v89-v91 模板增强 + 图源映射 + 多模态提示词可配置化

- 图源映射统一:热点采集与 Pinterest 模式均走 config.product.mark_dirs 配置,按任务序号随机抽模特图/平铺图
- 商品产地固定:统一为「中国大陆」+「产地省份=广东省」(不再读站点/字典映射)
- 模板 SKU 字段检测:按建议售价同一套路检测 SKU分类/SKU数量/SKU数量单位,必填时填入单品/1/件
- 多模态分析提示词可配置:prompts/pinterest_analyze_system.md + user.md,支持国家覆盖,不丢文件回退内置
- 自定义图片模式:新增 pinterest_custom_load_node,图片数量硬校验,选品清单 ≤ 有效图片数
- 模板导出优化:写入前按货号末 3 位升序排序,不再产生空白 xlsx
- 修复 v90 project review 10 项(503 致命终止、线程安全、原子写入等)
This commit is contained in:
2026-08-28 16:24:50 +08:00
parent 2a96ec0870
commit 71a48e4ed5
40 changed files with 780 additions and 200 deletions
+36
View File
@@ -179,6 +179,42 @@ def design_md5_ok(image_path: str) -> bool:
_IMG_EXTS = (".jpg", ".jpeg", ".png", ".webp", ".gif", ".bmp")
def list_valid_images(folder: Any) -> List[Path]:
"""返回文件夹内所有有效图片文件(扩展名匹配,含子目录递归),用于自定义模式。
供图源目录/自定义模式统计「有效图片数量」与注册图池使用;空/不存在返回空列表。
"""
d = Path(folder)
if not d.is_dir():
return []
out: List[Path] = []
for f in sorted(d.rglob("*")):
if f.is_file() and f.suffix.lower() in _IMG_EXTS:
out.append(f)
return out
def validate_custom_images(folder: Any, target: int) -> tuple:
"""自定义模式数量校验:返回 (ok, valid_n, message)。
folder 未填/不存在/无有效图片 → 失败;有效图片数 < 选品清单总数 target → 失败
(「选品清单不得大于有效图片数」硬校验)。供 UI/入口 fail-fast 与节点安全网复用。
"""
folder_s = str(folder or "").strip()
if not folder_s:
return False, 0, "自定义图片文件夹未填写(pinterest.custom_image_dir / UI 选择上传文件夹)"
if not Path(folder_s).is_dir():
return False, 0, f"自定义图片文件夹不存在:{folder_s}"
imgs = list_valid_images(folder_s)
n = len(imgs)
if n == 0:
return False, 0, f"自定义图片文件夹「{folder_s}」中没有有效图片(jpg/jpeg/png/webp"
if target > n:
return False, n, (f"选品清单数量({target})大于自定义图片有效数量({n}):"
f"选品清单不得大于有效图片数,请补充图片或减少选品")
return True, n, f"自定义图片校验通过:有效图片 {n} 张 ≥ 选品清单 {target}"
def image_pool_path(output_dir: str, country: str) -> Path:
return Path(output_dir) / "pinterest_ref" / country / "image_pool.json"