From 9080e39e7e7214661d5713ca88489e9484c80f74 Mon Sep 17 00:00:00 2001 From: kanade Date: Tue, 6 Sep 2022 18:07:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/cron/supply.go | 31 +++++++++ internal/v2/lib/supply/mq.go | 16 +++++ internal/v2/logic/third/supply.go | 109 +++++++++++++++++++++++++++++- 3 files changed, 153 insertions(+), 3 deletions(-) diff --git a/internal/cron/supply.go b/internal/cron/supply.go index a289152..61081f6 100644 --- a/internal/cron/supply.go +++ b/internal/cron/supply.go @@ -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) + } + }) + }) +} diff --git a/internal/v2/lib/supply/mq.go b/internal/v2/lib/supply/mq.go index 50dc833..0681b40 100644 --- a/internal/v2/lib/supply/mq.go +++ b/internal/v2/lib/supply/mq.go @@ -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) diff --git a/internal/v2/logic/third/supply.go b/internal/v2/logic/third/supply.go index 5035494..1881468 100644 --- a/internal/v2/logic/third/supply.go +++ b/internal/v2/logic/third/supply.go @@ -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 +}