feat(export): 批量导出生成 Excel 后弹窗提示用户 (§17.24)
Excel 成功写入后弹出 QMessageBox,显示文件路径并引导切换 到「AI 穿搭」页直接使用;无有效印花子目录时不弹框。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -260,6 +260,7 @@
|
|||||||
- F 失败原因:留空(由 AI 穿搭写回)
|
- F 失败原因:留空(由 AI 穿搭写回)
|
||||||
- **行数**:等于本次批量产出的有效印花子目录数(即目录内至少有一个合成图文件),按印花文件名字母序排列。
|
- **行数**:等于本次批量产出的有效印花子目录数(即目录内至少有一个合成图文件),按印花文件名字母序排列。
|
||||||
- 若本次批量无任何成功的印花子目录,则不生成 Excel。
|
- 若本次批量无任何成功的印花子目录,则不生成 Excel。
|
||||||
|
- Excel 生成后弹出信息框提示用户,内容包含文件路径和「可切换到 AI 穿搭页直接使用」的引导语;用户点击「确定」关闭。
|
||||||
- 用户在「AI 穿搭」页选择此 Excel,即可直接对合成图批量生成穿搭效果图(C 列为目录,触发目录扇出逻辑,详见 `docs/11-ai-outfit.md` §4.1 / §9.1)。
|
- 用户在「AI 穿搭」页选择此 Excel,即可直接对合成图批量生成穿搭效果图(C 列为目录,触发目录扇出逻辑,详见 `docs/11-ai-outfit.md` §4.1 / §9.1)。
|
||||||
|
|
||||||
## 7. 非功能需求
|
## 7. 非功能需求
|
||||||
|
|||||||
@@ -395,13 +395,25 @@ class QueuePanel(QWidget):
|
|||||||
|
|
||||||
self._running = False
|
self._running = False
|
||||||
self._batch_btn.setText("开始批量导出")
|
self._batch_btn.setText("开始批量导出")
|
||||||
self._write_outfit_excel(run_dir)
|
excel_path = self._write_outfit_excel(run_dir)
|
||||||
|
if excel_path:
|
||||||
|
from PySide6.QtWidgets import QMessageBox
|
||||||
|
QMessageBox.information(
|
||||||
|
self,
|
||||||
|
"AI 穿搭 Excel 已生成",
|
||||||
|
"已生成 AI 穿搭 Excel 文件:\n{}\n\n可切换到「AI 穿搭」页,选择该文件直接开始生成穿搭图。".format(
|
||||||
|
excel_path
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
def _write_outfit_excel(self, run_dir):
|
def _write_outfit_excel(self, run_dir):
|
||||||
"""Generate an AI-outfit source Excel alongside *run_dir* (docs/02 §6.12)."""
|
"""Generate an AI-outfit source Excel alongside *run_dir* (docs/02 §6.12).
|
||||||
|
|
||||||
|
Returns the excel path string on success, None if skipped or failed.
|
||||||
|
"""
|
||||||
run_path = Path(run_dir)
|
run_path = Path(run_dir)
|
||||||
if not run_path.is_dir():
|
if not run_path.is_dir():
|
||||||
return
|
return None
|
||||||
_img_exts = {".png", ".jpg", ".jpeg", ".webp", ".gif"}
|
_img_exts = {".png", ".jpg", ".jpeg", ".webp", ".gif"}
|
||||||
rows = []
|
rows = []
|
||||||
for subdir in sorted(run_path.iterdir(), key=lambda p: p.name.lower()):
|
for subdir in sorted(run_path.iterdir(), key=lambda p: p.name.lower()):
|
||||||
@@ -410,12 +422,14 @@ class QueuePanel(QWidget):
|
|||||||
if any(f.suffix.lower() in _img_exts for f in subdir.iterdir() if f.is_file()):
|
if any(f.suffix.lower() in _img_exts for f in subdir.iterdir() if f.is_file()):
|
||||||
rows.append((subdir.name, str(subdir) + os.sep))
|
rows.append((subdir.name, str(subdir) + os.sep))
|
||||||
if not rows:
|
if not rows:
|
||||||
return
|
return None
|
||||||
excel_path = run_path.with_suffix(".xlsx")
|
excel_path = run_path.with_suffix(".xlsx")
|
||||||
try:
|
try:
|
||||||
write_outfit_source_excel(excel_path, rows)
|
write_outfit_source_excel(excel_path, rows)
|
||||||
|
return str(excel_path)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error("Failed to write outfit source Excel: %s", exc)
|
logger.error("Failed to write outfit source Excel: %s", exc)
|
||||||
|
return None
|
||||||
|
|
||||||
def _image_size(self, path):
|
def _image_size(self, path):
|
||||||
"""Return (w, h) for path, caching within a run. None if unreadable."""
|
"""Return (w, h) for path, caching within a run. None if unreadable."""
|
||||||
|
|||||||
@@ -1034,6 +1034,25 @@
|
|||||||
- `write_outfit_source_excel` 生成的文件表头正确、行数 = 传入 rows 数、A/B/C 列值正确(A=print_name,B=空,C=subdir 末尾有 `/`)、D/E/F 为空
|
- `write_outfit_source_excel` 生成的文件表头正确、行数 = 传入 rows 数、A/B/C 列值正确(A=print_name,B=空,C=subdir 末尾有 `/`)、D/E/F 为空
|
||||||
- [ ] 验收:批量导出完成后 `<合并后的图片>/` 下出现 `<时间戳>.xlsx`;打开 AI 穿搭、选该文件,预览下拉显示各印花名行(货号列显示「无货号」);「开始生成」触发目录扇出,正常输出穿搭图
|
- [ ] 验收:批量导出完成后 `<合并后的图片>/` 下出现 `<时间戳>.xlsx`;打开 AI 穿搭、选该文件,预览下拉显示各印花名行(货号列显示「无货号」);「开始生成」触发目录扇出,正常输出穿搭图
|
||||||
|
|
||||||
|
### 17.24 批量导出完成弹窗提示 AI 穿搭 Excel — docs/02 §6.12
|
||||||
|
|
||||||
|
前置阅读:
|
||||||
|
|
||||||
|
- `docs/02-prd.md`(§6.12 AI 穿搭 Excel)
|
||||||
|
- `src/app/widgets/queue_panel.py`(`_start_batch`、`_write_outfit_excel`)
|
||||||
|
|
||||||
|
背景:
|
||||||
|
|
||||||
|
§17.23 已在批量导出完成后生成同名 xlsx,但用户感知不到。需在 Excel 成功生成后弹出信息框,告知文件路径并引导切换到「AI 穿搭」页使用。
|
||||||
|
|
||||||
|
任务:
|
||||||
|
|
||||||
|
- [ ] `queue_panel.py`:`_write_outfit_excel` 成功生成 Excel 后返回 `excel_path`,失败/跳过返回 `None`
|
||||||
|
- [ ] `_start_batch` 拿到返回值后,若不为 `None`,调用 `QMessageBox.information` 弹出提示:
|
||||||
|
- 标题:`AI 穿搭 Excel 已生成`
|
||||||
|
- 内容:`已生成 AI 穿搭 Excel 文件:\n<excel_path>\n\n可切换到「AI 穿搭」页,选择该文件直接开始生成穿搭图。`
|
||||||
|
- [ ] 验收:批量导出完成后弹框显示 xlsx 路径;点「确定」关闭;若无有效印花子目录则不弹框
|
||||||
|
|
||||||
## 18. 后续暂缓任务
|
## 18. 后续暂缓任务
|
||||||
|
|
||||||
以下任务第一阶段暂不做,后续需要时再新增设计文档:
|
以下任务第一阶段暂不做,后续需要时再新增设计文档:
|
||||||
|
|||||||
Reference in New Issue
Block a user