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.

201 lines
5.4 KiB

package order_preview
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"github.com/shopspring/decimal"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/order_preview"
"recook/internal/model/store"
"recook/internal/model/user"
"recook/tools"
)
type updateOrderShippingMethodParam struct {
UserID uint `json:"userId" validate:"required"`
OrderID uint `json:"orderId" validate:"required"`
ShippingMethod uint `json:"shippingMethod"`
StoreID uint `json:"storeId"`
}
func UpdateOrderShippingMethod(c *gin.Context) {
var p updateOrderShippingMethodParam
err := tools.ParseParams(&p, c)
if err != nil {
back.Fail(c, err.Error())
return
}
if p.ShippingMethod == 1 && p.StoreID == 0 {
back.Fail(c, "未指定提货门店")
return
}
var previewOrderInfo order_preview.Information
dbc.DB.First(&previewOrderInfo, p.OrderID)
var goodsList []order_preview.GoodsDetail
dbc.DB.Find(&goodsList, "order_id = ?", p.OrderID)
if previewOrderInfo.ShippingMethod == 0 && p.ShippingMethod == 1 { // 改成自提
tx := dbc.DB.Begin()
{
// 增加自提逻辑
if err = updateStoreAddr(p.StoreID, p.OrderID); err != nil {
back.Fail(c, err.Error())
return
}
for _, v := range goodsList {
err = tx.Model(&v).Updates(map[string]interface{}{
"express_fee": 0.0,
"actual_amount": v.ActualAmount.Sub(v.ExpressFee),
}).Error
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
err = tx.Model(&previewOrderInfo).Updates(map[string]interface{}{
"shipping_method": 1,
"store_id": p.StoreID,
"express_total_fee": 0.0,
"actual_amount": previewOrderInfo.ActualTotalAmount.Sub(previewOrderInfo.ExpressTotalFee),
}).Error
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
tx.Commit()
} else if previewOrderInfo.ShippingMethod == 1 && p.ShippingMethod == 1 { // 本来是自提 单纯的换个门店
err = dbc.DB.Model(&previewOrderInfo).Updates(map[string]interface{}{
"store_id": p.StoreID,
}).Error
if err != nil {
back.Err(c, err.Error())
return
}
if err = updateStoreAddr(p.StoreID, p.OrderID); err != nil {
back.Fail(c, err.Error())
return
}
} else if previewOrderInfo.ShippingMethod == 1 && p.ShippingMethod == 0 { // 改成快递
tx := dbc.DB.Begin()
{
// 删除上一次地址
var prevAddr order_preview.Addr
dbc.DB.Where("order_id= ?", p.OrderID).Delete(&prevAddr)
// 寻找默认地址, 没有就跳过
var userAddr user.Addr
userAddr.UserID = p.UserID
userAddr.IsDefault = 1
if err := dbc.DB.Find(&userAddr).Error; err != nil {
if err == gorm.ErrRecordNotFound {
// 如果没有默认地址
if err := dbc.DB.Model(&previewOrderInfo).Updates(map[string]interface{}{
"shipping_method": 0,
}).Error; err != nil {
back.Suc(c, "更改失败", queryPreviewOrderGroup(previewOrderInfo.ID))
return
} else {
back.Suc(c, "更改成功", queryPreviewOrderGroup(previewOrderInfo.ID))
return
}
}
tx.Rollback()
back.Fail(c, "服务器错误"+err.Error())
return
}
{
var prevAddr order_preview.Addr
prevAddr.OrderID = p.OrderID
dbc.DB.Delete(&prevAddr)
// 自提改成快递,从新计算收获地址的运费
var addr order_preview.Addr
tx.First(&addr, "order_id = ?", p.OrderID)
if addr.IsDeliveryArea == 1 {
expressTotalFee := decimal.NewFromFloat(0.0)
for _, v := range goodsList {
_, expFee, err := computeExpressFeeWithPreviewGoods(v.Quantity, &v, addr.Province, addr.City)
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
err = tx.Model(&v).Updates(map[string]interface{}{
"express_fee": expFee,
"actual_amount": v.ActualAmount.Sub(v.ExpressFee).Add(expFee),
}).Error
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
expressTotalFee = expressTotalFee.Add(expFee)
}
err = tx.Model(&previewOrderInfo).Updates(map[string]interface{}{
"shipping_method": 0,
"express_total_fee": expressTotalFee,
"actual_amount": previewOrderInfo.ActualTotalAmount.Sub(previewOrderInfo.ExpressTotalFee).Add(expressTotalFee),
}).Error
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else { // 原来的地址属于不发货地区
// 不操作,直接返回
// 如果没有默认地址
dbc.DB.Model(&previewOrderInfo).Updates(map[string]interface{}{
"shipping_method": 0,
})
}
}
}
tx.Commit()
} else {
back.Fail(c, "无需操作")
return
}
back.Suc(c, "更改成功", queryPreviewOrderGroup(previewOrderInfo.ID))
}
func updateStoreAddr(StoreID, OrderID uint) (err error) {
// 在表中先删后增
var prevAddr order_preview.Addr
prevAddr.OrderID = OrderID
dbc.DB.Where("order_id=?", OrderID).Delete(&prevAddr)
// 增加自提逻辑
var storeInfo store.Information
dbc.DB.Find(&storeInfo, StoreID)
if storeInfo.ID <= 0 {
err = fmt.Errorf("自提店选择错误")
return
}
var pAddr order_preview.Addr
dbc.DB.First(&pAddr, OrderID)
pAddr.OrderID = OrderID
pAddr.AddressID = 0
pAddr.Address = storeInfo.BusinessLicenseAddress
pAddr.Province = "[自提]"
pAddr.City = ""
pAddr.District = ""
pAddr.ReceiverName = ""
pAddr.Mobile = ""
err = dbc.DB.Save(&pAddr).Error
return
}