fix(export): 生成的 AI 穿搭 Excel 字段名对齐标题生成产品图.xlsx
B 列从「货号」改为「商品id」,C 列从「衣服图路径」改为「原始图片路径」, 补第 7 列「货憨憨上传状态」留空,与用户实际模板文件完全一致。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+4
-3
@@ -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 穿搭页直接使用」的引导语;用户点击「确定」关闭。
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user