feat: 保存并展示 PDD 店铺与价格采样信息 (#31)
This commit is contained in:
@@ -93,6 +93,7 @@ SQLite 同一时刻只允许一个写事务,连接放太开会互相抢锁、
|
||||
| v1 | 初始表结构:`shopee_products`(当时还带着 `pdd_data`/`collect_status` 等采集字段)、`shopee_skus`、`syb_orders`、`sku_mappings`(当时主键只有 `shopee_sku_id`)、`tasks`、`clients`、`idempotency_keys`。 |
|
||||
| v2 | 新增 `task_claims`(领取历史,见 §8)。 |
|
||||
| v3 | 把 PDD 采集数据从 `shopee_products` 拆到独立的 `pdd_products`(本文档 §4 描述的最终结构);重建 `shopee_products`,去掉已经搬走的四个字段;重建 `sku_mappings`,主键改成 `(shopee_sku_id, pdd_goods_id)`(§6.1 的理由)。 |
|
||||
| v4 | `pdd_products` 增加可空的 `shop_name`;老数据保持 `NULL`。 |
|
||||
|
||||
**v3 为什么丢弃旧 `sku_mappings` 数据(见 #20):** 新主键需要 `pdd_option_key`,
|
||||
这是 Go 的 `service.OptionKey()` 用 `json.Marshal` 算出来的规范化键,SQL 语句
|
||||
@@ -248,6 +249,7 @@ CREATE TABLE pdd_products (
|
||||
goods_id TEXT NOT NULL UNIQUE, -- 从 PDD 链接解析
|
||||
url TEXT NOT NULL, -- 操作员填的链接原文
|
||||
title TEXT, -- 采集回来,人工核对用
|
||||
shop_name TEXT, -- 店铺名;采不到或老数据为 NULL
|
||||
skus_json TEXT, -- 采集结果,结构见 §4.2
|
||||
|
||||
collect_status TEXT NOT NULL DEFAULT 'pending'
|
||||
@@ -358,6 +360,8 @@ UPDATE pdd_products
|
||||
"schema_version": 1,
|
||||
"goods_id": "737116531267",
|
||||
"title": "【现货】西装外套三件套",
|
||||
"shop_name": "XX旗舰店",
|
||||
"price_granularity": "color",
|
||||
"captured_at": "2026-08-07T08:00:00Z",
|
||||
"dimensions": [
|
||||
{"key": "color", "name": "颜色分类"},
|
||||
@@ -365,7 +369,9 @@ UPDATE pdd_products
|
||||
],
|
||||
"skus": [
|
||||
{"options": {"color": "黑色", "size": "M"},
|
||||
"price_cent": 1256, "available": true, "raw_price": "¥12.56"},
|
||||
"price_cent": 1256, "list_price_cent": 1990,
|
||||
"price_observed_at": {"color": "黑色", "size": "M"},
|
||||
"available": true, "raw_price": "券后¥12.56"},
|
||||
{"options": {"color": "白色", "size": "M"},
|
||||
"price_cent": 1256, "available": false, "raw_price": "¥12.56"}
|
||||
]
|
||||
@@ -380,12 +386,18 @@ UPDATE pdd_products
|
||||
| `skus[].price_cent` | 建采购任务时带出 `max_price_cent` | 价格保护填不了,Client 会拒绝执行 |
|
||||
| `skus[].available` | 不给缺货规格建任务 | 白跑一趟,Client 到手机上才发现卖光 |
|
||||
| `goods_id` / `title` | 核对"采的是不是要的那个商品" | 链接跳转、采错商品时静默存错 |
|
||||
| `shop_name` | 核对是否来自目标店铺 | 同标题商品无法区分来源;采不到时允许为空 |
|
||||
| `dimensions` | 界面按顺序渲染下拉框 | Go 的 map 无序,不知道该先显示颜色还是尺码 |
|
||||
| `price_granularity` | 告诉下游价格是逐 SKU 实测还是按颜色推断 | 下单价格保护会把推断价误当实测价 |
|
||||
| `price_observed_at` | 标明读取价格时实际选中的规格组合 | 无法区分哪一行是实测价 |
|
||||
| `raw_price` | 价格解析出错时对账 | 只有数字,出错了没法查 |
|
||||
|
||||
`[必须]` 几条硬规则:
|
||||
|
||||
- **`price_cent` 是整数分**,不是 `12.56` 也不是 `"12.56"`。这个数要参与价格保护比对,是会花钱的判断,禁止浮点。
|
||||
- **`price_cent` 是实付价**(如券后价、折后价),不是划线价;可选的划线价放在 `list_price_cent`。
|
||||
- **`price_granularity` 只能是 `color` 或 `sku`**。`color` 表示同颜色各尺码共用一次采样价;老 Client 不传时继续兼容。
|
||||
- **`price_observed_at` 必须记录读取价格时实际选中的完整组合**。按颜色采样时,同颜色下只有与它完全相同的那一行是实测,其余是推断。
|
||||
- **采不到价格时给 `null`,不要给 0**。Admin 遇到 `null` 当"未知"处理并拒绝建任务,绝不当成 0 元。
|
||||
- **`options` 嵌一层,不平铺 `color`/`size`**。支持任意多个维度,碰到三维商品(颜色/尺码/款式)平铺的结构直接装不下。
|
||||
- **`dimensions` 只给 `key` 和 `name`,不给 values**。values 能从 `skus` 去重推出来,存两份迟早不一致。
|
||||
|
||||
Reference in New Issue
Block a user