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 }