You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.1 KiB

4 years ago
package order_preview
import (
"github.com/gin-gonic/gin"
"github.com/shopspring/decimal"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/order_preview"
"recook/internal/model/user"
"recook/tools"
)
type updateOrderCouponUseStatusParam struct {
UserID uint `json:"userId" validate:"required"`
OrderID uint `json:"orderId" validate:"required"`
}
func UpdatePreOrderNoUseCoupon(c *gin.Context) {
var p updateOrderCouponUseStatusParam
if err := tools.ParseParams(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
var preOrderInfo order_preview.Information
if err := dbc.DB.First(&preOrderInfo, "id = ?", p.OrderID).Error; err != nil {
back.Err(c, err.Error())
return
}
var coupons []order_preview.CouponDetail
if err := dbc.DB.Find(&coupons, "order_id = ?", p.OrderID).Error; err != nil {
back.Err(c, err.Error())
return
}
if len(coupons) == 0 {
back.Fail(c, "没有优惠券可以使用")
return
}
var preGoodsList []order_preview.GoodsDetail
if err := dbc.DB.Find(&preGoodsList, "order_id = ?", p.OrderID).Error; err != nil {
back.Err(c, err.Error())
return
}
tx := dbc.DB.Begin()
{
// 将优惠券记录删除 将订单中的优惠券金额减去 将实际支付价格修改成没有优惠券的价格 瑞币抵扣重新计算
brandCouponTotalAmount := decimal.NewFromFloat(0.0)
universeCouponTotalAmount := decimal.NewFromFloat(0.0)
coinTotalAmount := decimal.NewFromFloat(0.0)
var wallet user.Wallet
if err := dbc.DB.First(&wallet, "user_id = ?", p.UserID).Error; err != nil {
back.Err(c, err.Error())
return
}
for _, v := range coupons {
if v.Scope == 0 { // 通用的
universeCouponTotalAmount = universeCouponTotalAmount.Add(v.DeductedAmount)
} else if v.Scope == 1 {
brandCouponTotalAmount = brandCouponTotalAmount.Add(v.DeductedAmount)
}
if err := tx.Delete(&v).Error; err != nil {
tx.Rollback()
back.Err(c, err.Error())
return
}
}
if wallet.Coin.GreaterThanOrEqual(decimal.NewFromInt(1)) { // 瑞币金额不小于1块钱时可以抵扣
//walletCoinAmount := decimal.NewFromInt(int64(wallet.Coin)).Div(decimal.NewFromInt(100)) // 将瑞币折算为实际金额
walletCoinAmount := wallet.Coin // 1 瑞币 == 1 rmb
if preOrderInfo.ActualTotalAmount.Add(preOrderInfo.CoinTotalAmount).GreaterThanOrEqual(walletCoinAmount) { // 只能抵扣部分价格, 全部花光瑞比
coinTotalAmount = walletCoinAmount
} else {
// 不能全部花光瑞比,瑞比足够支付时 将瑞币直接使用掉 订单金额为0
coinTotalAmount = preOrderInfo.ActualTotalAmount.Add(preOrderInfo.CoinTotalAmount)
}
}
if err := tx.Model(&preOrderInfo).Updates(map[string]interface{}{
"brand_coupon_total_amount": 0.0,
"universe_coupon_total_amount": 0.0,
"coin_total_amount": coinTotalAmount,
"actual_total_amount": preOrderInfo.ActualTotalAmount.Add(preOrderInfo.CoinTotalAmount).Sub(coinTotalAmount).Add(preOrderInfo.BrandCouponTotalAmount).Add(preOrderInfo.UniverseCouponTotalAmount),
}).Error; err != nil {
tx.Rollback()
back.Err(c, err.Error())
return
}
length := len(preGoodsList)
previousCoinTotalAmount := decimal.NewFromFloat(0.0)
for i, v := range preGoodsList {
coinAmount := decimal.NewFromFloat(0.0)
if i == length-1 { // 保证没有循环小数
coinAmount = coinTotalAmount.Sub(previousCoinTotalAmount)
} else {
rate := (v.GoodsAmount.Add(v.ExpressFee)).Div(preOrderInfo.GoodsTotalAmount.Add(preOrderInfo.ExpressTotalFee))
coinAmount = coinTotalAmount.Mul(rate).Round(2)
previousCoinTotalAmount = previousCoinTotalAmount.Add(coinAmount)
}
if err := tx.Model(&v).Updates(map[string]interface{}{
"brand_coupon_amount": 0.0,
"universe_coupon_amount": 0.0,
"coin_amount": coinAmount,
"actual_amount": v.ActualAmount.Add(v.BrandCouponAmount).Add(v.UniverseCouponAmount).Sub(coinAmount),
}).Error; err != nil {
tx.Rollback()
back.Err(c, err.Error())
return
}
}
}
tx.Commit()
back.Suc(c, "", queryPreviewOrderGroup(preOrderInfo.ID))
}