fix: 修复顺运宝采集任务孤儿状态 (#165)
This commit is contained in:
+20
-7
@@ -387,7 +387,8 @@ func SetCollectFailed(q Execer, pddGoodsID, msg, artifactRef string) error {
|
||||
//
|
||||
// 允许发起采集的状态:
|
||||
// - pending / failed —— 没有任务在跑;
|
||||
// - collecting **且已经超时**(`updated_at` 早于 `now - model.CollectStaleAfter`)
|
||||
// - collecting **且已经超时**(`updated_at` 早于 `now - model.CollectStaleAfter`),
|
||||
// 或数据库里已经没有有效采集任务;
|
||||
// —— 客户端离线、崩溃或任务被删都会让一个 collecting 卡住不动,
|
||||
// 这些是常态不是异常,界面上必须有出口,见 #24。
|
||||
//
|
||||
@@ -414,11 +415,17 @@ func MarkCollecting(q Execer, pddGoodsID string) (bool, error) {
|
||||
staleBefore := now.Add(-model.CollectStaleAfter).UTC().Format(model.TimeLayout)
|
||||
|
||||
res, err := q.Exec(`
|
||||
UPDATE pdd_products
|
||||
UPDATE pdd_products AS pp
|
||||
SET collect_status = 'collecting', updated_at = ?
|
||||
WHERE goods_id = ? AND deleted_at IS NULL
|
||||
WHERE pp.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 (
|
||||
SELECT 1 FROM tasks t
|
||||
WHERE t.task_type='collect' AND t.pdd_goods_id=pp.goods_id
|
||||
AND t.status IN ('pending','assigned','claimed')
|
||||
)
|
||||
)) )`,
|
||||
nowISO, pddGoodsID, staleBefore)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("标记 PDD 商品 %s 采集中失败: %w", pddGoodsID, err)
|
||||
@@ -442,11 +449,17 @@ func MarkRecollecting(q Execer, pddGoodsID string) (bool, error) {
|
||||
staleBefore := now.Add(-model.CollectStaleAfter).UTC().Format(model.TimeLayout)
|
||||
|
||||
res, err := q.Exec(`
|
||||
UPDATE pdd_products
|
||||
UPDATE pdd_products AS pp
|
||||
SET collect_status = 'collecting', updated_at = ?
|
||||
WHERE goods_id = ? AND deleted_at IS NULL
|
||||
WHERE pp.goods_id = ? AND deleted_at IS NULL
|
||||
AND ( collect_status IN ('pending', 'failed', 'collected')
|
||||
OR (collect_status = 'collecting' AND updated_at < ?) )`,
|
||||
OR (collect_status = 'collecting' AND (
|
||||
updated_at < ? OR NOT EXISTS (
|
||||
SELECT 1 FROM tasks t
|
||||
WHERE t.task_type='collect' AND t.pdd_goods_id=pp.goods_id
|
||||
AND t.status IN ('pending','assigned','claimed')
|
||||
)
|
||||
)) )`,
|
||||
nowISO, pddGoodsID, staleBefore)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("标记 PDD 商品 %s 重新采集中失败: %w", pddGoodsID, err)
|
||||
|
||||
Reference in New Issue
Block a user