feat(mq): task:event task type + business event constants

- pkg/mq/tasks/task_events.go (new): business event constants
  - EventDailyLogin, EventDailyBrowseAsset, EventDailyMint, EventDailyPlaceAsset
  - TaskEventPayload{UserID, StarID, EventType}
- pkg/mq/tasks/registry.go: +TypeTaskEvent = 'task:event'

Spec §3 F3 separation: business event constants live in task_events.go;
MQ task type strings live in registry.go (revenue:/gallery:/* style).

Consumed by:
- assetService/mq/producer.go (Phase F.1 emitter for daily_mint)
- frontend pages (Phase F.2 callers via task-api.js reportEvent -> gateway -> task:event)
- taskService/mq/consumer.go (Phase E consumer -> ProcessTaskEvent)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
zerosaturation 2026-07-27 15:41:49 +08:00
parent e2f1122cc8
commit ecdd96da5b
2 changed files with 53 additions and 0 deletions

View File

@ -60,6 +60,12 @@ const (
// 重试: 3 次,handler 内按 exhibition_id 幂等
TypeUserAccumulateHours = "user:accumulate-hours"
// TypeTaskEvent 通用业务事件入口daily-task 引擎消费)
// 生产者: assetService(铸造成功处 emit daily_mint) + 前端 reportEvent RPC(daily_login/daily_browse_asset/daily_place_asset)
// 消费者: taskService
// 重试: 3 次,handler 内按 user_id+star_id+task_key 幂等pending→completed 一次性)
TypeTaskEvent = "task:event"
// ===== Phase 2+: 预留(本期不实现,仅占位方便后续查阅)=====
TypeAssetAccumulateHours = "asset:accumulate-hours"

View File

@ -0,0 +1,47 @@
// Package tasks 业务事件枚举与 task:event payload 定义。
//
// 与 registry.go 的关系spec §3 F3 修正版):
// - registry.go 收拢所有 MQ TaskType 字符串常量与 Phase 1 Payload 结构
// - 本文件专注"业务事件枚举"task:event payload.EventType 字段取值)
// 供 task_definitions.trigger_event 列引用;与 MQ 任务类型分层
//
// 业务事件归属spec §3 表):
// - daily_login 前端 Header.vue reportEvent
// - daily_browse_asset 前端 asset-detail.vue reportEvent迁移自 exhibition.vue 错位实现)
// - daily_mint 后端 assetService/mint_service.go 铸造成功 emit
// - daily_place_asset 前端 myWorks.vue placeAssetToGalleryApi 成功后 reportEvent
package tasks
// ===== 业务事件枚举 =====
//
// 取值即 task_definitions.trigger_event 列的合法值;
// 新增事件 = 在此加常量 + 在该行为的源头 emit 一次spec §3 治理规则 #2
const (
// EventDailyLogin 每日首次活跃(进入 home。前端 Header.vue 触发。
EventDailyLogin = "daily_login"
// EventDailyBrowseAsset 每日首次浏览藏品详情。前端 asset-detail.vue onLoad 触发。
// 修复前exhibition.vue:1566 错位实现。
EventDailyBrowseAsset = "daily_browse_asset"
// EventDailyMint 每日首次铸造。后端 assetService/mint_service.go 铸造成功 emit。
EventDailyMint = "daily_mint"
// EventDailyPlaceAsset 每日首次上架作品。前端 myWorks.vue placeAssetToGalleryApi 成功后触发。
EventDailyPlaceAsset = "daily_place_asset"
)
// ===== task:event payload =====
//
// TaskEventPayload 是一条 task:event MQ 消息的 body。
// 由 assetService / 前端 reportEvent → gateway → taskService consumer 链路消费。
// TaskEventPayload task:event MQ 消息 payload。
// 来源assetService 铸造成功处 / 前端 reportEvent RPC → gateway 转发。
// 消费者taskService MQ consumer → DailyTaskService.ProcessTaskEvent。
type TaskEventPayload struct {
UserID int64 `json:"user_id"`
StarID int64 `json:"star_id"`
EventType string `json:"event_type"` // 取自 EventDailyXxx 常量task_definitions.trigger_event 匹配键
}