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
124 lines
4.1 KiB
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))
|
|
}
|