feat: 增加顺运宝店铺筛选 (#151)

This commit is contained in:
chengma
2026-08-11 14:39:13 +08:00
parent 30bdab3e2e
commit 9d4d6fc1e5
20 changed files with 313 additions and 56 deletions
+8
View File
@@ -106,6 +106,7 @@ SQLite 同一时刻只允许一个写事务,连接放太开会互相抢锁、
| v6(#50) | Admin 网页登录:新增 `users` 和 `web_sessions`,只在迁移末尾追加,未改写 v1–v5。 |
| v7(#54) | 客户端负责人:新增 `client_user_assignments` 和当前归属唯一索引,保留绑定、转交、解绑历史;未改写 v1–v6。 |
| v8(#59) | 顺运宝同步记录:新增 `syb_sync_runs` 和开始时间倒序索引;未改写 v1–v7。 |
| v9(#151) | `syb_orders` 增加可空 `shop_name`,从有效 `syb_data.stock.shopName` 回填历史店铺名;无效 JSON、缺字段和空白值保持 `NULL`。 |
**v3 为什么丢弃旧 `sku_mappings` 数据(见 #20):** 新主键需要 `pdd_option_key`,
这是 Go 的 `service.OptionKey()` 用 `json.Marshal` 算出来的规范化键,SQL 语句
@@ -401,6 +402,7 @@ UPDATE pdd_products
CREATE TABLE syb_orders (
syb_id TEXT PRIMARY KEY, -- 货运单**明细行** ID(顺运宝 details[].id)
order_no TEXT NOT NULL, -- 订单号(顺运宝外层 code,不是 orderCode)
shop_name TEXT, -- 蝦皮店铺(顺运宝外层 shopName)
title TEXT, -- 商品标题
product_spec TEXT, -- 顺运宝规格原文
spec_key VARCHAR(191), -- 规格身份键;空规格保持 NULL
@@ -422,6 +424,8 @@ CREATE INDEX idx_syb_orders_list ON syb_orders(updated_at DESC, syb_id DESC);
- `price_twd_cent` 是**台币分**,是蝦皮那边的售价,
和采购任务的人民币价格上限**没有换算关系**,不要互相赋值。
- `image_url` 存 URL。`[必须]` 不要把图片二进制存进数据库。
- `shop_name` 是顺运宝货运单级事实,同一货运单下的多条商品明细会重复保存同一值;
独立列用于列表展示和检索,完整上游值仍保留在 `syb_data.stock.shopName`。
- `spec_key` 通过 `SpecKey(product_spec)` 计算:去除首尾空白,把连续空白折叠为一个半角空格,
但不做大小写、繁简、颜色或单位转换。空规格不生成键,并在采购流程中作为数据异常阻断。
- **处理阶段是派生的,不存字段**:PDD 规格是否已匹配要按
@@ -450,6 +454,10 @@ v10 幂等重放 v8、v9 的逐项建列、空值回填、约束和唯一索引
形状;只有全部通过才记录 v10。它不删除或改写旧迁移记录,也不清空商品、SKU 或
导入记录。
MySQL schema v11(工单 #151)为 `syb_orders` 增加可空 `VARCHAR(500)` 的
`shop_name`,并从合法原始 JSON 的 `$.stock.shopName` 回填历史数据。迁移可重放,
只填仍为空的列;新同步直接更新该列,不把它写入或覆盖蝦皮商品主数据。
蝦皮详情把 `syb_orders` 按 `(shopee_goods_id, spec_key)` 聚合为“顺运宝观测规格”:
订单数按唯一 `syb_id` 行计数,累计数量求和,最近一行提供历史台币售价和图片。
该读模型不写入 `shopee_skus`。只有同一商品下恰好一条正式 SKU 的 `spec_raw`