## Context 支付成功后,订单服务通过 `enqueueCommissionCalculation()` 将佣金计算任务入队到 Asynq 队列(任务类型 `commission:calculate`)。然而,`pkg/queue/handler.go` 中的 `RegisterHandlers()` 方法没有注册对应的 Handler,导致任务永远不会被消费。 **现有组件**: - `internal/task/commission_calculation.go` - 定义了 `CommissionCalculationHandler` 和 `NewCommissionCalculationHandler()` - `internal/service/commission_calculation/service.go` - 实现了 `CalculateCommission()` 业务逻辑 - `pkg/constants/constants.go` - 定义了 `TaskTypeCommission = "commission:calculate"` **缺失的连接**: - `pkg/queue/handler.go` 中没有调用 `task.NewCommissionCalculationHandler()` 并注册到 `mux` ## Goals / Non-Goals **Goals:** - 在 `pkg/queue/handler.go` 中注册 `CommissionCalculationHandler` - 确保所有依赖正确注入(`commission_calculation.Service` 及其依赖) - 修复后队列中积压的 `commission:calculate` 任务能被正常消费 **Non-Goals:** - 不修改佣金计算的业务逻辑 - 不修改任务入队的逻辑 - 不补偿历史丢失的任务(如果已从队列过期) ## Decisions ### 决策 1:在 Handler 结构体中注入 `commission_calculation.Service` **选项 A(选中)**:在 `pkg/queue/handler.go` 的 `registerCommissionCalculationHandler()` 方法中本地创建 Service 及其依赖 **选项 B**:修改 `NewHandler()` 签名,增加 `commission_calculation.Service` 参数 **选择理由**:选项 A 与现有的 `registerCommissionStatsHandlers()` 模式一致,不需要修改外部调用 `NewHandler()` 的代码。 ### 决策 2:依赖创建方式 `commission_calculation.Service` 需要以下依赖: - `*gorm.DB` - Handler 已有 - 多个 Store(CommissionRecord、Shop、ShopPackageAllocation 等)- 需在方法内创建 - `*commission_stats.Service` - 需在方法内创建 - `*zap.Logger` - Handler 已有 参考 `registerCommissionStatsHandlers()` 的模式,在注册方法内部创建所有需要的 Store 和 Service。 ## Risks / Trade-offs | 风险 | 缓解措施 | |------|---------| | Store 实例重复创建 | 可接受,Store 是无状态的轻量级对象,且只在启动时创建一次 | | 历史任务可能已过期 | 提供补偿机制(后台扫描 `commission_status=pending` 的已支付订单) | | 并发任务可能重复处理 | 已有幂等检查(`commission_status == calculated` 则跳过) |