Files
jx-callback/business/partner/purchase/jd/order_afs.go
2020-07-31 16:49:03 +08:00

226 lines
9.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package jd
import (
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"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"
)
var (
AfsVendorStatus2StatusMap = map[string]int{
jdapi.AfsServiceStateWaiting4Audit: model.AfsOrderStatusWait4Approve, // 需要审核
jdapi.AfsServiceStateWaiting4CSFeedback: model.AfsOrderStatusNew,
jdapi.AfsServiceStateRefundProcessing: model.AfsOrderStatusNew,
jdapi.AfsServiceStateWaiting4DirectCompensate: model.AfsOrderStatusNew,
jdapi.AfsServiceStateWaiting4ReturnGoods: model.AfsOrderStatusNew,
jdapi.AfsServiceStateWaiting4MerchantReceiveGoods: model.AfsOrderStatusWait4ReceiveGoods,
jdapi.AfsServiceStateRefundSuccess: model.AfsOrderStatusFinished,
jdapi.AfsServiceStateSolved: model.AfsOrderStatusFinished,
jdapi.AfsServiceStateDirectCompensateSuccess: model.AfsOrderStatusFinished,
jdapi.AfsServiceStateReturnGoodsSuccess: model.AfsOrderStatusFinished,
jdapi.AfsServiceStateRefundFailed: model.AfsOrderStatusFailed,
jdapi.AfsServiceStateAuditRefused: model.AfsOrderStatusFailed,
jdapi.AfsServiceStateUserCanceled: model.AfsOrderStatusFailed,
jdapi.AfsServiceStateMerchantFailedReceiveGoods: model.AfsOrderStatusFailed,
jdapi.AfsServiceStateDirectCompensateFailed: model.AfsOrderStatusFailed,
jdapi.AfsServiceStateReturnGoodsFailed: model.AfsOrderStatusFailed,
}
afsReasonTypeMap = map[int]int8{
jdapi.AfsReasonTypeGoodsQuality: model.AfsReasonTypeGoodsQuality,
jdapi.AfsReasonTypeWrongGoods: model.AfsReasonTypeWrongGoods,
jdapi.AfsReasonTypeMissingGoods: model.AfsReasonTypeMissingGoods,
jdapi.AfsReasonTypeNoGoods: model.AfsReasonTypeNoGoods,
jdapi.AfsReasonTypeDamagedGoods: model.AfsReasonTypeDamagedGoods,
jdapi.AfsReasonTypeGoodsQuantity: model.AfsReasonTypeGoodsQuantity,
jdapi.AfsReasonTypeGoodsAbsent: model.AfsReasonTypeGoodsAbsent,
jdapi.AfsReasonTypeGoodsSizeNoSame: model.AfsReasonTypeGoodsNoSame,
jdapi.AfsReasonTypeGoodsColorNoSame: model.AfsReasonTypeGoodsNoSame,
jdapi.AfsReasonWrongPurchase: model.AfsReasonWrongPurchase,
jdapi.AfsReasonNotReceivedIntime: model.AfsReasonNotReceivedIntime,
}
afsAppealTypeMap = map[string]int8{
jdapi.AfsDealTypeRefund: model.AfsAppealTypeRefund,
jdapi.AfsDealTypeReturnGoodsRefund: model.AfsAppealTypeReturnAndRefund,
jdapi.AfsDealTypeDirectCompensate: model.AfsAppealTypeNewGoods,
}
afsApproveTypeMap = map[int]int{
partner.AfsApproveTypeRefund: jdapi.AfsApproveTypeRefund,
partner.AfsApproveTypeReturnGoods: jdapi.AfsApproveTypeReturnGoods,
partner.AfsApproveTypeRefused: jdapi.AfsApproveTypeRefused,
}
)
func (c *PurchaseHandler) OnAfsOrderMsg(a *jdapi.API, msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) {
jxutils.CallMsgHandlerAsync(func() {
retVal = c.onAfsOrderMsg(a, msg)
}, jxutils.ComposeUniversalOrderID(msg.BillID, model.VendorIDJD))
return retVal
}
func (c *PurchaseHandler) onAfsOrderMsg(a *jdapi.API, msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) {
afsInfo, err := a.GetAfsService2(msg.BillID)
if err == nil {
status := c.callbackAfsMsg2Status(msg, afsInfo)
if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 {
return nil
}
if status.Status == model.AfsOrderStatusWait4Approve || status.Status == model.AfsOrderStatusNew {
afsOrder := c.buildAfsOrder(afsInfo)
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, status)
} else {
err = partner.CurOrderManager.OnAfsOrderStatusChanged(status)
}
retVal = jdapi.Err2CallbackResponse(err, status.VendorStatus)
}
return retVal
}
func (c *PurchaseHandler) callbackAfsMsg2Status(msg *jdapi.CallbackOrderMsg, afsInfo *jdapi.AfsServiceResponse) *model.OrderStatus {
orderStatus := &model.OrderStatus{
VendorOrderID: msg.BillID, // 是售后单ID不是订单ID订单ID在RefVendorOrderID中
VendorID: model.VendorIDJD,
OrderType: model.OrderTypeAfsOrder,
RefVendorOrderID: afsInfo.OrderID,
RefVendorID: model.VendorIDJD,
VendorStatus: msg.StatusID,
Status: c.GetAfsStatusFromVendorStatus(msg.StatusID),
StatusTime: utils.Str2Time(msg.Timestamp),
Remark: msg.Remark,
}
return orderStatus
}
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(vendorStatus string) int {
if status, ok := AfsVendorStatus2StatusMap[vendorStatus]; ok {
return status
}
return model.OrderStatusUnknown
}
func (c *PurchaseHandler) convertAfsReasonType(vendorReasonType int) int8 {
if status, ok := afsReasonTypeMap[vendorReasonType]; ok {
return status
}
return model.AfsReasonNotOthers
}
func (c *PurchaseHandler) convertAfsAppealType(vendorAppealType string) int8 {
if status, ok := afsAppealTypeMap[vendorAppealType]; ok {
return status
}
globals.SugarLogger.Warnf("jd convertAfsAppealType unknown vendorAppealType:%d", vendorAppealType)
return 0
}
func (c *PurchaseHandler) buildAfsOrder(afsInfo *jdapi.AfsServiceResponse) (afsOrder *model.AfsOrder) {
afsOrder = &model.AfsOrder{
VendorID: model.VendorIDJD,
AfsOrderID: afsInfo.AfsServiceOrder,
VendorOrderID: afsInfo.OrderID,
VendorStoreID: afsInfo.StationID,
StoreID: int(utils.Str2Int64WithDefault(afsInfo.StationNumOutSystem, 0)),
AfsCreatedAt: afsInfo.CreateTime.GoTime(),
FreightUserMoney: afsInfo.OrderFreightMoney,
AfsFreightMoney: afsInfo.AfsFreight,
BoxMoney: afsInfo.PackagingMoney,
TongchengFreightMoney: afsInfo.TongchengFreightMoney,
SkuBoxMoney: afsInfo.MealBoxMoney,
VendorStatus: utils.Int2Str(afsInfo.AfsServiceState),
VendorReasonType: utils.Int2Str(afsInfo.QuestionTypeCid),
ReasonType: c.convertAfsReasonType(afsInfo.QuestionTypeCid),
ReasonDesc: utils.LimitUTF8StringLen(afsInfo.QuestionDesc, 1024),
ReasonImgList: utils.LimitUTF8StringLen(jdapi.ProcessQuestionPic(afsInfo.QuestionPic), 1024),
VendorAppealType: afsInfo.ApplyDeal,
AppealType: c.convertAfsAppealType(afsInfo.ApplyDeal),
VendorOrgCode: afsInfo.VenderID,
}
afsOrder.Status = c.GetAfsStatusFromVendorStatus(afsOrder.VendorStatus)
for _, x := range afsInfo.AfsDetailList {
orderSku := &model.OrderSkuFinancial{
// VendorID: model.VendorIDJD,
// AfsOrderID: afsOrder.AfsOrderID,
// VendorOrderID: afsOrder.VendorOrderID,
// VendorStoreID: afsOrder.VendorStoreID,
// StoreID: afsOrder.StoreID,
// IsAfsOrder: 1,
Count: x.SkuCount,
// ConfirmTime: afsOrder.AfsCreateAt,
VendorSkuID: utils.Int64ToStr(x.WareID),
SkuID: int(utils.Str2Int64WithDefault(x.SkuIDIsv, 0)),
Name: x.WareName,
UserMoney: x.AfsMoney,
PmSkuSubsidyMoney: x.PlatPayMoney,
}
if x.PromotionType != 0 && x.PromotionType != jdapi.PromotionTypeNormal {
orderSku.StoreSubName = utils.Int2Str(x.PromotionType)
}
afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney
orderSku.PmSubsidyMoney += orderSku.PmSkuSubsidyMoney
for _, y := range x.AfsSkuDiscountList {
orderSku.PmSubsidyMoney += y.PlatPayMoney
}
afsOrder.SkuUserMoney += orderSku.UserMoney
afsOrder.PmSubsidyMoney += orderSku.PmSubsidyMoney
afsOrder.Skus = append(afsOrder.Skus, orderSku)
}
return afsOrder
}
// 审核售后单申请
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
if globals.EnableJdStoreWrite {
err = getAPI(order.VendorOrgCode).AfsOpenApprove(order.AfsOrderID, afsApproveTypeMap[approveType], reason, ctx.GetUserName())
}
return err
}
// 确认收到退货
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
if globals.EnableJdStoreWrite {
err = getAPI(order.VendorOrgCode).ConfirmReceipt(order.AfsOrderID, ctx.GetUserName())
}
return err
}
func orderSkus2AfsSkus(refundSkuList []*model.OrderSku) (list []*jdapi.VenderAfsSkuDTO) {
for _, v := range refundSkuList {
actType := int(utils.Str2Int64WithDefault(v.StoreSubName, 0))
if actType == 0 { //!(actType == jdapi.PromotionTypeOverflowGiveGift || actType == jdapi.PromotionTypeBuyGiveGift) {
actType = 1
}
list = append(list, &jdapi.VenderAfsSkuDTO{
SkuID: utils.Str2Int64(v.VendorSkuID),
SkuCount: v.Count,
PromotionType: actType,
})
}
return list
}
// 发起全款退款
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
return c.PartRefundOrder(ctx, order, order.Skus, reason)
}
// 发起部分退款
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
if globals.EnableJdStoreWrite {
_, err = getAPI(order.VendorOrgCode).AfsSubmit(order.VendorOrderID, ctx.GetUserName(), utils.Int2Str(jdapi.AfsReasonTypeWrongGoods), reason, "", order.ConsigneeName, order.ConsigneeMobile, order.ConsigneeAddress, orderSkus2AfsSkus(refundSkuList))
}
return err
}