diff --git a/business/partner/purchase/tao_vegetable/order_afs.go b/business/partner/purchase/tao_vegetable/order_afs.go index 54f9b3f92..bb952728c 100644 --- a/business/partner/purchase/tao_vegetable/order_afs.go +++ b/business/partner/purchase/tao_vegetable/order_afs.go @@ -24,22 +24,26 @@ var ( tao_vegetable.OrderStatusApplyAfs: model.AfsOrderStatusWait4Approve, tao_vegetable.OrderStatusCancelAfs: model.AfsOrderStatusCancelAfs, tao_vegetable.OrderStatusRefundSuccess: model.AfsOrderStatusFinished, + tao_vegetable.OrderStatusOnSaleCancel: model.AfsOrderStatusOnSaleAfs, } ) func (c *PurchaseHandler) isAfsMsg(orderStatus string, orderId string) bool { - if orderStatus == tao_vegetable.OrderStatusApplyAfs || orderStatus == tao_vegetable.OrderStatusCancelAfs || orderStatus == tao_vegetable.OrderStatusRefundSuccess { - switch orderStatus { - case tao_vegetable.OrderStatusApplyAfs, tao_vegetable.OrderStatusCancelAfs: - order, _ := partner.CurOrderManager.LoadOrder2(orderId, model.VendorIDTaoVegetable) - if order != nil { - return true - } - case tao_vegetable.OrderStatusRefundSuccess: - afsOrder, _ := partner.CurOrderManager.LoadAfsOrder(orderId, model.VendorIDTaoVegetable) - if afsOrder != nil { - return true - } + switch orderStatus { + case tao_vegetable.OrderStatusApplyAfs, tao_vegetable.OrderStatusCancelAfs: + order, _ := partner.CurOrderManager.LoadOrder2(orderId, model.VendorIDTaoVegetable) + if order != nil { + return true + } + case tao_vegetable.OrderStatusRefundSuccess: + afsOrder, _ := partner.CurOrderManager.LoadAfsOrder(orderId, model.VendorIDTaoVegetable) + if afsOrder != nil { + return true + } + case tao_vegetable.OrderStatusOnSaleCancel: + order, _ := partner.CurOrderManager.LoadOrder(orderId, model.VendorIDTaoVegetable) + if order != nil { + return true } } return false @@ -69,12 +73,39 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal } } } + if needCallNew && orderStatus.Status == model.AfsOrderStatusOnSaleAfs { + needCallNew = false + } if needCallNew { refundData := msg.(*tao_vegetable.UserApplyRefundCallBack) var afsOrder *model.AfsOrder var api = getAPI("", 0, refundData.StoreId) + // 订单商品详细信息 + queryOrderDetailParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(refundData.StoreId), + }} + order, err := partner.CurOrderManager.LoadOrder2(refundData.OutOrderId, model.VendorIDTaoVegetable) + if err != nil { + globals.SugarLogger.Debugf("用户申请售后时,通过售后外部渠道订单号获取主订单失败:%s", err.Error()) + return tao_vegetable.CallBackResultInfo(err) + } + if order == nil { + globals.SugarLogger.Debugf("数据库订单查询失败,订单号异常 :%s", refundData.OutOrderId) + return tao_vegetable.CallBackResultInfo(errors.New("订单号异常")) + } + queryOrderDetailParam.OrderGetRequest.BizOrderId = utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)) + skuList, err := api.QueryOrderDetail(queryOrderDetailParam) + if err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + if *skuList.OrderStatus != tao_vegetable.OrderStatusSuccess { + // 用户申请售后,只有订单完成之后才可以!现在是售中取消和售后取消都在走这个接口 + // 所以只处理售后取消的消息 + return tao_vegetable.CallBackResultInfo(nil) + } + afsOrder = &model.AfsOrder{ VendorID: model.VendorIDTaoVegetable, AfsOrderID: orderStatus.VendorOrderID, @@ -99,19 +130,6 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal } refundIds = append(refundIds, utils.Str2Int64(refundData.BizRefundId)) - //taoAfsOrderDetail, err := getAPI(refundData.MerchantCode, 0, "").QueryAfsOrderDetail(&request591.AlibabaWdkOrderRefundGetRequest{ - // BizOrderIds: &bizOrderIds, - // RefundIds: &refundIds, - // OrderFrom: nil, - // ShopId: nil, - // StoreId: &refundData.StoreId, - //}) - //if err != nil { - // return tao_vegetable.CallBackResultInfo(err) - //} - // - //taoAfsOrder := *taoAfsOrderDetail.Orders - afsOrder.FreightUserMoney = 0 // 订单运费 afsOrder.AfsFreightMoney = 0 // 暂时未发现退货取件费用 afsOrder.BoxMoney = 0 // 餐盒费 @@ -119,25 +137,6 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal afsOrder.SkuBoxMoney = 0 // 商品包装费 afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态 - // 订单商品详细信息 - queryOrderDetailParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ - StoreId: utils.String2Pointer(refundData.StoreId), - }} - order, err := partner.CurOrderManager.LoadOrder2(refundData.OutOrderId, model.VendorIDTaoVegetable) - if err != nil { - globals.SugarLogger.Debugf("用户申请售后时,通过售后外部渠道订单号获取主订单失败:%s", err.Error()) - return tao_vegetable.CallBackResultInfo(err) - } - if order == nil { - globals.SugarLogger.Debugf("数据库订单查询失败,订单号异常 :%s", refundData.OutOrderId) - return tao_vegetable.CallBackResultInfo(errors.New("订单号异常")) - } - queryOrderDetailParam.OrderGetRequest.BizOrderId = utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)) - skuList, err := api.QueryOrderDetail(queryOrderDetailParam) - if err != nil { - return tao_vegetable.CallBackResultInfo(err) - } - var refundSkuCount int64 = 0 // 子订单申请退款的商品数 var orderSkuCount int64 = 0 // 子订单购买的商品数 for _, refundSku := range refundData.SubRefundOrders { // 本次退款订单 @@ -149,18 +148,11 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal VendorSkuID: *sku.SkuCode, SkuID: utils.Str2Int(*sku.SkuCode), Name: *sku.SkuName, + UserMoney: refundSku.MaxRefundFee, PmSkuSubsidyMoney: *sku.DiscountPlatformFee, // 平台补贴商品 VendorOrderID: orderStatus.VendorOrderID, VendorSubOrderID: *sku.OutSubOrderId, } - // 交易成功,商户取消,配送中,配送结束时!订单不退换运费 - switch *sku.OrderStatus { - case tao_vegetable.OrderStatusSuccess, tao_vegetable.OrderStatusMerchantCancel, tao_vegetable.OrderStatusDelivery, tao_vegetable.OrderStatusDeliveryOver: - orderSku.UserMoney = refundSku.RefundFee - default: - orderSku.UserMoney = refundSku.MaxRefundFee - } - afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney afsOrder.Skus = append(afsOrder.Skus, orderSku) orderSkuCount += utils.Float64TwoInt64(*sku.BuySaleQuantity) @@ -183,7 +175,8 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal } } else { // 用户取消售后 - if status == tao_vegetable.OrderStatusCancelAfs { + switch status { + case tao_vegetable.OrderStatusCancelAfs: // 删除售后单 afsOrder, err := dao.GetAfsOrders(db, model.VendorIDTaoVegetable, orderStatus.RefVendorOrderID, orderStatus.VendorOrderID) if err != nil || afsOrder == nil { @@ -221,6 +214,86 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal } } } + // 业务上规定的是打包之后不能取消,但是如果配送超过了预计送达时间1-2小时, + // c端的取消按钮会自动打开,让用户操作取消,但是如果你没接这个接口,用户申请取消了, + // 你这边没有响应那么就不会退钱给用户,就会造成客诉。为什么不接售中取消呢 + case tao_vegetable.OrderStatusOnSaleCancel: + onSaleMsg := msg.(*tao_vegetable.OnSaleCancel) + var afsOrder *model.AfsOrder + var api = getAPI("", 0, onSaleMsg.PartCancelRequest.StoreId) + queryOrderDetailParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(onSaleMsg.PartCancelRequest.StoreId), + BizOrderId: utils.Int64ToPointer(onSaleMsg.PartCancelRequest.BizOrderId), + }} + orderDetail, err := api.QueryOrderDetail(queryOrderDetailParam) + if err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + + afsOrder = &model.AfsOrder{ + VendorID: model.VendorIDTaoVegetable, + AfsOrderID: orderStatus.VendorOrderID, + VendorOrderID: orderStatus.RefVendorOrderID, + VendorStoreID: onSaleMsg.PartCancelRequest.StoreId, + StoreID: 0, + AfsCreatedAt: orderStatus.StatusTime, + VendorAppealType: status, // 原始售后方式 + AppealType: model.AfsAppealTypeUserCancel, // 淘宝这个接口下发的只有用户取消 + VendorReasonType: tao_vegetable.OrderStatusOnSaleCancel, + ReasonType: 0, + ReasonDesc: "售中取消:订单未打包,或者长时间为送到!响应成功直接退款", + VendorOrgCode: api.GetVendorOrgCode(), + } + afsOrder.FreightUserMoney = 0 // 订单运费 + afsOrder.AfsFreightMoney = 0 // 暂时未发现退货取件费用 + afsOrder.BoxMoney = 0 // 餐盒费 + afsOrder.TongchengFreightMoney = 0 // 同城配送费 + afsOrder.SkuBoxMoney = 0 // 商品包装费 + afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态 + + ifAfsTypeFullRefund := false + var refundFee int64 = 0 + for _, v := range *orderDetail.SubOrderResponseList { + for _, v2 := range onSaleMsg.PartCancelRequest.SubOrders { + if *v.BizSubOrderId == v2.BizSubOrderId { + orderSku := &model.OrderSkuFinancial{ + Count: utils.Float64TwoInt(*v.BuySaleQuantity), + VendorSkuID: *v.SkuCode, + SkuID: utils.Str2Int(*v.SkuCode), + Name: *v.SkuName, + UserMoney: *v.OriginalFee, + PmSkuSubsidyMoney: *v.DiscountPlatformFee, // 平台补贴商品 + VendorOrderID: orderStatus.VendorOrderID, + VendorSubOrderID: *v.OutSubOrderId, + } + afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney + afsOrder.Skus = append(afsOrder.Skus, orderSku) + refundFee += *v.OriginalFee + } + } + } + if len(onSaleMsg.PartCancelRequest.SubOrders) == len(*orderDetail.SubOrderResponseList) { + ifAfsTypeFullRefund = true + } + + afsOrder.SkuUserMoney += refundFee + if ifAfsTypeFullRefund { // 全退 + afsOrder.RefundType = model.AfsTypeFullRefund + afsOrder.SkuUserMoney += *orderDetail.PostFee + afsOrder.Skus[len(afsOrder.Skus)-1].UserMoney += *orderDetail.PostFee + } else { + afsOrder.RefundType = model.AfsTypePartRefund + } + + if afsOrder != nil { + //直接就来一个新的售后单,并且还是售后完成的 + if orderStatus.Status == model.AfsOrderStatusFinished { + afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt + } + globals.SugarLogger.Debugf("==============onsaleRefund afsOrd: = %s", utils.Format4Output(afsOrder, false)) + globals.SugarLogger.Debugf("==============onsaleRefund orderStatus: = %s", utils.Format4Output(orderStatus, false)) + err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) + } } if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil { @@ -240,6 +313,7 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal goodsOrder.Status = model.OrderStatusCanceled goodsOrder.VendorStatus = orderStatus.VendorStatus dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") + // 取消三方运单 } } } @@ -278,13 +352,13 @@ func (c *PurchaseHandler) callbackAfsMsg2Status(status string, msg interface{}) if order != nil { orderStatus.RefVendorOrderID = order.VendorOrderID } - //case tao_vegetable.OrderStatusOnSaleCancel: - // refundData := msg.(*tao_vegetable.OnSaleCancel) - // orderStatus.RefVendorOrderID = utils.Int64ToStr(refundData.BizOrderId) - // orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusOnSaleCancel, "用户售中取消") - // orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusOnSaleCancel) - // orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp) - // orderStatus.VendorOrderID = refundData.IdempotentId + case tao_vegetable.OrderStatusOnSaleCancel: + refundData := msg.(*tao_vegetable.OnSaleCancel) + orderStatus.RefVendorOrderID = utils.Int64ToStr(refundData.PartCancelRequest.BizOrderId) + orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusOnSaleCancel, "用户售中取消") + orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusOnSaleCancel) + orderStatus.StatusTime = time.Now() + //orderStatus.VendorOrderID = refundData.IdempotentId case tao_vegetable.OrderStatusRefundSuccess: // 售后成功 refundData := msg.(*tao_vegetable.RefundOrderFinish) afsOrder, _ := partner.CurOrderManager.LoadAfsOrder(refundData.OutMainRefundId, model.VendorIDTaoVegetable)