226 lines
9.2 KiB
Go
226 lines
9.2 KiB
Go
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
|
||
}
|