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.

130 lines
4.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package order_preview
import (
"github.com/gin-gonic/gin"
"github.com/shopspring/decimal"
"log"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/coupon"
"recook/internal/model/order_preview"
"recook/tools"
"time"
)
type updateCouponRequest struct {
UserID uint `json:"userId" validate:"numeric"`
OrderID uint `json:"orderId" validate:"numeric"`
CouponID []uint `json:"couponId" validate:"numeric"`
}
// 修改订单的优惠券
func UpdateCoupon(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
log.Println("服务器出错:", err)
back.Fail(c, "服务器出错")
return
}
}()
var p updateCouponRequest
if err := tools.ParseParams(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
// todo 这里可能以后有个逻辑需要考虑,就是以后优惠券多了之后,是否一个订单可以用多个通用券(品牌券)
// 如果需只能用一张同一类的券,这里需要限制,做判断
// 产品说这里只有一张优惠券可以使用
// 提前加判断,如果以后取消,删除判断代码即可
if len(p.CouponID) > 1 {
back.Fail(c, "一次只能选择一张优惠券")
return
}
// 修改优惠券后,要修改订单,重新计算价格
//查找订单
var previewOrderInfo order_preview.Information
previewOrderInfo.UserID = p.UserID
err := dbc.DB.First(&previewOrderInfo, p.OrderID).Error
if err != nil {
back.Err(c, err.Error())
return
}
// 查找优惠券
var couponInfos []coupon.ReceiverMid
err = dbc.DB.Where(" start_time <= ? AND end_time > ?", time.Now(), time.Now()).Find(&couponInfos, p.CouponID).Error
if err != nil {
back.Err(c, err.Error())
return
}
// 计算减免金额, 暂时只有一张优惠券, 其实可以不用for 不过以后要是取消限制,这里不需要改, zhi
var universeCoupon []coupon.ReceiverMid // 通用券
universeCouponReducePrice := decimal.NewFromFloat(0.0) // 通用优惠券抵扣的价格
var brandCoupon []coupon.ReceiverMid // 品牌券
brandCouponReducePrice := decimal.NewFromFloat(0.0) // 品牌优惠券抵扣的价格
for _, couponInfo := range couponInfos {
if couponInfo.BrandID > 0 {
brandCoupon = append(brandCoupon, couponInfo)
brandCouponReducePrice.Add(decimal.NewFromInt(int64(couponInfo.Cash)))
} else if couponInfo.BrandID == 0 {
universeCoupon = append(universeCoupon, couponInfo)
universeCouponReducePrice.Add(decimal.NewFromInt(int64(couponInfo.Cash)))
}
}
// 实际支付的金额 = (老)实际支付 + (老)优惠券减免 - (新)优惠券减免
actualAmount := previewOrderInfo.ActualTotalAmount.Add(previewOrderInfo.BrandCouponTotalAmount).
Add(previewOrderInfo.UniverseCouponTotalAmount).Sub(brandCouponReducePrice).Sub(universeCouponReducePrice)
// 修改订单信息, 实际支付,品牌优惠券,通用优惠券
previewOrderInfo.ActualTotalAmount = actualAmount
previewOrderInfo.BrandCouponTotalAmount = brandCouponReducePrice
previewOrderInfo.UniverseCouponTotalAmount = universeCouponReducePrice
tx := dbc.DB.Begin()
{
if err := dbc.DB.Save(&previewOrderInfo).Error; err != nil {
tx.Rollback()
back.Fail(c, "更新失败")
log.Println("更新失败1", err)
return
}
// 还要更新修改 recook_order_preview_coupon_detail 先删除原来的,再添加现在的
dbc.DB.Where("order_id = ?", p.OrderID).Delete(order_preview.CouponDetail{})
if err = UpdatePrevCouponInfo(p.OrderID, couponInfos); err != nil {
tx.Rollback()
back.Fail(c, "更新失败")
log.Println("更新失败2", err)
return
}
}
tx.Commit()
back.Suc(c, "更新成功", queryPreviewOrderGroup(p.OrderID))
return
}
func UpdatePrevCouponInfo(orderId uint, couponInfos []coupon.ReceiverMid) error {
for _, couponInfo := range couponInfos {
var newPrevCoupon order_preview.CouponDetail
newPrevCoupon.OrderID = orderId
newPrevCoupon.CouponID = couponInfo.CouponID
newPrevCoupon.BrandID = couponInfo.BrandID
newPrevCoupon.CouponName = couponInfo.Name
newPrevCoupon.PersonalCouponID = couponInfo.ID
newPrevCoupon.Scope = couponInfo.Scope
newPrevCoupon.DeductedAmount = decimal.NewFromInt(int64(couponInfo.Cash))
newPrevCoupon.EndTime = couponInfo.EndTime
if err := dbc.DB.Save(&newPrevCoupon).Error; err != nil {
return err
}
}
return nil
}