2 Commits d68ef6a453 ... b425bc7cbe

Author SHA1 Message Date
  lishiqiang b425bc7cbe Merge branch 'main' of http://47.98.207.247:3000/lsq/ship-ota-server 2 weeks ago
  lishiqiang 8109470de4 取消订单退款 2 weeks ago

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/refund/RefundDO.java

@@ -62,7 +62,7 @@ public class RefundDO extends TenantBaseDO {
      */
     private String machineName;
     /**
-     * 退票方式:0正常退款,1强制退款 2改签退款
+     * 退票方式:0正常退款,1强制退款 2改签退款 3退押金
      */
     private Integer refundMethod;
     /**

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderPayMapper.java

@@ -33,4 +33,6 @@ public interface TradeOrderPayMapper extends BaseMapperX<TradeOrderPayDO> {
      */
     List<RefundStatisticsVO> selectRefundStatistics(@Param("startDateTime") LocalDateTime startDateTime,
                                                      @Param("endDateTime") LocalDateTime endDateTime);
+
+    List<TradeOrderPayDO> getOrderPayByOrderId(Long orderId);
 }

+ 1 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeOrderRepositoryService.java

@@ -65,6 +65,7 @@ public interface TradeOrderRepositoryService {
     void updateOrderAfterAllPay(TradeOrderDO tradeOrderDO);
 
     TradeOrderPayDO getPayOrderById(Long id);
+    List<TradeOrderPayDO> getPayOrderByOrderId(Long orderId);
 
     /**
      * 全部供应商支付完成后更新订单

+ 4 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderRepositoryServiceImpl.java

@@ -612,6 +612,10 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
     public TradeOrderPayDO getPayOrderById(Long id) {
         return tradeOrderPayMapper.selectById(id);
     }
+    @Override
+    public List<TradeOrderPayDO> getPayOrderByOrderId(Long orderId) {
+        return tradeOrderPayMapper.getOrderPayByOrderId(orderId);
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 5 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -128,6 +128,7 @@ import com.yc.ship.module.trade.framework.annotation.TradeOrderLog;
 import com.yc.ship.module.trade.framework.common.ConfigUtils;
 import com.yc.ship.module.trade.framework.common.ThreadLocalUtil;
 import com.yc.ship.module.trade.framework.common.TradeOrderLogUtils;
+import com.yc.ship.module.trade.service.refund.TradeRefundService;
 import com.yc.ship.module.trade.utils.IdCardProvinceUtil;
 import com.yc.ship.module.trade.framework.mq.TradePublishUtils;
 import com.yc.ship.module.trade.service.invoice.InvoiceService;
@@ -309,6 +310,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
     @Resource
     private ConfigUtils configUtils;
+    @Resource
+    private TradeRefundService tradeRefundService;
 
 
     public final static String AGENCY_LOGIN_INFO = "agencyLoginInfo";
@@ -1303,6 +1306,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                     result += "退押金"+supplementAmount;
                 }
                 extMap.put("result", result);
+                tradeRefundService.refundByOrderId(orderId, supplementAmount);
+
                 TradeOrderLogUtils.setOrderInfo(orderId, tradeOrderDO.getOrderStatus(), TradeOrderStatusEnum.UNPAID.getStatus(), extMap);
             } else {
                 AuditUserDO auditUserDO = auditUserMapper.selectOne(new QueryWrapper<AuditUserDO>().eq("type", tradeOrderDO.getAuditType()).eq("audit_status", tradeOrderDO.getAuditStatus() + 1).last("limit 1"));

+ 1 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/TradeRefundRepositoryService.java

@@ -25,6 +25,7 @@ import java.util.Map;
 public interface TradeRefundRepositoryService{
 
     void saveRefund(TradeRefundBO tradeRefundBO);
+    void saveRefund(RefundDO refundDO);
 
     void updateOrderRefunding(TradeRefundBO tradeRefundBO);
 

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/TradeRefundService.java

@@ -60,6 +60,8 @@ public interface TradeRefundService {
      */
     CommonResult<?> refundByPaymentType(Long refundId);
 
+    CommonResult<?> refundByOrderId(Long orderId,BigDecimal amount);
+
     /**
      * 接收MQ消息根据支付类型退款
      * @param refundId

+ 11 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/impl/TradeRefundRepositoryServiceImpl.java

@@ -91,6 +91,17 @@ public class TradeRefundRepositoryServiceImpl implements TradeRefundRepositorySe
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveRefund(RefundDO refundDO) {
+        try {
+            refundMapper.insert(refundDO);
+        }catch (Exception e){
+            log.error("退单保存异常",e);
+            throw exception(REFUND_SAVE_EXCEPTION);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateOrderRefunding(TradeRefundBO tradeRefundBO) {

+ 97 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/impl/TradeRefundServiceImpl.java

@@ -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 {

+ 6 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderPayMapper.xml

@@ -26,6 +26,12 @@
         LIMIT 1
     </select>
 
+    <select id="getOrderPayByOrderId" resultType="com.yc.ship.module.trade.dal.dataobject.order.TradeOrderPayDO">
+        select * from trade_order_pay p
+        where p.order_id = #{orderId} and p.pay_status = 1 and p.deleted = 0
+        order by payment_type desc
+    </select>
+
     <select id="selectRefundStatistics" resultType="com.yc.ship.module.trade.controller.admin.report.vo.RefundStatisticsVO">
         SELECT
             tr.refund_time AS refundTime,