Commit ac2ff3c1 by 周晓航

Merge branch 'KA-新增同意退款回调逻辑处理' into pre

# Conflicts:
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderAdapterServiceImpl.java
#	order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
#	order-management/src/main/java/cn/freemud/management/service/adapter/OrderManagerAdapter.java
parents bfa066e3 bfd25c88
......@@ -19,7 +19,8 @@ public enum PayRefundStatus {
/**
* 额外状态码 用于判断逻辑,
*/
NOT_SUFFICIENT_FUNDS(8200201,"余额不足");
NOT_SUFFICIENT_FUNDS(8200201,"余额不足"),
COMPATIBILITY_STATUS(9999999,"兼容爱马哥报错");
private Integer code;
private String desc;
......
package com.freemud.sdk.api.assortment.order.response.order;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
......@@ -22,7 +23,16 @@ public class MultiOrderRefundResponse<T> {
}
@Data
public static class RefundPlatformResponse{
public static class RefundPlatformResponse {
/**
* 退款中状态码需要单独处理
*/
public static Integer REFUNDED_RESULTCODE = 8200305;
/**
* 退款成功
*/
public static Integer REFUND_SUCCESS = 100;
private String endTransTradeNo;
private String fmRefundNo;
private String fmTradeNo;
......@@ -39,5 +49,11 @@ public class MultiOrderRefundResponse<T> {
private Integer totalAmount;
private String transId;
private String ebcode;
@ApiModelProperty(value = "业务返回码 8200305 代表退款中 100是成功 其他 都是失败")
private Integer resultCode;
@ApiModelProperty(value = "业务返回消息")
private String resultMsg;
}
}
\ No newline at end of file
......@@ -22,6 +22,7 @@ import cn.freemud.entities.vo.encircle.CreateReserveOrderVo;
import cn.freemud.entities.vo.encircle.EncircleReserveBaseVo;
import cn.freemud.entities.vo.order.*;
import cn.freemud.handler.OrderReportJobHandler;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.service.EncircleOrderService;
import cn.freemud.service.Orderservice;
import cn.freemud.service.PointsMallOrderService;
......
......@@ -207,6 +207,7 @@ public enum ResponseResult {
*/
PAY_BACKEND_CONFIG_ERROR("58003", "支付交易异常","Abnormal payment transaction"),
PAY_SVC_CONFIG_ERROR("58004", "不支持储值卡支付",""),
PAY_REFUND_ERROR("58005", "退款已受理,请等待",""),
/**
* 优惠券活动
*/
......
......@@ -18,6 +18,7 @@ import cn.freemud.entities.vo.order.PaymentConfigVo;
import cn.freemud.entities.vo.order.PlugInParameter;
import cn.freemud.enums.*;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.service.handle.SaasOrderHandle;
import cn.freemud.management.thirdparty.OrderCallbackClient;
import cn.freemud.manager.OpenPlatformOrderConfigManager;
......@@ -122,7 +123,7 @@ public class OrderAdapterServiceImpl {
@Autowired
private MCCafeOrderService mcCafeOrderService;
// private UniversalOrderService universalOrderService;
// private UniversalOrderService universalOrderService;
@Autowired
private CreateOrderServiceFactory createOrderServiceFactory;
@Autowired
......@@ -170,7 +171,7 @@ public class OrderAdapterServiceImpl {
private EmailAlertService emailAlertService;
//获取下单实现对象
private OrderFactoryService getCreateOrderBean(AssortmentCustomerInfoVo assortmentCustomerInfoVo,CreateOrderVo createOrderVo){
private OrderFactoryService getCreateOrderBean(AssortmentCustomerInfoVo assortmentCustomerInfoVo, CreateOrderVo createOrderVo) {
// 扩展字段中存储 sessionKey
createOrderVo.setSessionKey(assortmentCustomerInfoVo.getSessionKey());
if (IappIdType.WC_XCX.getCode().equals(assortmentCustomerInfoVo.getIappId())) { //i围餐
......@@ -192,7 +193,7 @@ public class OrderAdapterServiceImpl {
}
//抖音卖券
if (Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(),createOrderVo.getBizType())) {
if (Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(), createOrderVo.getBizType())) {
return sellCouponOrderServiceImpl;
}
return orderService;
......@@ -201,6 +202,7 @@ public class OrderAdapterServiceImpl {
/**
* 创建无单 收银订单
* 不需要查询购物车,没有商品,流程上 只需要创建一个订单然后唤起预支付就行了
*
* @param createOrderDto 请求信息
*/
public CreateOrderResponseVo createCashierOrder(CreateCashierOrderDto createOrderDto) {
......@@ -238,7 +240,7 @@ public class OrderAdapterServiceImpl {
if (!LockUtils.lock(redisCache.getRedisTemplate(), createOrderKey, expire)) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_CREATE_ERROR);
}
OrderFactoryService orderFactoryService = getCreateOrderBean(assortmentCustomerInfoVo,createOrderVo);
OrderFactoryService orderFactoryService = getCreateOrderBean(assortmentCustomerInfoVo, createOrderVo);
CreateOrderBONew createOrderBO = new CreateOrderBONew(createOrderVo);
//赋值缓存用户信息
createOrderBO.setUserLoginInfoDto(assortmentCustomerInfoVo);
......@@ -338,36 +340,36 @@ public class OrderAdapterServiceImpl {
result = orderCommonService.paySuccessCallback(message, confirmOrderDto, orderBeans);
break;
case 27: //抖音卖券订单处理 OrderClientType.TIKTOKPAY.getIndex()
if (Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(),orderBean.getBizType())) {
if (Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(), orderBean.getBizType())) {
result = sellCouponOrderService.paySuccessCallbackForTiktok(message, confirmOrderDto, orderBeans);
break;
}
break;
// bizType不等于4的,非积分商城订单,继续往下走
// bizType不等于4的,非积分商城订单,继续往下走
case 12: //app订单 OrderClientType.APP.getIndex()
if (!Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(),orderBean.getBizType())) {
if (!Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(), orderBean.getBizType())) {
// bizType为卖券的订单,不走app订单逻辑
result = appOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
break;
}
default://微信,支付宝渠道
// 积分商城订单
if (Objects.equals(BizTypeEnum.INTEGRAL_MALL.getBizType(),orderBean.getBizType())) {
result = pointsMallOrderService.paySuccessCallback(message,orderBeans);
if (Objects.equals(BizTypeEnum.INTEGRAL_MALL.getBizType(), orderBean.getBizType())) {
result = pointsMallOrderService.paySuccessCallback(message, orderBeans);
break;
}
// 买券虚拟订单
if (Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(),orderBean.getBizType())) {
if (Objects.equals(BizTypeEnum.SALE_COUPON.getBizType(), orderBean.getBizType())) {
result = sellCouponOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
break;
}
// 微商城订单处理
if (Objects.equals(BizTypeEnum.MALL.getBizType(),orderBean.getBizType())){
if (Objects.equals(BizTypeEnum.MALL.getBizType(), orderBean.getBizType())) {
result = mallOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
break;
}
// 收银单处理
if (Objects.equals(MarketTypeEnum.CASHIER.getIndex(),orderBean.getMarketingType().intValue())) {
if (Objects.equals(MarketTypeEnum.CASHIER.getIndex(), orderBean.getMarketingType().intValue())) {
result = cashierOrderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
break;
}
......@@ -377,16 +379,16 @@ public class OrderAdapterServiceImpl {
break;
}
// 默认点餐处理(点餐业务和预定业务)
if (Objects.equals(BizTypeEnum.ORDINARY.getBizType(),orderBean.getBizType())
|| Objects.equals(BizTypeEnum.ADVANCE_ORDER.getBizType(),orderBean.getBizType())) {
if (Objects.equals(BizTypeEnum.ORDINARY.getBizType(), orderBean.getBizType())
|| Objects.equals(BizTypeEnum.ADVANCE_ORDER.getBizType(), orderBean.getBizType())) {
result = orderService.paySuccessCallback(message, confirmOrderDto, orderBeans);
break;
}
}
//储值卡订单消费后通知储值交易服务
if(CollectionUtils.isNotEmpty(message.getSvcPayItems())){
sendSvcPayInfoToSvcTransaction(message.getSvcPayItems(),orderBean.getCompanyId(),orderBean.getOid(),orderBean.getUserId(),orderBean.getShopId());
if (CollectionUtils.isNotEmpty(message.getSvcPayItems())) {
sendSvcPayInfoToSvcTransaction(message.getSvcPayItems(), orderBean.getCompanyId(), orderBean.getOid(), orderBean.getUserId(), orderBean.getShopId());
}
//爱马哥低碳活动 活动结束即可删除此代码,大概2022-09月结束
sendLowCarbonToWeixin(message,orderBean);
......@@ -399,8 +401,8 @@ public class OrderAdapterServiceImpl {
// 增加全局开关,当紧急方案打开时进行直接处理callBack消息
if (orderBean != null && orderCenterProperties.isUrgentCallbackOpen()) {
// 查询
OrderCallBackRequestVo requestVo = saasOrderHandle.convert2CallbackReq(orderBean.getOid(),2,null,null);
ApiLog.infoMessage("紧急方案 支付成功直接调用callback,orderCode:{},requestId:{}",requestVo.getOrderCode(),requestVo.getRequestId());
OrderCallBackRequestVo requestVo = saasOrderHandle.convert2CallbackReq(orderBean.getOid(), 2, null, null);
ApiLog.infoMessage("紧急方案 支付成功直接调用callback,orderCode:{},requestId:{}", requestVo.getOrderCode(), requestVo.getRequestId());
orderCallbackClient.callbackOrder(requestVo);
}
}
......@@ -420,21 +422,18 @@ public class OrderAdapterServiceImpl {
// }
// return ResponseUtil.error(ResponseResult.PARAMETER_MISSING);
// }
public BaseResponse<PlugInParameter> getPaymentConfig(PaymentConfigVo paymentConfigVo){
public BaseResponse<PlugInParameter> getPaymentConfig(PaymentConfigVo paymentConfigVo) {
AssortmentCustomerInfoVo assortmentCustomerInfoVo = assortmentCustomerInfoManager.getCustomerInfoByObject(paymentConfigVo.getSessionId());
if (assortmentCustomerInfoVo == null || StringUtils.isEmpty(assortmentCustomerInfoVo.getMemberId())) {
return ResponseUtil.error(ResponseResult.NOT_LOGIN);
}
//周周惠插件要返回参数
if(paymentConfigVo.getPlugInType() != null && paymentConfigVo.getPlugInType() == 2){
return ResponseUtil.success(payService.getPlugInParameter(paymentConfigVo.getPartnerId(),assortmentCustomerInfoVo.getWxAppId(),paymentConfigVo.getShopId()));
if (paymentConfigVo.getPlugInType() != null && paymentConfigVo.getPlugInType() == 2) {
return ResponseUtil.success(payService.getPlugInParameter(paymentConfigVo.getPartnerId(), assortmentCustomerInfoVo.getWxAppId(), paymentConfigVo.getShopId()));
}
//1元插件要返回参数
return ResponseUtil.success(payService.getPlugInParameter(paymentConfigVo.getPartnerId(),assortmentCustomerInfoVo.getWxAppId()));
return ResponseUtil.success(payService.getPlugInParameter(paymentConfigVo.getPartnerId(), assortmentCustomerInfoVo.getWxAppId()));
}
......@@ -458,11 +457,11 @@ public class OrderAdapterServiceImpl {
if (null == configType)
throw new ServiceException(ResponseResult.PARAMETER_MISSING);
String key = configType.getKey() + request.getPartnerId()+ "_" + request.getMiniAppId();
String key = configType.getKey() + request.getPartnerId() + "_" + request.getMiniAppId();
String configStr = redisCache.hashGet(key, configType.getType());
if (StringUtils.isBlank(configStr)){
if (StringUtils.isBlank(configStr)) {
OpenPlatformOrderConfig openPlatformOrderConfig = openPlatformOrderConfigManager.getOrderConfigByType(request);
if (null != openPlatformOrderConfig){
if (null != openPlatformOrderConfig) {
configStr = openPlatformOrderConfig.getTypeValue();
}
}
......@@ -470,7 +469,7 @@ public class OrderAdapterServiceImpl {
return configStr;
}
private void sendSvcPayInfoToSvcTransaction(List<SvcPayItem> svcPayItems,String partnerId,String orderCode,String memberId,String storeId){
private void sendSvcPayInfoToSvcTransaction(List<SvcPayItem> svcPayItems, String partnerId, String orderCode, String memberId, String storeId) {
ConsumeHistoryCreateRequest request = new ConsumeHistoryCreateRequest();
try {
request.setPartnerId(partnerId);
......@@ -481,8 +480,8 @@ public class OrderAdapterServiceImpl {
request.setCardRequestNo(svcTransIds);
svcTransactionClient.consumeHistoryCreate(request);
}catch (Exception e){
ErrorLog.printErrorLog("sendSvcPayInfoToSvcTransaction","paySuccessCallback",request,e);
} catch (Exception e) {
ErrorLog.printErrorLog("sendSvcPayInfoToSvcTransaction", "paySuccessCallback", request, e);
}
}
......@@ -574,4 +573,5 @@ public class OrderAdapterServiceImpl {
}
return false;
}
}
......@@ -2023,9 +2023,9 @@ public class OrderServiceImpl implements Orderservice {
BaseResponse baseResponse = partnerNoTakeOrder(orderRefundVo, orderBean, orderId, AfterSalesType.USER_CANCEL, isRefundDeliveryFee);
if (baseResponse != null) {
return baseResponse;
}
// 删除订单 通知活动添加商品库存
} // 删除订单 通知活动添加商品库存
orderQueueService.backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus(), orderBean.getPayStatus());
} else {
CancelOrderRequest cancelOrderRequest = new CancelOrderRequest();
cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
......@@ -2079,50 +2079,24 @@ public class OrderServiceImpl implements Orderservice {
String partnerId = orderBean.getCompanyId();
int state = PayRefundStatus.SUCCESS.getCode();
if (orderBean.getAmount() != 0) {
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) {
//调用支付退款
MultiOrderRefundRequest multiOrderRefundRequest = orderAdapter.getMultiOrderPayRefundRequest(orderBean, refundId);
MultiOrderRefundResponse multiOrderRefundResponse = payServiceImpl.paymentApplicationRefund(multiOrderRefundRequest, orderBean.getCompanyId());
if (multiOrderRefundResponse == null || multiOrderRefundResponse.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.ORDER_PAY_RESPONSE_SUCCESS.equals(multiOrderRefundResponse.getCode())) {
return ResponseUtil.error(ResponseResult.MULTIORDER__ERRORREFUND.getCode(), "multiOrderRefund_failed");
}
List<MultiOrderRefundResponse.RefundPlatformResponse> refundPlatformResponseList = multiOrderRefundResponse.getData().refundPlatformResponseList;
if (null != refundPlatformResponseList && refundPlatformResponseList.size() > 0) {
redisCache.save(RedisUtil.getPaymentTransIdSequenceKey(refundPlatformResponseList.get(0).getTransId()), orderBean.getOid(), 1L, TimeUnit.DAYS);
}
//获取支付返回退款状态
state = PayRefundStatus.SUCCESS.getCode();
} else {
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单
PayRefundResponse resp = paymentHandle.agentPayRefund(orderBean);
state = resp.getPayRefundStatus().getCode();
} else {
//调用支付退款
PayRefundRequestDto orderPayRefundRequest = orderAdapter.getOrderPayRefundRequest(orderBean, refundId, fatherOrderId);
//抖音支付退款必传
orderPayRefundRequest.setRefundDesc(orderRefundVo.getReason() == null ? "用户退款" : orderRefundVo.getReason());
response = payServiceImpl.orderRefund(orderPayRefundRequest);
if (response == null || response.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(response.getCode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
}
//获取支付返回退款状态
state = response.getData().getRefundStatus() == null ? PayRefundStatus.SUCCESS.getCode() : response.getData().getRefundStatus();
}
}
OrderManagerRequest orderManagerRequest = new OrderManagerRequest();
orderManagerRequest.setReason(orderRefundVo.getReason());
PayRefundResponse refundResponse = paymentHandle.getCommonPayRefundResponse(orderManagerRequest, orderBean);
state = refundResponse.getPayRefundStatus().getCode();
}
CancelOrderRequest cancelOrderRequest = orderAdapter.convent2CancelOrderRequest(orderBean.getOid(),
partnerId, afterSalesType, orderRefundVo.getReason(), LogThreadLocal.getTrackingNo(), refundId.toString());
cancelOrderRequest.setOperator(orderBean.getUserName());
cancelOrderRequest.setPartnerId(orderBean.getCompanyId());
if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
if (Objects.equals(PayRefundStatus.FAIL.getCode(), state)) {
// 退款中
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.RETURN_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
//退款成功
cancelOrderRequest.setCreateEvent(AfterSalesOrderCreateEventEnum.REFUND_COMPLETE.getCreateEvent());
} else if (Objects.equals(PayRefundStatus.RUNNING.getCode(), state)) {
cancelOrderRequest.setCreateEvent(null);
}
cancelOrderRequest.setReqRemark(orderRefundVo.getRemarks());
cancelOrderRequest.setRefundDeliveryAmount(isRefundDeliveryFee);
......@@ -2135,6 +2109,11 @@ public class OrderServiceImpl implements Orderservice {
if (baseOrderResponse == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, baseOrderResponse.getErrcode())) {
return ResponseUtil.error(ResponseResult.ORDER__ERRORREFUND.getCode(), "orderRefund_failed");
}
if (state == PayRefundStatus.RUNNING.getCode().intValue()) {
// 如果退款中, 直接来个申请记录, 退款回调进行处理
return ResponseUtil.error(ResponseResult.PAY_REFUND_ERROR);
}
return null;
}
......@@ -2339,7 +2318,10 @@ public class OrderServiceImpl implements Orderservice {
try {
messageTemplateRequest = messageNoticeAdapter.convent2MessageTemplateRequest(orderBean);
messageTemplateRequest.setMessageEventType(messageEventType);
this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest);
com.freemud.application.sdk.api.base.BaseResponse baseResponse = this.messageTemplatePushService.sendTemplateMsg(messageTemplateRequest);
if (!Objects.equals(baseResponse.getCode(), ResponseResultEnum.SUCCESS.getCode())) {
AppLogUtil.errorLog("发送支付成功模板消息 失败", orderBean.getOid(), JSON.toJSONString(baseResponse), null);
}
} catch (Exception e) {
AppLogUtil.errorLog("sendTemplateMsg_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(messageTemplateRequest), e);
}
......@@ -3614,7 +3596,7 @@ public class OrderServiceImpl implements Orderservice {
} else {
resultMap.put(orderCode, resp.getMessage());
}
}catch (Exception e){
} catch (Exception e) {
resultMap.put(orderCode, e.getMessage());
}
});
......@@ -3705,9 +3687,9 @@ public class OrderServiceImpl implements Orderservice {
Long bLong = Long.valueOf(o2.getCreateTime());
if (bLong > aLong) {
return 1;
}else if (bLong < aLong){
} else if (bLong < aLong) {
return -1;
}else {
} else {
return 0;
}
});
......@@ -3954,5 +3936,4 @@ public class OrderServiceImpl implements Orderservice {
}
}
package cn.freemud.management.adapter;
import cn.freemud.management.entities.dto.request.pay.AgentPayRefundReq;
import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
......@@ -76,6 +78,21 @@ public class PaymentSdkAdapter {
return multiQueryRequest;
}
@SneakyThrows
public AgentPayRefundReq getAgentPayefundReq(OrderBeanV1 orderBean, BigDecimal refundAmount) {
OrderExtInfoDto ext = JSON.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
AgentPayRefundReq req = new AgentPayRefundReq();
req.setPartnerId(orderBean.getCompanyId());
req.setStoreId(orderBean.getShopId());
req.setFmTradeNo(ext.getPayTransId());
req.setOutOrderNo(orderBean.getOid());
req.setRefundTradeNo(this.getRefundSerialNo().toString());
req.setRefundAmount(refundAmount.longValue());
req.setNotifyUrl(refundNotifyCallback);
req.setVer("V1");
return req;
}
public Long getRefundSerialNo() {
return System.currentTimeMillis() + (int) (Math.random() * 9000) + 1000;
}
......
......@@ -3,6 +3,7 @@ package cn.freemud.management.controller;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.entities.dto.request.order.McCafeOrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.entities.dto.request.order.RefundSuccessCallbackVo;
import cn.freemud.management.enums.McCafeOperateType;
import cn.freemud.management.enums.OperateType;
import cn.freemud.management.enums.ResponseResult;
......@@ -72,6 +73,17 @@ public class OrderManagerController {
}
}
/**
* 同意退款, 支付服务退款失败的补偿接口
*
* 退款成功会回调该接口进行后续流程补偿
*/
@ApiAnnotation(logMessage = "/order/refund/callback")
@PostMapping("/refund/callback")
public BaseResponse refundSuccessCallback(@Validated @LogParams @RequestBody RefundSuccessCallbackVo req) {
return orderManagerAdapter.refundSuccessCallback(req);
}
@ApiAnnotation(logMessage = "mcCafeDeliveryCreate")
@ApiOperation(value = "麦咖啡订单入机", notes = "麦咖啡订单入机", produces = "application/json")
@PostMapping("/mcCafe/statusOperate")
......
package cn.freemud.management.entities.dto.request.order;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/6/8 17:38
* @description :
*/
@Data
public class RefundSuccessCallbackVo {
@ApiModelProperty(value = "总金额", position = 10)
private Integer totalAmount;
@ApiModelProperty(value = "退款金额", position = 11)
private Integer refundAmount;
@ApiModelProperty(value = "应结总金额", position = 12)
private Integer settlementTotalAmount;
@ApiModelProperty(value = "应结退款金额", position = 13)
private Integer settlementRefundAmount;
@ApiModelProperty(value = "交易流水号", position = 14)
private String tradeNo;
/**
* 订单编号
*/
private String orderCode;
/**
* 退款描述
*/
private String msg;
@ApiModelProperty(value = "第三方交易流水", position = 15)
private String thirdPartTradeNo;
@ApiModelProperty(value = "退款交易流水号", position = 16)
private String refundTradeNo;
@ApiModelProperty(value = "第三方退款交易流水", position = 17)
private String thirdPartRefundTradeNo;
@ApiModelProperty(value = "格式:yyyyMMddHHmmss", position = 18)
private String refundTime;
@ApiModelProperty(value = "货币类型", position = 19)
private String transCurrency;
@ApiModelProperty(value = "退款状态: 100 退款成功 8200305 处理中, 其他都是失败", position = 20)
private String refundStatus;
@ApiModelProperty(value = "商户号", position = 21)
private String partnerId;
@ApiModelProperty(value = "业务方退款单号", position = 22)
private String refundId;
@ApiModelProperty(value = "业务方支付单号", position = 22)
private String transId;
@ApiModelProperty(value = "间联退款单号")
private String refundEndTransId;
}
package cn.freemud.management.entities.dto.response.pay;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -20,6 +21,7 @@ public class AgentPayRefundResp {
@NoArgsConstructor
@Data
public static class DataDTO {
private String fmTradeNo;
private String endTransTradeNo;
private String platformTradeNo;
......@@ -35,6 +37,12 @@ public class AgentPayRefundResp {
private String refundTime;
private String transId;
private String ebcode;
@ApiModelProperty(value = "业务返回码")
private Integer resultCode;
@ApiModelProperty(value = "业务返回消息")
private String resultMsg;
}
public boolean isOk() {
......
package cn.freemud.management.entities.dto.response.pay;
import cn.freemud.management.enums.ResponseResult;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import lombok.Data;
......@@ -28,4 +29,9 @@ public class PayRefundResponse {
* 退款序列号
*/
private String refundId;
/**
* 兼容爱马哥退款报错的字段 ,其他场景不会有值
*/
private ResponseResult result;
}
......@@ -181,6 +181,8 @@ public enum ResponseResult {
REFUND_EXCEPTION("58004", "支付退款异常"),
REFUND_FAIL("58005", "支付退款失败"),
NOT_SUFFICIENT_FUNDS("8200201", "商户余额不足"),
CHECK_PARAM_ERROR("58006", "支付退款请求参数校验异常"),
REFUND_FAIL_WAIT_CALLBACK("58007", "支付退款失败,等待回调补偿中"),
/**
* 优惠券活动
*/
......
......@@ -2,6 +2,7 @@ package cn.freemud.management.service;
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.util.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
......@@ -110,4 +111,14 @@ public interface OrderManagerService {
default BaseResponse<OrderManagerResponse> orderCancelDelivery(OrderManagerRequest request, OrderBeanV1 orderBean){
return ResponseUtil.success();
};
/**
* 支付退款成功的售后状态回调
* @param request
* @param orderBean
* @return
*/
default BaseResponse refundSuccessCallback(RefundSuccessCallbackVo request, OrderBeanV1 orderBean){
return ResponseUtil.success();
};
}
......@@ -2,6 +2,7 @@ package cn.freemud.management.service.adapter;
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.OperateType;
import cn.freemud.management.enums.ResponseResult;
......@@ -10,6 +11,7 @@ import cn.freemud.management.service.handle.OrderVerifyHandle;
import cn.freemud.management.util.ResponseUtil;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.BizTypeEnum;
import com.freemud.application.sdk.api.ordercenter.enums.NewOrderStatus;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderStatusV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderTypeV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.RefundStatusV1;
......@@ -57,11 +59,12 @@ public class OrderManagerAdapter {
}
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderConfirm(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 制作完成
*
* @param request
* @return
*/
......@@ -74,14 +77,15 @@ public class OrderManagerAdapter {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.orderDoneVerify(orderBean, request);
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderDone(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 送出
* 送出
*
* @param request
* @return
*/
......@@ -100,19 +104,20 @@ public class OrderManagerAdapter {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.orderDeliveryVerify(orderBean, request);
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return StringUtils.equals(verifyResponse.getCode(), ResponseResult.ORDER_IS_COMPLETE_CAN_NOT_DELIVERY.getCode()) ? handleResponse(request,orderBean,ResponseUtil.success()) : handleResponse(request,orderBean,verifyResponse);
return StringUtils.equals(verifyResponse.getCode(), ResponseResult.ORDER_IS_COMPLETE_CAN_NOT_DELIVERY.getCode()) ? handleResponse(request, orderBean, ResponseUtil.success()) : handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderDelivery(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 完成
*
* @param request
* @return
*/
public BaseResponse<OrderManagerResponse> orderAffirm(OrderManagerRequest request,OrderBeanV1 orderBean) {
if (orderBean==null){
public BaseResponse<OrderManagerResponse> orderAffirm(OrderManagerRequest request, OrderBeanV1 orderBean) {
if (orderBean == null) {
//查询订单
orderBean = orderBaseService.getByOrderCode(request.getOrderId());
if (null == orderBean) {
......@@ -122,10 +127,10 @@ public class OrderManagerAdapter {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.orderAffirmVerify(orderBean, request);
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderAffirm(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
......@@ -142,9 +147,9 @@ public class OrderManagerAdapter {
}
//订单接单参数校验
BaseResponse verifyResponse;
if(BizTypeEnum.MALL.getBizType().compareTo(orderBean.getBizType()) == 0){
if (BizTypeEnum.MALL.getBizType().compareTo(orderBean.getBizType()) == 0) {
verifyResponse = orderVerifyHandle.mallOrderRejectVerify(orderBean, request);
}else {
} else {
if (!macCafePartnerId.equals(orderBean.getCompanyId())) {
verifyResponse = orderVerifyHandle.orderRejectVerify(orderBean, request);
} else {
......@@ -152,14 +157,15 @@ public class OrderManagerAdapter {
}
}
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderReject(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 同意退款
*
* @param request
* @return
*/
......@@ -171,7 +177,7 @@ public class OrderManagerAdapter {
}
//订单接单参数校验
BaseResponse verifyResponse;
if(BizTypeEnum.MALL.getBizType()==orderBean.getBizType()){
if (BizTypeEnum.MALL.getBizType() == orderBean.getBizType()) {
verifyResponse = orderVerifyHandle.mallOrderAgreeRefund(orderBean, request);
}else if(BizTypeEnum.FM_MALL.getBizType()==orderBean.getBizType()){//新版saas商城同意退款校验
verifyResponse = orderVerifyHandle.fmMallOrderAgreeRefund(orderBean, request);
......@@ -179,10 +185,10 @@ public class OrderManagerAdapter {
verifyResponse = orderVerifyHandle.orderAgreeRefund(orderBean, request);
}
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderAgreeRefund(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
......@@ -194,22 +200,23 @@ public class OrderManagerAdapter {
if (null == orderBean) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
if(CollectionUtils.isNotEmpty(orderBean.getRefundList())){
if (CollectionUtils.isNotEmpty(orderBean.getRefundList())) {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.orderAgreeRefundMCCafe(orderBean, request);
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderAgreeRefund(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
}else {
return handleResponse(request, orderBean, orderManagerResponse);
} else {
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCancel(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
}
/**
* 拒绝退款
*
* @param request
* @return
*/
......@@ -221,22 +228,23 @@ public class OrderManagerAdapter {
}
//订单接单参数校验
BaseResponse verifyResponse;
if(BizTypeEnum.MALL.getBizType()==orderBean.getBizType()){
if (BizTypeEnum.MALL.getBizType() == orderBean.getBizType()) {
verifyResponse = orderVerifyHandle.mallOrderRejectRefund(orderBean, request);
}else{
verifyResponse = orderVerifyHandle.orderRejectRefund(orderBean, request);
} else {
verifyResponse = orderVerifyHandle.orderRejectRefund(orderBean, request);
}
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderRejectRefund(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 取消订单
*
* @param request
* @return
*/
......@@ -247,11 +255,12 @@ public class OrderManagerAdapter {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCancel(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 拒绝退款
*
* @param request
* @return
*/
......@@ -264,20 +273,20 @@ public class OrderManagerAdapter {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.mcCafeOrderRejectRefund(orderBean, request);
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
return handleResponse(request,orderBean,verifyResponse);
return handleResponse(request, orderBean, verifyResponse);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderRejectRefund(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
private BaseResponse<OrderManagerResponse> handleResponse(OrderManagerRequest request, OrderBeanV1 orderBean,BaseResponse result) {
if (orderBean==null){
private BaseResponse<OrderManagerResponse> handleResponse(OrderManagerRequest request, OrderBeanV1 orderBean, BaseResponse result) {
if (orderBean == null) {
return result;
}
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(), result.getCode())) {
OperateType byOpType = OperateType.getByOpType(request.getOperateType());
if (byOpType != null) {
switch (byOpType) {
......@@ -304,14 +313,15 @@ public class OrderManagerAdapter {
default:
}
}
return ResponseUtil.success(new OrderManagerResponse(orderStatus,refundStatus));
return ResponseUtil.success(new OrderManagerResponse(orderStatus, refundStatus));
}
result.setResult(new OrderManagerResponse(orderStatus,refundStatus));
result.setResult(new OrderManagerResponse(orderStatus, refundStatus));
return result;
}
/**
* 创建配送单
*
* @param request
* @return
*/
......@@ -327,10 +337,10 @@ public class OrderManagerAdapter {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCreateDelivery(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
private BaseResponse<OrderBeanV1> getOrderBean(String orderId){
private BaseResponse<OrderBeanV1> getOrderBean(String orderId) {
//查询订单
OrderBeanV1 orderBean = orderBaseService.getByOrderCode(orderId);
// 防止NPE
......@@ -342,6 +352,7 @@ public class OrderManagerAdapter {
/**
* 取消配送
*
* @param request
* @return
*/
......@@ -353,14 +364,14 @@ public class OrderManagerAdapter {
}
OrderBeanV1 orderBean = orderBeanResp.getResult();
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderCancelDelivery(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* @see OrderManagerAdapter#orderAgreeRefund(cn.freemud.management.entities.dto.request.order.OrderManagerRequest)
* @param request
* @return 改操作 无需校验订单参数 直接退款
* 使用该方法 请先进行报备, 因为不暴露给外部使用, 不属于业务代码
* @see OrderManagerAdapter#orderAgreeRefund(cn.freemud.management.entities.dto.request.order.OrderManagerRequest)
*/
public BaseResponse developRefund(OrderManagerRequest request) {
//查询订单
......@@ -369,8 +380,31 @@ public class OrderManagerAdapter {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
// 设置退款金额
orderBean.setAmount(orderVerifyHandle.getRefundAmount(orderBean,false).longValue());
orderBean.setAmount(orderVerifyHandle.getRefundAmount(orderBean, false).longValue());
BaseResponse<OrderManagerResponse> orderManagerResponse = orderBeanFactory.getOrderManagerService(orderBean).orderAgreeRefund(request, orderBean);
return handleResponse(request,orderBean,orderManagerResponse);
return handleResponse(request, orderBean, orderManagerResponse);
}
/**
* 支付退款成功回调
*
* @param request
* @return
*/
public BaseResponse refundSuccessCallback(RefundSuccessCallbackVo request) {
// step 1 查订单
OrderBeanV1 orderBean = orderBaseService.getByOrderCode(request.getOrderCode());
if (null == orderBean) {
return ResponseUtil.error(ResponseResult.ORDER_NOT_EXIST);
}
// step 2 检查订单状态
//已取消的订单不能操作
if (ObjectUtils.equals(OrderStatusV1.CANCEL.getV2Code(), orderBean.getStatusV2())) {
return ResponseUtil.error(ResponseResult.ORDER_HAS_CANCELED);
}
// step 3 调用后续逻辑操作
orderBeanFactory.getOrderManagerService(orderBean).refundSuccessCallback(request, orderBean);
return ResponseUtil.success();
}
}
package cn.freemud.management.service.handle;
import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
import cn.freemud.management.entities.dto.response.pay.PayRefundData;
import cn.freemud.management.enums.PaymentRefundStatus;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.freemud.application.sdk.api.base.BaseResponse;
import com.freemud.application.sdk.api.util.ResponseUtils;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import org.apache.commons.lang.ObjectUtils;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/6/13 10:56
* @description :
*/
public class DemoMain {
public static void main(String[] args) {
String str = "{\n" +
" \"code\": \"100\",\n" +
" \"data\": {\n" +
" \"resultCode\": 82004005,\n" +
" \"resultMsg\": \"当前订单有退款记录没有完成\"\n" +
" },\n" +
" \"message\": \"success\"\n" +
"}";
BaseResponse<PayRefundData> refundNewResponse = JSON.parseObject(str, new TypeReference<BaseResponse<PayRefundData>>() {
});
if (Objects.equals(refundNewResponse.getCode(), "100") && refundNewResponse.getData() != null) {
refundNewResponse.setCode(refundNewResponse.getData().getResultCode().toString());
refundNewResponse.setMessage(refundNewResponse.getData().getResultMsg());
}
if (Objects.equals(refundNewResponse.getCode(), "100")) {
PayRefundData refundData = refundNewResponse.getData();
if (null != refundData) {
OrderRefundResponse refundResponse = new OrderRefundResponse();
refundResponse.setStatusCode(refundData.getResultCode());
refundResponse.setMsg(refundData.getResultMsg());
refundResponse.setRefundAmount(refundData.getRefundAmount());
refundResponse.setTotalAmount(refundData.getTotalAmount());
refundResponse.setRefundStatus(getRefundStatus(refundData.getResultCode()));
refundResponse.setRefundTradeNo(refundData.getRefundTradeNo());
refundResponse.setTradeNo(refundData.getRefundTradeNo());
refundResponse.setThirdPartRefundTradeNo(refundData.getThirdPartRefundTradeNo());
refundResponse.setThirdPartTradeNo(refundData.getThirdPartTradeNo());
refundResponse.setTotalAmount(refundData.getTotalAmount());
// return ResponseUtils.success(refundResponse);
}
}
BaseResponse<OrderRefundResponse> orderRefundResponse = ResponseUtils.error(refundNewResponse.getCode(), refundNewResponse.getMessage());
// Integer refundStatus = PayRefundStatus.SUCCESS;
Integer refundStatus = 1;
if (orderRefundResponse == null) {
// refundStatus = PayRefundStatus.RUNNING;
refundStatus = 4;
} else {
refundStatus = getFinalRefundStatus(Integer.valueOf(orderRefundResponse.getCode()));
}
System.out.println(refundStatus);
}
private static Integer getFinalRefundStatus(Integer resultCode) {
switch (resultCode) {
// 退款中状态码需要单独处理
case 8200305:
// return PayRefundStatus.RUNNING;
return 4;
// 退款成功
case 100:
// return PayRefundStatus.SUCCESS;
return 1;
default:
// return PayRefundStatus.FAIL;
return 2;
}
}
private static final String SUCCESS = "100";
public static final Integer SUCCESS_RESPONSE_CODE_INT = 100;
public static final Integer SUCCESS_RESPONSE_101_CODE_INT = 101;
public static final Integer REFUND_RESPONSE_CODE = 8200305;
public static Integer getRefundStatus(Integer resultCode) {
if (Objects.equals(resultCode, SUCCESS_RESPONSE_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else if (Objects.equals(resultCode, SUCCESS_RESPONSE_101_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else {
return Objects.equals(resultCode, REFUND_RESPONSE_CODE) ? PaymentRefundStatus.PAYMENT_REFUND_STATUS_4.getCode() : PaymentRefundStatus.PAYMENT_REFUND_STATUS_2.getCode();
}
}
}
......@@ -13,7 +13,6 @@ import cn.freemud.management.thirdparty.MulitiPaymentClient;
import cn.freemud.management.thirdparty.OMSPaymentClient;
import cn.freemud.management.util.RedisUtil;
import cn.freemud.redis.RedisCache;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappStore;
import com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformIappWxappStoreManager;
......@@ -22,6 +21,7 @@ import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderTypeV1;
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.service.OrderSdkService;
......@@ -41,6 +41,7 @@ import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* All rights Reserved, Designed By www.freemud.cn
*
......@@ -85,6 +86,32 @@ public class PaymentHandle {
@Autowired
private LogUtil logUtil;
public PayRefundResponse getCommonPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) {
PayRefundResponse refundResponse;
try {
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) {
// payment/application/refund
refundResponse = this.multiRefund(orderBean);
} else {
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
refundResponse = this.agentPayRefund(orderBean);
} else {
//正常订单现金退款 paymentcenter/refund
refundResponse = this.refund(request, orderBean);
}
}
} catch (OrderServiceException orderEx) { // 爱马哥兼容,不抛错
ResponseResult result = orderEx.getResult();
refundResponse = new PayRefundResponse();
refundResponse.setPayRefundStatus(PayRefundStatus.COMPATIBILITY_STATUS);
refundResponse.setResult(result);
return refundResponse;
}
return refundResponse;
}
/**
* 退款
*
......@@ -100,25 +127,87 @@ public class PaymentHandle {
if (ObjectUtils.equals(orderBean.getAmount(), 0L)) {
return handlePayRefundResponse(refundStatus, orderRefundRequest.getRefundId());
}
BaseResponse<OrderRefundResponse> orderRefundResponse;
// orderRefundResponse = standardPaymentService.orderRefund(orderRefundRequest, LogThreadLocal.getTrackingNo());
orderRefundResponse = this.orderPayRefund(orderRefundRequest);
BaseResponse<OrderRefundResponse> orderRefundResponse = this.orderPayRefund(orderRefundRequest);
if (orderRefundResponse == null) {
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
}
if (ObjectUtils.notEqual(orderRefundResponse.getCode(), SUCCESS)) {
//商户余额不足的情况下,返回异常特殊处理.
if (ResponseResult.NOT_SUFFICIENT_FUNDS.getCode().equals(orderRefundResponse.getCode())) {
throw new OrderServiceException(ResponseResult.NOT_SUFFICIENT_FUNDS);
}
ResponseResult refundFail = ResponseResult.REFUND_FAIL;
refundFail.setMessage(orderRefundResponse.getMessage());
throw new OrderServiceException(refundFail);
refundStatus = PayRefundStatus.RUNNING;
} else {
refundStatus = this.getFinalRefundStatus(Integer.valueOf(orderRefundResponse.getCode()));
}
refundStatus = ObjectUtils.equals(PayRefundStatus.SUCCESS.getCode(), orderRefundResponse.getData().getRefundStatus()) ? PayRefundStatus.SUCCESS : PayRefundStatus.RUNNING;
return handlePayRefundResponse(refundStatus, orderRefundRequest.getRefundId());
}
private PayRefundStatus getFinalRefundStatus(Integer resultCode) {
switch (resultCode) {
// 退款中状态码需要单独处理
case 8200305:
return PayRefundStatus.RUNNING;
// 重复请求,按照退款中处理
case 82004005:
return PayRefundStatus.RUNNING;
// 退款成功
case 100:
return PayRefundStatus.SUCCESS;
default:
return PayRefundStatus.FAIL;
}
}
private PayRefundRequestDto queryWxAppStore(BaseResponse<PaymentQueryOrderResponseDto> payQueryOrderResponse, PayRefundRequestDto refundRequest) {
String payCode = null;
if (Objects.equals(payQueryOrderResponse.getCode(), "100") && payQueryOrderResponse.getData() != null) {
refundRequest.setTotalAmount((payQueryOrderResponse.getData()).getAmount());
payCode = payQueryOrderResponse.getCode();
}
if (refundRequest.getTotalAmount() == null || refundRequest.getTotalAmount() == 0L) {
refundRequest.setTotalAmount(refundRequest.getRefundAmount());
}
AssortmentOpenPlatformIappWxappStore wxAppStore = this.assortmentOpenPlatformIappWxappStoreManager.selectWxappStoreByWxAppIdAndStoreId(refundRequest.getAppId(), refundRequest.getStoreId(), payCode);
PayRefundRequestDto request = new PayRefundRequestDto();
request.setStoreId(refundRequest.getStoreId());
request.setStationId(refundRequest.getStationId());
request.setOperatorId(refundRequest.getOperatorId());
request.setTransId(refundRequest.getOrgTransId());
request.setBusinessDate(refundRequest.getBusinessDate());
request.setFmId(refundRequest.getOrgPayFmId());
request.setTotalAmount(refundRequest.getTotalAmount());
request.setRefundAmount(refundRequest.getRefundAmount());
request.setRefundId(refundRequest.getRefundId());
request.setRefundDesc(refundRequest.getRefundDesc());
request.setNotifyUrl(refundRequest.getNotifyUrl());
request.setPartnerId(refundRequest.getPartnerId());
request.setVer(2);
request.setExtendParams(refundRequest.getExtendParams());
com.freemud.application.sdk.api.base.BaseResponse<OrderRefundResponse> checkParam = this.checkParam(refundRequest.getPartnerId(), refundRequest.getStoreId(), refundRequest.getRefundAmount(), wxAppStore);
if (!Objects.equals(checkParam.getCode(), "100")) {
return null;
}
return request;
}
/**
* @param refundRequest
* @return
*/
private BaseResponse<PaymentQueryOrderResponseDto> queryPayOrder(PayRefundRequestDto refundRequest) {
PaymentQueryOrderRequestDto paymentQueryOrderRequest = new PaymentQueryOrderRequestDto();
paymentQueryOrderRequest.setPartnerId(refundRequest.getPartnerId());
paymentQueryOrderRequest.setStoreId(refundRequest.getStoreId());
paymentQueryOrderRequest.setFrontTransId(refundRequest.getOrgTransId());
BaseResponse<PaymentQueryOrderResponseDto> payQueryOrderResponse = null;
try {
payQueryOrderResponse = paymentNewClient.payQueryOrder(paymentQueryOrderRequest);
} catch (Exception e) {
cn.freemud.base.log.ErrorLog.errorConvertJson(this.getClass(), "paymentcenter/queryOrder error", e);
}
if (payQueryOrderResponse == null) {
return null;
}
return payQueryOrderResponse;
}
/**
* 代付订单退款
*
......@@ -126,31 +215,29 @@ public class PaymentHandle {
* @return
*/
public PayRefundResponse agentPayRefund(OrderBeanV1 orderBean) {
PayRefundResponse ret = new PayRefundResponse();
PayRefundStatus refundStatus = PayRefundStatus.SUCCESS;
String fmRefundNo = "";
try {
OrderExtInfoDto ext = JSON.parseObject(orderBean.getExtInfo(), OrderExtInfoDto.class);
AgentPayRefundReq req = new AgentPayRefundReq();
req.setPartnerId(orderBean.getCompanyId());
req.setStoreId(orderBean.getShopId());
req.setFmTradeNo(ext.getPayTransId());
req.setOutOrderNo(orderBean.getOid());
req.setRefundTradeNo(paymentSdkAdapter.getRefundSerialNo().toString());
req.setRefundAmount(this.getRefundAmount(orderBean).longValue());
req.setVer("V1");
AgentPayRefundReq req = paymentSdkAdapter.getAgentPayefundReq(orderBean, this.getRefundAmount(orderBean));
AgentPayRefundResp resp = mulitiPaymentClient.agentPayRefund(req);
logUtil.info("fisherman refundRespons ---> "+orderBean.getOid() + "---", JSON.toJSONString(req), JSON.toJSONString(resp));
if (!resp.isOk()) throw new Exception("退款失败");
ret.setRefundId(resp.getData().getFmRefundNo());
ret.setPayRefundStatus(PayRefundStatus.SUCCESS);
if (!resp.isOk()) {
refundStatus = PayRefundStatus.RUNNING;
}
AgentPayRefundResp.DataDTO data = resp.getData();
if (Objects.nonNull(data)) {
refundStatus = this.getFinalRefundStatus(data.getResultCode());
}
fmRefundNo = resp.getData().getFmRefundNo();
} catch (Throwable e) {
ret.setPayRefundStatus(PayRefundStatus.FAIL);
refundStatus = PayRefundStatus.FAIL;
}
return ret;
return this.handlePayRefundResponse(refundStatus, fmRefundNo);
}
/**
* 卖券调用退款
*
* @param reason
* @param orderBean
* @return -2正常 -1 不需要退款 0其他异常 1账户余额不足 2 系统异常
......@@ -278,7 +365,7 @@ public class PaymentHandle {
private PayRefundResponse handlePayRefundResponse(PayRefundStatus refundStatus, String refundId) {
PayRefundResponse payRefundResponse = new PayRefundResponse();
payRefundResponse.setPayRefundStatus(refundStatus);
payRefundResponse.setRefundId(refundId.toString());
payRefundResponse.setRefundId(refundId);
return payRefundResponse;
}
......@@ -287,12 +374,29 @@ public class PaymentHandle {
MultiOrderRefundRequest multiOrderRefundRequest = paymentSdkAdapter.getMultiOrderPayRefundRequest(orderBean, getRefundAmount(orderBean));
MultiOrderRefundResponse multiOrderRefundResponse = mulitiPaymentClient.paymentApplicationRefund(multiOrderRefundRequest, orderBean.getCompanyId());
if (multiOrderRefundResponse == null || multiOrderRefundResponse.getData() == null || !com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant.ORDER_PAY_RESPONSE_SUCCESS.equals(multiOrderRefundResponse.getCode())) {
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
// fisherman 退款异常 也当做 退款中处理
refundStatus = PayRefundStatus.RUNNING;
}
List<MultiOrderRefundResponse.RefundPlatformResponse> refundPlatformResponseList = multiOrderRefundResponse.getData().refundPlatformResponseList;
if (null != refundPlatformResponseList && refundPlatformResponseList.size() > 0) {
redisCache.save(RedisUtil.getPaymentTransIdSequenceKey(refundPlatformResponseList.get(0).getTransId()), orderBean.getOid(), 1L, TimeUnit.DAYS);
}
if (CollectionUtils.isNotEmpty(refundPlatformResponseList)) {
long refundError = refundPlatformResponseList.stream()
.filter(s -> s.getResultCode().compareTo(MultiOrderRefundResponse.RefundPlatformResponse.REFUNDED_RESULTCODE) != 0
&& s.getResultCode().compareTo(MultiOrderRefundResponse.RefundPlatformResponse.REFUND_SUCCESS) != 0)
.count();
if (refundError > 0L) {
refundStatus = PayRefundStatus.FAIL;
}
// 退款中
long refunded = refundPlatformResponseList.stream()
.filter(s -> s.getResultCode().compareTo(MultiOrderRefundResponse.RefundPlatformResponse.REFUNDED_RESULTCODE) == 0)
.count();
if (refunded > 0L) {
refundStatus = PayRefundStatus.RUNNING;
}
}
return handlePayRefundResponse(refundStatus, multiOrderRefundRequest.getRefundTradeNo());
}
......@@ -302,102 +406,55 @@ public class PaymentHandle {
*/
public BaseResponse<OrderRefundResponse> orderPayRefund(PayRefundRequestDto refundRequest) {
PaymentQueryOrderRequestDto paymentQueryOrderRequest = new PaymentQueryOrderRequestDto();
paymentQueryOrderRequest.setPartnerId(refundRequest.getPartnerId());
paymentQueryOrderRequest.setStoreId(refundRequest.getStoreId());
paymentQueryOrderRequest.setFrontTransId(refundRequest.getOrgTransId());
BaseResponse<PaymentQueryOrderResponseDto> payQueryOrderResponse = null;
try {
payQueryOrderResponse = paymentNewClient.payQueryOrder(paymentQueryOrderRequest);
}catch (Exception e){
cn.freemud.base.log.ErrorLog.errorConvertJson(this.getClass(), "paymentcenter/queryOrder error", e);
// step1 查询支付
BaseResponse<PaymentQueryOrderResponseDto> paymentQueryOrderResponseDtoBaseResponse = this.queryPayOrder(refundRequest);
if (Objects.isNull(paymentQueryOrderResponseDtoBaseResponse)) {
throw new OrderServiceException(ResponseResult.REFUND_EXCEPTION);
}
if(payQueryOrderResponse == null){
return null;
// step2 查询退款配置
PayRefundRequestDto request = this.queryWxAppStore(paymentQueryOrderResponseDtoBaseResponse, refundRequest);
if (Objects.isNull(request)) {
throw new OrderServiceException(ResponseResult.CHECK_PARAM_ERROR);
}
Long vipAmount = 0L;
String payCode = null;
if (Objects.equals(payQueryOrderResponse.getCode(), "100") && payQueryOrderResponse.getData() != null) {
if ((payQueryOrderResponse.getData()).getVipAmount() != null && (payQueryOrderResponse.getData()).getVipAmount() != 0) {
vipAmount = (long) (payQueryOrderResponse.getData()).getVipAmount();
}
refundRequest.setTotalAmount((payQueryOrderResponse.getData()).getAmount());
payCode = payQueryOrderResponse.getCode();
// step3 退款
BaseResponse<PayRefundData> refundNewResponse = null;
try {
refundNewResponse = paymentNewClient.payRefund(request);
} catch (Exception e) {
ErrorLog.errorConvertJson(this.getClass(), "paymentcenter/refund error", e);
}
if (refundRequest.getTotalAmount() == null || refundRequest.getTotalAmount() == 0L) {
refundRequest.setTotalAmount(refundRequest.getRefundAmount());
if (refundNewResponse == null) {
return null;
}
AssortmentOpenPlatformIappWxappStore wxAppStore = this.assortmentOpenPlatformIappWxappStoreManager.selectWxappStoreByWxAppIdAndStoreId(refundRequest.getAppId(), refundRequest.getStoreId(), payCode);
PayRefundRequestDto request = new PayRefundRequestDto();
request.setStoreId(refundRequest.getStoreId());
request.setStationId(refundRequest.getStationId());
request.setOperatorId(refundRequest.getOperatorId());
request.setTransId(refundRequest.getOrgTransId());
request.setBusinessDate(refundRequest.getBusinessDate());
request.setFmId(refundRequest.getOrgPayFmId());
request.setTotalAmount(refundRequest.getTotalAmount());
request.setRefundAmount(refundRequest.getRefundAmount());
request.setRefundId(refundRequest.getRefundId());
request.setRefundDesc(refundRequest.getRefundDesc());
request.setNotifyUrl(refundRequest.getNotifyUrl());
request.setPartnerId(refundRequest.getPartnerId());
request.setVer(2);
request.setExtendParams(refundRequest.getExtendParams());
com.freemud.application.sdk.api.base.BaseResponse<OrderRefundResponse> checkParam = this.checkParam(refundRequest.getPartnerId(), refundRequest.getStoreId(), refundRequest.getRefundAmount(), wxAppStore);
if (!Objects.equals(checkParam.getCode(), "100")) {
return checkParam;
} else {
// String receiveJsonStr = this.setPayValueFromSDKByManager(refundRequest.getPartnerId(), refundRequest.getStoreId(), refundRequest.getRefundAmount() + vipAmount, vipAmount, wxAppStore.getIndirectId(), false);
// if (!StringUtils.isEmpty(receiveJsonStr)) {
// request.setAccountDivided(receiveJsonStr);
// }
BaseResponse<PayRefundData> refundNewResponse = null;
try {
refundNewResponse = paymentNewClient.payRefund(request);
}catch (Exception e){
ErrorLog.errorConvertJson(this.getClass(), "paymentcenter/refund error", e);
}
if(refundNewResponse == null){
return null;
}
logUtil.info("paymentcenter/refund", JSONObject.toJSONString(request),JSONObject.toJSONString(refundNewResponse));
//支付状态码取内部值
if(Objects.equals(refundNewResponse.getCode(), "100") && refundNewResponse.getData() != null){
refundNewResponse.setCode(refundNewResponse.getData().getResultCode().toString());
refundNewResponse.setMessage(refundNewResponse.getData().getResultMsg());
}
if (Objects.equals(refundNewResponse.getCode(), "100")) {
PayRefundData refundData = refundNewResponse.getData();
if (null != refundData) {
OrderRefundResponse refundResponse = new OrderRefundResponse();
refundResponse.setStatusCode(refundData.getResultCode());
refundResponse.setMsg(refundData.getResultMsg());
refundResponse.setRefundAmount(refundData.getRefundAmount());
refundResponse.setTotalAmount(refundData.getTotalAmount());
refundResponse.setRefundStatus(this.getRefundStatus(refundData.getResultCode()));
refundResponse.setRefundTradeNo(refundData.getRefundTradeNo());
refundResponse.setTradeNo(refundData.getRefundTradeNo());
refundResponse.setThirdPartRefundTradeNo(refundData.getThirdPartRefundTradeNo());
refundResponse.setThirdPartTradeNo(refundData.getThirdPartTradeNo());
refundResponse.setTotalAmount(refundData.getTotalAmount());
return ResponseUtils.success(refundResponse);
}
}
if (!Arrays.asList("8200201", "8200202", "8200203", "8200204", "8200205").contains(refundNewResponse.getCode())) {
// this.emailAlertService.sendEmailAlert("支付退款失败", "请求json:" + JSONObject.toJSONString(request) + "返回msg:" + refundNewResponse.getMessage());
logUtil.info("paymentcenter/refund", JSONObject.toJSONString(request), JSONObject.toJSONString(refundNewResponse));
//支付状态码取内部值
if (Objects.equals(refundNewResponse.getCode(), "100") && refundNewResponse.getData() != null) {
refundNewResponse.setCode(refundNewResponse.getData().getResultCode().toString());
refundNewResponse.setMessage(refundNewResponse.getData().getResultMsg());
}
if (Objects.equals(refundNewResponse.getCode(), "100")) {
PayRefundData refundData = refundNewResponse.getData();
if (null != refundData) {
OrderRefundResponse refundResponse = new OrderRefundResponse();
refundResponse.setStatusCode(refundData.getResultCode());
refundResponse.setMsg(refundData.getResultMsg());
refundResponse.setRefundAmount(refundData.getRefundAmount());
refundResponse.setTotalAmount(refundData.getTotalAmount());
refundResponse.setRefundStatus(this.getRefundStatus(refundData.getResultCode()));
refundResponse.setRefundTradeNo(refundData.getRefundTradeNo());
refundResponse.setTradeNo(refundData.getRefundTradeNo());
refundResponse.setThirdPartRefundTradeNo(refundData.getThirdPartRefundTradeNo());
refundResponse.setThirdPartTradeNo(refundData.getThirdPartTradeNo());
refundResponse.setTotalAmount(refundData.getTotalAmount());
return ResponseUtils.success(refundResponse);
}
return ResponseUtils.error(refundNewResponse.getCode(), refundNewResponse.getMessage());
}
return ResponseUtils.error(refundNewResponse.getCode(), refundNewResponse.getMessage());
}
public com.freemud.application.sdk.api.base.BaseResponse<OrderRefundResponse> checkParam(String partnerId, String storeId, Long amount, AssortmentOpenPlatformIappWxappStore wxAppStore) {
if (StringUtils.isBlank(partnerId)) {
return ResponseUtils.error("501", "商户号不能为空");
......@@ -414,7 +471,7 @@ public class PaymentHandle {
public Integer getRefundStatus(Integer resultCode) {
if (Objects.equals(resultCode, SUCCESS_RESPONSE_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
}else if (Objects.equals(resultCode, SUCCESS_RESPONSE_101_CODE_INT)) {
} else if (Objects.equals(resultCode, SUCCESS_RESPONSE_101_CODE_INT)) {
return PaymentRefundStatus.PAYMENT_REFUND_STATUS_1.getCode();
} else {
return Objects.equals(resultCode, REFUND_RESPONSE_CODE) ? PaymentRefundStatus.PAYMENT_REFUND_STATUS_4.getCode() : PaymentRefundStatus.PAYMENT_REFUND_STATUS_2.getCode();
......
......@@ -221,6 +221,7 @@ public class SaasOrderHandle {
if (PayRefundStatus.SUCCESS.equals(refundResponse.getPayRefundStatus())) {
baseOrderResponse = orderCenterSdkService.refundComplete(refundAgreeRequest);
} else {
// fisherman 这里有缺陷 退款失败也是最终状态, 基础服务售后状态不能为 4 不然用户无法重新发起售后单
baseOrderResponse = orderCenterSdkService.refundReturn(refundAgreeRequest);
}
if (baseOrderResponse == null || ObjectUtils.notEqual(ResponseResult.SUCCESS.getCode(), baseOrderResponse.getErrcode().toString())) {
......
......@@ -4,6 +4,7 @@ import cn.freemud.base.entity.BaseResponse;
import cn.freemud.management.constant.ResponseCodeConstant;
import cn.freemud.management.entities.dto.request.console.*;
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.entities.dto.response.pay.PayRefundResponse;
import cn.freemud.management.enums.OperateType;
......@@ -30,6 +31,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderExpressReq;
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.service.OrderSdkService;
import com.freemud.application.sdk.api.service.EmailAlertService;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
......@@ -106,9 +108,9 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
@Override
public BaseResponse<OrderManagerResponse> orderConfirm(OrderManagerRequest request, OrderBeanV1 orderBean) {
QueryFlag query = QueryFlag.builder().queryBusinessInfo(true).queryStoreInfo(true).build();
ConsoleResponseDTO<BizDTO> storeMix = this.getStoreMix(query, orderBean.getCompanyId(), orderBean.getShopId());
ConsoleResponseDTO<BizDTO> storeMix = this.getStoreMix(query, orderBean.getCompanyId(), orderBean.getShopId());
boolean idAutoCreate = false;
if (storeMix!=null && ObjectUtils.equals(ResponseResult.SUCCESS.getCode(), storeMix.getStatusCode())) {
if (storeMix != null && ObjectUtils.equals(ResponseResult.SUCCESS.getCode(), storeMix.getStatusCode())) {
BizDTO bizVO = storeMix.getBizVO();
// fisherman 预约单不走自动|半自动派单逻辑 【【野萃山】手动派单增加半自动配置】 https://www.tapd.cn/43862731/prong/stories/view/1143862731001040800
boolean reservedExpress = Objects.equals(orderBean.getNewOrderType(), OrderType.GENERAL_EXPRESS.getIndex());
......@@ -137,13 +139,13 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
// 创建配送单
deliveryHandle.createDelivery(orderBean, request, storeMix, idAutoCreate);
// 推送pos、微信消息中心 重复接单不重复推消息(针对蜜雪做的修改)
if(baseResponse != null && baseResponse.getResult() == null){
if (baseResponse != null && baseResponse.getResult() == null) {
orderBaseService.sendMessage(orderBean, OperateType.ORDER_CONFIRM, request.getReason());
}
// 增加全局开关,当紧急方案打开时进行直接处理callBack消息
if (orderCenterProperties.isUrgentCallbackOpen()) {
OrderCallBackRequestVo requestVo = saasOrderHandle.convert2CallbackReq(orderBean.getOid(),3,null,null);
ApiLog.infoMessage("紧急方案 接单成功直接调用callback,orderCode:{},requestId:{}",requestVo.getOrderCode(),requestVo.getRequestId());
OrderCallBackRequestVo requestVo = saasOrderHandle.convert2CallbackReq(orderBean.getOid(), 3, null, null);
ApiLog.infoMessage("紧急方案 接单成功直接调用callback,orderCode:{},requestId:{}", requestVo.getOrderCode(), requestVo.getRequestId());
orderCallbackClient.callbackOrder(requestVo);
}
return ResponseUtil.success(new OrderManagerResponse(storeMix.getBizVO().getBusinessInfo().getOrderPrintConfig(), orderBean.getGmtExpect(),
......@@ -208,14 +210,14 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
@Override
public BaseResponse<OrderManagerResponse> orderReject(OrderManagerRequest request, OrderBeanV1 orderBean) {
//支付退款
PayRefundResponse refundResponse ;
PayRefundResponse refundResponse;
try {
if(null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size()>0){
if (null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size() > 0) {
refundResponse = paymentHandle.multiRefund(orderBean);
}else{
} else {
refundResponse = paymentHandle.refund(request, orderBean);
}
} catch (OrderServiceException orderEx){ // 爱马哥兼容,不抛错
} catch (OrderServiceException orderEx) { // 爱马哥兼容,不抛错
return ResponseUtil.error(orderEx.getResult());
}
//订单拒单
......@@ -224,12 +226,11 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
orderBaseService.sendMessage(orderBean, OperateType.ORDER_REJECT, request.getReason());
//todo 可以考虑基于订单回调异步实现
//冲正库存
stockHandle.revert(request,orderBean);
stockHandle.revert(request, orderBean);
return ResponseUtil.success();
}
/**
* 同意退款
*
......@@ -240,36 +241,40 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
@Override
public BaseResponse<OrderManagerResponse> orderAgreeRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {
//取消配送单
deliveryHandle.cancelDelivery(orderBean,request);
deliveryHandle.cancelDelivery(orderBean, request);
//支付退款
PayRefundResponse refundResponse;
try {
if(null != orderBean.getOrderPayItem() && orderBean.getOrderPayItem().size()>0){
refundResponse = paymentHandle.multiRefund(orderBean);
}else{
OrderExtendedReq ext = orderBean.getOrderExtended();
if (StringUtils.isNotBlank(ext.getAgentPayerId()) && !Objects.equals(ext.getAgentPayerId(), orderBean.getUserId())) {
//代付人信息不为空 并且和订单创建人不一样,表示代付单
refundResponse = paymentHandle.agentPayRefund(orderBean);
} else {
//正常订单现金退款
refundResponse = paymentHandle.refund(request, orderBean);
}
}
} catch (OrderServiceException orderEx){ // 爱马哥兼容,不抛错
return ResponseUtil.error(orderEx.getResult());
PayRefundResponse refundResponse = this.getPayRefundResponse(request, orderBean);
// 爱马哥报错
if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.COMPATIBILITY_STATUS.getCode()) == 0) {
return ResponseUtil.error(refundResponse.getResult());
}
// fisherman --> 退款中的状态 阻止后续流程 等待支付回调
if (refundResponse.getPayRefundStatus().getCode().compareTo(PayRefundStatus.RUNNING.getCode()) == 0) {
return ResponseUtil.error(ResponseResult.REFUND_FAIL_WAIT_CALLBACK);
}
//订单同意退款
saasOrderHandle.refundAgree(request, refundResponse, orderBean);
// 推送pos、微信消息中心
orderBaseService.sendMessage(orderBean, ORDER_AGREE_REFUND, request.getReason());
//todo 可以考虑基于订单回调异步实现
//冲正库存
stockHandle.revert(request,orderBean);
stockHandle.revert(request, orderBean);
return ResponseUtil.success();
}
/**
* 提出 退款公共代码
*
* @param request
* @param orderBean
* @return
*/
private PayRefundResponse getPayRefundResponse(OrderManagerRequest request, OrderBeanV1 orderBean) {
return paymentHandle.getCommonPayRefundResponse(request, orderBean);
}
/**
* 拒绝退款
*
* @param request
......@@ -279,7 +284,7 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
@Override
public BaseResponse<OrderManagerResponse> orderRejectRefund(OrderManagerRequest request, OrderBeanV1 orderBean) {
//拒绝退款
saasOrderHandle.refundReject(request,orderBean);
saasOrderHandle.refundReject(request, orderBean);
// 推送pos、微信消息中心
orderBaseService.sendMessage(orderBean, OperateType.ORDER_REJECT_REFUND, request.getReason());
return ResponseUtil.success();
......@@ -289,21 +294,21 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
* 取消订单
*/
@Override
public BaseResponse<OrderManagerResponse> orderCancel(OrderManagerRequest request, OrderBeanV1 orderBean){
public BaseResponse<OrderManagerResponse> orderCancel(OrderManagerRequest request, OrderBeanV1 orderBean) {
if (BizTypeEnum.ORDINARY.getBizType().compareTo(orderBean.getBizType()) == 0
&& MarketTypeEnum.TIKTOK_MARKET_ORDER.getIndex().compareTo(Byte.toUnsignedInt(orderBean.getMarketingType())) == 0) {
&& MarketTypeEnum.TIKTOK_MARKET_ORDER.getIndex().compareTo(Byte.toUnsignedInt(orderBean.getMarketingType())) == 0) {
this.orderAgreeRefund(request, orderBean);
return ResponseUtil.success();
}
List<Integer> newOrderStatusList = Arrays.asList(OrderStatusV1.RECEIPT.getV2Code(),OrderStatusV1.COMPLETE.getV2Code(),OrderStatusV1.COMPLETE_MAKE.getV2Code());
List<String> sourceList = Arrays.asList(OrderSourceV1.SAAS.getCode(),OrderSourceV1.ALIPAY.getCode(),OrderSourceV1.APP.getCode());
List<Integer> newOrderStatusList = Arrays.asList(OrderStatusV1.RECEIPT.getV2Code(), OrderStatusV1.COMPLETE.getV2Code(), OrderStatusV1.COMPLETE_MAKE.getV2Code());
List<String> sourceList = Arrays.asList(OrderSourceV1.SAAS.getCode(), OrderSourceV1.ALIPAY.getCode(), OrderSourceV1.APP.getCode());
if (sourceList.contains(orderBean.getSource()) && newOrderStatusList.contains(orderBean.getStatusV2())) {
return executeRefund(request,orderBean, OperateType.ORDER_REJECT.getOpType());
return executeRefund(request, orderBean, OperateType.ORDER_REJECT.getOpType());
} else if (OrderSourceV1.MEAL.getCode().equals(orderBean.getSource())) {
if (OrderStatusV1.WAIT_PAY.getV2Code().equals(orderBean.getStatusV2()) || PayType.CASH_ON_DELIVERY.getCode().compareTo(orderBean.getPayType()) == 0) {
return executeCancel(request,orderBean, PayRefundStatus.SUCCESS.getCode(), AfterSalesType.SYSTEM_CANCEL.getIndex(), Integer.valueOf(orderBean.getOrderClient()));
return executeCancel(request, orderBean, PayRefundStatus.SUCCESS.getCode(), AfterSalesType.SYSTEM_CANCEL.getIndex(), Integer.valueOf(orderBean.getOrderClient()));
} else {
return executeRefund(request,orderBean, OperateType.ORDER_REJECT.getOpType());
return executeRefund(request, orderBean, OperateType.ORDER_REJECT.getOpType());
}
} else if (OrderSourceV1.POS.getCode().equals(orderBean.getSource())) {
return posCancel(orderBean);
......@@ -313,12 +318,13 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
/**
* 退款操作
*
* @param request
* @param orderBean
* @param operationType
* @return
*/
private BaseResponse<OrderManagerResponse> executeRefund(OrderManagerRequest request,OrderBeanV1 orderBean, String operationType) {
private BaseResponse<OrderManagerResponse> executeRefund(OrderManagerRequest request, OrderBeanV1 orderBean, String operationType) {
//订单接单参数校验
BaseResponse verifyResponse = orderVerifyHandle.orderCancel(orderBean, OperateType.ORDER_AGREE_REFUND.getOpType());
if (ObjectUtils.notEqual(verifyResponse.getCode(), ResponseResult.SUCCESS.getCode())) {
......@@ -329,7 +335,7 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
if (operationType.equalsIgnoreCase(OperateType.ORDER_REJECT.getOpType())) {
baseResponse = this.orderReject(request, orderBean);
}
if(null == baseResponse || !ObjectUtils.equals(SUCCESS,Integer.valueOf(baseResponse.getCode()))){
if (null == baseResponse || !ObjectUtils.equals(SUCCESS, Integer.valueOf(baseResponse.getCode()))) {
if (PAY_RETURN_FILTER_CODES.contains(baseResponse.getCode())) {
return ResponseUtil.error(ResponseResult.getResponseResult(baseResponse.getCode()));
}
......@@ -342,11 +348,11 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
/**
* 拒单在支付退款后的取消订单操作
*
* @param order 订单详情
* @param refundStatus 支付退款状态
* @param order 订单详情
* @param refundStatus 支付退款状态
* @return
*/
private BaseResponse<OrderManagerResponse> executeCancel(OrderManagerRequest request,OrderBeanV1 order, Integer refundStatus, Integer afterSalesType, Integer orderClient) {
private BaseResponse<OrderManagerResponse> executeCancel(OrderManagerRequest request, OrderBeanV1 order, Integer refundStatus, Integer afterSalesType, Integer orderClient) {
Integer createEvent;
if (PayRefundStatus.RUNNING.getCode().equals(refundStatus)) {
createEvent = CreateEventEnum.FIVE.getType();
......@@ -363,9 +369,9 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
orderCancelReq.setCreateEvent(createEvent);
orderCancelReq.setOrderClient(orderClient == null ? OrderClientType.SAAS.getIndex() : orderClient);
orderCancelReq.setOperator(request.getOperator());
OrderBaseResp baseResponse = orderSdkService.cancelOrder(orderCancelReq,UUID.randomUUID().toString());
if (!ObjectUtils.equals(SUCCESS,Integer.valueOf(baseResponse.getCode()))) {
this.commonSendEmailAlert(order,baseResponse,"拒单在支付退款后的取消订单操作失败");
OrderBaseResp baseResponse = orderSdkService.cancelOrder(orderCancelReq, UUID.randomUUID().toString());
if (!ObjectUtils.equals(SUCCESS, Integer.valueOf(baseResponse.getCode()))) {
this.commonSendEmailAlert(order, baseResponse, "拒单在支付退款后的取消订单操作失败");
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
return ResponseUtil.success();
......@@ -380,24 +386,24 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
orderCancelReq.setAfterSalesType(AfterSalesType.PARTNER_CANCEL.getIndex());
orderCancelReq.setCreateEvent(CreateEventEnum.FOUR.getType());
orderCancelReq.setOrderClient(OrderClientType.POS.getIndex());
OrderBaseResp baseResponse = orderSdkService.cancelOrder(orderCancelReq,UUID.randomUUID().toString());
if (!Objects.equals(SUCCESS,Integer.valueOf(baseResponse.getCode()))){
this.commonSendEmailAlert(order,baseResponse,"posCancel 取消订单失败");
OrderBaseResp baseResponse = orderSdkService.cancelOrder(orderCancelReq, UUID.randomUUID().toString());
if (!Objects.equals(SUCCESS, Integer.valueOf(baseResponse.getCode()))) {
this.commonSendEmailAlert(order, baseResponse, "posCancel 取消订单失败");
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){
if (orderExtInfoDto != null && orderExtInfoDto.getSvcAmount() != null && StringUtils.isNotEmpty(orderExtInfoDto.getSvcCardCode()) && order.getPayStatus() > 1) {
PayRefundResponse refundResponse = paymentHandle.posOrderPayRefund(order, orderExtInfoDto);
if(!ObjectUtils.equals(PayRefundStatus.SUCCESS,refundResponse.getPayRefundStatus())){
if (!ObjectUtils.equals(PayRefundStatus.SUCCESS, refundResponse.getPayRefundStatus())) {
return ResponseUtil.error(ResponseResult.PARTNER_ORDER_CANCEL_ERROR);
}
}
return ResponseUtil.success();
}
private void commonSendEmailAlert(OrderBeanV1 order, OrderBaseResp baseResponse,String desc){
private void commonSendEmailAlert(OrderBeanV1 order, OrderBaseResp baseResponse, String desc) {
emailAlertService.sendEmailAlert(desc, "请求json:" + JSONObject.toJSONString(order) + "返回msg:" + baseResponse.getMessage());
}
......@@ -405,37 +411,68 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
public BaseResponse<OrderManagerResponse> orderCreateDelivery(OrderManagerRequest request, OrderBeanV1 orderBean) {
// 使用feign调用 获取门店信息
QueryFlag query = QueryFlag.builder().queryBusinessInfo(true).queryStoreInfo(true).build();
ConsoleResponseDTO<BizDTO> storeMix = this.getStoreMix(query, orderBean.getCompanyId(), orderBean.getShopId());
ConsoleResponseDTO<BizDTO> storeMix = this.getStoreMix(query, orderBean.getCompanyId(), orderBean.getShopId());
// 创建配送单
return deliveryHandle.createDelivery(orderBean, request, storeMix, false);
}
@Override
public BaseResponse orderCancelDelivery(OrderManagerRequest request, OrderBeanV1 orderBean) {
BaseResponse response = deliveryHandle.cancelDelivery(orderBean,request);
if (!Objects.equals(response.getCode(), ResponseCodeConstant.RESPONSE_SUCCESS_STR)){
BaseResponse response = deliveryHandle.cancelDelivery(orderBean, request);
if (!Objects.equals(response.getCode(), ResponseCodeConstant.RESPONSE_SUCCESS_STR)) {
return response;
}
OrderExpressReq expressReq = new OrderExpressReq();
expressReq.setOrderCode(orderBean.getOid());
expressReq.setPartnerId(orderBean.getCompanyId());
expressReq.setOrderSubState(DeliveryStatus.DELIVERYCANCEL.getCode());
OrderBaseResp orderBaseResp = orderSdkService.updateDeliveryInfo(expressReq, LogThreadLocal.getTrackingNo());
if (!Objects.equals(orderBaseResp.getCode(), ResponseCodeConstant.RESPONSE_SUCCESS_STR)){
this.commonSendEmailAlert(orderBean,orderBaseResp,"取消配送,修改订单配送状态失败");
OrderBaseResp orderBaseResp = orderSdkService.updateDeliveryInfo(expressReq, LogThreadLocal.getTrackingNo());
if (!Objects.equals(orderBaseResp.getCode(), ResponseCodeConstant.RESPONSE_SUCCESS_STR)) {
this.commonSendEmailAlert(orderBean, orderBaseResp, "取消配送,修改订单配送状态失败");
return ResponseUtil.error(ResponseResult.ORDER_DELIVERY_EDIT_FAILED);
}
return ResponseUtil.success();
}
@Override
public BaseResponse refundSuccessCallback(RefundSuccessCallbackVo request, OrderBeanV1 orderBean) {
String reason = "支付补偿,订单退款";
AfterSalesOrderResp afterSalesOrderResp = orderBean.getAfterSalesOrderResp();
if (Objects.nonNull(afterSalesOrderResp)) {
reason = afterSalesOrderResp.getAfterSalesReason();
}
//订单同意退款
PayRefundResponse refundResponse = new PayRefundResponse();
String refundStatus = request.getRefundStatus();
PayRefundStatus payRefundStatus = PayRefundStatus.SUCCESS;
if (!Objects.equals(refundStatus, "100")) {
payRefundStatus = PayRefundStatus.FAIL;
}
refundResponse.setPayRefundStatus(payRefundStatus);
refundResponse.setRefundId(request.getRefundId());
OrderManagerRequest omRequest = new OrderManagerRequest();
omRequest.setReason(reason);
omRequest.setOperator("支付退款回调系统补偿");
saasOrderHandle.refundAgree(omRequest, refundResponse, orderBean);
// 推送pos、微信消息中心 未接单前 不需要推送pos
if (!NewOrderStatus.PLACE_AN_ORDER.getIndex().equals(orderBean.getStatusV2())) {
orderBaseService.sendMessage(orderBean, ORDER_AGREE_REFUND, reason);
}
//todo 可以考虑基于订单回调异步实现
//冲正库存
stockHandle.revert(omRequest, orderBean);
return ResponseUtil.success();
}
/**
*
* @param query
* @param partnerId
* @param storeId
* @return
*/
private ConsoleResponseDTO<BizDTO> getStoreMix(QueryFlag query, String partnerId, String storeId) {
private ConsoleResponseDTO<BizDTO> getStoreMix(QueryFlag query, String partnerId, String storeId) {
GetStoreMixRequest getStoreMixRequest = GetStoreMixRequest.builder().partnerId(partnerId).storeCode(storeId).build();
getStoreMixRequest.setQuery(query);
ConsoleResponseDTO<BizDTO> storeMix = consoleApiClient.getStoreMix(getStoreMixRequest);
......
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