Commit 69823c90 by ping.wu

Merge branch 'feature/20240305_门店操作部分退款_wuping' of…

Merge branch 'feature/20240305_门店操作部分退款_wuping' of https://gitlab.freemud.com/order-group-application/order-group into qa

 Conflicts:
	order-management/src/main/java/cn/freemud/management/enums/ResponseResult.java
parents b77e9613 b473ebf9
...@@ -64,6 +64,8 @@ public class OrderManagerController { ...@@ -64,6 +64,8 @@ public class OrderManagerController {
return orderManagerAdapter.orderRejectRefund(request); return orderManagerAdapter.orderRejectRefund(request);
case ORDER_CANCEL: case ORDER_CANCEL:
return orderManagerAdapter.orderCancel(request); return orderManagerAdapter.orderCancel(request);
case PART_REFUND:
return orderManagerAdapter.partRefund(request);
case ORDER_CREATE_DELIVERY: case ORDER_CREATE_DELIVERY:
return orderManagerAdapter.orderCreateDelivery(request); return orderManagerAdapter.orderCreateDelivery(request);
case ORDER_CANCEL_DELIVERY: case ORDER_CANCEL_DELIVERY:
......
...@@ -88,4 +88,9 @@ public class OrderManagerRequest { ...@@ -88,4 +88,9 @@ public class OrderManagerRequest {
* 品牌审核售后单 不传默认无需品牌审核 * 品牌审核售后单 不传默认无需品牌审核
*/ */
private Boolean brandVerifyAfterSales = false; private Boolean brandVerifyAfterSales = false;
/**
* 部分退金额,单位分
*/
private Integer refundAmount;
} }
...@@ -29,6 +29,11 @@ public class OrderManagerResponse { ...@@ -29,6 +29,11 @@ public class OrderManagerResponse {
*/ */
private Integer refundStatus; private Integer refundStatus;
/**
* 支付退款状态
*/
private Integer payRefundStatus;
public OrderManagerResponse(){ public OrderManagerResponse(){
} }
......
...@@ -12,6 +12,7 @@ public enum OperateType { ...@@ -12,6 +12,7 @@ public enum OperateType {
ORDER_AGREE_REFUND("orderAgreeRefund","同意退款"), ORDER_AGREE_REFUND("orderAgreeRefund","同意退款"),
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"), ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"),
ORDER_CANCEL("orderCancel","订单取消"), ORDER_CANCEL("orderCancel","订单取消"),
PART_REFUND("partRefund","部分退款"),
ORDER_CREATE_DELIVERY("orderCreateDelivery","创建配送"), ORDER_CREATE_DELIVERY("orderCreateDelivery","创建配送"),
ORDER_CANCEL_DELIVERY("orderCancelDelivery","取消配送"), ORDER_CANCEL_DELIVERY("orderCancelDelivery","取消配送"),
/** /**
......
...@@ -16,6 +16,7 @@ public enum ResponseResult { ...@@ -16,6 +16,7 @@ public enum ResponseResult {
NOT_LOGIN("40001", "用户未登录"), NOT_LOGIN("40001", "用户未登录"),
PARAMETER_MISSING("40002", "缺少必要参数"), PARAMETER_MISSING("40002", "缺少必要参数"),
OPERATE_TOO_OFTEN("40003", "忙不过来了,请稍后再试"), OPERATE_TOO_OFTEN("40003", "忙不过来了,请稍后再试"),
OPERATE_NOT_SUPPORT("40004","操作不支持"),
/** /**
* 用户信息状态码 * 用户信息状态码
...@@ -176,6 +177,7 @@ public enum ResponseResult { ...@@ -176,6 +177,7 @@ public enum ResponseResult {
PARTNER_CAN_NOT_CANCEL_ORDER("45091","订单已部分退款,不能取消"), PARTNER_CAN_NOT_CANCEL_ORDER("45091","订单已部分退款,不能取消"),
DONE_FAIL_ONE_MINUTE("45092", "平台规定,接单一分钟后才能出餐"), DONE_FAIL_ONE_MINUTE("45092", "平台规定,接单一分钟后才能出餐"),
REFUND_THIRD_COUPON_TIME_LIMIT("45093", "核销时间超过可冲正期限,撤销核销失败"), REFUND_THIRD_COUPON_TIME_LIMIT("45093", "核销时间超过可冲正期限,撤销核销失败"),
PARTNER_CAN_NOT_OPERATE("45094","订单已部分退款,请勿重复操作"),
/** /**
* 支付 * 支付
......
...@@ -4,6 +4,7 @@ import cn.freemud.base.entity.BaseResponse; ...@@ -4,6 +4,7 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest; import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo; import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse; import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.util.ResponseUtil; import cn.freemud.management.util.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1; import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
...@@ -89,6 +90,12 @@ public interface OrderManagerService { ...@@ -89,6 +90,12 @@ public interface OrderManagerService {
return ResponseUtil.success(); return ResponseUtil.success();
} }
/**
* 门店操作部分退
*/
default BaseResponse<OrderManagerResponse> partRefund(OrderManagerRequest request, OrderBeanV1 orderBean){
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT);
}
/** /**
* 创建配送单 * 创建配送单
......
...@@ -263,6 +263,23 @@ public class OrderManagerAdapter { ...@@ -263,6 +263,23 @@ public class OrderManagerAdapter {
} }
/** /**
* 部分退款,发起售后单,退款,同意售后
*/
public BaseResponse partRefund(OrderManagerRequest request) {
//查询订单
OrderBeanV1 orderBean = orderBaseService.getByOrderCode(request.getOrderId(),request.getPartnerId());
if (null == orderBean) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
BaseResponse verifyResponse = orderVerifyHandle.partRefund(orderBean);
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).partRefund(request, orderBean);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 拒绝退款 * 拒绝退款
* *
* @param request * @param request
...@@ -284,13 +301,13 @@ public class OrderManagerAdapter { ...@@ -284,13 +301,13 @@ public class OrderManagerAdapter {
// } // }
private BaseResponse<OrderManagerResponse> handleResponse(OrderManagerRequest request, OrderBeanV1 orderBean, BaseResponse result) { private BaseResponse<OrderManagerResponse> handleResponse(OrderManagerRequest request, OrderBeanV1 orderBean, BaseResponse response) {
if (orderBean == null) { if (orderBean == null) {
return result; return response;
} }
RefundStatusV1 refundStatus = CollectionUtils.isNotEmpty(orderBean.getRefundList()) ? RefundStatusV1.getRefundStatusByCodeV1(orderBean.getRefundList().get(0).getStatus()) : null; RefundStatusV1 refundStatus = CollectionUtils.isNotEmpty(orderBean.getRefundList()) ? RefundStatusV1.getRefundStatusByCodeV1(orderBean.getRefundList().get(0).getStatus()) : null;
OrderStatusV1 orderStatus = OrderStatusV1.getByCode(orderBean.getStatus()); OrderStatusV1 orderStatus = OrderStatusV1.getByCode(orderBean.getStatus());
if (ObjectUtils.equals(ResponseResult.SUCCESS.getCode(), result.getCode())) { if (ObjectUtils.equals(ResponseResult.SUCCESS.getCode(), response.getCode())) {
OperateType byOpType = OperateType.getByOpType(request.getOperateType()); OperateType byOpType = OperateType.getByOpType(request.getOperateType());
if (byOpType != null) { if (byOpType != null) {
switch (byOpType) { switch (byOpType) {
...@@ -319,8 +336,9 @@ public class OrderManagerAdapter { ...@@ -319,8 +336,9 @@ public class OrderManagerAdapter {
} }
return ResponseUtil.success(new OrderManagerResponse(orderStatus, refundStatus)); return ResponseUtil.success(new OrderManagerResponse(orderStatus, refundStatus));
} }
result.setResult(new OrderManagerResponse(orderStatus, refundStatus)); if(response.getResult() != null) return response;
return result; response.setResult(new OrderManagerResponse(orderStatus, refundStatus));
return response;
} }
/** /**
......
...@@ -88,6 +88,7 @@ public class MultiRefundService { ...@@ -88,6 +88,7 @@ public class MultiRefundService {
String message = ""; String message = "";
if (Objects.isNull(resp) || resp.getCode() != 200) { if (Objects.isNull(resp) || resp.getCode() != 200) {
refundStatus = PayRefundStatus.FAIL; refundStatus = PayRefundStatus.FAIL;
message = resp != null ? resp.getMsg() : "";
} else { } else {
MultiOrderRefundResponse.RefundPlatform data = resp.getData(); MultiOrderRefundResponse.RefundPlatform data = resp.getData();
if (Objects.isNull(data) || CollectionUtils.isEmpty(data.refundPlatformResponseList)) { if (Objects.isNull(data) || CollectionUtils.isEmpty(data.refundPlatformResponseList)) {
......
...@@ -36,6 +36,7 @@ import java.util.Arrays; ...@@ -36,6 +36,7 @@ import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -66,6 +67,8 @@ public class OrderVerifyHandle { ...@@ -66,6 +67,8 @@ public class OrderVerifyHandle {
private String macCafePartnerId; private String macCafePartnerId;
private static final String THIRD = "third"; private static final String THIRD = "third";
public static final String PAYMENT_REFUND_KEY = "kgd:order:payment:refund:{0}";
/** /**
* 接单校验 * 接单校验
* *
...@@ -688,4 +691,28 @@ public class OrderVerifyHandle { ...@@ -688,4 +691,28 @@ public class OrderVerifyHandle {
return ResponseUtil.success(); return ResponseUtil.success();
} }
/**
* 校验是否部分退
*/
public BaseResponse partRefund(OrderBeanV1 orderBean){
//已取消的订单不能操作
if (ObjectUtils.equals(OrderStatusV1.CANCEL.getV2Code(), orderBean.getStatusV2())) {
return ResponseUtil.error(ResponseResult.ORDER_HAS_CANCELED);
}
if(isWaimai(orderBean)){
return ResponseUtil.error(ResponseResult.PARTNER_CAN_NOT_OPERATE.getCode(),"三方平台外卖单暂无法操作");
}
//判断订单是否有申请退款且为部分退款
if (orderBean.getAfterSalesOrderResp() != null && orderBean.getAfterSalesOrderResp().getIsPartRefund()) {
return ResponseUtil.error(ResponseResult.PARTNER_CAN_NOT_OPERATE);
}
String redisKey = MessageFormat.format(PAYMENT_REFUND_KEY, orderBean.getOid());
Object value = redisCache.getValue(redisKey);
if(value != null){
return ResponseUtil.error(ResponseResult.OPERATE_NOT_SUPPORT.getCode(),"订单正在退款,请勿重复操作");
}
redisCache.save(redisKey,orderBean.getOid(),30L, TimeUnit.SECONDS);
return ResponseUtil.success();
}
} }
...@@ -97,6 +97,8 @@ public class PaymentHandle { ...@@ -97,6 +97,8 @@ public class PaymentHandle {
if (afterSalesOrder != null) { if (afterSalesOrder != null) {
refundAmount = new BigDecimal(afterSalesOrder.getActualAmount()); refundAmount = new BigDecimal(afterSalesOrder.getActualAmount());
} }
//门店发起部分退款
if (request.getRefundAmount() != null) refundAmount = new BigDecimal(request.getRefundAmount());
//订单支付明细表新saas都会存数据,ka,pass商户需要兼容 //订单支付明细表新saas都会存数据,ka,pass商户需要兼容
PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(orderBean.getCompanyId(), orderBean.getShopId(), PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(orderBean.getCompanyId(), orderBean.getShopId(),
orderBean.getOid(), refundAmount, orderBean.getOrderPayItem(),Integer.parseInt(orderBean.getOrderClient())); orderBean.getOid(), refundAmount, orderBean.getOrderPayItem(),Integer.parseInt(orderBean.getOrderClient()));
......
...@@ -23,6 +23,7 @@ import cn.freemud.management.thirdparty.response.coupon.SaasResponse; ...@@ -23,6 +23,7 @@ import cn.freemud.management.thirdparty.response.coupon.SaasResponse;
import cn.freemud.management.thirdparty.response.ecology.adapter.CancelRedeemCouponResponse; import cn.freemud.management.thirdparty.response.ecology.adapter.CancelRedeemCouponResponse;
import cn.freemud.management.util.ResponseUtil; import cn.freemud.management.util.ResponseUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.log.ApiLog; import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog; import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
...@@ -45,9 +46,11 @@ import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus; ...@@ -45,9 +46,11 @@ import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -382,6 +385,61 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService { ...@@ -382,6 +385,61 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
return ResponseUtil.error("501", "暂不支持"); return ResponseUtil.error("501", "暂不支持");
} }
@Override
public BaseResponse<OrderManagerResponse> partRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {
//发起售后单,退款,同意售后
OrderCancelReq orderCancelReq = new OrderCancelReq();
orderCancelReq.setPartnerId(orderBean.getCompanyId());
orderCancelReq.setOrderCode(orderBean.getOid());
orderCancelReq.setCancelReason(request.getReason());
orderCancelReq.setAfterSalesType(3);
orderCancelReq.setCreateEvent(4);
orderCancelReq.setOrderClient(Integer.parseInt(orderBean.getOrderClient()));
orderCancelReq.setOperator(request.getOperator());
orderCancelReq.setOperationClient(request.getOperationClient());
orderCancelReq.setRefundState(AfterSalesRefunStateEnum.STATE_1.getIndex());
orderCancelReq.setIsPartRefund(true);
orderCancelReq.setReqAmount(new BigDecimal(request.getRefundAmount()));
// 支付退款 包括线上小程序付款的订单,订单宝其他支付方式收款(汇来米,收钱吧,现金,其他)
PayRefundResponse refundResponse = this.payRefundCommon(request, orderBean);
// 退款异常
if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.COMPATIBILITY_STATUS.getCode()) == 0) {
return ResponseUtil.error(refundResponse.getResult());
}
// 退款失败终止下面的退款流程
if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.FAIL.getCode()) == 0) {
return ResponseUtil.error(ResponseResult.REFUND_FAIL.getCode(), refundResponse.getMessage());
}
List<OrderCancelReq.PayRefundItem> refundItemList = new ArrayList<>();
if (!CollectionUtils.isEmpty(refundResponse.getPayRefundItemList())) {
refundResponse.getPayRefundItemList().forEach(item -> {
OrderCancelReq.PayRefundItem refundItem = new OrderCancelReq.PayRefundItem();
BeanUtils.copyProperties(item, refundItem);
refundItemList.add(refundItem);
});
}
OrderManagerResponse response = new OrderManagerResponse();
Integer state = refundResponse.getPayRefundStatus().getCode();
if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功
orderCancelReq.setCreateEvent(4);
// 设置退款信息
orderCancelReq.setPayRefundItemList(refundItemList);
} else if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
orderCancelReq.setCreateEvent(null);
orderCancelReq.setRefundState(AfterSalesRefunStateEnum.STATE_2.getIndex());
}
response.setPayRefundStatus(state);
//同意售后
OrderBaseResp baseResponse = orderSdkService.cancelOrder(orderCancelReq, LogThreadLocal.getTrackingNo());
if (baseResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE_STR, baseResponse.getCode())) {
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
return ResponseUtil.success(response);
}
/** /**
* 退款操作 * 退款操作
* *
......
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