Commit 6111c8d6 by 周晓航

新增 未接单的退款售后处理逻辑

parent 269947c8
...@@ -19,7 +19,8 @@ public enum PayRefundStatus { ...@@ -19,7 +19,8 @@ public enum PayRefundStatus {
/** /**
* 额外状态码 用于判断逻辑, * 额外状态码 用于判断逻辑,
*/ */
NOT_SUFFICIENT_FUNDS(8200201,"余额不足"); NOT_SUFFICIENT_FUNDS(8200201,"余额不足"),
COMPATIBILITY_STATUS(9999999,"兼容爱马哥报错");
private Integer code; private Integer code;
private String desc; private String desc;
......
...@@ -206,6 +206,7 @@ public enum ResponseResult { ...@@ -206,6 +206,7 @@ public enum ResponseResult {
*/ */
PAY_BACKEND_CONFIG_ERROR("58003", "支付交易异常","Abnormal payment transaction"), PAY_BACKEND_CONFIG_ERROR("58003", "支付交易异常","Abnormal payment transaction"),
PAY_SVC_CONFIG_ERROR("58004", "不支持储值卡支付",""), PAY_SVC_CONFIG_ERROR("58004", "不支持储值卡支付",""),
PAY_REFUND_ERROR("58005", "退款已受理,请等待",""),
/** /**
* 优惠券活动 * 优惠券活动
*/ */
......
...@@ -2018,9 +2018,9 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2018,9 +2018,9 @@ public class OrderServiceImpl implements Orderservice {
BaseResponse baseResponse = partnerNoTakeOrder(orderRefundVo, orderBean, orderId, AfterSalesType.USER_CANCEL, isRefundDeliveryFee); BaseResponse baseResponse = partnerNoTakeOrder(orderRefundVo, orderBean, orderId, AfterSalesType.USER_CANCEL, isRefundDeliveryFee);
if (baseResponse != null) { if (baseResponse != null) {
return baseResponse; return baseResponse;
} } // 删除订单 通知活动添加商品库存
// 删除订单 通知活动添加商品库存
orderQueueService.backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus(), orderBean.getPayStatus()); orderQueueService.backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus(), orderBean.getPayStatus());
} else { } else {
CancelOrderRequest cancelOrderRequest = new CancelOrderRequest(); CancelOrderRequest cancelOrderRequest = new CancelOrderRequest();
cancelOrderRequest.setPartnerId(orderBean.getCompanyId()); cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
...@@ -2074,50 +2074,24 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2074,50 +2074,24 @@ public class OrderServiceImpl implements Orderservice {
String partnerId = orderBean.getCompanyId(); String partnerId = orderBean.getCompanyId();
int state = PayRefundStatus.SUCCESS.getCode(); int state = PayRefundStatus.SUCCESS.getCode();
if (orderBean.getAmount() != 0) { if (orderBean.getAmount() != 0) {
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) { OrderManagerRequest orderManagerRequest = new OrderManagerRequest();
//调用支付退款 orderManagerRequest.setReason(orderRefundVo.getReason());
MultiOrderRefundRequest multiOrderRefundRequest = orderAdapter.getMultiOrderPayRefundRequest(orderBean, refundId); PayRefundResponse refundResponse = paymentHandle.getCommonPayRefundResponse(orderManagerRequest, orderBean);
MultiOrderRefundResponse multiOrderRefundResponse = payServiceImpl.paymentApplicationRefund(multiOrderRefundRequest, orderBean.getCompanyId()); state = refundResponse.getPayRefundStatus().getCode();
if (multiOrderRefundResponse == null || multiOrderRefundResponse.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.ORDER_PAY_RESPONSE_SUCCESS.equals(multiOrderRefundResponse.getCode())) {
return ResponseUtil.error(ResponseResult.MULTIORDER__ERRORREFUND.getCode(), "multiOrderRefund_failed");
}
List<MultiOrderRefundResponse.RefundPlatformResponse> refundPlatformResponseList = multiOrderRefundResponse.getData().refundPlatformResponseList;
if (null != refundPlatformResponseList && refundPlatformResponseList.size() > 0) {
redisCache.save(RedisUtil.getPaymentTransIdSequenceKey(refundPlatformResponseList.get(0).getTransId()), orderBean.getOid(), 1L, TimeUnit.DAYS);
}
//获取支付返回退款状态
state = PayRefundStatus.SUCCESS.getCode();
} else {
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单
PayRefundResponse resp = paymentHandle.agentPayRefund(orderBean);
state = resp.getPayRefundStatus().getCode();
} else {
//调用支付退款
PayRefundRequestDto orderPayRefundRequest = orderAdapter.getOrderPayRefundRequest(orderBean, refundId, fatherOrderId);
//抖音支付退款必传
orderPayRefundRequest.setRefundDesc(orderRefundVo.getReason() == null ? "用户退款" : orderRefundVo.getReason());
response = payServiceImpl.orderRefund(orderPayRefundRequest);
if (response == null || response.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(response.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
}
//获取支付返回退款状态
state = response.getData().getRefundStatus() == null ? PayRefundStatus.SUCCESS.getCode() : response.getData().getRefundStatus();
}
}
} }
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(), CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(),
partnerId, afterSalesType, orderRefundVo.getReason(), LogThreadLocal.getTrackingNo(), refundId.toString()); partnerId, afterSalesType, orderRefundVo.getReason(), LogThreadLocal.getTrackingNo(), refundId.toString());
cancelOrderRequest.setOperator(orderBean.getUserName()); cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setPartnerId(orderBean.getCompanyId()); cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) { if (Objects.equals(PayRefundStatus.FAIL.getCode(), state)) {
// 退款中 // 退款中
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent()); cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) { } else if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功 //退款成功
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent()); cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
cancelOrderRequest.setCreateEvent(null);
} }
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks()); cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee); cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
...@@ -2130,6 +2104,11 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2130,6 +2104,11 @@ public class OrderServiceImpl implements Orderservice {
if (baseOrderResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) { if (baseOrderResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed"); return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
} }
if (state == PayRefundStatus.RUNNING.getCode().intValue()) {
// 如果退款中, 直接来个申请记录, 退款回调进行处理
return ResponseUtil.error(ResponseResult.PAY_REFUND_ERROR);
}
return null; return null;
} }
...@@ -2336,7 +2315,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2336,7 +2315,7 @@ public class OrderServiceImpl implements Orderservice {
messageTemplateRequest.setMessageEventType(messageEventType); messageTemplateRequest.setMessageEventType(messageEventType);
com.freemud.application.sdk.api.base.BaseResponse baseResponse = this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest); com.freemud.application.sdk.api.base.BaseResponse baseResponse = this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest);
if (!Objects.equals(baseResponse.getCode(), ResponseResultEnum.SUCCESS.getCode())) { if (!Objects.equals(baseResponse.getCode(), ResponseResultEnum.SUCCESS.getCode())) {
AppLogUtil.errorLog("发送支付成功模板消息 失败",orderBean.getOid(),JSON.toJSONString(baseResponse),null); AppLogUtil.errorLog("发送支付成功模板消息 失败", orderBean.getOid(), JSON.toJSONString(baseResponse), null);
} }
} catch (Exception e) { } catch (Exception e) {
AppLogUtil.errorLog("sendTemplateMsg_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(messageTemplateRequest), e); AppLogUtil.errorLog("sendTemplateMsg_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(messageTemplateRequest), e);
...@@ -3592,7 +3571,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3592,7 +3571,7 @@ public class OrderServiceImpl implements Orderservice {
} else { } else {
resultMap.put(orderCode, resp.getMessage()); resultMap.put(orderCode, resp.getMessage());
} }
}catch (Exception e){ } catch (Exception e) {
resultMap.put(orderCode, e.getMessage()); resultMap.put(orderCode, e.getMessage());
} }
}); });
...@@ -3623,7 +3602,7 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3623,7 +3602,7 @@ public class OrderServiceImpl implements Orderservice {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单已取消,无法退款"); return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "订单已取消,无法退款");
} }
// fisherman 仅仅支持 餐饮类订单进行操作 // fisherman 仅仅支持 餐饮类订单进行操作
if (BizTypeEnum.ORDINARY.getBizType().compareTo(orderBean.getBizType()) !=0) { if (BizTypeEnum.ORDINARY.getBizType().compareTo(orderBean.getBizType()) != 0) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "仅支持餐饮订单操作"); return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "仅支持餐饮订单操作");
} }
...@@ -3682,9 +3661,9 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3682,9 +3661,9 @@ public class OrderServiceImpl implements Orderservice {
Long bLong = Long.valueOf(o2.getCreateTime()); Long bLong = Long.valueOf(o2.getCreateTime());
if (bLong > aLong) { if (bLong > aLong) {
return 1; return 1;
}else if (bLong < aLong){ } else if (bLong < aLong) {
return -1; return -1;
}else { } else {
return 0; return 0;
} }
}); });
...@@ -3931,5 +3910,4 @@ public class OrderServiceImpl implements Orderservice { ...@@ -3931,5 +3910,4 @@ public class OrderServiceImpl implements Orderservice {
} }
} }
package cn.freemud.management.entities.dto.response.pay; package cn.freemud.management.entities.dto.response.pay;
import cn.freemud.management.enums.ResponseResult;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus; import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import lombok.Data; import lombok.Data;
...@@ -28,4 +29,9 @@ public class PayRefundResponse { ...@@ -28,4 +29,9 @@ public class PayRefundResponse {
* 退款序列号 * 退款序列号
*/ */
private String refundId; private String refundId;
/**
* 兼容爱马哥退款报错的字段 ,其他场景不会有值
*/
private ResponseResult result;
} }
...@@ -21,6 +21,7 @@ import com.freemud.application.sdk.api.log.ErrorLog; ...@@ -21,6 +21,7 @@ import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1; import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderTypeV1; import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderTypeV1;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto; import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq;
import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp; import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
...@@ -85,6 +86,32 @@ public class PaymentHandle { ...@@ -85,6 +86,32 @@ public class PaymentHandle {
@Autowired @Autowired
private LogUtil logUtil; private LogUtil logUtil;
public PayRefundResponse getCommonPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) {
PayRefundResponse refundResponse;
try {
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) {
// payment/application/refund
refundResponse = this.multiRefund(orderBean);
} else {
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
refundResponse = this.agentPayRefund(orderBean);
} else {
//正常订单现金退款 paymentcenter/refund
refundResponse = this.refund(request, orderBean);
}
}
} catch (OrderServiceException orderEx) { // 爱马哥兼容,不抛错
ResponseResult result = orderEx.getResult();
refundResponse = new PayRefundResponse();
refundResponse.setPayRefundStatus(PayRefundStatus.COMPATIBILITY_STATUS);
refundResponse.setResult(result);
return refundResponse;
}
return refundResponse;
}
/** /**
* 退款 * 退款
* *
......
...@@ -243,25 +243,11 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService { ...@@ -243,25 +243,11 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
//取消配送单 //取消配送单
deliveryHandle.cancelDelivery(orderBean, request); deliveryHandle.cancelDelivery(orderBean, request);
//支付退款 //支付退款
PayRefundResponse refundResponse; PayRefundResponse refundResponse = this.getPayRefundResponse(request, orderBean);
try { // 爱马哥报错
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) { if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.COMPATIBILITY_STATUS.getCode()) == 0) {
// payment/application/refund return ResponseUtil.error(refundResponse.getResult());
refundResponse = paymentHandle.multiRefund(orderBean);
} else {
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
refundResponse = paymentHandle.agentPayRefund(orderBean);
} else {
//正常订单现金退款 paymentcenter/refund
refundResponse = paymentHandle.refund(request, orderBean);
}
}
} catch (OrderServiceException orderEx) { // 爱马哥兼容,不抛错
return ResponseUtil.error(orderEx.getResult());
} }
// fisherman --> 退款中的状态 阻止后续流程 等待支付回调 // fisherman --> 退款中的状态 阻止后续流程 等待支付回调
if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.RUNNING.getCode()) == 0) { if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.RUNNING.getCode()) == 0) {
return ResponseUtil.error(ResponseResult.REFUND_FAIL_WAIT_CALLBACK); return ResponseUtil.error(ResponseResult.REFUND_FAIL_WAIT_CALLBACK);
...@@ -278,6 +264,17 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService { ...@@ -278,6 +264,17 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
} }
/** /**
* 提出 退款公共代码
*
* @param request
* @param orderBean
* @return
*/
private PayRefundResponse getPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) {
return paymentHandle.getCommonPayRefundResponse(request, orderBean);
}
/**
* 拒绝退款 * 拒绝退款
* *
* @param request * @param request
...@@ -449,7 +446,7 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService { ...@@ -449,7 +446,7 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
String refundStatus = request.getRefundStatus(); String refundStatus = request.getRefundStatus();
PayRefundStatus payRefundStatus = PayRefundStatus.SUCCESS; PayRefundStatus payRefundStatus = PayRefundStatus.SUCCESS;
if (!Objects.equals(refundStatus,"100")) { if (!Objects.equals(refundStatus, "100")) {
payRefundStatus = PayRefundStatus.FAIL; payRefundStatus = PayRefundStatus.FAIL;
} }
refundResponse.setPayRefundStatus(payRefundStatus); refundResponse.setPayRefundStatus(payRefundStatus);
...@@ -459,9 +456,10 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService { ...@@ -459,9 +456,10 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
omRequest.setReason(reason); omRequest.setReason(reason);
omRequest.setOperator("支付退款回调系统补偿"); omRequest.setOperator("支付退款回调系统补偿");
saasOrderHandle.refundAgree(omRequest, refundResponse, orderBean); saasOrderHandle.refundAgree(omRequest, refundResponse, orderBean);
// 推送pos、微信消息中心 // 推送pos、微信消息中心 未接单前 不需要推送pos
if (!NewOrderStatus.PLACE_AN_ORDER.getIndex().equals(orderBean.getStatusV2())) {
orderBaseService.sendMessage(orderBean, ORDER_AGREE_REFUND, reason); orderBaseService.sendMessage(orderBean, ORDER_AGREE_REFUND, reason);
}
//todo 可以考虑基于订单回调异步实现 //todo 可以考虑基于订单回调异步实现
//冲正库存 //冲正库存
stockHandle.revert(omRequest, orderBean); stockHandle.revert(omRequest, orderBean);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment