Commit d4e0bc6b by rui.zhu

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

parents d6ff47cb e0fad7f2
......@@ -20,6 +20,7 @@ public class OrderCancelReqAdapter {
public static OrderCancelReq convert(OrderInfoReqs order,
String refundId,
AfterSalesType afterSalesType,
Boolean isPartRefund,
Long refundAmount,
String reason,
String remark,
......@@ -34,7 +35,7 @@ public class OrderCancelReqAdapter {
req.setOrderCode(order.getOrderCode());
req.setReqRemark(remark);
req.setReqAmount(refundAmount != null ? new BigDecimal(refundAmount) : null);
req.setIsPartRefund(refundAmount != null); // 是否部分退
req.setIsPartRefund(isPartRefund != null && isPartRefund); // 是否部分退
//售后单类型 1:其他取消 2:用户取消 3:商户取消 4:未支付超时关单 5:商户接单超时取消 6:商家拒单
// 7:配送用户拒收 8:用户售后退货/售后退款 9:系统取消 10:客服取消 11:用户统一取消,
req.setAfterSalesType(afterSalesType.getIndex());
......
......@@ -263,7 +263,7 @@ public class OrderController {
// 微商城因为没有退款原因选项 所以将用户退款说明用户作为退款原因
String reason = StringUtils.isBlank(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();
}
......
......@@ -55,4 +55,7 @@ public class OrderRefundVo {
@ApiModelProperty(value = "微商城退款方式", notes = RefundModeEnum.API_DOC)
private Byte refundMode;
@ApiModelProperty("是否部分退款,默认为false")
private Boolean isPartRefund = false;
}
......@@ -10,6 +10,7 @@ import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo;
import cn.freemud.entities.dto.ecology.SendMessageRequest;
import cn.freemud.entities.dto.store.BusinessInfoDto;
import cn.freemud.entities.vo.OrderDevelopRefundVo;
import cn.freemud.entities.vo.OrderRefundVo;
import cn.freemud.enums.AfterSalesOrderCreateEventEnum;
import cn.freemud.enums.PayRefundStatus;
import cn.freemud.enums.PayStatus;
......@@ -114,14 +115,17 @@ public class RefundService {
/**
* C端用户发起退款
*
* @param partnerId 商户号
* @param orderCode 订单号
* @param refundAmount 退款金额
* @param orderRefundVo {@link OrderRefundVo} 退款参数
* @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 = "退款";
// 退款校验
OrderInfoReqs order = preValidRefund(partnerId, orderCode, refundMode);
......@@ -145,7 +149,7 @@ public class RefundService {
orderQueueService.backOrdersStatusChange(order.getOrderCode(), orderSdkAdapter.getOldStatus(order.getOrderState()), order.getPayState(), order.getPartnerId());
} else {
// 已接单的,创建售后单
createAfterSales(order, refundAmount, reason, remark, refundDeliveryFee, refundMode);
createAfterSales(order, refundAmount, isPartRefund, reason, remark, refundDeliveryFee, refundMode);
}
}
......@@ -219,7 +223,7 @@ public class RefundService {
if (!isCreateAfter) {
// 没有已申请的售后单,创建售后单
createAfterSales(order, null, reqVo.getReason(), reqVo.getReason(), refundDeliveryFee, reqVo.getRefundMode());
createAfterSales(order, null, false, reqVo.getReason(), reqVo.getReason(), refundDeliveryFee, reqVo.getRefundMode());
}
// 调用oms的 同意退款操作
OrderManagerRequest request = new OrderManagerRequest();
......@@ -286,8 +290,9 @@ public class RefundService {
private void refundOrder(OrderInfoReqs order, String reason, String remark, Boolean isRefundDeliveryFee, Byte refundMode) {
int state = PayRefundStatus.SUCCESS.getCode();
List<OrderCancelReq.PayRefundItem> refundItemList = new ArrayList<>();
PayRefundResponse refundResponse = null;
if (order.getSettlementAmount().longValue() > 0) {
PayRefundResponse refundResponse = paymentHandle.getCommonPayRefundResponse(order, reason);
refundResponse = paymentHandle.getCommonPayRefundResponse(order, reason);
state = refundResponse.getPayRefundStatus().getCode();
if (CollectionUtils.isNotEmpty(refundResponse.getPayRefundItemList())) {
refundResponse.getPayRefundItemList().forEach(item -> {
......@@ -297,9 +302,9 @@ public class RefundService {
});
}
}
Long refundAmount = refundResponse != null ? refundResponse.getRefundAmount().longValue() : null;
OrderCancelReq req = OrderCancelReqAdapter.convert(order, UUID.randomUUID().toString(),
AfterSalesType.USER_CANCEL, null, reason, remark, isRefundDeliveryFee, refundMode);
AfterSalesType.USER_CANCEL, true, refundAmount, reason, remark, isRefundDeliveryFee, refundMode);
req.setRefundState(AfterSalesRefunStateEnum.STATE_4.getIndex());
if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功
......@@ -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.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,
BusinessInfoDto config = storeManager.queryStoreBusiness(order.getPartnerId(), order.getStoreId());
if (Objects.equals(config.getAutoChargebackOrderType(), 2) && !Objects.equals(config.getAutoChargebackOrderTime(), 0)) {
......
......@@ -4,6 +4,7 @@ import cn.freemud.management.enums.ResponseResult;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -47,6 +48,11 @@ public class PayRefundResponse {
private Boolean partRefund = false;
/**
* 退款总额
*/
private BigDecimal refundAmount;
/**
* 对退款明细的记录
*/
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;
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.PaymentQueryOrderResponseDto;
import cn.freemud.management.enums.OrderCostType;
import cn.freemud.management.enums.PaymentRefundStatus;
import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.intercept.OrderServiceException;
......@@ -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.response.OrderBaseResp;
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.service.OrderSdkService;
import com.freemud.application.sdk.api.ordercenter.util.LogUtil;
......@@ -83,7 +85,14 @@ public class PaymentHandle {
public PayRefundResponse getCommonPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) {
PayRefundResponse refundResponse;
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商户需要兼容
PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(orderBean.getCompanyId(), orderBean.getShopId(), orderBean.getOid(), refundAmount, orderBean.getOrderPayItem());
if (multiRefundResponse != null) {
......@@ -109,7 +118,7 @@ public class PaymentHandle {
refundResponse = this.payRefund(req);
}
}
refundResponse.setPartRefund(!Objects.equals(orderBean.getSettlementAmount(), refundAmount.longValue()));
refundResponse.setPartRefund(!Objects.equals(maxRefundAmount.compareTo(refundAmount), 0));
} catch (OrderServiceException orderEx) {
ResponseResult result = orderEx.getResult();
refundResponse = new PayRefundResponse();
......@@ -139,12 +148,19 @@ public class PaymentHandle {
public PayRefundResponse getCommonPayRefundResponse(OrderInfoReqs order, String reason) {
PayRefundResponse refundResponse;
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());
if (multiRefundResponse != null) {
// payment/application/refund
refundResponse = multiRefundResponse;
refundResponse.setRefundAmount(refundAmount);
} else {
OrderExtendedReq extended = order.getOrderExtended();
if (StringUtils.isNotBlank(extended.getAgentPayerId()) && !Objects.equals(extended.getAgentPayerId(), order.getUserId())) {
......@@ -166,7 +182,8 @@ public class PaymentHandle {
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) {
ResponseResult result = orderEx.getResult();
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