diff --git a/business/partner/purchase/tao_vegetable/order_afs.go b/business/partner/purchase/tao_vegetable/order_afs.go index 6a359e211..48e0435b6 100644 --- a/business/partner/purchase/tao_vegetable/order_afs.go +++ b/business/partner/purchase/tao_vegetable/order_afs.go @@ -71,22 +71,25 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal var err error var db = dao.GetDB() orderStatus := c.callbackAfsMsg2Status(status, msg) - needCallNew := orderStatus.Status == model.AfsOrderStatusWait4Approve || orderStatus.Status == model.AfsOrderStatusNew - if !needCallNew { - _, err := partner.CurOrderManager.LoadAfsOrder(orderStatus.VendorOrderID, orderStatus.VendorID) - if err != nil { - if dao.IsNoRowsError(err) { - needCallNew = true - } else { - return tao_vegetable.CallBackResultInfo(err) - } - } - } - if needCallNew && orderStatus.Status == model.AfsOrderStatusOnSaleAfs { - needCallNew = false - } + //needCallNew := orderStatus.Status == model.AfsOrderStatusWait4Approve || orderStatus.Status == model.AfsOrderStatusNew + //if !needCallNew { + // _, err := partner.CurOrderManager.LoadAfsOrder(orderStatus.VendorOrderID, orderStatus.VendorID) + // if err != nil { + // if dao.IsNoRowsError(err) { + // needCallNew = true + // } else { + // return tao_vegetable.CallBackResultInfo(err) + // } + // } + //} + //if needCallNew && orderStatus.Status == model.AfsOrderStatusOnSaleAfs { + // needCallNew = false + //} + + // 用户取消售后 + switch status { + case tao_vegetable.OrderStatusApplyAfs: - if needCallNew { refundData := msg.(*tao_vegetable.UserApplyRefundCallBack) var afsOrder *model.AfsOrder var api = getAPI("", 0, refundData.StoreId) @@ -182,150 +185,146 @@ func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal } err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } - } else { - // 用户取消售后 - switch status { - case tao_vegetable.OrderStatusCancelAfs: - // 删除售后单 - afsOrder, err := dao.GetAfsOrders(db, model.VendorIDTaoVegetable, orderStatus.RefVendorOrderID, orderStatus.VendorOrderID) - if err != nil || afsOrder == nil { - globals.SugarLogger.Debugf("用户取消售后单,获取之前生成的售后单失败") - return tao_vegetable.CallBackResultInfo(err) - } - - cancelMsg := msg.(*tao_vegetable.UserCancelRefundApply) - for _, v := range afsOrder { - // 商家驳回,会发出用户撤销的回调通知,不管他 - if v.AfsOrderID == cancelMsg.RefundId && v.Flag == model.AfsOrderFlagRefuseUserRefund { - return tao_vegetable.CallBackResultInfo(nil) - } - - // 用户撤销未处理的售后订单 - if v.AfsOrderID == cancelMsg.RefundId && v.Flag == 0 { - // 下面处理用户撤销售后 - if err = utils.CallFuncLogError(func() error { - _, err = dao.DeleteEntity(db, v, "VendorOrderID", "VendorID") - return err - }, "SaveAfsOrder delete AfsOrder, afsOrderID:%s", v.AfsOrderID); err != nil { - return tao_vegetable.CallBackResultInfo(err) - } - - // 删除售后商品 - if err = utils.CallFuncLogError(func() error { - _, err = dao.DeleteEntity(db, &model.OrderSkuFinancial{ - VendorOrderID: v.VendorOrderID, - VendorID: v.VendorID, - IsAfsOrder: 1, - }, "VendorOrderID", "VendorID", "IsAfsOrder") - return err - }, "SaveAfsOrder delete OrderSkuFinancial, afsOrderID:%s", v.AfsOrderID); err != nil { - return tao_vegetable.CallBackResultInfo(err) - } - } - } - // 业务上规定的是打包之后不能取消,但是如果配送超过了预计送达时间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: onSaleMsg.PartCancelRequest.IdempotentId, - 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 { - //直接就来一个新的售后单,并且还是售后完成的 - afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt - afsOrder.Flag = model.AfsOrderFlagAgreeUserRefund - 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) - } + case tao_vegetable.OrderStatusCancelAfs: + // 删除售后单 + afsOrder, err := dao.GetAfsOrders(db, model.VendorIDTaoVegetable, orderStatus.RefVendorOrderID, orderStatus.VendorOrderID) + if err != nil || afsOrder == nil { + globals.SugarLogger.Debugf("用户取消售后单,获取之前生成的售后单失败") + return tao_vegetable.CallBackResultInfo(err) } - if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil { - skuList, _ := dao.GetSimpleOrderSkus(db, orderStatus.RefVendorOrderID, nil) - totalSkuCount := 0 - for _, v := range skuList { - totalSkuCount += v.Count + cancelMsg := msg.(*tao_vegetable.UserCancelRefundApply) + for _, v := range afsOrder { + // 商家驳回,会发出用户撤销的回调通知,不管他 + if v.AfsOrderID == cancelMsg.RefundId && v.Flag == model.AfsOrderFlagRefuseUserRefund { + return tao_vegetable.CallBackResultInfo(nil) } - financialSku, _ := dao.GetOrderRefundSkuList(db, []string{orderStatus.RefVendorOrderID}) - refundSkuCount := 0 - for _, v := range financialSku { - refundSkuCount += v.Count + // 用户撤销未处理的售后订单 + if v.AfsOrderID == cancelMsg.RefundId && v.Flag == 0 { + // 下面处理用户撤销售后 + if err = utils.CallFuncLogError(func() error { + _, err = dao.DeleteEntity(db, v, "VendorOrderID", "VendorID") + return err + }, "SaveAfsOrder delete AfsOrder, afsOrderID:%s", v.AfsOrderID); err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + + // 删除售后商品 + if err = utils.CallFuncLogError(func() error { + _, err = dao.DeleteEntity(db, &model.OrderSkuFinancial{ + VendorOrderID: v.VendorOrderID, + VendorID: v.VendorID, + IsAfsOrder: 1, + }, "VendorOrderID", "VendorID", "IsAfsOrder") + return err + }, "SaveAfsOrder delete OrderSkuFinancial, afsOrderID:%s", v.AfsOrderID); err != nil { + return tao_vegetable.CallBackResultInfo(err) + } } - if err == nil && status == tao_vegetable.OrderStatusRefundSuccess && totalSkuCount == refundSkuCount { - goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID) - goodsOrder.Status = model.OrderStatusCanceled - goodsOrder.VendorStatus = orderStatus.VendorStatus - dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") - // 取消三方运单 + } + // 业务上规定的是打包之后不能取消,但是如果配送超过了预计送达时间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: onSaleMsg.PartCancelRequest.IdempotentId, + 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 { + //直接就来一个新的售后单,并且还是售后完成的 + afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt + afsOrder.Flag = model.AfsOrderFlagAgreeUserRefund + 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) + } } - globals.SugarLogger.Debugf("=============errr : %v", err) + + if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil { + skuList, _ := dao.GetSimpleOrderSkus(db, orderStatus.RefVendorOrderID, nil) + totalSkuCount := 0 + for _, v := range skuList { + totalSkuCount += v.Count + } + + financialSku, _ := dao.GetOrderRefundSkuList(db, []string{orderStatus.RefVendorOrderID}) + refundSkuCount := 0 + for _, v := range financialSku { + refundSkuCount += v.Count + } + if err == nil && status == tao_vegetable.OrderStatusRefundSuccess && totalSkuCount == refundSkuCount { + goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID) + goodsOrder.Status = model.OrderStatusCanceled + goodsOrder.VendorStatus = orderStatus.VendorStatus + dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") + // 取消三方运单 + } + } + return tao_vegetable.CallBackResultInfo(err) }