Files
huang b11edde720
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m19s
fix: 注册佣金计算任务 Handler 到队列处理器
佣金计算任务 (commission:calculate) 的 Handler 已实现但未在队列处理器中注册,
导致支付成功后入队的佣金计算任务永远不会被消费执行。

变更内容:
- 在 pkg/queue/handler.go 中添加 registerCommissionCalculationHandler() 方法
- 创建所有需要的 Store 和 Service 依赖
- 在 RegisterHandlers() 中调用注册方法

修复后,订单支付成功将正确触发佣金计算和发放。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:08:03 +08:00

2.4 KiB
Raw Blame History

Context

支付成功后,订单服务通过 enqueueCommissionCalculation() 将佣金计算任务入队到 Asynq 队列(任务类型 commission:calculate)。然而,pkg/queue/handler.go 中的 RegisterHandlers() 方法没有注册对应的 Handler导致任务永远不会被消费。

现有组件

  • internal/task/commission_calculation.go - 定义了 CommissionCalculationHandlerNewCommissionCalculationHandler()
  • 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.goregisterCommissionCalculationHandler() 方法中本地创建 Service 及其依赖

选项 B:修改 NewHandler() 签名,增加 commission_calculation.Service 参数

选择理由:选项 A 与现有的 registerCommissionStatsHandlers() 模式一致,不需要修改外部调用 NewHandler() 的代码。

决策 2依赖创建方式

commission_calculation.Service 需要以下依赖:

  • *gorm.DB - Handler 已有
  • 多个 StoreCommissionRecord、Shop、ShopPackageAllocation 等)- 需在方法内创建
  • *commission_stats.Service - 需在方法内创建
  • *zap.Logger - Handler 已有

参考 registerCommissionStatsHandlers() 的模式,在注册方法内部创建所有需要的 Store 和 Service。

Risks / Trade-offs

风险 缓解措施
Store 实例重复创建 可接受Store 是无状态的轻量级对象,且只在启动时创建一次
历史任务可能已过期 提供补偿机制(后台扫描 commission_status=pending 的已支付订单)
并发任务可能重复处理 已有幂等检查(commission_status == calculated 则跳过)