From 4a2501a3d11168f271961a0620c68495deaee3da Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Thu, 26 Mar 2026 01:28:50 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8A=98=E6=89=A3=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=B2=BE=E7=A1=AE=E5=8C=B9=E9=85=8D=20quanti?= =?UTF-8?q?ty=EF=BC=8C=E4=B8=8D=E5=86=8D=E5=8F=96=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=9C=80=E5=B0=8F=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 getDiscount 和 isNewUserOnlyForQuantity 的匹配逻辑从 inputMonths >= discount.Quantity 改为 inputMonths == discount.Quantity, 买多少天就用多少天对应的折扣,避免错误配置导致折扣泄漏。 同时增加 discount 值合法性校验(>0 且 <100)。 Co-Authored-By: claude-flow --- internal/logic/public/order/getDiscount.go | 18 ++++++------------ internal/logic/public/portal/tool.go | 8 +++----- queue/logic/order/activateOrderLogic.go | 10 +++------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/internal/logic/public/order/getDiscount.go b/internal/logic/public/order/getDiscount.go index af21ced..ee7dd4e 100644 --- a/internal/logic/public/order/getDiscount.go +++ b/internal/logic/public/order/getDiscount.go @@ -3,32 +3,26 @@ package order import "github.com/perfect-panel/server/internal/types" func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 { - var finalDiscount float64 = 100 - for _, discount := range discounts { if discount.NewUserOnly && !isNewUser { continue } - if inputMonths >= discount.Quantity && discount.Discount < finalDiscount { - finalDiscount = discount.Discount + if inputMonths == discount.Quantity && discount.Discount > 0 && discount.Discount < 100 { + return discount.Discount / float64(100) } } - return finalDiscount / float64(100) + return 1 } // isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled. func isNewUserOnlyForQuantity(discounts []types.SubscribeDiscount, inputQuantity int64) bool { - var finalDiscount float64 = 100 - var newUserOnly bool - for _, discount := range discounts { - if inputQuantity >= discount.Quantity && discount.Discount < finalDiscount { - finalDiscount = discount.Discount - newUserOnly = discount.NewUserOnly + if inputQuantity == discount.Quantity { + return discount.NewUserOnly } } - return newUserOnly + return false } diff --git a/internal/logic/public/portal/tool.go b/internal/logic/public/portal/tool.go index 2fa92b6..939b599 100644 --- a/internal/logic/public/portal/tool.go +++ b/internal/logic/public/portal/tool.go @@ -7,17 +7,15 @@ import ( ) func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 { - var finalDiscount float64 = 100 - for _, discount := range discounts { if discount.NewUserOnly && !isNewUser { continue } - if inputMonths >= discount.Quantity && discount.Discount < finalDiscount { - finalDiscount = discount.Discount + if inputMonths == discount.Quantity && discount.Discount > 0 && discount.Discount < 100 { + return discount.Discount / float64(100) } } - return finalDiscount / float64(100) + return 1 } func calculateCoupon(amount int64, couponInfo *coupon.Coupon) int64 { diff --git a/queue/logic/order/activateOrderLogic.go b/queue/logic/order/activateOrderLogic.go index f2fdad6..ad4fe05 100644 --- a/queue/logic/order/activateOrderLogic.go +++ b/queue/logic/order/activateOrderLogic.go @@ -1479,15 +1479,11 @@ func (l *ActivateOrderLogic) RedemptionActivate(ctx context.Context, orderInfo * // isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled. func isNewUserOnlyForQuantity(discounts []internaltypes.SubscribeDiscount, inputQuantity int64) bool { - var finalDiscount float64 = 100 - var newUserOnly bool - for _, d := range discounts { - if inputQuantity >= d.Quantity && d.Discount < finalDiscount { - finalDiscount = d.Discount - newUserOnly = d.NewUserOnly + if inputQuantity == d.Quantity { + return d.NewUserOnly } } - return newUserOnly + return false }