# 2026-08-20 工作日志

## SPU 增加 mark 字段 + 批量替换固定值
- SPU 表新增 `mark` 列（TEXT），全部 59 条 SPU 设为 '1'。
- 按用户要求用 SQL 批量替换 SPU 15 个字段为统一模板值：
  pattern=印花、details=无、collar_style=圆领、style=休闲、care_Instructions=数码印花类可机洗且不可干洗、fabric=微弹、target_audience=成人、season=四季、is_transparent=否、layout=H、weaving_method=针织(含钩织、毛织面料)、printing_type=定位印花、fabric_texture_1=光面、fabric_weight_unit_1=g/㎡、lining_texture=无里料/无内衬。
- **注意**：这些字段不再随 PG 数据变化（原 details=english_name、fabric=品类面料、target_audience=美国男装等已被覆盖），sync_from_pg.py 的 SPU 插入已改为 fixed 模板值 + mark='1'。
- 保留的 PG 映射字段：material（20 个唯一值）、component_1~3/比例、fabric_weight_1（克重，如 180/207/270）。
- create_db.py 的 SPU 定义同步加了 mark 列。重跑验证：SPU 59 / SKU 1400，16 个固定值字段各仅 1 个唯一值。
- 踩坑：SPU INSERT 的占位符一度写成 27 个 ? 对 26 列（报 27 values for 26 columns），已修正。

## component_proportion 字段转百分比
- SPU 的 component_proportion_1/2/3 由数值（100、100.0、92.0…）改为百分比形式（100%、92%…），空值保持不变。
- SQL：`UPDATE SPU SET component_proportion_x = CAST(CAST(component_proportion_x AS REAL) AS INTEGER) || '%' WHERE ... IS NOT NULL AND <> ''`（当前值全为整数小数，无精度损失）。
- sync_from_pg.py 新增 `format_pct()` 函数（整数值去 .0 加 %，带小数保留，非数字原样），SPU 插入时对 p1/p2/p3 应用。重跑验证：p2 空 33、p3 空 51 保持，格式全部正确。

## SPU layout 字段改为"常规"
- SPU.layout 由 'H' 全部替换为 '常规'（59 条），sync_from_pg.py 的 fixed 模板值同步更新。

## 同步墨西哥货盘数据（替换美国数据）
- PG `plates` 表：`墨西哥` = plate_id 6（共 17 国，美国 2/3/4/5、日本 7、韩国 8、沙特 9、巴西 10、英国 11、加拿大 12、波兰 13、西班牙 14、德国 15、澳洲 16、意大利 17）。
- 改造 sync_from_pg.py：顶部常量 `PLATE_IDS=(6,)` + `COUNTRY="MX"` 可切换国家；SPU 插入 country 用 COUNTRY；SKU 颜色增加 `clean_color_name()`（去尺码前缀如 'S-3XL黑色'→'黑色'）与 `is_clean_code()`（code 须 '品类code-非中文后缀'）兜底。
- 结果：**SPU 8 / SKU 123**（颜色×尺码粒度），country 全 MX。8 个品类：HM01、MESXT001、METB001、METN001、METP001、PET001、SFB、TBB001。
- 脏数据兜底：墨西哥 colors 有脏 code（'METB001-S-3XL黑色'、'SFB-黑色'），清洗后 code 为 'METB001-黑色'/'SFB-黑色' 等（源库只有中文名、无拉丁编码，故 code 含中文属必然）。
- 留空：仅 **SFB**（运动短裤）12 条 SKU 缺 price/package_weight/img_url，因 PG 中 SFB 无 prices 记录、无 product_extra（无 packaging JSON）、无 color_detail_images。SFB 尺码走 size_chart 回退（2 色×6 码）。
- 注：本步将数据库内容由美国（US）整体替换为墨西哥（MX）——这是**错误的**，用户要求的是保留 US 再追加 MX。

## 修正：US + MX 双国累积同步（保留多国数据）
- sync_from_pg.py 重构为 `sync(plate_ids, country, clear_first)`：
  - `clear_first=True` 先 DELETE 整库再插入（重置/单国全量）；`clear_first=False` 仅追加，跳过已存在的 SPU code 与 SKU 组合 (spu_id, code, size)。
  - `__main__` 顺序执行：`sync((2,3,4,5),"US",clear_first=True)` 再 `sync((6,),"MX",clear_first=False)`。
- 结果：**SPU 67（US 59 + MX 8）/ SKU 1523（US 1400 + MX 123）**，country 分布 `[('MX',8),('US',59)]`，全部保留。
- 缺失 price/package_weight/img 共 72 条 = 5000B（US，60 条，源库无价格/包装/图）+ SFB（MX，12 条，源库无 prices/product_extra/图），属正常留空。
- 顶部注释已列出全部 17 国 plate_id 映射，后续同步任意国家（如 JP=7/KR=8/GB=11/DE=15）追加进脚本的 `__main__` 调用即可，不会覆盖已有数据。

## 追加同步日本(JP)与英国(GB)
- JP = plate_id 7（15 品类，1 个缺 product_extra 走 size_chart 回退）；GB = plate_id 11（15 品类，其中 4 个 code=NULL 被自动过滤，实际 11 有效品类，均有 product_extra）。
- `__main__` 追加 `sync((7,), "JP", False)` 与 `sync((11,), "GB", False)`，整库重置顺序：US(全量) → MX → JP → GB（追加）。
- 结果：**SPU 93（US59/MX8/JP15/GB11）/ SKU 1997（US1400/MX123/JP216/GB258）**，四国数据全部保留。
- JP 字段填充：color/size 216/216，price 204/216，package_weight 200/216，img 204/216（缺项来自源库无价格/包装/图的品类）。GB：color/size/price/img 全填，package_weight 238/258，shoulder_width 236/258（裤子/裙无肩宽属正常）。
- 颜色名正常（日文/英文均识别），尺码体系 JP=XS~L、GB=S~XL，均按颜色×尺码展开。

## SKU code 命名规则改为「款号-颜色的英文名」（用户要求）
- 问题：用户反馈「看不到日本 SKU」——实际 JP 数据齐全（216 条），根因是 JP `colors` 源数据存在脏 code（中文颜色名+尺码区间拼进 code，甚至整组颜色被拼成一条），旧兜底把它们变成 `JPHM009-灰色（S~XXL）` 这类难看 code，看起来像坏数据。
- 新规则（`sync_from_pg.py`）：SKU code 规范（品类code-纯字母数字后缀，如 `JPHM009-BL01`/`JPTM007-ESPRESSO`）直接用；**缺失/脏 code → 款号(品类code)-颜色的英文名**。
- 英文名来源：PG `color_detail_images.color_name_web`（按 color_id 取，如 Black/White/Navy/Apricot）；该表无值则用 `ZH_TO_EN` 中文→英文字典兜底；多色拼接脏名取首个可识别颜色英文名（`first_color_en()`）。
- `is_clean_code()` 收窄：后缀须为纯字母数字，含中文/`~`/`()` 一律判为脏（修复纯尺码区间假颜色 `JPHM009-（S~XXXL）` 被误判规范的问题）；纯尺码行 code 仅保留款号，color=NULL。
- `clean_color_name()` 增强：额外去掉结尾尺码区间括号（如 `灰色（S~XXL）`→`灰色`）。
- 全量重跑（先备份 spu_sku.db.bak）：SPU/SKU 总数不变（93/1997），JP 残留中文/`~` 的 code 由多条降为 **0**。
- **已知源数据坑**：`JPTM001` 的某条 `colors` 记录把 5 个颜色（白/杏/藏青/灰/粉）拼进同一 code 字段，脚本只能取首个颜色英文名兜底为 `JPTM001-White`，无法还原成 5 条独立颜色 SKU——需在 PG 侧修源。
- 结论：加其他国家只需在 `__main__` 追加 `sync((plate_id,), "国家码", False)`，命名规则自动生效。

## 清洗 JPTM001 脏 colors + 重新同步（用户要求"先清洗再导入sku"）
- PG 侧：`colors` 表 id=357 把 5 个颜色（白/杏/藏青/灰/粉）拼进同一条 code（源数据损坏）；其 `color_detail_images` 本就有 5 个独立颜色（White/Apricot/Deep Navy Blue/Gray/Pink，各 9 图）但 `color_id` 全为 NULL——脏记录是个未被图片引用的孤儿。
- 清洗（事务提交）：DELETE id=357；INSERT 5 条规范 `colors`（code=JPTM001-WH01/AP01/BE01/GR02/PK01，name 中文，size_range=XS-XXXL）；UPDATE `color_detail_images.color_id` 指回新 id（白/杏/藏青/灰/粉 各 9 行 + 黑 9 行全关联成功）。
- 颜色 code 缩写约定：白=WH01、杏=AP01、藏青=BE01、灰=GR02、粉=PK01（粉色无先例新编 PK01；藏青沿用 JPTM006 的 BE01）。
- 重跑 `sync_from_pg.py` 全量：JPTM001 SKU 由 2 色(14 条)→6 色(42 条)；全局 SKU 1997→2025(+28)，SPU 93 不变。脏 `JPTM001-White` 长串记录已清除。
- 注意：四国(US/MX/JP/GB)还存在其它"多色拼接"脏 colors 记录（一条 code 含 ≥2 个颜色，如 DG102/DG120/DG205/DG701/VS002/JSA004/GBHM002/GBTF004 等）。JPTM001 已修，其余待用户决定是否同法清洗（每条需先核 color_detail_images 是否可按独立颜色拆分）。

## SKU 尺码字段按国家区分（仅 JP=亚洲，其余=欧美）
- 用户最初要求 US/JP 改为亚洲尺码，后纠正：**US 不改**，仅 JP 走亚洲尺码。
- 最终状态：`size_group`/`size_type` —— JP=亚洲尺码/亚洲尺码亚洲常规(244)，US/GB/MX=尺码/欧美尺码常规(1781)。全表 SKU 仍 2025。
- 回滚备份：spu_sku.db.bak_usjp（US+JP 都改错的版本）、spu_sku.db.bak_revert_us（改回 US 后的版本）。
- 规律：尺码体系与国家挂钩——**仅 JP=亚洲尺码亚洲常规**，US/GB/MX=欧美尺码常规。后续加国家时按此约定（亚洲市场如 JP/KR 走亚洲，欧美市场 US/GB/MX/DE 走欧美），或写进 sync_from_pg.py 按 country 映射自动填。
