Commit 802d8a6d by ping.wu

门店发起部分退款

parent fb814bae
......@@ -64,6 +64,8 @@ public class OrderManagerController {
return orderManagerAdapter.orderRejectRefund(request);
case ORDER_CANCEL:
return orderManagerAdapter.orderCancel(request);
case PART_REFUND:
return orderManagerAdapter.partRefund(request);
case ORDER_CREATE_DELIVERY:
return orderManagerAdapter.orderCreateDelivery(request);
case ORDER_CANCEL_DELIVERY:
......
......@@ -88,4 +88,9 @@ public class OrderManagerRequest {
* 品牌审核售后单 不传默认无需品牌审核
*/
private Boolean brandVerifyAfterSales = false;
/**
* 部分退金额,单位分
*/
private Integer refundAmount;
}
......@@ -29,6 +29,11 @@ public class OrderManagerResponse {
*/
private Integer refundStatus;
/**
* 支付退款状态
*/
private Integer payRefundStatus;
public OrderManagerResponse(){
}
......
......@@ -12,6 +12,7 @@ public enum OperateType {
ORDER_AGREE_REFUND("orderAgreeRefund","同意退款"),
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"),
ORDER_CANCEL("orderCancel","订单取消"),
PART_REFUND("partRefund","部分退款"),
ORDER_CREATE_DELIVERY("orderCreateDelivery","创建配送"),
ORDER_CANCEL_DELIVERY("orderCancelDelivery","取消配送"),
/**
......
......@@ -16,6 +16,7 @@ public enum ResponseResult {
NOT_LOGIN("40001", "用户未登录"),
PARAMETER_MISSING("40002", "缺少必要参数"),
OPERATE_TOO_OFTEN("40003", "忙不过来了,请稍后再试"),
OPERATE_NOT_SUPPORT("40004","操作不支持"),
/**
* 用户信息状态码
......@@ -175,6 +176,7 @@ public enum ResponseResult {
ORDER_DELIVERY_EDIT_FAILED("45090", "修改配送状态失败"),
PARTNER_CAN_NOT_CANCEL_ORDER("45091","订单已部分退款,不能取消"),
DONE_FAIL_ONE_MINUTE("45092", "平台规定,接单一分钟后才能出餐"),
PARTNER_CAN_NOT_OPERATE("45093","订单已部分退款,请勿重复操作"),
/**
* 支付
......
......@@ -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.RefundSuccessCallbackVo;
import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.util.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
......@@ -89,6 +90,12 @@ public interface OrderManagerService {
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 {
}
/**
* 部分退款,发起售后单,退款,同意售后
*/
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
......@@ -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) {
return result;
return response;
}
RefundStatusV1 refundStatus = CollectionUtils.isNotEmpty(orderBean.getRefundList()) ? RefundStatusV1.getRefundStatusByCodeV1(orderBean.getRefundList().get(0).getStatus()) : null;
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());
if (byOpType != null) {
switch (byOpType) {
......@@ -319,8 +336,9 @@ public class OrderManagerAdapter {
}
return ResponseUtil.success(new OrderManagerResponse(orderStatus, refundStatus));
}
result.setResult(new OrderManagerResponse(orderStatus, refundStatus));
return result;
if(response.getResult() != null) return response;
response.setResult(new OrderManagerResponse(orderStatus, refundStatus));
return response;
}
/**
......
......@@ -36,6 +36,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
......@@ -66,6 +67,8 @@ public class OrderVerifyHandle {
private String macCafePartnerId;
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 {
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 {
if (afterSalesOrder != null) {
refundAmount = new BigDecimal(afterSalesOrder.getActualAmount());
}
//门店发起部分退款
if (request.getRefundAmount() != null) refundAmount = new BigDecimal(request.getRefundAmount());
//订单支付明细表新saas都会存数据,ka,pass商户需要兼容
PayRefundResponse multiRefundResponse = multiRefundService.multiRefund(orderBean.getCompanyId(), orderBean.getShopId(),
orderBean.getOid(), refundAmount, orderBean.getOrderPayItem(),Integer.parseInt(orderBean.getOrderClient()));
......
......@@ -18,6 +18,7 @@ import cn.freemud.management.thirdparty.ConsoleApiClient;
import cn.freemud.management.thirdparty.OrderCallbackClient;
import cn.freemud.management.util.ResponseUtil;
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.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.config.OrderCenterProperties;
......@@ -39,9 +40,11 @@ import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -349,6 +352,61 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
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