feat(ai-outfit): C 列支持图片目录 → 多图扇出到同名子目录 (§19.12)
Excel C 列除单张图片外也可填一个目录(d:/images/a/):对目录内每张图各 生成一张穿搭图(N→N),全部存到 输出目录/<目录叶子名>/,文件名沿用源图名; Excel 仍整行一个状态:D=子目录、E=全成功才「完成」、F=失败张数/原因。 - core/ai_outfit.py: list_directory_images(顶层、扩展名过滤、排序、忽略子目录)、 make_outfit_subdir_path(不加 _n 后缀)、generate_outfit_image 目录分支 (新参 request_interval/image_log;逐张跳过已存在→幂等重试、本地节流、发日志、 聚合成单个 OutfitResult) - core/models.py: OutfitResult 加 output_paths(目录行各 jpg,供缩略图) - ai_outfit_panel.py: gen 闭包传 request_interval/image_log;缩略图逐张; 明细「结果」列显示「子目录(N 张)」;_basename 处理目录末尾分隔符 - tests/test_ai_outfit.py: 扇出/幂等跳过/空目录/缺目录/部分失败/命名过滤等用例 - docs/11 §4.1+§9.1、tasks.md §19.12 离屏冒烟:3 图目录 + mock API → output/<dir>/ 3 jpg、D=子目录、E=完成、缩略图 3 张; 全套 12 测试文件在 Python 3.7 全绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -71,6 +71,18 @@ services/excel_service:把结果写回 Excel(D 新图路径 / E 状态 / F
|
||||
- **每处理完一行即保存 Excel**(降低崩溃丢结果风险)。
|
||||
- 成功 → D=新图绝对路径、E=`完成`;失败 → E=`失败`、F=原因(同步写日志)。
|
||||
|
||||
### 4.1 C 列为「图片目录」(多图扇出,§9.1)
|
||||
|
||||
C 列除了单张图片文件,**也可以是一个目录**(如 `d:/images/a/`)。约定:
|
||||
|
||||
- 判定:`os.path.isdir(C)` 为真,或路径以分隔符结尾。仅取该目录**顶层**的图片
|
||||
(扩展名 `.png/.jpg/.jpeg/.webp/.gif`),**不递归**子目录,按文件名排序。
|
||||
- 该行仍是**一个任务、一次回写**;对目录内**每一张**图各生成一张穿搭图(N→N),
|
||||
共用本行的标题/货号与话术。
|
||||
- 输出落到 `输出目录/<目录叶子名>/`(见 §9.1);Excel 回写仍是**整行一个状态**:
|
||||
D=子目录绝对路径、E=全部成功才 `完成` 否则 `失败`、F=失败张数/原因。
|
||||
- 目录不存在或目录内没有图片 → 该行 `失败` 并记录原因,不中断其它行。
|
||||
|
||||
## 5. 内部数据模型
|
||||
|
||||
`core/models.py` 新增(纯 dataclass,Python 3.7 兼容,不依赖 PySide6):
|
||||
@@ -165,6 +177,20 @@ Excel 行 → `OutfitTask` 列表的转换由 `excel_service` 完成;核心只
|
||||
- 命名:`货号.jpg`,重名自动 `_1`/`_2`,非法字符替换为 `_`(不改 Excel 原始货号)。
|
||||
- 成功后把**实际新图绝对路径**写回 Excel D 列。
|
||||
|
||||
### 9.1 目录行的输出(多图 → 同名子目录)
|
||||
|
||||
当 C 列是目录(§4.1)时:
|
||||
|
||||
- 每张源图各生成一张穿搭图,存到 `输出目录/<目录叶子名>/<源图名>.jpg`
|
||||
(子目录名 = 目录叶子名,文件名沿用源图名;二者均按 §9 规则替换非法字符)。
|
||||
例:`d:/images/a/img1.png` → `输出目录/a/img1.jpg`。
|
||||
- **不加 `_1`/`_2` 去重后缀**:目标文件已存在视为「已生成」并**跳过**,使整行可
|
||||
幂等重试——重试只补做缺失/失败的那几张,已成功的不重复调 API。
|
||||
- 整行回写 Excel 时,D 列写**子目录**绝对路径(而非单个文件)。
|
||||
- 目录内逐张**顺序**生成(同一 worker 内);为避免压垮中转 API,逐张之间按
|
||||
「新请求间隔」本地 sleep 节流。并发=1(默认)时即等于全局节流;并发>1 时为近似。
|
||||
进度条按 Excel 行前进(一个目录=1 格),逐张进度通过实时日志反馈。
|
||||
|
||||
## 10. 界面(「2 AI 穿搭」页签)
|
||||
|
||||
界面效果图见 **`docs/ui-ai-outfit.html`**(浏览器打开)/ **`docs/ui-ai-outfit.png`**,完全沿用 cmbot 现有视觉、与「1 添加印花」严格统一(同 `docs/ui-v1`:浅灰底、`#0067c0` 蓝单一主色、12px 雅黑、3px 圆角、pill 状态徽章;不引入第二识别色)。「生成中」状态用蓝,与印花页「导出中」同色。把主窗口当前禁用的「2 AI 穿搭」页签启用,做成独立工作页(与「1 添加印花」并列、互不干扰)。
|
||||
|
||||
Reference in New Issue
Block a user