Commit 1d534cd1 by zhiheng.zhang

Merge remote-tracking branch 'remotes/origin/feature/20210610-开放平台取消订单接口移动-张志恒'

parents e985febb 3cabbc9e
......@@ -75,6 +75,11 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>paymentcenter-sdk</artifactId>
<version>2.9.8.RELEASE</version>
</dependency>
<dependency>
<artifactId>structure-center-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>1.2.3.RELEASE</version>
......
......@@ -2,6 +2,7 @@ package cn.freemud.management.adapter;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.paymentcenter.client.request.OrderRefundNewRequest;
import com.freemud.sdk.api.assortment.order.request.order.MultiOrderRefundRequest;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import lombok.SneakyThrows;
......@@ -9,6 +10,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.UUID;
/**
* All rights Reserved, Designed By www.freemud.cn
......@@ -43,6 +45,20 @@ public class PaymentSdkAdapter {
return refundRequestDTO;
}
public OrderRefundNewRequest convert2OrderRefundNewRequest(QueryOrdersResponse.DataBean.OrderBean order, OrderExtInfoDto orderExtInfoDto) {
OrderRefundNewRequest refundRequest = new OrderRefundNewRequest();
refundRequest.setPartnerId(order.getCompanyId());
refundRequest.setVer(2);
refundRequest.setStoreId(order.getShopId());
refundRequest.setStationId("1");
refundRequest.setTransId(order.getOid());
refundRequest.setFmId(orderExtInfoDto.getFmId());
refundRequest.setRefundId(UUID.randomUUID().toString());
refundRequest.setTotalAmount(Long.valueOf(orderExtInfoDto.getSvcAmount()));
refundRequest.setRefundAmount(Long.valueOf(orderExtInfoDto.getSvcAmount()));
return refundRequest;
}
@SneakyThrows
public MultiOrderRefundRequest getMultiOrderPayRefundRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, BigDecimal refundAmount) {
MultiOrderRefundRequest multiQueryRequest = new MultiOrderRefundRequest();
......
......@@ -62,6 +62,8 @@ public class OrderManagerController {
return orderManagerAdapter.orderAgreeRefund(request);
case ORDER_REJECT_REFUND:
return orderManagerAdapter.orderRejectRefund(request);
case ORDER_CANCEL:
return orderManagerAdapter.orderCancel(request);
default:
return ResponseUtil.error(ResponseResult.ORDER_OPERATE_TYPE_NOT_VALIDATE);
}
......
......@@ -10,8 +10,8 @@ public enum OperateType {
ORDER_SEND("orderSend","送出"),
ORDER_AFFIRM("orderAffirm","完成"),
ORDER_AGREE_REFUND("orderAgreeRefund","同意退款"),
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款");
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"),
ORDER_CANCEL("orderCancel","订单取消");
/**
* 操作类型
......
......@@ -170,6 +170,9 @@ public enum ResponseResult {
ORDER_STATUS_FAILED("45085", "订单状态错误"),
ORDER_MOVE_FAILED("45086", "三方配送正在进行,不允许操作"),
AGREE_REFUND_APPLY_ORDER_FAIL("45087", "同意退款申请失败"),
AGREE_REFUND_APPLY_ORDER_NOT_ALLOW("45088", "商户配置不允许退款,请检查商户配置"),
PARTNER_ORDER_CANCEL_ERROR("45089", "取消订单失败"),
/**
* 支付
*/
......
package cn.freemud.management.enums;
public enum SettlementTypeEnum {
OFFLINE_PAY(219, "线下支付"),
POINTS(200, "积分抵扣"),
CASH_COUPON(10, "代金券"),
DISCOUNT_COUPON(208, "折扣券"),
PRODUCT_COUPON(118, "商品券"),
;
private int settlementType;
private String desc;
SettlementTypeEnum(int settlementType, String desc) {
this.settlementType = settlementType;
this.desc = desc;
}
public int getSettlementType() {
return settlementType;
}
public String getDesc() {
return desc;
}
}
......@@ -207,6 +207,18 @@ public class OrderManagerAdapter {
}
/**
* 取消订单
* @param request
* @return
*/
public BaseResponse orderCancel(OrderManagerRequest request) {
//查询订单
QueryOrdersResponse.DataBean.OrderBean orderBean = orderBaseService.getByOrderCode(request.getOrderId());
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCancel(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
}
/**
* 拒绝退款
* @param request
* @return
......
......@@ -17,11 +17,13 @@ import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant;
import com.freemud.sdk.api.assortment.message.enums.OrderType;
import com.freemud.sdk.api.assortment.order.enums.OldOrderAccountType;
import com.freemud.sdk.api.assortment.order.enums.OldOrderType;
import com.freemud.sdk.api.assortment.order.enums.OrderSourceType;
import com.freemud.sdk.api.assortment.order.enums.RefundStatus;
import com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -418,6 +420,26 @@ public class OrderVerifyHandle {
}
/**
* 取消退款
* @param orderBean
* @param request
* @return
*/
public BaseResponse orderCancel(QueryOrdersResponse.DataBean.OrderBean orderBean, OrderManagerRequest request,String opType) {
List<String> standardPaymentRefundSourceList = Lists.newArrayList(OrderSourceType.SAAS.getCode(), OrderSourceType.APP.getCode(), OrderSourceType.ALIPAY.getCode());
// 商家同意退款时,校验订单是否能退款(B端后台"订单退款设置")
boolean isCanRefund = true;
if (Objects.equals(OperateType.ORDER_AGREE_REFUND, opType) && standardPaymentRefundSourceList.contains(orderBean.getSource())) {
isCanRefund = getRefundConfig(orderBean);
if (!isCanRefund) {
return ResponseUtil.error(ResponseResult.AGREE_REFUND_APPLY_ORDER_NOT_ALLOW);
}
}
return ResponseUtil.success();
}
/**
* 拒绝退款
* @param orderBean
* @param request
......
......@@ -10,8 +10,13 @@ import cn.freemud.management.util.RedisUtil;
import cn.freemud.redis.RedisCache;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
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.paymentcenter.client.request.OrderRefundNewRequest;
import com.freemud.application.sdk.api.paymentcenter.client.response.RefundNewResponse;
import com.freemud.application.sdk.api.paymentcenter.client.service.PaymentNewService;
import com.freemud.sdk.api.assortment.order.enums.OldOrderType;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import com.freemud.sdk.api.assortment.order.request.order.MultiOrderRefundRequest;
......@@ -62,6 +67,9 @@ public class PaymentHandle {
private MulitiPaymentClient mulitiPaymentClient;
@Autowired
private RedisCache redisCache;
@Autowired
private PaymentNewService paymentNewService;
/**
* 退款
* @param request
......@@ -91,6 +99,34 @@ public class PaymentHandle {
return handlePayRefundResponse(refundStatus,orderRefundRequest.getRefundId());
}
/**
* 退款
* @param orderBean
* @return
*/
public PayRefundResponse newOrderRefund(QueryOrdersResponse.DataBean.OrderBean orderBean, OrderExtInfoDto orderExtInfoDto){
PayRefundStatus refundStatus=PayRefundStatus.SUCCESS;
OrderRefundNewRequest refundRequest = paymentSdkAdapter.convert2OrderRefundNewRequest(orderBean, orderExtInfoDto);
if (ObjectUtils.equals(orderBean.getAmount(), 0L)) {
return handlePayRefundResponse(refundStatus,refundRequest.getRefundId());
}
com.freemud.application.sdk.api.base.BaseResponse<RefundNewResponse> orderRefundResponse;
try {
orderRefundResponse = paymentNewService.newOrderRefund(refundRequest, LogThreadLocal.getTrackingNo());
}catch (Exception ex){
ErrorLog.errorConvertJson(this.getClass(), "paymentNewService.newOrderRefundError", ex);
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
}
if (orderRefundResponse==null){
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
}
if (ObjectUtils.notEqual(orderRefundResponse.getCode(),SUCCESS)){
throw new OrderServiceException(ResponseResult.REFUND_FAIL,orderRefundResponse.getMessage());
}
refundStatus=ObjectUtils.equals( PayRefundStatus.SUCCESS.getCode(), orderRefundResponse.getData().getCode())?PayRefundStatus.SUCCESS:PayRefundStatus.FAIL;
return handlePayRefundResponse(refundStatus,refundRequest.getRefundId());
}
/**
* 麦咖啡退款
* @param request
* @param orderBean
......
......@@ -6,19 +6,51 @@ import cn.freemud.management.entities.dto.response.order.OrderManagerResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.enums.OperateType;
import cn.freemud.management.enums.RefundStatus;
import cn.freemud.management.enums.ResponseResult;
import cn.freemud.management.enums.SettlementTypeEnum;
import cn.freemud.management.intercept.OrderServiceException;
import cn.freemud.management.service.OrderBaseService;
import cn.freemud.management.service.OrderManagerService;
import cn.freemud.management.service.handle.*;
import cn.freemud.management.util.ResponseUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig;
import com.freemud.application.sdk.api.couponcenter.offline.domain.TransactionVO;
import com.freemud.application.sdk.api.couponcenter.offline.request.CouponRequest;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.AbnormalStateEnum;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.request.OrderCancelReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.SdkUpdateAbnormalState;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.service.EmailAlertService;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import com.freemud.sdk.api.assortment.order.enums.*;
import com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.freemud.management.enums.OperateType.ORDER_AGREE_REFUND;
import static cn.freemud.management.enums.OperateType.ORDER_CANCEL;
/**
* All rights Reserved, Designed By www.freemud.cn
*
......@@ -46,6 +78,13 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
private StockHandle stockHandle;
@Autowired
private DeliveryHandle deliveryHandle;
@Autowired
private OrderVerifyHandle orderVerifyHandle;
@Autowired
private OrderSdkService orderSdkService;
@Autowired
private EmailAlertService emailAlertService;
private static final int SUCCESS = 100;
/**
* 接单
......@@ -174,7 +213,7 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
//订单同意退款
saasOrderHandle.refundAgree(request, refundResponse, orderBean);
// 推送pos、微信消息中心
orderBaseService.sendMessage(orderBean, OperateType.ORDER_AGREE_REFUND, request.getReason());
orderBaseService.sendMessage(orderBean, ORDER_AGREE_REFUND, request.getReason());
//todo 可以考虑基于订单回调异步实现
//冲正库存
stockHandle.revert(request,orderBean);
......@@ -197,4 +236,105 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
return ResponseUtil.success();
}
/**
* 取消订单
*/
@Override
public BaseResponse<OrderManagerResponse> orderCancel(OrderManagerRequest request, QueryOrdersResponse.DataBean.OrderBean orderBean){
List<Integer> oldOrderStatusList = Arrays.asList(OldOrderStatus.RECEIPT.getCode(),OldOrderStatus.COMPLETE.getCode(),OldOrderStatus.COMPLETE_MAKE.getCode());
List<String> sourceList = Arrays.asList(OrderSourceType.SAAS.getCode(),OrderSourceType.ALIPAY.getCode(),OrderSourceType.APP.getCode());
if (sourceList.contains(orderBean.getSource()) && oldOrderStatusList.contains(orderBean.getStatus())) {
return executeRefund(request,orderBean, OperateType.ORDER_REJECT.getOpType());
} else if (OrderSourceType.MEAL.getCode().equals(orderBean.getSource())) {
if (OldOrderStatus.WAIT_PAY.getCode().equals(orderBean.getStatus()) || PayType.CASH_ON_DELIVERY.getCode() == orderBean.getPayType()) {
return executeCancel(request,orderBean, PayRefundStatus.SUCCESS.getCode(), AfterSalesType.SYSTEM_CANCEL.getIndex(), Integer.valueOf(orderBean.getOrderClient()));
} else {
return executeRefund(request,orderBean, OperateType.ORDER_REJECT.getOpType());
}
} else if (OrderSourceType.POS.getCode().equals(orderBean.getSource())) {
return posCancel(orderBean);
}
return ResponseUtil.success();
}
/**
* 退款操作
* @param request
* @param orderBean
* @param operationType
* @return
*/
private BaseResponse<OrderManagerResponse> executeRefund(OrderManagerRequest request,QueryOrdersResponse.DataBean.OrderBean orderBean, String operationType) {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.orderCancel(orderBean, request, OperateType.ORDER_AGREE_REFUND.getOpType());
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return ResponseUtil.error(verifyResponse.getCode());
}
BaseResponse<OrderManagerResponse> baseResponse = null;
//调用oms拒绝订单
if (operationType.equalsIgnoreCase(OperateType.ORDER_REJECT.getOpType())) {
baseResponse = this.orderReject(request, orderBean);
}
if(null == baseResponse || !ObjectUtils.equals(SUCCESS,Integer.valueOf(baseResponse.getCode()))){
emailAlertService.sendEmailAlert("商家取消订单失败", "请求json:" + JSONObject.toJSONString(orderBean) + "返回msg:" + baseResponse.getMessage());
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
return ResponseUtil.success();
}
/**
* 拒单在支付退款后的取消订单操作
*
* @param order 订单详情
* @param refundStatus 支付退款状态
* @return
*/
private BaseResponse<OrderManagerResponse> executeCancel(OrderManagerRequest request,QueryOrdersResponse.DataBean.OrderBean order, Integer refundStatus, Integer afterSalesType, Integer orderClient) {
Integer createEvent;
if (PayRefundStatus.RUNNING.getCode().equals(refundStatus)) {
createEvent = 5;
} else if (PayRefundStatus.SUCCESS.getCode().equals(refundStatus)) {
createEvent = 4;
} else {
createEvent = 5;
}
OrderCancelReq orderCancelReq = new OrderCancelReq();
orderCancelReq.setPartnerId(order.getCompanyId());
orderCancelReq.setOrderCode(order.getOid());
orderCancelReq.setCancelReason(request.getReason());
orderCancelReq.setAfterSalesType(afterSalesType);
orderCancelReq.setCreateEvent(createEvent);
orderCancelReq.setOrderClient(orderClient == null ? OrderClientType.SAAS.getIndex() : orderClient);
orderCancelReq.setOperator(request.getOperator());
com.freemud.application.sdk.api.ordercenter.response.BaseResponse baseResponse = orderSdkService.cancelOrder(orderCancelReq,UUID.randomUUID().toString());
if (!ObjectUtils.equals(SUCCESS,Integer.valueOf(baseResponse.getCode()))) {
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
return ResponseUtil.success();
}
public BaseResponse<OrderManagerResponse> posCancel(QueryOrdersResponse.DataBean.OrderBean order) {
//调用cancel接口,商家退款
OrderCancelReq orderCancelReq = new OrderCancelReq();
orderCancelReq.setPartnerId(order.getCompanyId());
orderCancelReq.setOrderCode(order.getOid());
orderCancelReq.setCancelReason("商家取消");
orderCancelReq.setAfterSalesType(AfterSalesType.PARTNER_CANCEL.getIndex());
orderCancelReq.setCreateEvent(4);
orderCancelReq.setOrderClient(OrderClientType.POS.getIndex());
com.freemud.application.sdk.api.ordercenter.response.BaseResponse baseResponse = orderSdkService.cancelOrder(orderCancelReq,UUID.randomUUID().toString());
if (!Objects.equals(SUCCESS,Integer.valueOf(baseResponse.getCode()))){
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
// 储值卡退款
OrderExtInfoDto orderExtInfoDto = JSONObject.parseObject(order.getExtInfo(), OrderExtInfoDto.class) == null ? new OrderExtInfoDto() : JSONObject.parseObject(order.getExtInfo(), OrderExtInfoDto.class);
//支付退款
if (orderExtInfoDto != null && orderExtInfoDto.getSvcAmount()!= null && StringUtils.isNotEmpty(orderExtInfoDto.getSvcCardCode()) && order.getPayStatus() > 1){
PayRefundResponse refundResponse = paymentHandle.newOrderRefund(order, orderExtInfoDto);
if(ObjectUtils.equals(PayRefundStatus.SUCCESS,refundResponse.getPayRefundStatus())){
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
}
return ResponseUtil.success();
}
}
......@@ -10,7 +10,8 @@ public enum OperateType {
ORDER_SEND("orderSend","送出"),
ORDER_AFFIRM("orderAffirm","完成"),
ORDER_AGREE_REFUND("orderAgreeRefund","同意退款"),
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款");
ORDER_REJECT_REFUND("orderRejectRefund","拒绝退款"),
ORDER_CANCEL("orderCancel","订单取消");
/**
......
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