topfans/backend/migrations/2026_07_21_004_daily_task_trigger.sql
zerosaturation 89d5d12450 fix(task): backfill id=1/2 trigger_event + cleanup misleading NULL comments
daily_browse_asset (id=2) / daily_login (id=1) 之前永远不触发,根因:
2026_07_21_004 迁移只 backfill 了 id=3/4 的 trigger_event=task_key,
id=1/2 留 NULL。但 ProcessTaskEvent 引擎按 trigger_event = ? 严格匹配
(spec §4 单一隔离单元),NULL 不会命中,前端 reportEvent 后引擎跑空
循环、daily-tasks 任务永远 pending。

修复:
- 新增 2026_07_27_005 迁移:回填 id=1/2 的 trigger_event=task_key(幂等)
- 修订原 004 迁移的错误注释('trigger_event 留 NULL'误导后人)
- model/task_models.go:删除 'NULL 仍走 def.TaskKey 兜底' 不实承诺
- impl plan §37/39:修订错描述('暂不依赖 trigger_event 列')
- docker/init-db.sql:124668/124671:重建 dev DB 时也带 trigger_event
- daily_task_repo_test.go:补 2 个回归测试
  - NullTriggerEvent_NotMatched:trigger_event=NULL 时查不到
  - TriggerEventEqualsTaskKey_Matches:trigger_event=task_key 时能命中

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 16:36:40 +08:00

41 lines
2.3 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 2026_07_21_004_daily_task_trigger.sql
-- 每日任务配置驱动改造(方案 A
-- 1) task_definitions 加 trigger_event / target_count 列
-- 2) user_daily_task_progress 加 progress 列
-- 3) Backfill id=3 (daily_mint) + id=4 (daily_place_asset) 的 trigger_event
-- id=1/2 走前端 reportEventid=5 onboarding 不动)
-- 配套实施计划docs/superpowers/plans/2026-07-21-daily-task-config-driven-impl.md
-- 执行前请先备份:
-- pg_dump -h <host> -U postgres -t task_definitions -t user_daily_task_progress <db> > backup_daily_task_004.sql
BEGIN;
-- (1) task_definitions 新列
ALTER TABLE task_definitions ADD COLUMN IF NOT EXISTS trigger_event varchar(64);
ALTER TABLE task_definitions ADD COLUMN IF NOT EXISTS target_count int NOT NULL DEFAULT 1;
-- (2) user_daily_task_progress 新列
ALTER TABLE user_daily_task_progress ADD COLUMN IF NOT EXISTS progress int NOT NULL DEFAULT 0;
-- (3) Backfill给"后端 emit 路径"的两个 daily 任务填 trigger_event。
-- daily_mint (id=3) 由 assetService.CreateMintOrder 成功后 emit
-- daily_place_asset (id=4) 由前端 myWorks.vue 上架成功后 reportEvent。
-- onboarding_complete (id=5) 不属于 daily留 NULL。
--
-- ★ 修正 2026-07-27
-- 原 SQL 漏 backfill id=1 (daily_login) / id=2 (daily_browse_asset)
-- 误以为"走前端 reportEvent 就不用填 trigger_event"——但 ProcessTaskEvent
-- 按 trigger_event = ? 严格匹配spec §4 单一隔离单元,无 NULL 兜底),
-- NULL 永远查不到引擎跑空循环daily-tasks 任务永远 pending。
-- 已在 2026_07_27_005 迁移中按 spec §2.1 原计划补回填。
UPDATE task_definitions SET trigger_event = 'daily_mint', target_count = 1 WHERE id = 3 AND task_type = 'daily';
UPDATE task_definitions SET trigger_event = 'daily_place_asset', target_count = 1 WHERE id = 4 AND task_type = 'daily';
-- (4) 防御target_count 默认值兜底(防止历史脏数据)
UPDATE task_definitions SET target_count = 1 WHERE target_count IS NULL OR target_count < 1;
-- (5) 序列同步CLAUDE.md 强制)
SELECT setval('task_definitions_id_seq', (SELECT COALESCE(MAX(id),1) FROM task_definitions));
SELECT setval('user_daily_task_progress_id_seq', (SELECT COALESCE(MAX(id),1) FROM user_daily_task_progress));
COMMIT;