Commit 90ae4502 by 查志伟

fix/门店自动退款不生效问题修复

parent d5627814
package cn.freemud.adapter; package cn.freemud.adapter;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType; import com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType;
import com.freemud.application.sdk.api.ordercenter.request.OrderCancelReq;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.sdk.api.assortment.order.enums.AfterSalesRefunStateEnum; import com.freemud.sdk.api.assortment.order.enums.AfterSalesRefunStateEnum;
import com.freemud.sdk.api.assortment.order.enums.OperationClientEnum; import com.freemud.sdk.api.assortment.order.enums.OperationClientEnum;
import com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -15,39 +15,50 @@ import java.math.BigDecimal; ...@@ -15,39 +15,50 @@ import java.math.BigDecimal;
* @version 1.0.0 * @version 1.0.0
* @since 1.0.0 * @since 1.0.0
*/ */
public class CancelOrderRequestAdapter { public class OrderCancelReqAdapter {
public static CancelOrderRequest convert(OrderInfoReqs order, String refundId, AfterSalesType afterSalesType, Long refundAmount, String reason, String remark, Boolean refundDeliveryFee, Byte refundMode) { public static OrderCancelReq convert(OrderInfoReqs order,
CancelOrderRequest req = new CancelOrderRequest(); String refundId,
req.setOrderId(order.getOrderCode()); AfterSalesType afterSalesType,
req.setPartnerId(order.getPartnerId()); Long refundAmount,
req.setAfterSalesType(afterSalesType); String reason,
req.setOrderClient(order.getOrderClient()); String remark,
Boolean refundDeliveryFee,
Byte refundMode) {
OrderCancelReq req = new OrderCancelReq();
if (StringUtils.isNotBlank(reason) && reason.length() > 50) { if (StringUtils.isNotBlank(reason) && reason.length() > 50) {
reason = reason.substring(0, 50); reason = reason.substring(0, 50);
} }
req.setReason(reason); //商户号必传
req.setTrackingNo(LogThreadLocal.getTrackingNo()); req.setPartnerId(order.getPartnerId());
req.setRefundSerialNo(refundId); req.setOrderCode(order.getOrderCode());
req.setReqRemark(remark);
req.setReqAmount(refundAmount != null ? new BigDecimal(refundAmount) : null);
req.setIsPartRefund(refundAmount != null); // 是否部分退 req.setIsPartRefund(refundAmount != null); // 是否部分退
req.setReqAmount(refundAmount != null ? new BigDecimal(refundAmount) : null); // 退款金额 //售后单类型 1:其他取消 2:用户取消 3:商户取消 4:未支付超时关单 5:商户接单超时取消 6:商家拒单
// 7:配送用户拒收 8:用户售后退货/售后退款 9:系统取消 10:客服取消 11:用户统一取消,
req.setAfterSalesType(afterSalesType.getIndex());
req.setOrderClient(order.getOrderClient());
req.setCancelReason(reason);
req.setAfterSalesReason(reason);
req.setAfterSerialNo(refundId);
// 商城订单 增加拓展信息
if (null != refundMode) {
JSONObject ext = new JSONObject();
ext.put("refundMode", refundMode);
req.setExtInfo(ext.toJSONString());
}
req.setRefundDeliveryAmount(refundDeliveryFee);
req.setRefundState(AfterSalesRefunStateEnum.STATE_1.getIndex());
//操作来源客户端 1:POS插件 2:小助手 3:开放平台 4:自动任务 5:用户端 6:系统 7:万象 8:太一 //操作来源客户端 1:POS插件 2:小助手 3:开放平台 4:自动任务 5:用户端 6:系统 7:万象 8:太一
req.setOperationClient(OperationClientEnum.STATE_5.getIndex());
req.setOperator(order.getUserName());
if (AfterSalesType.SYSTEM_CANCEL.getIndex().equals(afterSalesType.getIndex())) { if (AfterSalesType.SYSTEM_CANCEL.getIndex().equals(afterSalesType.getIndex())) {
req.setOperator("admin"); req.setOperator("admin");
req.setOperationClient(OperationClientEnum.STATE_6.getIndex()); req.setOperationClient(OperationClientEnum.STATE_6.getIndex());
} else {
req.setOperationClient(OperationClientEnum.STATE_5.getIndex());
req.setOperator(order.getUserName());
} }
// 这里给默认值,外面调用者 自己的根据业务判断退款 状态
req.setRefundState(AfterSalesRefunStateEnum.STATE_1.getIndex());
req.setReqRemark(remark);
req.setRefundDeliveryAmount(refundDeliveryFee);
// 商城订单 增加拓展信息
CancelOrderRequest.AfterSalesOrderExtInfoReq ext = new CancelOrderRequest.AfterSalesOrderExtInfoReq();
ext.setRefundMode(refundMode);
req.setExtInfoReq(ext);
return req; return req;
} }
} }
package cn.freemud.adapter;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.store.BusinessInfoDto;
import com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq;
import java.util.Date;
import java.util.Objects;
import java.util.Random;
/**
* @author Clover.z
* @version 1.0.0
* @since 1.0.0
*/
public class OrderTaskReqAdapter {
/**
* 设置申请退款时间
* 如果时间的类型是2表示采用原来的48小时逻辑
* 如果时间的类型是1表示在指定的时间之后进行退款
* 为了防止同一时刻的退款量太大,需要将退款的订单分散到指定的时间后半小时内
*/
public static OrderTaskReq convert(BusinessInfoDto config) {
OrderTaskReq orderTask;
if (config.getTimeTypeOfRefund() == null || Objects.equals(config.getTimeTypeOfRefund(), 2)) {
// 48小时之后
orderTask = new OrderTaskReq();
orderTask.setTaskType(4);
orderTask.setTimeout(1);
//1000*60*60*24*2 毫秒(48小时)
long timeout = 172800000;
long timeMillis = System.currentTimeMillis();
Date processingDate = new Date(timeMillis + timeout - 60000);
Date taskTime = new Date(timeMillis + timeout);
orderTask.setTaskTime(DateUtil.convert2String(taskTime, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
//处理时间,当前时间加48小时减1分钟
orderTask.setProcessingTime(DateUtil.convert2String(processingDate, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS));
} else if (config.getTimeTypeOfRefund() != null && config.getTimeTypeOfRefund().compareTo(1) == 0) {// 指定时间
orderTask = new OrderTaskReq();
orderTask.setTaskType(4);
orderTask.setTimeout(1);
// 获取门店配置的当天指定的退款时间
String timeOfRefund = config.getTimeOfRefund();
// 获取半小时的随机数
Random r = new Random();
int minute = r.ints(1, 31).findFirst().getAsInt() * 60000;
String today = DateUtil.getCurrentDate(DateUtil.FORMAT_YMD);
Date configTime = DateUtil.convert2Date(today + " " + timeOfRefund, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS);
// 判断当前时间是否已经超过门店设置的截至时间
if (new Date().after(configTime)) {
today = DateUtil.convert2String(DateUtil.addDays(new Date(), 1), DateUtil.FORMAT_YMD);
configTime = DateUtil.convert2Date(today + " " + timeOfRefund, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS);
}
Date processingDate = new Date(configTime.getTime() + minute);
String processingStr = DateUtil.convert2String(processingDate, DateUtil.FORMAT_YYYY_MM_DD_HHMMSS);
orderTask.setTaskTime(processingStr);
orderTask.setProcessingTime(processingStr);
} else {
orderTask = null;
}
return orderTask;
}
}
...@@ -197,6 +197,10 @@ public class BusinessInfoDto { ...@@ -197,6 +197,10 @@ public class BusinessInfoDto {
private String timeOfRefund; private String timeOfRefund;
/**
* 1-指定时间退款
* 2-48小时后自动退款处理
*/
private Integer timeTypeOfRefund; private Integer timeTypeOfRefund;
......
package cn.freemud.service; package cn.freemud.service;
import cn.freemud.adapter.CancelOrderRequestAdapter;
import cn.freemud.adapter.MessageNoticeAdapter; import cn.freemud.adapter.MessageNoticeAdapter;
import cn.freemud.adapter.OrderCancelReqAdapter;
import cn.freemud.adapter.OrderPrintDtoAdapter; import cn.freemud.adapter.OrderPrintDtoAdapter;
import cn.freemud.adapter.OrderTaskReqAdapter;
import cn.freemud.base.util.DateUtil; import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse; import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse;
import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo; import cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo;
import cn.freemud.entities.dto.ecology.SendMessageRequest; import cn.freemud.entities.dto.ecology.SendMessageRequest;
import cn.freemud.entities.dto.store.BusinessInfoDto;
import cn.freemud.entities.vo.OrderDevelopRefundVo; import cn.freemud.entities.vo.OrderDevelopRefundVo;
import cn.freemud.enums.AfterSalesOrderCreateEventEnum; import cn.freemud.enums.AfterSalesOrderCreateEventEnum;
import cn.freemud.enums.PayRefundStatus; import cn.freemud.enums.PayRefundStatus;
...@@ -21,6 +23,7 @@ import cn.freemud.management.service.handle.OrderVerifyHandle; ...@@ -21,6 +23,7 @@ import cn.freemud.management.service.handle.OrderVerifyHandle;
import cn.freemud.management.service.handle.PaymentHandle; import cn.freemud.management.service.handle.PaymentHandle;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.impl.OrderQueueService; import cn.freemud.service.impl.OrderQueueService;
import cn.freemud.service.store.StoreManager;
import cn.freemud.service.thirdparty.DeliveryFeiginClient; import cn.freemud.service.thirdparty.DeliveryFeiginClient;
import cn.freemud.service.thirdparty.EcologyAdminApplicationClient; import cn.freemud.service.thirdparty.EcologyAdminApplicationClient;
import cn.freemud.service.thirdparty.FMAssistantCloudPrintClient; import cn.freemud.service.thirdparty.FMAssistantCloudPrintClient;
...@@ -31,7 +34,9 @@ import com.freemud.application.sdk.api.constant.ResponseConstant; ...@@ -31,7 +34,9 @@ import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.log.ErrorLog; import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.enums.*; import com.freemud.application.sdk.api.ordercenter.enums.*;
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.OrderExtInfoDto;
import com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse;
...@@ -40,8 +45,7 @@ import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto; ...@@ -40,8 +45,7 @@ import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto;
import com.freemud.application.sdk.api.structure.service.MessageCenterClient; import com.freemud.application.sdk.api.structure.service.MessageCenterClient;
import com.freemud.sdk.api.assortment.order.constant.OrderRedisKeyConstant; import com.freemud.sdk.api.assortment.order.constant.OrderRedisKeyConstant;
import com.freemud.sdk.api.assortment.order.entities.OrderRefundConfigEntity; import com.freemud.sdk.api.assortment.order.entities.OrderRefundConfigEntity;
import com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest; import com.freemud.sdk.api.assortment.order.enums.AutoOrderConfigTime;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService; import com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -77,6 +81,7 @@ public class RefundService { ...@@ -77,6 +81,7 @@ public class RefundService {
private final FMAssistantCloudPrintClient fmAssistantCloudPrintClient; private final FMAssistantCloudPrintClient fmAssistantCloudPrintClient;
private final OrderManagerAdapter orderManagerAdapter; private final OrderManagerAdapter orderManagerAdapter;
private final OrderVerifyHandle orderVerifyHandle; private final OrderVerifyHandle orderVerifyHandle;
private final StoreManager storeManager;
private OrderInfoReqs preValidRefund(String partnerId, String orderCode, Byte refundMode) { private OrderInfoReqs preValidRefund(String partnerId, String orderCode, Byte refundMode) {
// 查询订单信息 // 查询订单信息
...@@ -281,7 +286,7 @@ public class RefundService { ...@@ -281,7 +286,7 @@ public class RefundService {
state = refundResponse.getPayRefundStatus().getCode(); state = refundResponse.getPayRefundStatus().getCode();
} }
CancelOrderRequest req = CancelOrderRequestAdapter.convert(order, UUID.randomUUID().toString(), OrderCancelReq req = OrderCancelReqAdapter.convert(order, UUID.randomUUID().toString(),
AfterSalesType.USER_CANCEL, null, reason, remark, isRefundDeliveryFee, refundMode); AfterSalesType.USER_CANCEL, null, reason, remark, isRefundDeliveryFee, refundMode);
req.setRefundState(AfterSalesRefunStateEnum.STATE_4.getIndex()); req.setRefundState(AfterSalesRefunStateEnum.STATE_4.getIndex());
if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) { if (Objects.equals(PayRefundStatus.SUCCESS.getCode(), state)) {
...@@ -295,9 +300,8 @@ public class RefundService { ...@@ -295,9 +300,8 @@ public class RefundService {
throw new ServiceException(ResponseResult.MULTIORDER__ERRORREFUND.getMessage()); throw new ServiceException(ResponseResult.MULTIORDER__ERRORREFUND.getMessage());
} }
OrderBaseResp<?> resp = orderSdkService.cancelOrder(req, LogThreadLocal.getTrackingNo());
BaseOrderResponse resp = orderCenterSdkService.orderCancel(req); if (resp == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE_STR, resp.getCode())) {
if (resp == null || !ObjectUtils.equals(ResponseConstant.SUCCESS_RESPONSE_CODE, resp.getErrcode())) {
throw new ServiceException(ResponseResult.ORDER__ERRORREFUND.getMessage()); throw new ServiceException(ResponseResult.ORDER__ERRORREFUND.getMessage());
} }
...@@ -313,10 +317,16 @@ public class RefundService { ...@@ -313,10 +317,16 @@ public class RefundService {
private void createAfterSales(OrderInfoReqs order, Long refundAmount, String reason, String remark, Boolean refundDeliveryFee, Byte refundMode) { private void createAfterSales(OrderInfoReqs order, Long refundAmount, String reason, String remark, Boolean refundDeliveryFee, Byte refundMode) {
AfterSalesType type = NewOrderStatus.COMPLETE.getIndex().equals(order.getOrderState()) AfterSalesType type = NewOrderStatus.COMPLETE.getIndex().equals(order.getOrderState())
? AfterSalesType.USER_SALE_RETURN : AfterSalesType.USER_CANCEL; ? AfterSalesType.USER_SALE_RETURN : AfterSalesType.USER_CANCEL;
CancelOrderRequest req = CancelOrderRequestAdapter.convert(order, null, type, refundAmount, reason, remark, refundDeliveryFee, refundMode); OrderCancelReq req = OrderCancelReqAdapter.convert(order, null, type, refundAmount, reason, remark, refundDeliveryFee, refundMode);
BaseOrderResponse resp = orderCenterSdkService.orderCancel(req); // 查询门店服务配置,退单模式为2为自动退款,判断自动退款时间,设置为0则不传入timeout,
if (!Objects.equals(resp.getErrcode(), 100)) { BusinessInfoDto config = storeManager.queryStoreBusiness(order.getPartnerId(), order.getStoreId());
throw new ServiceException(ResponseResult.ORDER__ERRORREFUND.getCode(), resp.getErrmsg()); if (Objects.equals(config.getAutoChargebackOrderType(), 2) && !Objects.equals(config.getAutoChargebackOrderTime(), 0)) {
req.setTimeOut(AutoOrderConfigTime.getTime(config.getAutoChargebackOrderTime().toString()));
}
req.setOrderTask(OrderTaskReqAdapter.convert(config));
OrderBaseResp<?> resp = orderSdkService.cancelOrder(req, LogThreadLocal.getTrackingNo());
if (!Objects.equals(resp.getCode(), "100")) {
throw new ServiceException(ResponseResult.ORDER__ERRORREFUND.getCode(), resp.getMessage());
} }
// 金额大于0的退款,发送到消息中心推送到pos // 金额大于0的退款,发送到消息中心推送到pos
......
package cn.freemud.service.store; package cn.freemud.service.store;
import cn.freemud.constant.ResponseCodeConstant; import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.StoreResponseDto;
import cn.freemud.entities.dto.store.BusinessInfoDto;
import cn.freemud.entities.dto.store.StoreMixResponseDto; import cn.freemud.entities.dto.store.StoreMixResponseDto;
import cn.freemud.entities.dto.store.StoreBaseResponseDto; import cn.freemud.entities.dto.store.StoreBaseResponseDto;
import cn.freemud.entities.dto.store.StoreInfoRequestDto; import cn.freemud.entities.dto.store.StoreInfoRequestDto;
...@@ -29,7 +31,7 @@ public class StoreManager { ...@@ -29,7 +31,7 @@ public class StoreManager {
* @param partnerId 商户号 * @param partnerId 商户号
* @param storeCode 门店号 * @param storeCode 门店号
* @param q 设置查询数据的func * @param q 设置查询数据的func
* @return * @return 门店聚合信息
*/ */
public StoreMixResponseDto queryStoreMixInfo(String partnerId, String storeCode, Consumer<StoreInfoRequestDto.QueryInfo> q) { public StoreMixResponseDto queryStoreMixInfo(String partnerId, String storeCode, Consumer<StoreInfoRequestDto.QueryInfo> q) {
StoreInfoRequestDto request = new StoreInfoRequestDto(partnerId, storeCode); StoreInfoRequestDto request = new StoreInfoRequestDto(partnerId, storeCode);
...@@ -43,4 +45,37 @@ public class StoreManager { ...@@ -43,4 +45,37 @@ public class StoreManager {
return response.getBizVO(); return response.getBizVO();
} }
/**
* 查询门店信息
* @param partnerId 商户号
* @param storeCode 门店号
* @return 门店信息
*/
public StoreResponseDto queryStoreInfo(String partnerId, String storeCode) {
StoreMixResponseDto mix = this.queryStoreMixInfo(partnerId, storeCode, query -> {
query.setQueryStoreInfo(true);
});
if (null == mix.getStoreInfo()) {
throw new ServiceException("门店不存在");
}
return mix.getStoreInfo();
}
/**
* 查询门店业务配置信息
* @param partnerId 商户号
* @param storeCode 门店号
* @return 门店业务配置信息
*/
public BusinessInfoDto queryStoreBusiness(String partnerId, String storeCode) {
StoreMixResponseDto mix = this.queryStoreMixInfo(partnerId, storeCode, query -> {
query.setQueryBusinessInfo(true);
});
if (null == mix.getBusinessInfo()) {
throw new ServiceException("门店未初始化业务配置");
}
return mix.getBusinessInfo();
}
} }
...@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.PostMapping; ...@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "CONSOLE-API",url="${saas.storeclient.feign.url}") @FeignClient(name = "CONSOLE-API",url="${saas.storeclient.feign.url:}")
@RequestMapping(produces = {"application/json;charset=UTF-8"}) @RequestMapping(produces = {"application/json;charset=UTF-8"})
public interface StoreClient { public interface StoreClient {
......
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