|
|
@@ -38,10 +38,10 @@ import com.yc.ship.module.trade.dal.dataobject.supplier.SupplierRefundDO;
|
|
|
import com.yc.ship.module.trade.dal.mysql.order.TradeOrderMapper;
|
|
|
import com.yc.ship.module.trade.dal.mysql.order.TradeOrderTotalMapper;
|
|
|
import com.yc.ship.module.trade.dal.mysql.order.TradeVisitorMapper;
|
|
|
+import com.yc.ship.module.trade.dal.mysql.refund.RefundMapper;
|
|
|
import com.yc.ship.module.trade.enums.*;
|
|
|
import com.yc.ship.module.trade.framework.annotation.TradeOrderLog;
|
|
|
import com.yc.ship.module.trade.framework.common.ExceptionUtils;
|
|
|
-import com.yc.ship.module.trade.framework.common.PayDigestUtil;
|
|
|
import com.yc.ship.module.trade.framework.common.TradeOrderLogUtils;
|
|
|
import com.yc.ship.module.trade.framework.common.UserUtils;
|
|
|
import com.yc.ship.module.trade.framework.mq.TradePublishUtils;
|
|
|
@@ -73,9 +73,11 @@ import java.math.RoundingMode;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static com.yc.ship.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
|
import static com.yc.ship.module.trade.enums.ApiConstants.*;
|
|
|
import static com.yc.ship.module.trade.enums.ErrorCodeConstants.*;
|
|
|
import static com.yc.ship.module.trade.enums.TravelhubDictTypeConstants.NO;
|
|
|
@@ -129,6 +131,10 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
@Resource
|
|
|
private TradeOrderMapper tradeOrderMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private RefundMapper refundMapper;
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public CommonResult<TradeRefundRespDTO> refund(TradeRefundCreateReqDTO refundCreateReqDTO) {
|
|
|
String lockKey = String.format(UPDATE_ORDER_LOCK, refundCreateReqDTO.getOrderId());
|
|
|
@@ -367,6 +373,91 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
return refundAuditDO;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public CommonResult<?> refundByOrderId(Long orderId,BigDecimal amount) {
|
|
|
+ TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);
|
|
|
+ BigDecimal totalAmount = amount;
|
|
|
+ try {
|
|
|
+ //如果失败更新退款记录状态为退款失败,成功状态由通知变更
|
|
|
+ List<TradeOrderPayDO> tradeOrderPayList = tradeOrderRepositoryService.getPayOrderByOrderId(tradeOrderDO.getId());
|
|
|
+ for (TradeOrderPayDO payOrderDO : tradeOrderPayList) {
|
|
|
+ if(totalAmount.compareTo(BigDecimal.ZERO) <= 0){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ RefundDO refundDO = new RefundDO();
|
|
|
+ if(payOrderDO.getPayAmount().compareTo(totalAmount) >= 0){
|
|
|
+ refundDO.setRefundAmount(amount);
|
|
|
+ refundDO.setOriginAmount(amount);
|
|
|
+ }else{
|
|
|
+ refundDO.setRefundAmount(payOrderDO.getPayAmount());
|
|
|
+ refundDO.setOriginAmount(payOrderDO.getPayAmount());
|
|
|
+ //还剩多少
|
|
|
+ totalAmount = totalAmount.subtract(payOrderDO.getPayAmount());
|
|
|
+ }
|
|
|
+ refundDO.setOrderId(orderId);
|
|
|
+ refundDO.setRefundChannel(6);
|
|
|
+ refundDO.setId(IdWorker.getId());
|
|
|
+ refundDO.setSellMethod(tradeOrderDO.getSellMethod());
|
|
|
+ refundDO.setRefundStatus(RefundStatusEnum.REFUNDING.getStatus());
|
|
|
+ refundDO.setRefundMethod(3);
|
|
|
+ refundDO.setRefundBackType(0);
|
|
|
+ refundDO.setRefundReason("取消订单退押金");
|
|
|
+ refundDO.setRefundUser(tradeOrderDO.getSellerId());
|
|
|
+ refundDO.setFee(BigDecimal.ZERO);
|
|
|
+ refundDO.setOrderStatus(tradeOrderDO.getOrderStatus());
|
|
|
+ refundDO.setTenantId(1L);
|
|
|
+ refundDO.setCreator(getLoginUserId()+"");
|
|
|
+ refundDO.setCreateTime(LocalDateTime.now());
|
|
|
+ refundDO.setDeleted(false);
|
|
|
+ refundMapper.insert(refundDO);
|
|
|
+
|
|
|
+ RefundRecordDO refundRecordDO = new RefundRecordDO();
|
|
|
+ refundRecordDO.setOrderPayId(payOrderDO.getId());
|
|
|
+ refundRecordDO.setRefundStatus(RefundStatusEnum.REFUNDING.getStatus());
|
|
|
+ refundRecordDO.setMerchantNo(payOrderDO.getMerchantNo());
|
|
|
+ refundRecordDO.setChannelId(payOrderDO.getChannelId());
|
|
|
+ refundRecordDO.setPaymentType(payOrderDO.getPaymentType());
|
|
|
+ refundRecordDO.setRefundId(refundDO.getId());
|
|
|
+ refundRecordDO.setRefundAmount(refundDO.getRefundAmount());
|
|
|
+ refundRecordDO.setTenantId(payOrderDO.getTenantId());
|
|
|
+ refundRecordDO.setPaymentNo(payOrderDO.getPaymentNo());
|
|
|
+ refundRecordDO.setRealPayOrderId(payOrderDO.getId());
|
|
|
+ refundRecordDO.setRefundBackType(0);
|
|
|
+ tradeRefundRepositoryService.saveRefundRecord(refundRecordDO);
|
|
|
+ if(payOrderDO.getPaymentType() == 1 || payOrderDO.getPaymentType() == 2) {
|
|
|
+ TradeMchInfoDO tradeMchInfoDO = tradeOrderRepositoryService.getByMchId(refundRecordDO.getMerchantNo());
|
|
|
+ Map result = payPlatService.createRefundOrder(refundRecordDO, refundDO, payOrderDO, tradeMchInfoDO);
|
|
|
+ Asserts.isTrue(StrUtil.equals(SUCCESS, MapUtils.getString(result, "retCode")), "调用支付平台退款失败");
|
|
|
+ String refundOrderId = MapUtil.getStr(result, "refundOrderId");
|
|
|
+ if (StrUtil.isNotBlank(refundOrderId)) {
|
|
|
+ refundRecordDO.setRefundNo(refundOrderId);
|
|
|
+ refundRecordDO.setRefundStatus(RefundStatusEnum.REFUND.getStatus());
|
|
|
+ tradeRefundRepositoryService.updateRefundRecord(refundRecordDO);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ PayTypeEnum payType = PayTypeEnum.valueOf(refundRecordDO.getPaymentType());
|
|
|
+ if (StrUtil.isNotBlank(payType.getServiceName()) && refundRecordDO.getRefundBackType() == REFUND_BACK_TYPE_ORIGINAL && (refundRecordDO.getRefundAmount().compareTo(BigDecimal.ZERO) > 0)) {
|
|
|
+ PayTypeService payTypeService = payTypeServiceMap.get(payType.getServiceName());
|
|
|
+ Long tradeId = payTypeService.refund(refundDO, refundRecordDO);
|
|
|
+ //更新退款记录(退款成功)
|
|
|
+ refundRecordDO.setRefundNo(tradeId.toString());
|
|
|
+ }
|
|
|
+ refundRecordDO.setRefundTime(LocalDateTime.now());
|
|
|
+ refundRecordDO.setRefundStatus(RefundStatusEnum.REFUND.getStatus());
|
|
|
+ tradeRefundRepositoryService.updateRefundRecord(refundRecordDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (ServiceException e) {
|
|
|
+ ExceptionUtils.log(log, "根据支付类型退款失败:", e);
|
|
|
+ return CommonResult.error(e);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("根据支付类型退款失败:", e);
|
|
|
+ return CommonResult.error(REFUND_FAIL_FROM_SYSTEM);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public CommonResult<?> refundByPaymentType(Long refundId) {
|
|
|
String lockKey = String.format(UPDATE_REFUND_LOCK, refundId);
|
|
|
@@ -1456,6 +1547,11 @@ public class TradeRefundServiceImpl implements TradeRefundService {
|
|
|
return CommonResult.success(null);
|
|
|
}
|
|
|
|
|
|
+ private CommonResult<?> refundFromPayOrder(RefundDO refundDO) {
|
|
|
+
|
|
|
+ return CommonResult.success(null);
|
|
|
+ }
|
|
|
+
|
|
|
private CommonResult<?> refundFromOtherPayType(RefundDO refundDO, RefundRecordDO refundRecordDO) {
|
|
|
PayTypeEnum payType = PayTypeEnum.valueOf(refundRecordDO.getPaymentType());
|
|
|
try {
|