fix: 修复顺运宝采集任务孤儿状态 (#165)
This commit is contained in:
@@ -108,6 +108,10 @@ SQLite 同一时刻只允许一个写事务,连接放太开会互相抢锁、
|
||||
| v8(#59) | 顺运宝同步记录:新增 `syb_sync_runs` 和开始时间倒序索引;未改写 v1–v7。 |
|
||||
| v9(#151) | `syb_orders` 增加可空 `shop_name`,从有效 `syb_data.stock.shopName` 回填历史店铺名;无效 JSON、缺字段和空白值保持 `NULL`。 |
|
||||
|
||||
生产 MySQL 迁移继续独立追加;v12(#165)新增 `task_syb_sources`,并把没有任何
|
||||
有效采集任务的孤立 `pdd_products.collect_status='collecting'` 回收到 `pending`。
|
||||
历史 SQLite migrations 保持冻结,不追加该表。
|
||||
|
||||
**v3 为什么丢弃旧 `sku_mappings` 数据(见 #20):** 新主键需要 `pdd_option_key`,
|
||||
这是 Go 的 `service.OptionKey()` 用 `json.Marshal` 算出来的规范化键,SQL 语句
|
||||
复现不了。硬凑一个键出来有两种后果:算错了会让映射静默失效,需要人工重新匹配一遍;
|
||||
@@ -290,8 +294,8 @@ CREATE INDEX idx_pdd_products_status ON pdd_products(collect_status);
|
||||
`collect_status` 就永远卡在 `collecting`,界面上没有任何入口能救回来,
|
||||
只能改数据库(见 #24)。
|
||||
|
||||
修复:`collecting` 状态超过 `model.CollectStaleAfter`(15 分钟)**也允许**
|
||||
重新建采集任务:
|
||||
修复:`collecting` 状态超过 `model.CollectStaleAfter`(15 分钟),或已经找不到
|
||||
`pending/assigned/claimed` 采集任务时,**也允许**重新建采集任务:
|
||||
|
||||
```sql
|
||||
-- repository.MarkCollecting,简化版
|
||||
@@ -299,7 +303,8 @@ UPDATE pdd_products
|
||||
SET collect_status = 'collecting', updated_at = ?
|
||||
WHERE goods_id = ? AND deleted_at IS NULL
|
||||
AND ( collect_status IN ('pending', 'failed')
|
||||
OR (collect_status = 'collecting' AND updated_at < ?) )
|
||||
OR (collect_status = 'collecting' AND
|
||||
(updated_at < ? OR NOT EXISTS (有效采集任务))) )
|
||||
```
|
||||
|
||||
`[必须]` 15 分钟为什么是这个数:采集本身几十秒到两分钟,加上排队等客户端来领,
|
||||
@@ -698,6 +703,29 @@ CREATE INDEX idx_tasks_order ON tasks(order_no);
|
||||
|
||||
状态含义见 [01 需求](01-requirements.md) §6.2。
|
||||
|
||||
### 7.1 `task_syb_sources` 采集任务来源(生产 MySQL v12)
|
||||
|
||||
从顺运宝创建采集任务时,同一个 PDD 商品可能对应多个货运单明细。来源使用关联表,
|
||||
不能压进 `tasks.syb_id` 单列;后者仍只表示采购任务自身的顺运宝明细。
|
||||
|
||||
```sql
|
||||
CREATE TABLE task_syb_sources (
|
||||
task_id VARCHAR(191) COLLATE utf8mb4_bin NOT NULL,
|
||||
syb_id VARCHAR(191) COLLATE utf8mb4_bin NOT NULL,
|
||||
created_at VARCHAR(35) NOT NULL,
|
||||
PRIMARY KEY (task_id, syb_id),
|
||||
KEY idx_task_syb_sources_syb (syb_id, task_id),
|
||||
FOREIGN KEY (task_id) REFERENCES tasks(task_id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (syb_id) REFERENCES syb_orders(syb_id) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
- `[必须]` 任务和全部来源在同一事务写入;按 PDD 商品去重后仍要保留每条来源。
|
||||
- `[必须]` 采集采购关键字搜索通过本表支持顺运宝订单号和明细 ID。
|
||||
- `[必须]` 删除任务后若同商品已无 `pending/assigned/claimed` 采集任务,必须在同一事务
|
||||
把仍为 `collecting` 的商品回收到 `pending`;有其他有效任务时不得回收。
|
||||
- 历史任务没有可靠来源,不做猜测回填,仍可按任务号和 PDD 商品 ID 查询。
|
||||
|
||||
## 8. `task_claims` 领取历史
|
||||
|
||||
记录"哪台客户端领过哪个任务"。
|
||||
|
||||
Reference in New Issue
Block a user