This commit is contained in:
邹宗楠
2022-09-30 17:16:22 +08:00
parent e2b41bf9db
commit 97c092cd26
36 changed files with 1753 additions and 1895 deletions

View File

@@ -3,18 +3,13 @@ package tiktok_store
import (
"fmt"
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
"git.rosy.net.cn/jx-callback/globals/api"
"net/url"
"strings"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
var (
@@ -116,301 +111,13 @@ var (
}
)
// 是否为售后消息
func (c *PurchaseHandler) isAfsMsg(msg *tiktokShop.OrderCallback) bool {
_, ok := AfsTagIDMap[msg.MsgId]
return ok
}
func (c *PurchaseHandler) OnAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) {
jxutils.CallMsgHandlerAsync(func() {
retVal = c.onAfsOrderMsg(msg)
}, jxutils.ComposeUniversalOrderID(GetOrderIDFromMsg(msg), model.VendorIDEBAI))
return retVal
}
// todo 对于退款与部分退款order.go与这个文件中对于状态的处理不一致
func (c *PurchaseHandler) onAfsOrderMsg(msg *tiktokShop.OrderCallback) (retVal *tiktokShop.CallbackResponse) {
var err error
orderStatus := c.callbackAfsMsg2Status(msg)
for _, v := range orderStatus {
needCallNew := v.Status == model.AfsOrderStatusWait4Approve || v.Status == model.AfsOrderStatusNew
if !needCallNew {
if _, err := partner.CurOrderManager.LoadAfsOrder(v.VendorOrderID, v.VendorID); err != nil {
if dao.IsNoRowsError(err) {
needCallNew = true
} else {
return tiktokShop.Err2CallbackResponse(err, "")
}
}
}
if needCallNew {
var afsOrder *model.AfsOrder
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDMTWM,
AfsOrderID: orderStatus.VendorOrderID,
VendorOrderID: orderStatus.RefVendorOrderID,
VendorStoreID: "",
StoreID: 0,
AfsCreatedAt: utils.Timestamp2Time(refundData.Timestamp),
VendorAppealType: "",
AppealType: model.AfsAppealTypeRefund,
VendorReasonType: "",
ReasonType: model.AfsReasonNotOthers,
ReasonDesc: utils.LimitUTF8StringLen(refundData.Reason, 1024),
ReasonImgList: utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024),
RefundType: model.AfsTypePartRefund,
VendorOrgCode: msg.AppID,
}
for _, sku := range refundData.FoodList {
orderSku := &model.OrderSkuFinancial{
Count: sku.Count,
VendorSkuID: sku.SkuID,
SkuID: int(utils.Str2Int64WithDefault(sku.SkuID, 0)),
Name: sku.FoodName,
UserMoney: jxutils.StandardPrice2Int(sku.RefundPrice)*int64(sku.Count) + jxutils.StandardPrice2Int(sku.BoxPrice)*int64(sku.BoxNum),
}
afsOrder.SkuUserMoney += orderSku.UserMoney
afsOrder.Skus = append(afsOrder.Skus, orderSku)
}
} else {
if afsOrder = c.createAfsOrder(msg.FormData); afsOrder != nil {
afsOrder.AfsOrderID = orderStatus.VendorOrderID
afsOrder.RefundType = model.AfsTypeFullRefund
afsOrder.AppealType = model.AfsAppealTypeRefund
afsOrder.VendorReasonType = ""
afsOrder.ReasonType = model.AfsReasonNotOthers
afsOrder.ReasonDesc = utils.LimitUTF8StringLen(refundData.Reason, 1024)
afsOrder.ReasonImgList = utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024)
}
}
if afsOrder != nil {
//直接就来一个新的售后单,并且还是售后完成的
if orderStatus.Status == model.AfsOrderStatusFinished {
afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt
}
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
}
} else {
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
}
}
return mtwmapi.Err2CallbackResponse(err, "")
}
func (p *PurchaseHandler) createAfsOrder(orderData url.Values) (afsOrder *model.AfsOrder) {
afsOrder, err := partner.CurOrderManager.CreateAfsOrderFromOrder(orderData.Get("order_id"), model.VendorIDMTWM)
if err == nil {
afsOrder.AfsOrderID = orderData.Get("refund_id")
afsOrder.AfsCreatedAt = utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp")))
if afsOrder.AfsOrderID == "" {
afsOrder.AfsOrderID = afsOrder.VendorOrderID
}
} else {
afsOrder = nil
}
return afsOrder
}
func (c *PurchaseHandler) callbackAfsMsg2Status(msg *tiktokShop.OrderCallback) (orderStatus []*model.OrderStatus) {
switch msg.MsgId {
case tiktokShop.CallbackRefundOrderMsgTagId: // 买家发起售后申请消息
for _, v := range msg.Body[tiktokShop.CallbackRefundOrderMsgTagId] {
refundOrder := v.(*tiktokShop.BuyerRefundCreatedData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "create"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackRefundOrderMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.ApplyTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
case tiktokShop.CallbackUpdateRefundOrderMsgTagId: // 买家修改售后申请消息
for _, v := range msg.Body[tiktokShop.CallbackUpdateRefundOrderMsgTagId] {
refundOrder := v.(*tiktokShop.BuyerRefundModifiedData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "update"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.ModifyTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
case tiktokShop.CallbackRefundOrderSuccessMsgTagId: // 退款成功消息
for _, v := range msg.Body[tiktokShop.CallbackRefundOrderSuccessMsgTagId] {
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_success"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息
for _, v := range msg.Body[tiktokShop.CallbackRefundOrderSuccessMsgTagId] {
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_money_fail"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
case tiktokShop.CallbackRefundShopMsgTagId: // 拒绝退货申请消息
for _, v := range msg.Body[tiktokShop.CallbackRefundShopMsgTagId] {
refundOrder := v.(*tiktokShop.BusinessNotReturnApplyRefusedData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "refuse_shop_fail"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackRefundShopMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.RefuseTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
case tiktokShop.CallbackReturnApplyAgreedMsgTagId: // 同意退货申请消息
for _, v := range msg.Body[tiktokShop.CallbackReturnApplyAgreedMsgTagId] {
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_shop_success"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackReturnApplyAgreedMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
case tiktokShop.CallbackReturnRefundAgreedMsgTagId: // 同意退款消息
for _, v := range msg.Body[tiktokShop.CallbackReturnRefundAgreedMsgTagId] {
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
orderMsg := &model.OrderStatus{
VendorID: model.VendorIDDD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
RefVendorID: model.VendorIDDD,
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_money_success"),
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackReturnRefundAgreedMsgTagId),
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
}
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
orderMsg.Remark = k
} else {
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
}
if refundOrder.AftersaleId > 0 {
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
} else {
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
}
orderStatus = append(orderStatus, orderMsg)
}
default:
return nil
}
return orderStatus
}
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(resType int, notifyType string) int {
status := AfsVendorStatus2StatusMap[notifyType]
if status == model.AfsOrderStatusWait4Approve && resType != mtwmapi.ResTypePending {
status = model.AfsOrderStatusNew
}
return status
}
// 审核售后单申请
// AgreeOrRefuseRefund todo 审核售后单申请 退货退款(同意退货,确认收货之后会自动退款) 审核售后有点问题
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
if globals.EnableMtwmStoreWrite {
if approveType == partner.AfsApproveTypeRefused {
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundReject(utils.Str2Int64(order.VendorOrderID), reason)
if globals.EnableDdStoreWrite {
if approveType == partner.AfsApproveTypeRefused { // 拒绝退货
err = getAPI(order.VendorOrgCode, order.JxStoreID, "").ReturnGoodsToWareHouseSuccess(order.AfsOrderID)
} else {
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundAgree(utils.Str2Int64(order.VendorOrderID), reason)
err = getAPI(order.VendorOrgCode, order.JxStoreID, "").ReturnGoodsToWareHouseSuccess(order.AfsOrderID)
}
}
return err
@@ -418,13 +125,13 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
// 确认收到退货
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
err = fmt.Errorf("内部错误,美团外卖平台不支持确认收到退货操作")
err = fmt.Errorf("暂不支持的API调用")
return err
}
// 发起全款退款
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
return fmt.Errorf("%s不支持售后全额退款请让买家发起退款", model.VendorChineseNames[model.VendorIDMTWM])
return fmt.Errorf("%s不支持售后全额退款请让买家发起退款", model.VendorChineseNames[model.VendorIDDD])
}
// 发起部分退款