fix(export): 生成的 AI 穿搭 Excel 字段名对齐标题生成产品图.xlsx

B 列从「货号」改为「商品id」,C 列从「衣服图路径」改为「原始图片路径」,
补第 7 列「货憨憨上传状态」留空,与用户实际模板文件完全一致。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 09:44:35 +08:00
co-authored by Claude Sonnet 4.6
parent 0362c7db89
commit 313e71b774
3 changed files with 12 additions and 8 deletions
+4 -3
View File
@@ -251,13 +251,14 @@
要求: 要求:
- **文件位置**:`<output>/<时间戳>.xlsx`,与 `<时间戳>/` 子目录同级。 - **文件位置**:`<output>/<时间戳>.xlsx`,与 `<时间戳>/` 子目录同级。
- **格式**:与 AI 穿搭读取的 `标题生成产品图.xlsx` 完全一致,共六列(首行为表头,数据从第 2 行起): - **格式**:与 `标题生成产品图.xlsx` 字段名完全一致,共七列(首行为表头,数据从第 2 行起):
- A 标题:印花文件名(不含扩展名) - A 标题:印花文件名(不含扩展名)
- B 货号:留空(货号可选,AI 穿搭支持空货号) - B 商品id:留空(AI 穿搭支持空货号)
- C 衣服图路径:对应印花子目录的绝对路径,末尾含路径分隔符(`/`) - C 原始图片路径:对应印花子目录的绝对路径,末尾含路径分隔符(`\`)
- D 生成结果图片路径:留空(由 AI 穿搭写回) - D 生成结果图片路径:留空(由 AI 穿搭写回)
- E 完成状态:留空(由 AI 穿搭写回) - E 完成状态:留空(由 AI 穿搭写回)
- F 失败原因:留空(由 AI 穿搭写回) - F 失败原因:留空(由 AI 穿搭写回)
- G 货憨憨上传状态:留空
- **行数**:等于本次批量产出的有效印花子目录数(即目录内至少有一个合成图文件),按印花文件名字母序排列。 - **行数**:等于本次批量产出的有效印花子目录数(即目录内至少有一个合成图文件),按印花文件名字母序排列。
- 若本次批量无任何成功的印花子目录,则不生成 Excel。 - 若本次批量无任何成功的印花子目录,则不生成 Excel。
- Excel 生成后弹出信息框提示用户,内容包含文件路径和「可切换到 AI 穿搭页直接使用」的引导语;用户点击「确定」关闭。 - Excel 生成后弹出信息框提示用户,内容包含文件路径和「可切换到 AI 穿搭页直接使用」的引导语;用户点击「确定」关闭。
+6 -3
View File
@@ -149,7 +149,9 @@ def read_all_rows(excel_path):
workbook.close() workbook.close()
_OUTFIT_SOURCE_HEADERS = ["标题", "货号", "衣服图路径", "生成结果图片路径", "完成状态", "失败原因"] _OUTFIT_SOURCE_HEADERS = [
"标题", "商品id", "原始图片路径", "生成结果图片路径", "完成状态", "失败原因", "货憨憨上传状态",
]
def write_outfit_source_excel(excel_path, rows): def write_outfit_source_excel(excel_path, rows):
@@ -157,14 +159,15 @@ def write_outfit_source_excel(excel_path, rows):
rows: ordered sequence of (print_name, subdir_path) pairs. rows: ordered sequence of (print_name, subdir_path) pairs.
subdir_path should end with a path separator so AI穿搭 treats it as a directory. subdir_path should end with a path separator so AI穿搭 treats it as a directory.
Columns: A=print_name, B=empty(货号可空), C=subdir_path, D/E/F=empty (AI穿搭 writes back). Columns match 标题生成产品图.xlsx: A=print_name, B=empty(商品id), C=subdir_path,
D/E/F=empty (AI穿搭 writes back), G=empty(货憨憨上传状态).
""" """
rows = list(rows) rows = list(rows)
wb = Workbook() wb = Workbook()
ws = wb.active ws = wb.active
ws.append(_OUTFIT_SOURCE_HEADERS) ws.append(_OUTFIT_SOURCE_HEADERS)
for print_name, subdir_path in rows: for print_name, subdir_path in rows:
ws.append([print_name, None, subdir_path, None, None, None]) ws.append([print_name, None, subdir_path, None, None, None, None])
wb.save(str(excel_path)) wb.save(str(excel_path))
wb.close() wb.close()
logger.info("Wrote outfit source Excel: %s (%d rows)", excel_path, len(rows)) logger.info("Wrote outfit source Excel: %s (%d rows)", excel_path, len(rows))
+2 -2
View File
@@ -156,8 +156,8 @@ class TestOutfitExcelService(unittest.TestCase):
ws = wb.active ws = wb.active
try: try:
self.assertEqual( self.assertEqual(
[ws.cell(1, c).value for c in range(1, 7)], [ws.cell(1, c).value for c in range(1, 8)],
["标题", "货号", "衣服图路径", "生成结果图片路径", "完成状态", "失败原因"], ["标题", "商品id", "原始图片路径", "生成结果图片路径", "完成状态", "失败原因", "货憨憨上传状态"],
) )
self.assertEqual(ws.max_row, 3) # 1 header + 2 data self.assertEqual(ws.max_row, 3) # 1 header + 2 data
self.assertEqual(ws.cell(2, 1).value, "floral") self.assertEqual(ws.cell(2, 1).value, "floral")