feat: 完成规格映射与采购任务创建 (#69)
This commit is contained in:
@@ -200,7 +200,7 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
| 数量 | |
|
||||
| 价格 | 蝦皮售价,**台币分**,见 §7 |
|
||||
| 图片 | 存 URL,表格里显示缩略图 |
|
||||
| 处理阶段 | 未找到蝦皮商品 / 待确认蝦皮规格 / 未关联 PDD / 待采集 / 采集中 / 采集失败 / 规格待匹配 / 可采购 |
|
||||
| 处理阶段 | 未找到蝦皮商品 / 待确认蝦皮规格 / 未关联 PDD / 待采集 / 采集中 / 采集失败 / 规格待匹配 / 可采购 / 采购数据异常 / 已创建任务 |
|
||||
| 下一步 | 每行只显示当前最需要完成的一个操作 |
|
||||
| 更新时间 | |
|
||||
|
||||
@@ -212,14 +212,16 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
- `shopee_sku_id` 只表示“蝦皮规格已确认”,不等于 PDD 规格已经匹配。完整处理阶段还要检查当前 PDD 关联、采集状态和 `sku_mappings`。
|
||||
- 蝦皮 SKU 确认后,可在同一弹窗填写完整 PDD 链接并创建采集任务;链接关联规则与蝦皮详情完全一致。
|
||||
|
||||
- 左边显示蝦皮的颜色尺码,右边显示该商品 `pdd_data` 里的 PDD 颜色尺码;
|
||||
- 显示蝦皮规格原文和当前 PDD 商品 `skus_json` 里的动态规格组合与人民币价格;
|
||||
- PDD 维度来自采集结果的 `dimensions`,不得写死成颜色、尺码两个维度;
|
||||
- 操作员选好对应关系,点保存;
|
||||
- `[必须]` 保存的是**可复用的 SKU 映射**,不是这一张订单的临时数据。
|
||||
下次遇到同一个蝦皮 SKU 自动带出,操作员只需确认。
|
||||
- `[必须]` 该商品尚未采集(`pdd_data` 为空)时,弹窗要明确提示"请先到蝦皮数据模块采集",
|
||||
- `[必须]` 该商品尚未采集(`skus_json` 为空)时,弹窗直接展示关联和创建采集任务入口,
|
||||
而不是显示一个空列表让人困惑。
|
||||
|
||||
**创建采购任务:** 勾选若干行 → 点按钮 → 校验通过后生成任务。校验规则见 §5。
|
||||
**创建采购任务:** 只有映射仍有效且没有进行中采购任务的行可勾选。确认弹窗要求
|
||||
选择当前账号可见的客户端,并逐行确认人民币价格上限;服务端仍按 §5 全量复核。
|
||||
|
||||
**底部状态条:** 最近同步时间、待匹配条数。
|
||||
|
||||
@@ -330,11 +332,13 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
`[必须]` 下面任何一条不满足就不允许创建,并明确告诉操作员缺什么:
|
||||
|
||||
1. 该蝦皮商品已填 PDD 链接;
|
||||
2. 该蝦皮商品已采集成功(`pdd_data` 非空);
|
||||
2. 当前 PDD 商品已采集成功(`skus_json` 非空);
|
||||
3. 该蝦皮 SKU 已有 PDD 规格映射;
|
||||
4. 数量大于 0;
|
||||
5. **价格上限已填且大于 0** —— 默认从 `pdd_data` 里该 SKU 的价格带出,操作员可改,但不允许为空;
|
||||
6. 已选择分配的客户端。
|
||||
5. **价格上限已填且大于 0** —— 默认从当前映射的 PDD 规格价格带出,操作员可改,但不允许为空;
|
||||
6. 已选择分配的客户端;
|
||||
7. 所选客户端存在且在当前账号可见范围内;
|
||||
8. 同一顺运宝明细没有 `pending` / `assigned` / `claimed` 的采购任务。
|
||||
|
||||
第 5 条是硬要求:Client 契约规定采购任务必须带明确的价格保护
|
||||
(见 [Client 契约](../client/04-admin-api-contract.md) §4),没有它 Client 会拒绝执行。
|
||||
@@ -396,7 +400,7 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
| PDD 采购价、价格上限 | 人民币 | `max_price_cent` |
|
||||
|
||||
`[必须]` **两种币种不得混用,不得互相换算后覆盖原值。**
|
||||
采购任务里的价格上限是**人民币**,来源是采集回来的 PDD 价格,
|
||||
采购任务里的价格上限是**人民币**,默认来源是采集回来的 PDD 价格,并由采购员逐行确认,
|
||||
和蝦皮的台币售价没有换算关系。
|
||||
|
||||
`[待定]` 是否需要展示汇率或利润,待业务确认。MVP 不做。
|
||||
|
||||
@@ -455,11 +455,12 @@ CREATE INDEX idx_syb_orders_list ON syb_orders(updated_at DESC, syb_id DESC);
|
||||
|
||||
**"编号能对上"和"本地一定查得到"是两回事,别混。**
|
||||
|
||||
**"匹配状态"是派生的,不存字段**:`shopee_sku_id` 非空就是"已匹配"(本工单未做
|
||||
`sku_mappings` 联查复用,规格匹配是后续工单的范围)。
|
||||
**处理阶段是派生的,不存字段**:`shopee_sku_id` 非空只表示蝦皮规格已确认。
|
||||
PDD 规格是否已匹配要联查 `sku_mappings`,同时限定 `shopee_sku_id` 和当前
|
||||
`pdd_goods_id`,并确认 `pdd_option_key` 仍存在于最新 `skus_json`;选项消失后按待匹配处理。
|
||||
|
||||
`[必须]` **`shopee_sku_id` 顺运宝同步绝不能覆盖**(工单 #46)。它是规格匹配的
|
||||
结果(人工确认或自动匹配产生),顺运宝那边根本没有这个值(顺运宝只给商品级 `productId`,
|
||||
`[必须]` **`shopee_sku_id` 顺运宝同步绝不能覆盖**(工单 #46)。它是蝦皮规格识别
|
||||
结果(人工确认或确定性唯一识别产生),顺运宝那边根本没有这个值(顺运宝只给商品级 `productId`,
|
||||
不含蝦皮規格ID,见 §5.1 下方接口对照)。`repository.UpsertSybOrder` 的
|
||||
`ON CONFLICT DO UPDATE SET` 里不出现这一列,新建行时才会写它(此时通常是空值)。
|
||||
|
||||
|
||||
@@ -64,6 +64,9 @@ X-Client-Id: client-001
|
||||
|
||||
排序 `ORDER BY (assigned_client IS NULL), priority DESC, created_at`
|
||||
—— **指定给本机的优先**;
|
||||
|
||||
网页创建的采购任务固定走第一种:创建前已经校验当前账号对客户端的可见范围,
|
||||
并写入 `pdd_options`、`quantity` 和人民币 `max_price_cent`。这不改变 Client 接口字段。
|
||||
3. 没有就返回 `204 No Content`;
|
||||
4. 有就把 `status` 改成 `claimed`、记 `claimed_at`,返回任务。
|
||||
|
||||
|
||||
@@ -476,7 +476,7 @@ HTML 片段,只替换弹窗内部的表格、总数和分页。主货运单表
|
||||
- 图片显示小缩略图。`[必须]` 存 URL,不要把图片塞进数据库。
|
||||
- 处理阶段是按当前关联事实**算出来的**,不是存一份容易过期的状态字段。阶段至少区分:
|
||||
未找到蝦皮商品、待确认蝦皮规格、未关联 PDD、PDD 待采集、采集中、采集失败、
|
||||
规格待匹配和可采购。`shopee_sku_id` 非空只说明蝦皮规格已确认。
|
||||
规格待匹配、可采购、采购数据异常和已创建任务。`shopee_sku_id` 非空只说明蝦皮规格已确认。
|
||||
- 每行显示一个有文字的“下一步”按钮;双击行和按钮打开同一个服务端渲染处理弹窗。
|
||||
- 规格原文完全一致,或解析后的颜色尺码只有一个唯一候选时,系统可以自动确认
|
||||
蝦皮 SKU;零候选或多候选必须由采购员选择,不能模糊猜测。
|
||||
@@ -510,21 +510,25 @@ HTML 片段,只替换弹窗内部的表格、总数和分页。主货运单表
|
||||
|
||||
`[必须]` 几条硬规则:
|
||||
|
||||
- 右侧下拉的选项来自该商品 `pdd_data` 里的 `dimensions`,
|
||||
- 右侧下拉的选项来自该商品 `skus_json` 里的 `dimensions`,
|
||||
**不要写死"颜色/尺码"两个维度**——PDD 商品可能有第三个维度。
|
||||
- **打开时先查 `sku_mappings`**,有记录就自动带出并提示"已自动带出"。
|
||||
这是省人工的关键:同一个蝦皮 SKU 只需人工匹配一次。
|
||||
- 该商品**还没采集**(`pdd_data` 为空)时,不要显示一个空下拉让人困惑,
|
||||
直接提示:"该商品尚未采集 PDD 数据,请先到『蝦皮数据』填写链接并采集",
|
||||
并给一个跳转链接。
|
||||
- 查询必须同时带当前 `pdd_goods_id`,并核对选项仍存在且可购买;换品或选项消失时回到待匹配。
|
||||
- 该商品**还没采集**(`skus_json` 为空)时,不要显示空下拉,直接展示关联和创建采集任务入口。
|
||||
- 保存写的是 `sku_mappings`(可复用),**不是这一张订单的临时数据**。
|
||||
|
||||
### 6.4 创建采购任务
|
||||
|
||||
勾选若干行 → 点按钮 → 逐条校验(见 [01 需求](01-requirements.md) §5)。
|
||||
只有“可创建采购任务”的行可勾选。勾选后打开服务端渲染的确认弹窗:选择当前账号
|
||||
可见的客户端,并逐行确认人民币价格上限。默认值来自映射规格的 PDD 采集价;没有价格时留空强制填写。
|
||||
|
||||
`[必须]` 校验不过的**不要静默跳过**,要列出来告诉操作员缺什么:
|
||||
|
||||
- 同一批中合法行可以创建,失败行逐条显示明细 ID 和原因;数据库错误则整批回滚。
|
||||
- 同一明细已有 `pending`、`assigned` 或 `claimed` 的采购任务时拒绝重复创建。
|
||||
- 顺运宝列表继续显示台币售价,但绝不把它带入人民币价格上限。
|
||||
|
||||
```text
|
||||
成功创建 3 个任务。以下 2 条未创建:
|
||||
· SO-...-007 该商品未填写 PDD 链接
|
||||
@@ -532,7 +536,7 @@ HTML 片段,只替换弹窗内部的表格、总数和分页。主货运单表
|
||||
```
|
||||
|
||||
`[必须]` 创建前弹出确认框,让操作员选**分配给哪个客户端**,并确认价格上限。
|
||||
价格上限默认从 `pdd_data` 带出,可改,**不允许为空**。
|
||||
价格上限默认从当前映射的 PDD 规格采集价带出,可改,**不允许为空**。
|
||||
|
||||
## 7. 采集采购页
|
||||
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
再加解析失败的用例(确认 `parse_ok=0` 且不瞎猜);
|
||||
- **Excel 导入分行**:商品汇总行 vs SKU 行的判断;
|
||||
- **upsert 不覆盖人工字段**:先填 PDD 链接,再导入一次,断言链接还在;
|
||||
- 任务创建校验(六条规则逐条);
|
||||
- 任务创建校验:商品、采集结果、有效映射、数量、人民币价格上限、客户端可见范围逐条覆盖;
|
||||
- 采购任务重复提交保护、部分业务失败、PDD 换品隔离和采集选项失效;
|
||||
- 金额换算显示(分 ↔ 元),边界值 0 和大额;
|
||||
- SKU 映射复用:第二次匹配同一 SKU 应自动带出;
|
||||
- 在线状态派生:`last_seen_at` 刚好在边界前后。
|
||||
@@ -57,6 +58,7 @@
|
||||
- **任务已重派给别人,原客户端提交仍被接受**;
|
||||
- 同一任务收到两个客户端的两份结果,都存下来;
|
||||
- 数据库从上一版本迁移,人工数据不丢。
|
||||
- 创建采购任务后通过现有 Client 契约读取,断言目标规格、数量、人民币价格上限和指定客户端完整;
|
||||
|
||||
中间三条是 [04](04-client-api.md) §4.1 那条最容易写错的规则,**必须有测试盯着**。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user