feat: 建立全局店铺跨渠道管理 (#208 #209 #210 #211)

This commit is contained in:
chengma
2026-08-13 11:15:54 +08:00
parent 901b37a8cb
commit 8f707722ba
28 changed files with 1160 additions and 500 deletions
+20 -8
View File
@@ -121,6 +121,10 @@ v15(#203)把历史 `syb_orders` 中每个蝦皮商品最新的非空店铺
“颜色,尺码【建议】”格式,并为历史数据补建无真实外部 ID 的低优先级蝦皮 SKU;
不明确格式只保留原文。v17(#205)为蝦皮商品增加 `deleted_at`、
`deleted_by_user_id` 和删除状态索引,删除改为可恢复的软删除。
v18(#208)新增 `shops` 业务店铺和 `shop_channel_aliases` 渠道名称表,并为
`syb_orders`、`shopee_products` 增加可空 `shop_id`。迁移把 v14 旧准入项一对一
转成业务店铺,同时保留 `syb_allowed_shops` 作为回退依据;历史数据只按渠道原始
名称精确回填,无法确认的记录保持未关联。
**v3 为什么丢弃旧 `sku_mappings` 数据(见 #20):** 新主键需要 `pdd_option_key`,
这是 Go 的 `service.OptionKey()` 用 `json.Marshal` 算出来的规范化键,SQL 语句
@@ -543,16 +547,24 @@ v14 起,`stock_count` 继续表示通过完整性校验的**原始货运单数
`shop_filter_hash` 保存同步开始时启用店铺排序后计算的 SHA-256,只用于判断两次同步
是否使用同一份快照,不保存 Cookie、密码或原始响应。
### 5.3 `syb_allowed_shops` 同步店铺准入(MySQL v14)
### 5.3 全局店铺与渠道名称(MySQL v18)
每个店铺只保留一条全局记录。`normalized_name` 是去除首尾空白后的名称并使用
`utf8mb4_bin` 唯一约束;匹配不做模糊、正则或大小写折叠。日常退出同步使用停用,
只有已停用项允许管理员永久删除;条件删除必须再次带 `enabled=0`,避免并发重新启用
后被误删。删除配置不级联历史货运单或同步记录。同步开始时一次读取所有
`enabled=1` 的名称作为不可变快照。
`shops` 是 Admin 内部统一展示的业务店铺;`shop_channel_aliases` 保存同一业务店铺
在 `syb`、`shopee` 渠道中的原始名称。首版每个业务店铺每个渠道维护一个主名称,
渠道和去除首尾空白后的原始名称组成唯一约束。匹配使用 `utf8mb4_bin` 精确比较,
不做模糊、正则、大小写折叠或 AI 猜测。
`[必须]` 没有任何启用店铺时同步关闭失败,不请求顺运宝、不推进游标。该表只控制
后续同步是否入库,不自动删除历史 `syb_orders`。
全局 `shops.enabled` 和 SYB 渠道名称的 `enabled` 是两个不同开关:前者停用整个业务
店铺,后者只停止该店铺进入后续 SYB 同步。蝦皮导入和 SYB 写入都保留上游原始店铺
名称,并把精确解析出的 `shop_id` 作为派生关联;未解析成功时 `shop_id` 保持 `NULL`,
由“待关联”筛选暴露给管理员处理。
`[必须]` 没有任何“业务店铺启用且 SYB 渠道启用”的名称时,同步关闭失败,不请求
顺运宝、不推进游标。编辑渠道名称会在一个事务里重建该业务店铺的历史精确关联。
永久删除只允许全局停用且没有任何货运单或蝦皮商品引用的店铺。
v14 的 `syb_allowed_shops` 在 v18 后不再作为运行时配置源,但为迁移回退保留,不能
在 v18 中直接改名或删除。
## 6. `spec_mappings` 顺运宝规格映射