主要功能: - 修改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>
250 lines
8.0 KiB
Python
250 lines
8.0 KiB
Python
#!/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'',
|
||
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
|
||

|
||
```
|
||
|
||
### 注意事项
|
||
- 所有图片已统一为 .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() |