169 lines
6.8 KiB
Go
169 lines
6.8 KiB
Go
package mtwm
|
|
|
|
import (
|
|
"fmt"
|
|
"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/partner"
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
"git.rosy.net.cn/jx-callback/globals/api"
|
|
)
|
|
|
|
var (
|
|
AfsVendorStatus2StatusMap = map[int]int{
|
|
mtwmapi.ResTypePending: model.AfsOrderStatusWait4Approve,
|
|
mtwmapi.ResTypeMerchantRefused: model.AfsOrderStatusFailed,
|
|
mtwmapi.ResTypeMerchantAgreed: model.AfsOrderStatusFinished,
|
|
mtwmapi.ResTypeCSRefused: model.AfsOrderStatusFailed,
|
|
mtwmapi.ResTypeCSAgreed: model.AfsOrderStatusFinished,
|
|
mtwmapi.ResTypeTimeoutAutoAgreed: model.AfsOrderStatusFinished,
|
|
mtwmapi.ResTypeAutoAgreed: model.AfsOrderStatusFinished,
|
|
mtwmapi.ResTypeUserCancelApply: model.AfsOrderStatusFailed,
|
|
mtwmapi.ResTypeUserCancelComplain: model.AfsOrderStatusFailed,
|
|
}
|
|
)
|
|
|
|
func (c *PurchaseHandler) isAfsMsg(msg *mtwmapi.CallbackMsg) bool {
|
|
if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
|
|
// refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
|
|
orderID := utils.Str2Int64(GetOrderIDFromMsg(msg))
|
|
orderInfo, err := api.MtwmAPI.OrderGetOrderDetail2(orderID, false)
|
|
if err == nil {
|
|
return orderInfo.Status == int(utils.Str2Int64(mtwmapi.OrderStatusFinished))
|
|
}
|
|
globals.SugarLogger.Warnf("mtwm isAfsMsg OrderGetOrderDetail2 orderID:%d failed with error:%v", orderID, err)
|
|
}
|
|
return false
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) {
|
|
var err error
|
|
orderStatus := c.callbackAfsMsg2Status(msg)
|
|
if orderStatus.Status == model.AfsOrderStatusWait4Approve || orderStatus.Status == model.AfsOrderStatusNew {
|
|
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,
|
|
|
|
// FreightUserMoney: afsInfo.OrderFreightMoney,
|
|
// AfsFreightMoney: afsInfo.AfsFreight,
|
|
// BoxMoney: afsInfo.PackagingMoney,
|
|
// TongchengFreightMoney: afsInfo.TongchengFreightMoney,
|
|
// SkuBoxMoney: afsInfo.MealBoxMoney,
|
|
}
|
|
for _, sku := range refundData.FoodList {
|
|
orderSku := &model.OrderSkuFinancial{
|
|
// VendorID: model.VendorIDMTWM,
|
|
// AfsOrderID: afsOrder.AfsOrderID,
|
|
// VendorOrderID: afsOrder.VendorOrderID,
|
|
// VendorStoreID: afsOrder.VendorStoreID,
|
|
// StoreID: afsOrder.StoreID,
|
|
// IsAfsOrder: 1,
|
|
|
|
Count: sku.Count,
|
|
// ConfirmTime: afsOrder.AfsCreateAt,
|
|
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)
|
|
}
|
|
afsOrder.PmSubsidyMoney += afsOrder.RefundMoney - afsOrder.SkuUserMoney
|
|
} else {
|
|
if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(orderStatus.RefVendorOrderID, model.VendorIDMTWM); err2 == nil {
|
|
afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg.FormData)
|
|
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 {
|
|
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
|
}
|
|
} else {
|
|
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
|
}
|
|
return mtwmapi.Err2CallbackResponse(err, "")
|
|
}
|
|
|
|
func (c *PurchaseHandler) callbackAfsMsg2Status(msg *mtwmapi.CallbackMsg) (orderStatus *model.OrderStatus) {
|
|
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
|
|
orderStatus = &model.OrderStatus{
|
|
VendorID: model.VendorIDMTWM,
|
|
OrderType: model.OrderTypeAfsOrder,
|
|
RefVendorOrderID: utils.Int64ToStr(refundData.OrderID),
|
|
RefVendorID: model.VendorIDMTWM,
|
|
VendorStatus: utils.Int2Str(refundData.ResType),
|
|
Status: c.GetAfsStatusFromVendorStatus(refundData.ResType),
|
|
StatusTime: utils.Timestamp2Time(refundData.Timestamp),
|
|
Remark: refundData.Reason,
|
|
}
|
|
if refundData.RefundID > 0 {
|
|
orderStatus.VendorOrderID = utils.Int64ToStr(refundData.RefundID)
|
|
}
|
|
return orderStatus
|
|
}
|
|
|
|
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(vendorStatus int) int {
|
|
return AfsVendorStatus2StatusMap[vendorStatus]
|
|
}
|
|
|
|
// 审核售后单申请
|
|
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
|
|
if globals.EnableMtwmStoreWrite {
|
|
if approveType == partner.AfsApproveTypeRefused {
|
|
err = api.MtwmAPI.OrderRefundReject(utils.Str2Int64(order.VendorOrderID), reason)
|
|
} else {
|
|
err = api.MtwmAPI.OrderRefundAgree(utils.Str2Int64(order.VendorOrderID), reason)
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
// 确认收到退货
|
|
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
|
|
err = fmt.Errorf("内部错误,美团外卖平台不支持确认收到退货操作")
|
|
return err
|
|
}
|
|
|
|
// 发起全款退款
|
|
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
|
return c.CancelOrder(ctx, order, reason)
|
|
}
|
|
|
|
// 发起部分退款
|
|
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
|
return c.AdjustOrder(ctx, order, refundSkuList, reason)
|
|
}
|