All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m44s
将 getDiscount 和 isNewUserOnlyForQuantity 的匹配逻辑从 inputMonths >= discount.Quantity 改为 inputMonths == discount.Quantity, 买多少天就用多少天对应的折扣,避免错误配置导致折扣泄漏。 同时增加 discount 值合法性校验(>0 且 <100)。 Co-Authored-By: claude-flow <ruv@ruv.net>
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package portal
|
|
|
|
import (
|
|
"github.com/perfect-panel/server/internal/model/coupon"
|
|
"github.com/perfect-panel/server/internal/model/payment"
|
|
"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
|
|
}
|
|
|
|
func calculateCoupon(amount int64, couponInfo *coupon.Coupon) int64 {
|
|
if couponInfo.Type == 1 {
|
|
return int64(float64(amount) * (float64(couponInfo.Discount) / float64(100)))
|
|
} else {
|
|
return min(couponInfo.Discount, amount)
|
|
}
|
|
}
|
|
|
|
func calculateFee(amount int64, config *payment.Payment) int64 {
|
|
var fee float64
|
|
switch config.FeeMode {
|
|
case 0:
|
|
return 0
|
|
case 1:
|
|
fee = float64(amount) * (float64(config.FeePercent) / float64(100))
|
|
case 2:
|
|
if amount > 0 {
|
|
fee = float64(config.FeeAmount)
|
|
}
|
|
case 3:
|
|
fee = float64(amount)*(float64(config.FeePercent)/float64(100)) + float64(config.FeeAmount)
|
|
}
|
|
return int64(fee)
|
|
}
|