Files
n8n_Demo/scripts/fix_all_orders_images.py
Yep_Q 67f5dfbe50 feat: 实现多订单班支持系统
主要功能:
- 修改RequirementModal支持12个订单班选择
- 添加OrderClassIconMap图标映射组件
- Store中添加selectedOrderClass状态管理
- WorkflowPage支持传递orderClass参数
- web_result添加URL参数切换功能
- 创建order-class-handler.js动态处理页面主题

技术改进:
- 创建软链接关联订单班数据目录
- 生成wenlu.json和food.json数据结构
- 删除重复的web_result目录
- 添加测试页面test-order-class.html

影响范围:
- 展会策划系统现支持12个订单班
- 结果展示页面自动适配不同订单班主题
- 用户可选择不同行业生成对应方案

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-29 10:02:15 +08:00

250 lines
8.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
处理所有订单班的图片整理
- 统一图片格式为jpg
- 规范化命名
- 更新Markdown引用
"""
import os
import re
import shutil
from pathlib import Path
from urllib.parse import unquote
def process_all_orders():
"""处理所有订单班"""
base_path = Path("/Users/xiaoqi/Documents/Dev/Project/2025-09-08_n8nDEMO演示/data/订单班文档资料")
# 订单班列表(排除已处理的文旅)
order_classes = [
"财经商贸", "食品", "智能开发", "智能制造",
"视觉设计", "交通物流", "土木", "大健康", "能源",
"化工", "环保"
]
print("=" * 60)
print("开始处理其他订单班图片")
print("=" * 60)
for order_class in order_classes:
order_dir = base_path / order_class
if not order_dir.exists():
print(f"\n⚠ 跳过 {order_class}:目录不存在")
continue
notion_dir = order_dir / "notion文稿"
if not notion_dir.exists():
print(f"\n⚠ 跳过 {order_class}notion文稿目录不存在")
continue
print(f"\n处理 {order_class}...")
process_single_order(order_class, notion_dir)
print("\n" + "=" * 60)
print("✅ 所有订单班处理完成!")
def process_single_order(order_class: str, notion_dir: Path):
"""处理单个订单班"""
image_dir = notion_dir / "image"
image_dir.mkdir(exist_ok=True)
# 收集所有图片
all_images = []
for ext in ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']:
all_images.extend(notion_dir.glob(f"*.{ext}"))
all_images.extend(notion_dir.glob(f"*.{ext.upper()}"))
all_images.extend(image_dir.glob(f"*.{ext}"))
all_images.extend(image_dir.glob(f"*.{ext.upper()}"))
# 去重
all_images = list(set(all_images))
if not all_images:
print(f" 没有找到图片")
return
print(f" 找到 {len(all_images)} 张图片")
# 分类计数器
counters = {
"设计图": 0,
"展示图": 0,
"效果图": 0,
"流程图": 0,
"场景图": 0,
"图片": 0
}
# 映射关系
image_mapping = {}
# 处理每张图片
for img_path in sorted(all_images):
old_name = img_path.name
new_name = generate_new_name(old_name, counters)
new_path = image_dir / new_name
# 移动或重命名
if img_path != new_path:
try:
if img_path.parent != image_dir:
# 需要移动到image目录
shutil.move(str(img_path), str(new_path))
else:
# 只需重命名
img_path.rename(new_path)
image_mapping[old_name] = new_name
print(f"{old_name}{new_name}")
except Exception as e:
print(f" ✗ 失败 {old_name}: {e}")
# 更新Markdown文件
if image_mapping:
update_markdown_files(notion_dir, image_mapping)
create_index(order_class, image_dir, len(all_images))
def generate_new_name(filename: str, counters: dict) -> str:
"""生成新的规范化文件名"""
name = Path(filename).stem.lower()
# 根据关键词分类
if any(kw in name for kw in ['设计', 'design', 'whisk', 'cad', '3d', '三维', '渲染', '效果图', 'render']):
counters["设计图"] += 1
return f"设计图_{counters['设计图']:02d}.jpg"
elif any(kw in name for kw in ['展示', 'display', 'show', '展台', '展位', '展览']):
counters["展示图"] += 1
return f"展示图_{counters['展示图']:02d}.jpg"
elif any(kw in name for kw in ['效果', 'effect', '成品', '最终']):
counters["效果图"] += 1
return f"效果图_{counters['效果图']:02d}.jpg"
elif any(kw in name for kw in ['流程', 'flow', 'process', '步骤', '架构', 'diagram']):
counters["流程图"] += 1
return f"流程图_{counters['流程图']:02d}.jpg"
elif any(kw in name for kw in ['场景', 'scene', '展会', '博览', '会场', '现场', '签到', '试驾', '实景', '照片']):
counters["场景图"] += 1
return f"场景图_{counters['场景图']:02d}.jpg"
elif name[0:1].isdigit():
# 数字开头的文件
counters["展示图"] += 1
return f"展示图_{counters['展示图']:02d}.jpg"
else:
# 其他图片
counters["图片"] += 1
return f"图片_{counters['图片']:02d}.jpg"
def update_markdown_files(notion_dir: Path, image_mapping: dict):
"""更新Markdown文件中的图片引用"""
md_files = list(notion_dir.glob("*.md"))
for md_file in md_files:
try:
content = md_file.read_text(encoding='utf-8')
original_content = content
# 更新每个图片引用
for old_name, new_name in image_mapping.items():
# 处理各种可能的引用格式
# 1. 普通引用
content = re.sub(
f"\\]\\({re.escape(old_name)}\\)",
f"](./image/{new_name})",
content
)
# 2. 带路径的引用
content = re.sub(
f"\\]\\([^)]*{re.escape(old_name)}\\)",
f"](./image/{new_name})",
content
)
# 3. URL编码的引用
encoded_name = unquote(old_name)
if encoded_name != old_name:
content = re.sub(
f"\\]\\([^)]*{re.escape(encoded_name)}[^)]*\\)",
f"](./image/{new_name})",
content
)
# 确保所有图片都指向./image/目录
content = re.sub(
r'!\[([^\]]*)\]\((?!\.?/image/)([^)]+\.(jpg|jpeg|png|gif))\)',
r'![\1](./image/\2)',
content,
flags=re.IGNORECASE
)
if content != original_content:
# 创建备份
backup_file = md_file.with_suffix('.md.bak')
shutil.copy2(md_file, backup_file)
# 保存更新
md_file.write_text(content, encoding='utf-8')
print(f" ✓ 更新MD: {md_file.name}")
except Exception as e:
print(f" ✗ 更新MD失败 {md_file.name}: {e}")
def create_index(order_class: str, image_dir: Path, total_count: int):
"""创建图片索引文件"""
images = sorted(image_dir.glob("*.jpg"))
# 分类
categories = {
"设计图": [],
"展示图": [],
"效果图": [],
"流程图": [],
"场景图": [],
"其他": []
}
for img in images:
name = img.name
added = False
for cat in ["设计图", "展示图", "效果图", "流程图", "场景图"]:
if name.startswith(cat):
categories[cat].append(name)
added = True
break
if not added:
categories["其他"].append(name)
# 生成索引内容
content = f"""# {order_class}订单班 - 图片资源索引
**图片总数**: {len(images)}
**更新时间**: 2025-09-28
**状态**: ✅ 已完成规范化整理
## 图片分类
"""
for cat, files in categories.items():
if files:
content += f"\n### {cat} ({len(files)}张)\n"
for file in files:
content += f"- {file}\n"
content += """
## 使用说明
### Markdown引用格式
```markdown
![图片描述](./image/图片名.jpg)
```
### 注意事项
- 所有图片已统一为 .jpg 格式
- 图片位于 notion文稿/image/ 目录下
- Markdown文件已创建备份.bak
"""
# 保存索引
index_file = image_dir.parent / "图片索引.md"
index_file.write_text(content, encoding='utf-8')
print(f" ✓ 创建索引: {index_file.name}")
if __name__ == "__main__":
process_all_orders()