订单取消

master
kanade 3 years ago
parent fcde75513d
commit 9080e39e7e

@ -126,3 +126,34 @@ func (s *supplyTask) orderSplit() {
})
})
}
// @Title 取消订单通知
func (s *supplyTask) orderChange() {
defer func() {
if recoverErr := recover(); recoverErr != nil {
log.Println("供应链拆单mq错误", recoverErr)
}
time.Sleep(time.Second * 3)
s.orderSplit()
}()
pool, _ := ants.NewPool(5)
rabbitmq.Rabbitmq.Consume(supply.Api.Mq.OrderCancel(), false, 5, func(delivery amqp.Delivery) {
pool.Submit(func() {
defer func() {
if recoverErr := recover(); recoverErr != nil {
log.Println("消息队列调用错误,err:", recoverErr)
}
}()
var orderCancel supply.OrderCancel
json.Unmarshal(delivery.Body, &orderCancel)
if err := third.SupplyLogic.OrderCancel(orderCancel); err != nil {
log.Println("取消订单处理失败,skuId:", string(delivery.Body), ",err:", err)
delivery.Reject(true)
return
} else {
defer delivery.Ack(false)
}
})
})
}

@ -12,6 +12,12 @@ const (
queueSkuChange = "supplySkuChange:%s"
// queueOrderSplit 订单拆单
queueOrderSplit = "supplyOrderSplit:%s"
// queueOrderChange 订单变更
queueOrderCancel = "supplyOrderCancel:%s"
OrderCancelSuccess = 1 // 取消成功
OrderCancelFail = 2 // 取消失败
OrderCancelReject = 3 // 拒收/商家主动取消
)
type mq struct {
@ -49,6 +55,16 @@ func (m *mq) OrderSplit() string {
return getQuesuName(queueOrderSplit)
}
type OrderCancel struct {
OrderSn string `json:"orderSn"`
Status uint `json:"status"`
}
// OrderCancel @Title 订单取消
func (m *mq) OrderCancel() string {
return getQuesuName(queueOrderCancel)
}
// @Title 获取队列名称
func getQuesuName(queue string) string {
return fmt.Sprintf(queue, Api.Config.AppKey)

@ -9,10 +9,14 @@ import (
"gorm.io/gorm"
"log"
"path"
"recook/internal/dbc"
"recook/internal/libs/bean"
order4 "recook/internal/model/order"
"recook/internal/v2/lib/supply"
after2 "recook/internal/v2/logic/manage/after"
"recook/internal/v2/model/recook/after"
"recook/internal/v2/model/recook/goods"
manage3 "recook/internal/v2/model/recook/manage"
manage2 "recook/internal/v2/model/recook/order"
manage "recook/internal/v2/model/third"
"recook/tools"
@ -743,17 +747,17 @@ func (s *supplyLogic) SyncData(skuIds []uint) error {
// 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)
mysql.Db.Preload("OrderSku").First(&orderInfo, "third_party_order_sn = ? and third_party_type = ?", orderSplit.OrderSn, goods.RecookGoodsInfoThirdPartyTypeSupply)
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 {
if err := mysql.Db.Preload("OrderSku").First(&parentOrderInfo, "third_party_order_sn = ? and third_party_type = ?", orderSplit.ParentOrderSn, goods.RecookGoodsInfoThirdPartyTypeSupply).Error; err != nil {
return err
}
var rod manage2.RecookOrderInfoModel
if err := mysql.Db.Preload("OrderSku").First(&rod, "third_party_order_sn = ?", orderSplit.RootOrderSn).Error; err != nil {
if err := mysql.Db.Preload("OrderSku").First(&rod, "third_party_order_sn = ? and third_party_type = ?", orderSplit.RootOrderSn, goods.RecookGoodsInfoThirdPartyTypeSupply).Error; err != nil {
return err
}
return mysql.Db.Transaction(func(tx *gorm.DB) error {
@ -902,3 +906,102 @@ func (s *supplyLogic) OrderSplit(orderSplit supply.OrderSplit) error {
return nil
})
}
// OrderCancel @Title 订单取消
func (s *supplyLogic) OrderCancel(orderCancel supply.OrderCancel) error {
var orderInfo manage2.RecookOrderInfoModel
if err := mysql.Db.First(&orderInfo, "third_party_order_sn = ? and third_party_type = ?", orderCancel.OrderSn, goods.RecookGoodsInfoThirdPartyTypeSupply).Error; err != nil {
if err != gorm.ErrRecordNotFound {
log.Println(err.Error())
return err
} else {
return nil
}
}
switch orderCancel.Status {
case supply.OrderCancelSuccess: // 取消成功
if orderInfo.Status == 0 {
// 未支付订单直接取消
return nil
} else {
tx := dbc.DB.Begin()
{
var asGoods []after.RecookAfterSalesGoodsModel
tx.Find(&asGoods, "order_id = ?", orderInfo.Id)
for _, v := range asGoods {
if v.RefundStatus == 1 {
continue
}
t := &after2.UpdateOrderCheckStatusReq{
AsID: v.Id,
}
if err := after2.Refund(tx, v, orderInfo, t, manage3.RecookManageUserInfoModel{}); err != nil {
tx.Rollback()
return err
}
}
}
if err := tx.Model(orderInfo).Update("deal_status", 11).Error; err != nil {
return err
}
tx.Commit()
}
case supply.OrderCancelFail: // 取消失败
tx := dbc.DB.Begin()
{
orderInfo.DealStatus = 12
if err := tx.Save(&orderInfo).Error; err != nil {
return err
}
var asGoods []after.RecookAfterSalesGoodsModel
if err := tx.Find(&asGoods, "order_id = ?", orderInfo.Id).Error; err != nil {
return err
}
for _, v := range asGoods {
if err := tx.Model(v).Updates(after.RecookAfterSalesGoodsModel{
ReturnStatus: 2,
RejectReason: "系统自动拒绝",
FinishTime: formatime.NewSecondNow(),
}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Model(&manage2.RecookOrderGoodsDetailModel{Id: v.OrderGoodsId}).Updates(map[string]interface{}{
"ass_type": 0,
}).Error; err != nil {
tx.Rollback()
return err
}
//这里插入日志
Log1 := after.RecookAfterSalesLogsModel{
AsID: v.Id,
Title: "平台拒绝退款",
Content: "拒绝买家退款申请,如有疑问,请联系客服",
CTime: formatime.NewSecondNow(),
User: "系统",
UserId: 0,
}
tx.Create(&Log1)
Log2 := after.RecookAfterSalesLogsModel{
AsID: v.Id,
Title: "退款关闭",
Content: "系统自动关闭",
CTime: formatime.NewSecondNow(),
User: "系统",
UserId: 0,
}
tx.Create(&Log2)
}
}
tx.Commit()
case supply.OrderCancelReject: // 拒收/商家主动取消case supply.
}
return nil
}

Loading…
Cancel
Save