fix: 折扣匹配改为精确匹配 quantity,不再取全局最小值
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m55s
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m55s
将 getDiscount 和 isNewUserOnlyForQuantity 的匹配逻辑从 inputMonths >= discount.Quantity 改为 inputMonths == discount.Quantity, 买多少天就用多少天对应的折扣,避免错误配置导致折扣泄漏。 同时增加 discount 值合法性校验(>0 且 <100)。 Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
parent
774fce6147
commit
4a2501a3d1
@ -3,32 +3,26 @@ package order
|
|||||||
import "github.com/perfect-panel/server/internal/types"
|
import "github.com/perfect-panel/server/internal/types"
|
||||||
|
|
||||||
func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 {
|
func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 {
|
||||||
var finalDiscount float64 = 100
|
|
||||||
|
|
||||||
for _, discount := range discounts {
|
for _, discount := range discounts {
|
||||||
if discount.NewUserOnly && !isNewUser {
|
if discount.NewUserOnly && !isNewUser {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if inputMonths >= discount.Quantity && discount.Discount < finalDiscount {
|
if inputMonths == discount.Quantity && discount.Discount > 0 && discount.Discount < 100 {
|
||||||
finalDiscount = discount.Discount
|
return discount.Discount / float64(100)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return finalDiscount / float64(100)
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled.
|
// isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled.
|
||||||
func isNewUserOnlyForQuantity(discounts []types.SubscribeDiscount, inputQuantity int64) bool {
|
func isNewUserOnlyForQuantity(discounts []types.SubscribeDiscount, inputQuantity int64) bool {
|
||||||
var finalDiscount float64 = 100
|
|
||||||
var newUserOnly bool
|
|
||||||
|
|
||||||
for _, discount := range discounts {
|
for _, discount := range discounts {
|
||||||
if inputQuantity >= discount.Quantity && discount.Discount < finalDiscount {
|
if inputQuantity == discount.Quantity {
|
||||||
finalDiscount = discount.Discount
|
return discount.NewUserOnly
|
||||||
newUserOnly = discount.NewUserOnly
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return newUserOnly
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,17 +7,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 {
|
func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 {
|
||||||
var finalDiscount float64 = 100
|
|
||||||
|
|
||||||
for _, discount := range discounts {
|
for _, discount := range discounts {
|
||||||
if discount.NewUserOnly && !isNewUser {
|
if discount.NewUserOnly && !isNewUser {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if inputMonths >= discount.Quantity && discount.Discount < finalDiscount {
|
if inputMonths == discount.Quantity && discount.Discount > 0 && discount.Discount < 100 {
|
||||||
finalDiscount = discount.Discount
|
return discount.Discount / float64(100)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return finalDiscount / float64(100)
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func calculateCoupon(amount int64, couponInfo *coupon.Coupon) int64 {
|
func calculateCoupon(amount int64, couponInfo *coupon.Coupon) int64 {
|
||||||
|
|||||||
@ -1479,15 +1479,11 @@ func (l *ActivateOrderLogic) RedemptionActivate(ctx context.Context, orderInfo *
|
|||||||
|
|
||||||
// isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled.
|
// isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled.
|
||||||
func isNewUserOnlyForQuantity(discounts []internaltypes.SubscribeDiscount, inputQuantity int64) bool {
|
func isNewUserOnlyForQuantity(discounts []internaltypes.SubscribeDiscount, inputQuantity int64) bool {
|
||||||
var finalDiscount float64 = 100
|
|
||||||
var newUserOnly bool
|
|
||||||
|
|
||||||
for _, d := range discounts {
|
for _, d := range discounts {
|
||||||
if inputQuantity >= d.Quantity && d.Discount < finalDiscount {
|
if inputQuantity == d.Quantity {
|
||||||
finalDiscount = d.Discount
|
return d.NewUserOnly
|
||||||
newUserOnly = d.NewUserOnly
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return newUserOnly
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user