package ebai import ( "fmt" "strings" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "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 ( AfsVendorStatus2Status4PartRefundMap = map[int]int{ ebaiapi.OrderPartRefundApply: model.AfsOrderStatusWait4Approve, ebaiapi.OrderPartRefundSuccess: model.AfsOrderStatusFinished, ebaiapi.OrderPartRefundUserApplyArbitration: model.OrderStatusUnknown, // 是否是中间状态 ebaiapi.OrderPartRefundFailed: model.AfsOrderStatusFailed, ebaiapi.OrderPartRefundMerchantRefused: model.OrderStatusUnknown, // 是否是中间状态 } AfsVendorStatus2Status4UserCancel = map[int]int{ ebaiapi.OrderUserCancelApply: model.AfsOrderStatusWait4Approve, ebaiapi.OrderUserCancelCSIntervene: model.OrderStatusUnknown, ebaiapi.OrderUserCancelCSRefused: model.AfsOrderStatusFailed, ebaiapi.OrderUserCancelCSAgreed: model.AfsOrderStatusFinished, ebaiapi.OrderUserCancelMerchantRefused: model.AfsOrderStatusFailed, ebaiapi.OrderUserCancelMerchantAgreed: model.AfsOrderStatusFinished, ebaiapi.OrderUserCancelInvalid: model.AfsOrderStatusFailed, } ) func (c *PurchaseHandler) isAfsMsg(msg *ebaiapi.CallbackMsg) bool { if msg.Cmd == ebaiapi.CmdOrderPartRefund { msgType := int(utils.MustInterface2Int64(msg.Body["type"])) return msgType == ebaiapi.OrderPartRefuncTypeCustomer } else if msg.Cmd == ebaiapi.CmdOrderUserCancel { cancelType := int(utils.MustInterface2Int64(msg.Body["cancel_type"])) return cancelType == ebaiapi.OrderUserCancelTypeAfterSale } return false } func (c *PurchaseHandler) OnAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi.CallbackResponse) { jxutils.CallMsgHandler(func() { utils.CallFuncAsync(func() { retVal = c.onAfsOrderMsg(msg) }) }, jxutils.ComposeUniversalOrderID(GetOrderIDFromMsg(msg), model.VendorIDEBAI)) return retVal } func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi.CallbackResponse) { if orderStatus := c.callbackAfsMsg2Status(msg); orderStatus != nil { afsOrder := &model.AfsOrder{ VendorID: model.VendorIDEBAI, AfsOrderID: orderStatus.VendorOrderID, VendorOrderID: orderStatus.RefVendorOrderID, VendorStoreID: "", StoreID: 0, AfsCreatedAt: utils.Timestamp2Time(msg.Timestamp), VendorAppealType: "", AppealType: model.AfsAppealTypeRefund, // FreightUserMoney: afsInfo.OrderFreightMoney, // AfsFreightMoney: afsInfo.AfsFreight, // BoxMoney: afsInfo.PackagingMoney, // TongchengFreightMoney: afsInfo.TongchengFreightMoney, // SkuBoxMoney: afsInfo.MealBoxMoney, } if msg.Cmd == ebaiapi.CmdOrderPartRefund { if orderStatus.Status <= model.AfsOrderStatusNew { partRefundData := msg.Data.(*ebaiapi.CBPartRefundInfo) afsOrder.VendorReasonType = partRefundData.ReasonType afsOrder.ReasonType = c.convertAfsReasonType(partRefundData.ReasonType) afsOrder.ReasonDesc = utils.LimitUTF8StringLen(buildFullReason(partRefundData.Reason, partRefundData.AdditionReason), 1024) afsOrder.ReasonImgList = utils.LimitUTF8StringLen(strings.Join(partRefundData.Photos, ","), 1024) for _, sku := range partRefundData.RefundProducts { orderSku := &model.OrderSkuFinancial{ VendorID: model.VendorIDEBAI, AfsOrderID: afsOrder.AfsOrderID, VendorOrderID: afsOrder.VendorOrderID, VendorStoreID: afsOrder.VendorStoreID, StoreID: afsOrder.StoreID, // ConfirmTime: afsOrder.AfsCreateAt, VendorSkuID: sku.SkuID, SkuID: int(utils.Str2Int64WithDefault(sku.CustomSkuID, 0)), Name: sku.Name, UserMoney: sku.TotalRefund, PmSkuSubsidyMoney: sku.ShopEleRefund, IsAfsOrder: 1, } afsOrder.SkuUserMoney += orderSku.UserMoney afsOrder.PmSubsidyMoney += orderSku.PmSubsidyMoney afsOrder.Skus = append(afsOrder.Skus, orderSku) } } } else if msg.Cmd == ebaiapi.CmdOrderUserCancel { if orderStatus.Status <= model.AfsOrderStatusNew { if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(afsOrder.VendorOrderID, afsOrder.VendorID); err2 == nil { afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg) cancelData := msg.Data.(*ebaiapi.CBUserCancelInfo) afsOrder.AppealType = model.AfsAppealTypeRefund afsOrder.VendorReasonType = "" afsOrder.ReasonType = model.AfsReasonNotOthers afsOrder.ReasonDesc = utils.LimitUTF8StringLen(buildFullReason(cancelData.CancelReason, cancelData.AdditionReason), 1024) afsOrder.ReasonImgList = utils.LimitUTF8StringLen(strings.Join(cancelData.Pictures, ","), 1024) } } } var err error if orderStatus.Status <= model.AfsOrderStatusNew { err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } else { err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus) } retVal = api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil) } return retVal } func (c *PurchaseHandler) convertAfsReasonType(vendorReasonType string) int8 { return model.AfsReasonNotOthers } func (c *PurchaseHandler) GetAfsStatusFromVendorStatus4PartRefund(vendorStatus int) int { return AfsVendorStatus2Status4PartRefundMap[vendorStatus] } func (c *PurchaseHandler) GetAfsStatusFromVendorStatus4UserCancel(vendorStatus int) int { return AfsVendorStatus2Status4UserCancel[vendorStatus] } func (c *PurchaseHandler) callbackAfsMsg2Status(msg *ebaiapi.CallbackMsg) (orderStatus *model.OrderStatus) { if msg.Cmd == ebaiapi.CmdOrderPartRefund { partRefundData := msg.Data.(*ebaiapi.CBPartRefundInfo) orderStatus = &model.OrderStatus{ VendorOrderID: partRefundData.RefundID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 VendorID: model.VendorIDEBAI, OrderType: model.OrderTypeAfsOrder, RefVendorOrderID: utils.Int64ToStr(partRefundData.OrderID), RefVendorID: model.VendorIDEBAI, VendorStatus: utils.Int2Str(partRefundData.Status), Status: c.GetAfsStatusFromVendorStatus4PartRefund(partRefundData.Status), StatusTime: utils.Timestamp2Time(msg.Timestamp), Remark: buildFullReason(partRefundData.Reason, partRefundData.AdditionReason), } if orderStatus.Status == model.AfsOrderStatusWait4Approve && partRefundData.Type != ebaiapi.OrderPartRefuncTypeCustomer { orderStatus.Status = model.AfsOrderStatusNew } } else if msg.Cmd == ebaiapi.CmdOrderUserCancel { cancelData := msg.Data.(*ebaiapi.CBUserCancelInfo) orderStatus = &model.OrderStatus{ VendorOrderID: utils.Int64ToStr(cancelData.OrderID), // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 VendorID: model.VendorIDEBAI, OrderType: model.OrderTypeAfsOrder, RefVendorOrderID: utils.Int64ToStr(cancelData.OrderID), RefVendorID: model.VendorIDEBAI, VendorStatus: utils.Int2Str(cancelData.Type), Status: c.GetAfsStatusFromVendorStatus4UserCancel(cancelData.Type), StatusTime: utils.Timestamp2Time(msg.Timestamp), Remark: buildFullReason(cancelData.CancelReason, cancelData.AdditionReason), } } return orderStatus } // 审核售后单申请 func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) { if globals.EnableEbaiStoreWrite { if approveType == partner.AfsApproveTypeRefused { err = api.EbaiAPI.OrderDisagreeRefund(order.VendorOrderID, reason) } else { err = api.EbaiAPI.OrderAgreeRefund(order.VendorOrderID) } } return err } // 确认收到退货 func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) { err = fmt.Errorf("内部错误,饿百平台不支持确认收到退货操作") return err }