All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m19s
佣金计算任务 (commission:calculate) 的 Handler 已实现但未在队列处理器中注册, 导致支付成功后入队的佣金计算任务永远不会被消费执行。 变更内容: - 在 pkg/queue/handler.go 中添加 registerCommissionCalculationHandler() 方法 - 创建所有需要的 Store 和 Service 依赖 - 在 RegisterHandlers() 中调用注册方法 修复后,订单支付成功将正确触发佣金计算和发放。 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
52 lines
2.4 KiB
Markdown
52 lines
2.4 KiB
Markdown
## 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` 则跳过) |
|