This commit is contained in:
邹宗楠
2022-08-31 17:32:34 +08:00
parent 97a83f1c2f
commit 9915fa1eb2
2 changed files with 203 additions and 3 deletions

View File

@@ -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 {

View File

@@ -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
}