Files
junhong_cmp_fiber/internal/task/commission_calculation.go
huang e87513541b
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m41s
feat: 实现一次性佣金功能
- 新增佣金计算服务,支持一次性佣金和返佣计算
- 新增 ShopSeriesOneTimeCommissionTier 模型和存储层
- 新增两个数据库迁移:一次性佣金表和订单佣金字段
- 更新 Commission 模型,新增佣金来源和关联字段
- 更新 CommissionRecord 存储层,支持一次性佣金查询
- 更新 MyCommission 服务,集成一次性佣金计算逻辑
- 更新 ShopCommission 服务,支持一次性佣金统计
- 新增佣金计算异步任务处理器
- 更新 API 路由,新增一次性佣金相关端点
- 归档 OpenSpec 变更文档,同步规范到主规范库
2026-01-29 09:36:12 +08:00

67 lines
1.5 KiB
Go

package task
import (
"context"
"github.com/bytedance/sonic"
"github.com/hibiken/asynq"
"go.uber.org/zap"
"gorm.io/gorm"
"github.com/break/junhong_cmp_fiber/internal/service/commission_calculation"
pkggorm "github.com/break/junhong_cmp_fiber/pkg/gorm"
)
const (
TypeCommissionCalculation = "commission:calculate"
)
type CommissionCalculationPayload struct {
OrderID uint `json:"order_id"`
}
type CommissionCalculationHandler struct {
db *gorm.DB
service *commission_calculation.Service
logger *zap.Logger
}
func NewCommissionCalculationHandler(
db *gorm.DB,
service *commission_calculation.Service,
logger *zap.Logger,
) *CommissionCalculationHandler {
return &CommissionCalculationHandler{
db: db,
service: service,
logger: logger,
}
}
func (h *CommissionCalculationHandler) HandleCommissionCalculation(ctx context.Context, task *asynq.Task) error {
ctx = pkggorm.SkipDataPermission(ctx)
var payload CommissionCalculationPayload
if err := sonic.Unmarshal(task.Payload(), &payload); err != nil {
h.logger.Error("解析佣金计算任务载荷失败",
zap.Error(err),
zap.String("task_id", task.ResultWriter().TaskID()),
)
return asynq.SkipRetry
}
if err := h.service.CalculateCommission(ctx, payload.OrderID); err != nil {
h.logger.Error("佣金计算失败",
zap.Uint("order_id", payload.OrderID),
zap.Error(err),
)
return err
}
h.logger.Info("佣金计算成功",
zap.Uint("order_id", payload.OrderID),
)
return nil
}