|
|
|
@ -7,10 +7,13 @@ import (
|
|
|
|
|
"github.com/golangkit/formatime"
|
|
|
|
|
"github.com/shopspring/decimal"
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
"log"
|
|
|
|
|
"path"
|
|
|
|
|
"recook/internal/libs/bean"
|
|
|
|
|
order4 "recook/internal/model/order"
|
|
|
|
|
"recook/internal/v2/lib/supply"
|
|
|
|
|
"recook/internal/v2/model/recook/goods"
|
|
|
|
|
manage2 "recook/internal/v2/model/recook/order"
|
|
|
|
|
manage "recook/internal/v2/model/third"
|
|
|
|
|
"recook/tools"
|
|
|
|
|
"sort"
|
|
|
|
@ -736,3 +739,163 @@ func (s *supplyLogic) SyncData(skuIds []uint) error {
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// OrderSplit @Title 拆单
|
|
|
|
|
func (s *supplyLogic) OrderSplit(orderSplit supply.OrderSplit) error {
|
|
|
|
|
var orderInfo manage2.RecookOrderInfoModel
|
|
|
|
|
mysql.Db.Preload("OrderSku").First(&orderInfo, "third_party_order_sn = ?", orderSplit.OrderSn)
|
|
|
|
|
if orderInfo.Id > 0 {
|
|
|
|
|
log.Println("重复拆单请求")
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
var parentOrderInfo manage2.RecookOrderInfoModel
|
|
|
|
|
if err := mysql.Db.Preload("OrderSku").First(&parentOrderInfo, "third_party_order_sn = ?", orderSplit.ParentOrderSn).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
var rod manage2.RecookOrderInfoModel
|
|
|
|
|
if err := mysql.Db.Preload("OrderSku").First(&parentOrderInfo, "third_party_order_sn = ?", orderSplit.RootOrderSn).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return mysql.Db.Transaction(func(tx *gorm.DB) error {
|
|
|
|
|
parentOrderInfo.IsSplit = true
|
|
|
|
|
parentOrderInfo.Status = 3
|
|
|
|
|
tx.Save(&parentOrderInfo)
|
|
|
|
|
|
|
|
|
|
if err := tx.Table((&order4.Profit{}).TableName()).Where("order_id = ?", rod.Id).Update("status", 1).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := tx.Table((&order4.Profit{}).TableName()).Where("order_id = ?", parentOrderInfo.Id).Update("status", 1).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
var skuIds []uint
|
|
|
|
|
for _, sku := range orderSplit.Skus {
|
|
|
|
|
skuIds = append(skuIds, sku.SkuId)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var orderSku []manage2.RecookOrderGoodsDetailModel
|
|
|
|
|
var sku []goods.RecookGoodsSkuModel
|
|
|
|
|
sub := tx.Select("id").Find(&sku, "third_party_sku_id in (?)", skuIds)
|
|
|
|
|
if err := tx.Find(&orderSku, "sku_id in (?) AND order_id = ?", sub, rod.Id).Error; err != nil {
|
|
|
|
|
log.Println(err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// 拆分拆单运费
|
|
|
|
|
unit := orderSplit.FreightFee.Div(decimal.NewFromInt(int64(len(orderSku)))).Round(2)
|
|
|
|
|
fee := orderSplit.FreightFee
|
|
|
|
|
unitMap := make(map[uint]decimal.Decimal)
|
|
|
|
|
var orderSkuNew []manage2.RecookOrderGoodsDetailModel
|
|
|
|
|
for i := 0; i < len(orderSku); i++ {
|
|
|
|
|
if i == len(orderSku)-1 {
|
|
|
|
|
unitMap[orderSku[i].SkuId] = fee
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
fee = fee.Sub(unit)
|
|
|
|
|
unitMap[orderSku[i].SkuId] = unit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
coinTotal := decimal.Zero
|
|
|
|
|
goodsTotalAmount := decimal.Zero
|
|
|
|
|
goodsTotalCommission := decimal.Zero
|
|
|
|
|
actualAmount := decimal.Zero
|
|
|
|
|
for _, v := range orderSku {
|
|
|
|
|
actualAmount = actualAmount.Add(v.GoodsAmount).Add(unitMap[v.SkuId]).Sub(v.CoinAmount)
|
|
|
|
|
coinTotal = coinTotal.Add(v.CoinAmount)
|
|
|
|
|
goodsTotalAmount = goodsTotalAmount.Add(v.GoodsAmount)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
orderNew := manage2.RecookOrderInfoModel{
|
|
|
|
|
AncestorId: rod.AncestorId,
|
|
|
|
|
ParentId: rod.ParentId,
|
|
|
|
|
SharerId: rod.SharerId,
|
|
|
|
|
LiveId: rod.LiveId,
|
|
|
|
|
UserId: rod.UserId,
|
|
|
|
|
UserRole: rod.UserRole,
|
|
|
|
|
Title: "",
|
|
|
|
|
CoinTotalAmount: coinTotal,
|
|
|
|
|
ExpressTotalFee: orderSplit.FreightFee,
|
|
|
|
|
GoodsTotalAmount: goodsTotalAmount,
|
|
|
|
|
GoodsTotalCommission: goodsTotalCommission,
|
|
|
|
|
ActualTotalAmount: actualAmount,
|
|
|
|
|
Channel: rod.Channel,
|
|
|
|
|
ShippingMethod: rod.ShippingMethod,
|
|
|
|
|
StoreId: rod.StoreId,
|
|
|
|
|
BuyerMessage: rod.BuyerMessage,
|
|
|
|
|
Status: 1,
|
|
|
|
|
ExpressStatus: rod.ExpressStatus,
|
|
|
|
|
InvoiceStatus: rod.InvoiceStatus,
|
|
|
|
|
CreatedAt: rod.CreatedAt,
|
|
|
|
|
ExpireTime: rod.ExpireTime,
|
|
|
|
|
PayIP: rod.PayIP,
|
|
|
|
|
TradeNo: rod.TradeNo,
|
|
|
|
|
PayTime: rod.PayTime,
|
|
|
|
|
PayMethod: rod.PayMethod,
|
|
|
|
|
RbacId: rod.RbacId,
|
|
|
|
|
IsFirst: rod.IsFirst,
|
|
|
|
|
VirtualID: rod.VirtualID,
|
|
|
|
|
PayType: rod.PayType,
|
|
|
|
|
Kind: rod.Kind,
|
|
|
|
|
ThirdPartyType: rod.ThirdPartyType,
|
|
|
|
|
ThirdPartyOrderSn: fmt.Sprintf("%d", orderSplit.OrderSn),
|
|
|
|
|
OrderType: rod.OrderType,
|
|
|
|
|
}
|
|
|
|
|
var orderAddr manage2.RecookOrderAddrModel
|
|
|
|
|
tx.First(&orderAddr, "order_id = ?", rod.Id)
|
|
|
|
|
|
|
|
|
|
if err := tx.Create(&orderNew).Error; err != nil {
|
|
|
|
|
log.Println(err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
orderAddr.Id = 0
|
|
|
|
|
orderAddr.OrderId = orderNew.Id
|
|
|
|
|
if err := tx.Create(&orderAddr).Error; err != nil {
|
|
|
|
|
log.Println(err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
cost := decimal.Zero
|
|
|
|
|
total := decimal.Zero
|
|
|
|
|
for _, v := range orderSku {
|
|
|
|
|
cost = cost.Add(v.PurchasePrice).Mul(decimal.NewFromInt(int64(v.Quantity)))
|
|
|
|
|
total = total.Add(v.GoodsAmount)
|
|
|
|
|
v.Id = 0
|
|
|
|
|
v.OrderId = orderNew.Id
|
|
|
|
|
v.ExpressFee = unitMap[v.SkuId]
|
|
|
|
|
//v.CoinAmount = decimal.Zero
|
|
|
|
|
v.ActualAmount = v.GoodsAmount.Add(v.ExpressFee).Sub(v.CoinAmount)
|
|
|
|
|
//coinTotal = decimal.Zero
|
|
|
|
|
orderSkuNew = append(orderSkuNew, v)
|
|
|
|
|
}
|
|
|
|
|
//orderNew.CoinTotalAmount = coinTotal
|
|
|
|
|
if err := tx.Save(orderNew).Error; err != nil {
|
|
|
|
|
log.Println(err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if err := tx.Create(orderSkuNew).Error; err != nil {
|
|
|
|
|
log.Println(err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
var rp []order4.Profit
|
|
|
|
|
if err := tx.Table((&order4.Profit{}).TableName()).Find(&rp, "order_id = ?", rod.Id).Error; err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
profitNew := make([]*order4.Profit, 0)
|
|
|
|
|
b2 := decimal.Zero
|
|
|
|
|
for _, k := range orderSkuNew {
|
|
|
|
|
b2 = b2.Add(k.GetBase().Mul(decimal.NewFromInt(int64(k.Quantity))))
|
|
|
|
|
}
|
|
|
|
|
for _, v := range rp {
|
|
|
|
|
temp := order4.CreateProfit(v.UserID, v.Type, b2, orderNew.Id)
|
|
|
|
|
profitNew = append(profitNew, temp)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(profitNew) != 0 {
|
|
|
|
|
if err := tx.Create(profitNew).Error; err != nil {
|
|
|
|
|
log.Println(err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|