All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m34s
isNewUserOnlyForQuantity 原逻辑取第一条匹配记录即返回, 当同一 quantity 同时配置了 new_user_only=true 和 false 两档时, 结果依赖数组顺序,导致老用户/超24h用户触发 SubscribeNewUserOnly 错误。 修复:扫描所有同 quantity 档位,仅当存在 true 且无 false 兜底时才返回 true; 有 false 兜底则返回 false,老用户可正常购买并命中普通折扣档。 Co-Authored-By: claude-flow <ruv@ruv.net>
39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
package order
|
|
|
|
import "github.com/perfect-panel/server/internal/types"
|
|
|
|
func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 {
|
|
for _, discount := range discounts {
|
|
if discount.NewUserOnly && !isNewUser {
|
|
continue
|
|
}
|
|
if inputMonths == discount.Quantity && discount.Discount > 0 && discount.Discount < 100 {
|
|
return discount.Discount / float64(100)
|
|
}
|
|
}
|
|
|
|
return 1
|
|
}
|
|
|
|
// isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled.
|
|
// Returns true only when all matching tiers for the given quantity require new-user status
|
|
// (i.e. no fallback tier with new_user_only=false exists). When both a new-user-only tier
|
|
// and a general tier exist for the same quantity, non-new-users can still purchase via the
|
|
// general tier, so this returns false.
|
|
func isNewUserOnlyForQuantity(discounts []types.SubscribeDiscount, inputQuantity int64) bool {
|
|
hasNewUserOnly := false
|
|
hasFallback := false
|
|
for _, d := range discounts {
|
|
if d.Quantity != inputQuantity {
|
|
continue
|
|
}
|
|
if d.NewUserOnly {
|
|
hasNewUserOnly = true
|
|
} else {
|
|
hasFallback = true
|
|
}
|
|
}
|
|
return hasNewUserOnly && !hasFallback
|
|
}
|
|
|