diff --git a/business/partner/purchase/tiktok_store/callback.go b/business/partner/purchase/tiktok_store/callback.go index 8869a6a61..5c446f9d4 100644 --- a/business/partner/purchase/tiktok_store/callback.go +++ b/business/partner/purchase/tiktok_store/callback.go @@ -3,10 +3,11 @@ package tiktok_store import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" + "git.rosy.net.cn/baseapi/utils" ) // 美团回调接口 -func OnCallbackMsg(msg *tiktokShop.CreateOrderCallback) (tiktokShop *mtwmapi.CallbackResponse) { +func OnCallbackMsg(msg *tiktokShop.CreateOrderCallback) (resp *mtwmapi.CallbackResponse) { if CurPurchaseHandler != nil { switch msg.Tag { case tiktokShop.CallbackMsgTagId: @@ -16,8 +17,8 @@ func OnCallbackMsg(msg *tiktokShop.CreateOrderCallback) (tiktokShop *mtwmapi.Cal return response } -func GetOrderIDFromMsg(msg *mtwmapi.CallbackMsg) string { - return msg.FormData.Get(mtwmapi.KeyOrderID) +func GetOrderIDFromMsg(msg *tiktokShop.CreateOrderCallback) string { + return utils.Int64ToStr(msg.Data.PId) } func GetVendorStoreIDFromMsg(msg *mtwmapi.CallbackMsg) string { diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go new file mode 100644 index 000000000..80eaa2aab --- /dev/null +++ b/business/partner/purchase/tiktok_store/order.go @@ -0,0 +1,199 @@ +package tiktok_store + +import ( + "git.rosy.net.cn/baseapi/platformapi/ebaiapi" + "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" +) + +func (c *PurchaseHandler) onOrderMsg(msg *tiktokShop.CreateOrderCallback) (response *mtwmapi.CallbackResponse) { + var err error + //if c.isAfsMsg(msg) { + // response = c.OnAfsOrderMsg(msg) // 退单 + //} else { + status := c.callbackMsg2Status(msg) + if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { + return nil + } + if msg.Cmd == mtwmapi.MsgTypeNewOrder { // 新订单 + order, orderMap, err2 := c.getOrder(msg.AppID, GetOrderIDFromMsg(msg), GetVendorStoreIDFromMsg(msg)) + if err = err2; err == nil { + err = partner.CurOrderManager.OnOrderNew(order, c.callbackMsg2Status(msg)) + if err == nil { + utils.CallFuncAsync(func() { + if msg.Cmd == mtwmapi.MsgTypeNewOrder { + c.OnOrderDetail(orderMap, partner.CreatedPeration) + } else { + c.OnOrderDetail(orderMap, partner.UpdatedPeration) + } + }) + } + } + } else { + if status != nil { + var order *model.GoodsOrder + if order, err = partner.CurOrderManager.LoadOrder(GetOrderIDFromMsg(msg), model.VendorIDMTWM); err == nil { + // if order, err = c.GetOrder(msg.AppID, GetOrderIDFromMsg(msg)); err == nil { + if status.Status == model.OrderStatusAdjust { + skuList, err2 := getRefundSkuDetailList(msg, order) + if err = err2; err == nil { + var removedSkuList []*model.OrderSku + for _, mtwmSku := range skuList { + order.ActualPayPrice -= jxutils.StandardPrice2Int(mtwmSku.RefundPrice) * int64(mtwmSku.Count) + removedSkuList = append(removedSkuList, &model.OrderSku{ + SkuID: int(utils.Str2Int64WithDefault(mtwmSku.SkuID, 0)), + Count: mtwmSku.Count, + }) + } + order = jxutils.RemoveSkuFromOrder(order, removedSkuList) + jxutils.RefreshOrderSkuRelated(order) + err = partner.CurOrderManager.OnOrderAdjust(order, status) + } + } else { + if status.Status == model.OrderStatusDelivering { + // 美团订单即使时在配送状态时,如果之前没有调用过拣货完成,也会对门店指标生成影响,这里强制再调用拣货完成,且忽略错误 + utils.CallFuncAsync(func() { + if globals.EnableMtwmStoreWrite { + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").PreparationMealComplete(utils.Str2Int64(status.VendorOrderID)) + } + }) + } + err = partner.CurOrderManager.OnOrderStatusChanged(msg.AppID, status) + if err == nil && msg.Cmd == mtwmapi.MsgTypeOrderFinished { + utils.CallFuncAsync(func() { + orderMap, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderGetOrderDetail(utils.Str2Int64(GetOrderIDFromMsg(msg)), true) + if err == nil && utils.MustInterface2Int64(orderMap["is_third_shipping"]) == SelfDeliveryCarrierNo { + c.OnOrderDetail(orderMap, partner.UpdatedPeration) + } + }) + } + + } + } + } + } + //} + return mtwmapi.Err2CallbackResponse(err, "") +} + +func (c *PurchaseHandler) callbackMsg2Status(msg *tiktokShop.CreateOrderCallback) (orderStatus *model.OrderStatus) { + orderID := GetOrderIDFromMsg(msg) + vendorStatus := msg.Cmd + remark := "" + statusTime := utils.Str2Int64(msg.FormData.Get("timestamp")) + switch msg.Cmd { + case mtwmapi.MsgTypeUserUrgeOrder, mtwmapi.MsgTypeOrderModified, mtwmapi.MsgTypeOrderFinancial: + vendorStatus = msg.Cmd + case mtwmapi.MsgTypeOrderCanceled: + vendorStatus = mtwmapi.OrderStatusCanceled + remark = msg.FormData.Get("reason") + case FakeMsgType, mtwmapi.MsgTypeNewOrder, mtwmapi.MsgTypeOrderAccepted, mtwmapi.MsgTypeOrderFinished: + vendorStatus = msg.FormData.Get("status") + statusTime = utils.Str2Int64(msg.FormData.Get("utime")) + case mtwmapi.MsgTypeOrderRefund, mtwmapi.MsgTypeOrderPartialRefund: + notifyType := msg.FormData.Get("notify_type") + vendorStatus = msg.Cmd + "-" + notifyType + if true { // 已经提前判断了,到这里的都是售中 + remark = msg.FormData.Get("reason") + if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { + if notifyType == mtwmapi.NotifyTypePartyApply { + if globals.EnableMtwmStoreWrite { + //if order, _ := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDMTWM); order != nil { + // getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderRefundAgree(utils.Str2Int64(orderID), "自动确认退款") + //} + // goods, err := dao.GetSimpleOrder(dao.GetDB(), orderID) + // if err == nil { + // if goods.Status < model.OrderStatusDelivering { + // } else { + // api.MtwmAPI.OrderRefundReject(utils.Str2Int64(orderID), "商品配送中,请联系门店。") // todo 京东与饿百都没有售前用户提出订单调整的,自动拒绝调整单 + // } + // } + } + } else if notifyType == mtwmapi.NotifyTypeSuccess { + vendorStatus = fakeOrderAdjustFinished + } + } else if msg.Cmd == mtwmapi.MsgTypeOrderRefund { + if notifyType == mtwmapi.NotifyTypeApply { + vendorStatus = fakeUserApplyCancel + } else if notifyType == mtwmapi.NotifyTypeCancelRefund || notifyType == mtwmapi.NotifyTypeCancelRefundComplaint { + vendorStatus = fakeUserUndoApplyCancel + } else if notifyType == mtwmapi.NotifyTypeReject { + vendorStatus = fakeRefuseUserApplyCancel + } else if notifyType == mtwmapi.NotifyTypeSuccess { + vendorStatus = fakeMerchantAgreeApplyCancel // todo 可能导致订单取消消息重复 + } + } + } + default: + globals.SugarLogger.Errorf("mtwm unkonw msg:%s", utils.Format4Output(msg, false)) + } + if vendorStatus != "" { + orderStatus = &model.OrderStatus{ + VendorOrderID: orderID, + VendorID: model.VendorIDMTWM, + OrderType: model.OrderTypeOrder, + RefVendorOrderID: orderID, + RefVendorID: model.VendorIDMTWM, + VendorStatus: vendorStatus, + Status: c.getStatusFromVendorStatus(vendorStatus), + StatusTime: getTimeFromTimestamp(statusTime), + Remark: remark, + } + } + return orderStatus +} + +func (c *PurchaseHandler) callbackMsg2Status(msg *tiktokShop.CreateOrderCallback) (orderStatus *model.OrderStatus) { + orderID := GetOrderIDFromMsg(msg) + orderStatus = &model.OrderStatus{ + VendorOrderID: orderID, + VendorID: model.VendorIDDD, + OrderType: model.OrderTypeOrder, + RefVendorOrderID: orderID, + RefVendorID: model.VendorIDDD, + StatusTime: utils.Timestamp2Time(msg.Timestamp), + VendorStatus: msg.Cmd, + } + if msg.Cmd == ebaiapi.CmdOrderUserCancel { + msgType := int(utils.MustInterface2Int64(msg.Body["type"])) + cancelType := int(utils.MustInterface2Int64(msg.Body["cancel_type"])) + orderStatus.Remark = buildFullReason(utils.Interface2String(msg.Body["cancel_reason"]), utils.Interface2String(msg.Body["addition_reason"])) + orderStatus.VendorStatus = msg.Cmd + "-" + utils.Int2Str(msgType) + if cancelType == ebaiapi.OrderUserCancelTypeBeforeSale { + if msgType == ebaiapi.OrderUserCancelApply /* || msgType == ebaiapi.OrderUserCancelCSIntervene */ { + orderStatus.Status = model.OrderStatusApplyCancel + } else if msgType == ebaiapi.OrderUserCancelCSRefused || + msgType == ebaiapi.OrderUserCancelMerchantRefused { + orderStatus.Status = model.OrderStatusVendorRejectCancel + } else if msgType == ebaiapi.OrderUserCancelInvalid { + orderStatus.Status = model.OrderStatusUndoApplyCancel + } else if msgType == ebaiapi.OrderUserCancelCSAgreed || + msgType == ebaiapi.OrderUserCancelMerchantAgreed { + orderStatus.Status = model.OrderStatusVendorAgreeCancel + } + } + } else if msg.Cmd == ebaiapi.CmdOrderPartRefund { + msgType := int(utils.MustInterface2Int64(msg.Body["type"])) + status := int(utils.MustInterface2Int64(msg.Body["status"])) + orderStatus.Remark = buildFullReason(utils.Interface2String(msg.Body["reason"]), utils.Interface2String(msg.Body["addition_reason"])) + if msgType == ebaiapi.OrderPartRefuncTypeMerchant && status == ebaiapi.OrderPartRefundSuccess { + orderStatus.VendorStatus = fakeOrderAdjustFinished + } + } else if status, ok := msg.Body["status"]; ok { + if vendorStatus, ok := status.(string); ok { + orderStatus.VendorStatus = vendorStatus + } else { + orderStatus.VendorStatus = utils.Int64ToStr(utils.MustInterface2Int64(status)) + } + orderStatus.Remark = utils.Interface2String(msg.Body["reason"]) + } + if orderStatus.Status == 0 { + orderStatus.Status = c.getStatusFromVendorStatus(orderStatus.VendorStatus) + } + return orderStatus +}