Commit 0c96f890 by rui.zhu

Merge branch 'feature/rui.zhu/退款接口逻辑调整'

parents 93b67d9f b6319a03
...@@ -20,6 +20,7 @@ public class OrderCancelReqAdapter { ...@@ -20,6 +20,7 @@ public class OrderCancelReqAdapter {
public static OrderCancelReq convert(OrderInfoReqs order, public static OrderCancelReq convert(OrderInfoReqs order,
String refundId, String refundId,
AfterSalesType afterSalesType, AfterSalesType afterSalesType,
Boolean isPartRefund,
Long refundAmount, Long refundAmount,
String reason, String reason,
String remark, String remark,
...@@ -34,7 +35,7 @@ public class OrderCancelReqAdapter { ...@@ -34,7 +35,7 @@ public class OrderCancelReqAdapter {
req.setOrderCode(order.getOrderCode()); req.setOrderCode(order.getOrderCode());
req.setReqRemark(remark); req.setReqRemark(remark);
req.setReqAmount(refundAmount != null ? new BigDecimal(refundAmount) : null); req.setReqAmount(refundAmount != null ? new BigDecimal(refundAmount) : null);
req.setIsPartRefund(refundAmount != null); // 是否部分退 req.setIsPartRefund(isPartRefund != null && isPartRefund); // 是否部分退
//售后单类型 1:其他取消 2:用户取消 3:商户取消 4:未支付超时关单 5:商户接单超时取消 6:商家拒单 //售后单类型 1:其他取消 2:用户取消 3:商户取消 4:未支付超时关单 5:商户接单超时取消 6:商家拒单
// 7:配送用户拒收 8:用户售后退货/售后退款 9:系统取消 10:客服取消 11:用户统一取消, // 7:配送用户拒收 8:用户售后退货/售后退款 9:系统取消 10:客服取消 11:用户统一取消,
req.setAfterSalesType(afterSalesType.getIndex()); req.setAfterSalesType(afterSalesType.getIndex());
......
...@@ -260,7 +260,7 @@ public class OrderController { ...@@ -260,7 +260,7 @@ public class OrderController {
// 微商城因为没有退款原因选项 所以将用户退款说明用户作为退款原因 // 微商城因为没有退款原因选项 所以将用户退款说明用户作为退款原因
String reason = StringUtils.isBlank(reqVo.getReason()) String reason = StringUtils.isBlank(reqVo.getReason())
? reqVo.getRemarks() : reqVo.getReason(); ? reqVo.getRemarks() : reqVo.getReason();
refundService.refundOrder(reqVo.getPartnerId(), reqVo.getOid(), reqVo.getRefundAmount(), reason, reqVo.getRemarks(), reqVo.getRefundMode()); refundService.refundOrder(reqVo, reason);
return ResponseUtil.success(); return ResponseUtil.success();
} }
......
...@@ -55,4 +55,7 @@ public class OrderRefundVo { ...@@ -55,4 +55,7 @@ public class OrderRefundVo {
@ApiModelProperty(value = "微商城退款方式", notes = RefundModeEnum.API_DOC) @ApiModelProperty(value = "微商城退款方式", notes = RefundModeEnum.API_DOC)
private Byte refundMode; private Byte refundMode;
@ApiModelProperty("是否部分退款,默认为false")
private Boolean isPartRefund = false;
} }
...@@ -10,6 +10,7 @@ import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo; ...@@ -10,6 +10,7 @@ import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo;
import cn.freemud.entities.dto.ecology.SendMessageRequest; import cn.freemud.entities.dto.ecology.SendMessageRequest;
import cn.freemud.entities.dto.store.BusinessInfoDto; import cn.freemud.entities.dto.store.BusinessInfoDto;
import cn.freemud.entities.vo.OrderDevelopRefundVo; import cn.freemud.entities.vo.OrderDevelopRefundVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.enums.AfterSalesOrderCreateEventEnum; import cn.freemud.enums.AfterSalesOrderCreateEventEnum;
import cn.freemud.enums.PayRefundStatus; import cn.freemud.enums.PayRefundStatus;
import cn.freemud.enums.PayStatus; import cn.freemud.enums.PayStatus;
...@@ -114,14 +115,17 @@ public class RefundService { ...@@ -114,14 +115,17 @@ public class RefundService {
/** /**
* C端用户发起退款 * C端用户发起退款
* *
* @param partnerId 商户号 * @param orderRefundVo {@link OrderRefundVo} 退款参数
* @param orderCode 订单号 * @param reason 退款原因/说明
* @param refundAmount 退款金额
* @param reason 退款原因/说明
* @param remark 退款备注
* @param refundMode 商城订单 退款模式
*/ */
public void refundOrder(String partnerId, String orderCode, Long refundAmount, String reason, String remark, Byte refundMode) { public void refundOrder(OrderRefundVo orderRefundVo, String reason) {
String partnerId = orderRefundVo.getPartnerId();
String orderCode = orderRefundVo.getOid();
Long refundAmount = orderRefundVo.getRefundAmount();
String remark = orderRefundVo.getRemarks();
Boolean isPartRefund = orderRefundVo.getIsPartRefund();
Byte refundMode = orderRefundVo.getRefundMode();
if (StringUtils.isEmpty(reason)) reason = "退款"; if (StringUtils.isEmpty(reason)) reason = "退款";
// 退款校验 // 退款校验
OrderInfoReqs order = preValidRefund(partnerId, orderCode, refundMode); OrderInfoReqs order = preValidRefund(partnerId, orderCode, refundMode);
...@@ -141,11 +145,11 @@ public class RefundService { ...@@ -141,11 +145,11 @@ public class RefundService {
// 未接单 // 未接单
if (NewOrderStatus.PLACE_AN_ORDER.getIndex().equals(order.getOrderState())) { if (NewOrderStatus.PLACE_AN_ORDER.getIndex().equals(order.getOrderState())) {
// 商家未接单逻辑处理 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口 // 商家未接单逻辑处理 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
refundOrder(order, reason, remark, refundDeliveryFee, refundMode); refundOrder(order, isPartRefund, reason, remark, refundDeliveryFee, refundMode);
orderQueueService.backOrdersStatusChange(order.getOrderCode(), orderSdkAdapter.getOldStatus(order.getOrderState()), order.getPayState(), order.getPartnerId()); orderQueueService.backOrdersStatusChange(order.getOrderCode(), orderSdkAdapter.getOldStatus(order.getOrderState()), order.getPayState(), order.getPartnerId());
} else { } else {
// 已接单的,创建售后单 // 已接单的,创建售后单
createAfterSales(order, refundAmount, reason, remark, refundDeliveryFee, refundMode); createAfterSales(order, refundAmount, isPartRefund, reason, remark, refundDeliveryFee, refundMode);
} }
} }
...@@ -219,7 +223,7 @@ public class RefundService { ...@@ -219,7 +223,7 @@ public class RefundService {
if (!isCreateAfter) { if (!isCreateAfter) {
// 没有已申请的售后单,创建售后单 // 没有已申请的售后单,创建售后单
createAfterSales(order, null, reqVo.getReason(), reqVo.getReason(), refundDeliveryFee, reqVo.getRefundMode()); createAfterSales(order, null, false, reqVo.getReason(), reqVo.getReason(), refundDeliveryFee, reqVo.getRefundMode());
} }
// 调用oms的 同意退款操作 // 调用oms的 同意退款操作
OrderManagerRequest request = new OrderManagerRequest(); OrderManagerRequest request = new OrderManagerRequest();
...@@ -283,11 +287,12 @@ public class RefundService { ...@@ -283,11 +287,12 @@ public class RefundService {
* 商家未接单,取消订单逻辑处理 * 商家未接单,取消订单逻辑处理
* 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口 * 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
*/ */
private void refundOrder(OrderInfoReqs order, String reason, String remark, Boolean isRefundDeliveryFee, Byte refundMode) { private void refundOrder(OrderInfoReqs order, Boolean isPartRefund, String reason, String remark, Boolean isRefundDeliveryFee, Byte refundMode) {
int state = PayRefundStatus.SUCCESS.getCode(); int state = PayRefundStatus.SUCCESS.getCode();
List<OrderCancelReq.PayRefundItem> refundItemList = new ArrayList<>(); List<OrderCancelReq.PayRefundItem> refundItemList = new ArrayList<>();
PayRefundResponse refundResponse = null;
if (order.getSettlementAmount().longValue() > 0) { if (order.getSettlementAmount().longValue() > 0) {
PayRefundResponse refundResponse = paymentHandle.getCommonPayRefundResponse(order, reason); refundResponse = paymentHandle.getCommonPayRefundResponse(order, reason);
state = refundResponse.getPayRefundStatus().getCode(); state = refundResponse.getPayRefundStatus().getCode();
if (CollectionUtils.isNotEmpty(refundResponse.getPayRefundItemList())) { if (CollectionUtils.isNotEmpty(refundResponse.getPayRefundItemList())) {
refundResponse.getPayRefundItemList().forEach(item -> { refundResponse.getPayRefundItemList().forEach(item -> {
...@@ -297,9 +302,9 @@ public class RefundService { ...@@ -297,9 +302,9 @@ public class RefundService {
}); });
} }
} }
Long refundAmount = refundResponse != null ? refundResponse.getRefundAmount().longValue() : null;
OrderCancelReq req = OrderCancelReqAdapter.convert(order, UUID.randomUUID().toString(), OrderCancelReq req = OrderCancelReqAdapter.convert(order, UUID.randomUUID().toString(),
AfterSalesType.USER_CANCEL, null, reason, remark, isRefundDeliveryFee, refundMode); AfterSalesType.USER_CANCEL, isPartRefund, refundAmount, reason, remark, isRefundDeliveryFee, refundMode);
req.setRefundState(AfterSalesRefunStateEnum.STATE_4.getIndex()); req.setRefundState(AfterSalesRefunStateEnum.STATE_4.getIndex());
if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) { if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功 //退款成功
...@@ -328,10 +333,10 @@ public class RefundService { ...@@ -328,10 +333,10 @@ public class RefundService {
/** /**
* 创建售后单 * 创建售后单
*/ */
private void createAfterSales(OrderInfoReqs order, Long refundAmount, String reason, String remark, Boolean refundDeliveryFee, Byte refundMode) { private void createAfterSales(OrderInfoReqs order, Long refundAmount, Boolean isPartRefund, String reason, String remark, Boolean refundDeliveryFee, Byte refundMode) {
AfterSalesType type = NewOrderStatus.COMPLETE.getIndex().equals(order.getOrderState()) AfterSalesType type = NewOrderStatus.COMPLETE.getIndex().equals(order.getOrderState())
? AfterSalesType.USER_SALE_RETURN : AfterSalesType.USER_CANCEL; ? AfterSalesType.USER_SALE_RETURN : AfterSalesType.USER_CANCEL;
OrderCancelReq req = OrderCancelReqAdapter.convert(order, null, type, refundAmount, reason, remark, refundDeliveryFee, refundMode); OrderCancelReq req = OrderCancelReqAdapter.convert(order, null, type, isPartRefund, refundAmount, reason, remark, refundDeliveryFee, refundMode);
// 查询门店服务配置,退单模式为2为自动退款,判断自动退款时间,设置为0则不传入timeout, // 查询门店服务配置,退单模式为2为自动退款,判断自动退款时间,设置为0则不传入timeout,
BusinessInfoDto config = storeManager.queryStoreBusiness(order.getPartnerId(), order.getStoreId()); BusinessInfoDto config = storeManager.queryStoreBusiness(order.getPartnerId(), order.getStoreId());
if (Objects.equals(config.getAutoChargebackOrderType(), 2) && !Objects.equals(config.getAutoChargebackOrderTime(), 0)) { if (Objects.equals(config.getAutoChargebackOrderType(), 2) && !Objects.equals(config.getAutoChargebackOrderTime(), 0)) {
......
...@@ -4,6 +4,7 @@ import cn.freemud.management.enums.ResponseResult; ...@@ -4,6 +4,7 @@ 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;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
...@@ -47,6 +48,11 @@ public class PayRefundResponse { ...@@ -47,6 +48,11 @@ public class PayRefundResponse {
private Boolean partRefund = false; private Boolean partRefund = false;
/** /**
* 退款总额
*/
private BigDecimal refundAmount;
/**
* 对退款明细的记录 * 对退款明细的记录
*/ */
private List<PayRefundItem> payRefundItemList; private List<PayRefundItem> payRefundItemList;
......
package cn.freemud.management.enums;
public enum OrderCostType {
//订单费用类型 1:包装费 2:运费 3:餐盒单价 4:餐盒数量 5:会员卡费用 6:储值卡费用 7:商户小费 8:商户支付运费 9:津贴服务费 11:会员开卡费
PACKAGE_FEE(1, "包装费"),
DELIVERY_FEE(2, "运费"),
OPEN_MEMBER_CARD_FEE(11, "会员卡开卡费"),
;
private int type;
private String desc;
OrderCostType(int type, String desc) {
this.type = type;
this.desc = desc;
}
public int getType() {
return type;
}
public String getDesc() {
return desc;
}
}
...@@ -10,6 +10,7 @@ import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse; ...@@ -10,6 +10,7 @@ import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundData; import cn.freemud.management.entities.dto.response.pay.PayRefundData;
import cn.freemud.management.entities.dto.response.pay.PayRefundResponse; import cn.freemud.management.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PaymentQueryOrderResponseDto; import cn.freemud.management.entities.dto.response.pay.PaymentQueryOrderResponseDto;
import cn.freemud.management.enums.OrderCostType;
import cn.freemud.management.enums.PaymentRefundStatus; import cn.freemud.management.enums.PaymentRefundStatus;
import cn.freemud.management.enums.ResponseResult; import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.intercept.OrderServiceException; import cn.freemud.management.intercept.OrderServiceException;
...@@ -27,6 +28,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto; ...@@ -27,6 +28,7 @@ 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.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.response.orderInfo.OrderCostResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService; import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.ordercenter.util.LogUtil; import com.freemud.application.sdk.api.ordercenter.util.LogUtil;
...@@ -83,7 +85,14 @@ public class PaymentHandle { ...@@ -83,7 +85,14 @@ public class PaymentHandle {
public PayRefundResponse getCommonPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) { public PayRefundResponse getCommonPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) {
PayRefundResponse refundResponse; PayRefundResponse refundResponse;
try { try {
BigDecimal refundAmount = getRefundAmount(orderBean.getCompanyId(), new BigDecimal(orderBean.getAmount()), orderBean.getOid()); // 最大可退金额 = 订单实付总额 - 开通会员卡金额 退款的时候会员卡已经开通了,所以开卡费不可退
OrderCostResp openMemberCardCost = null;
if (CollectionUtils.isNotEmpty(orderBean.getOrderCostDetailList())) {
openMemberCardCost = orderBean.getOrderCostDetailList().stream().filter(c -> Objects.equals(c.getCostType(), OrderCostType.OPEN_MEMBER_CARD_FEE.getType())).findFirst().orElse(null);
}
// 最大可退金额 = 订单实付总额 - 开通会员卡金额 退款的时候会员卡已经开通了,所以开卡费不可退
BigDecimal maxRefundAmount = openMemberCardCost != null ? new BigDecimal(orderBean.getAmount()).subtract(openMemberCardCost.getCostAmount()) : new BigDecimal(orderBean.getAmount());
BigDecimal refundAmount = getRefundAmount(orderBean.getCompanyId(), maxRefundAmount, orderBean.getOid());
//订单支付明细表新saas都会存数据,ka,pass商户需要兼容 //订单支付明细表新saas都会存数据,ka,pass商户需要兼容
PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getOid(), refundAmount, orderBean.getOrderPayItem()); PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getOid(), refundAmount, orderBean.getOrderPayItem());
if (multiRefundResponse != null) { if (multiRefundResponse != null) {
...@@ -109,7 +118,7 @@ public class PaymentHandle { ...@@ -109,7 +118,7 @@ public class PaymentHandle {
refundResponse = this.payRefund(req); refundResponse = this.payRefund(req);
} }
} }
refundResponse.setPartRefund(!Objects.equals(orderBean.getSettlementAmount(), refundAmount.longValue())); refundResponse.setPartRefund(!Objects.equals(maxRefundAmount.compareTo(refundAmount), 0));
} catch (OrderServiceException orderEx) { } catch (OrderServiceException orderEx) {
ResponseResult result = orderEx.getResult(); ResponseResult result = orderEx.getResult();
refundResponse = new PayRefundResponse(); refundResponse = new PayRefundResponse();
...@@ -139,12 +148,19 @@ public class PaymentHandle { ...@@ -139,12 +148,19 @@ public class PaymentHandle {
public PayRefundResponse getCommonPayRefundResponse(OrderInfoReqs order, String reason) { public PayRefundResponse getCommonPayRefundResponse(OrderInfoReqs order, String reason) {
PayRefundResponse refundResponse; PayRefundResponse refundResponse;
try { try {
BigDecimal refundAmount = getRefundAmount(order.getPartnerId(), order.getSettlementAmount(), order.getOrderCode()); // 最大可退金额 = 订单实付总额 - 开通会员卡金额 退款的时候会员卡已经开通了,所以开卡费不可退
OrderCostResp openMemberCardCost = null;
if (CollectionUtils.isNotEmpty(order.getOrderCostDetailList())) {
openMemberCardCost = order.getOrderCostDetailList().stream().filter(c -> Objects.equals(c.getCostType(), OrderCostType.OPEN_MEMBER_CARD_FEE.getType())).findFirst().orElse(null);
}
BigDecimal maxRefundAmount = openMemberCardCost != null ? order.getSettlementAmount().subtract(openMemberCardCost.getCostAmount()) : order.getSettlementAmount();
BigDecimal refundAmount = getRefundAmount(order.getPartnerId(), maxRefundAmount, order.getOrderCode());
PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(order.getPartnerId(), order.getStoreId(), order.getOrderCode(), refundAmount, order.getOrderPayItemCreateReqList()); PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(order.getPartnerId(), order.getStoreId(), order.getOrderCode(), refundAmount, order.getOrderPayItemCreateReqList());
if (multiRefundResponse != null) { if (multiRefundResponse != null) {
// payment/application/refund // payment/application/refund
refundResponse = multiRefundResponse; refundResponse = multiRefundResponse;
refundResponse.setRefundAmount(refundAmount);
} else { } else {
OrderExtendedReq extended = order.getOrderExtended(); OrderExtendedReq extended = order.getOrderExtended();
if (StringUtils.isNotBlank(extended.getAgentPayerId()) && !Objects.equals(extended.getAgentPayerId(), order.getUserId())) { if (StringUtils.isNotBlank(extended.getAgentPayerId()) && !Objects.equals(extended.getAgentPayerId(), order.getUserId())) {
...@@ -166,7 +182,8 @@ public class PaymentHandle { ...@@ -166,7 +182,8 @@ public class PaymentHandle {
refundResponse = this.payRefund(req); refundResponse = this.payRefund(req);
} }
} }
refundResponse.setPartRefund(!Objects.equals(order.getSettlementAmount().compareTo(refundAmount), 0)); refundResponse.setPartRefund(!Objects.equals(maxRefundAmount.compareTo(refundAmount), 0));
refundResponse.setRefundAmount(refundAmount);
} catch (OrderServiceException orderEx) { } catch (OrderServiceException orderEx) {
ResponseResult result = orderEx.getResult(); ResponseResult result = orderEx.getResult();
refundResponse = new PayRefundResponse(); refundResponse = new PayRefundResponse();
......
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