shanshanzhong 9987bd43fa
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m53s
fix(订单): 修复折扣计算问题并添加四舍五入处理
统一处理百分比和系数两种折扣输入方式,增加边界保护
在金额计算中使用math.Round进行四舍五入处理
添加相关单元测试确保计算准确性
2025-12-02 02:22:09 -08:00

52 lines
1.2 KiB
Go

package portal
import (
"math"
"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) float64 {
final := 1.0
for _, d := range discounts {
val := d.Discount
if val > 1 && val <= 100 {
val = val / 100.0
}
if val < 0 {
val = 0
}
if inputMonths >= d.Quantity && val < final {
final = val
}
}
return final
}
func calculateCoupon(amount int64, couponInfo *coupon.Coupon) int64 {
if couponInfo.Type == 1 {
return int64(math.Round(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(math.Round(fee))
}