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>
41 lines
2.3 KiB
PL/PgSQL
41 lines
2.3 KiB
PL/PgSQL
-- 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 走前端 reportEvent,id=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; |