修复(#85): 按数量匹配订阅促销价

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
2026-05-27 00:36:24 -07:00
parent 48e507783e
commit ae64cc635d
15 changed files with 209 additions and 41 deletions
+12 -12
View File
@@ -149,7 +149,14 @@ func (l *ActivateOrderLogic) ProcessTask(ctx context.Context, task *asynq.Task)
return err
}
l.recordPromoUsage(ctx, orderInfo)
if err = l.recordPromoUsage(ctx, orderInfo); err != nil {
logger.WithContext(ctx).Error("[ActivateOrderLogic] 促销使用记录写入失败,将重试",
logger.Field("order_no", orderInfo.OrderNo),
logger.Field("promo_rule_id", orderInfo.PromoRuleId),
logger.Field("error", err.Error()),
)
return err
}
l.finalizeCouponAndOrder(ctx, orderInfo)
commonLogic.SubscriptionTraceInfo(logger.WithContext(ctx), commonLogic.SubscriptionTraceFlowOrder, "activation_finished",
@@ -159,9 +166,9 @@ func (l *ActivateOrderLogic) ProcessTask(ctx context.Context, task *asynq.Task)
return nil
}
func (l *ActivateOrderLogic) recordPromoUsage(ctx context.Context, orderInfo *order.Order) {
func (l *ActivateOrderLogic) recordPromoUsage(ctx context.Context, orderInfo *order.Order) error {
if orderInfo == nil || orderInfo.PromoRuleId <= 0 || orderInfo.Quantity <= 0 || orderInfo.SubscribeId <= 0 || orderInfo.OrderNo == "" {
return
return nil
}
promoPrice := int64(0)
@@ -169,10 +176,10 @@ func (l *ActivateOrderLogic) recordPromoUsage(ctx context.Context, orderInfo *or
promoPrice = (orderInfo.Price - orderInfo.PromoDiscount) / orderInfo.Quantity
}
if promoPrice <= 0 {
return
return nil
}
err := l.svc.DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
return l.svc.DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
var count int64
if e := tx.Model(&promo.Usage{}).Where("order_no = ?", orderInfo.OrderNo).Count(&count).Error; e != nil {
return e
@@ -188,13 +195,6 @@ func (l *ActivateOrderLogic) recordPromoUsage(ctx context.Context, orderInfo *or
PromoPrice: promoPrice,
}, tx)
})
if err != nil {
logger.WithContext(ctx).Error("Insert promo usage failed",
logger.Field("error", err.Error()),
logger.Field("order_no", orderInfo.OrderNo),
logger.Field("promo_rule_id", orderInfo.PromoRuleId),
)
}
}
// parsePayload unMarshals the task payload into a structured format