Procházet zdrojové kódy

Merge remote-tracking branch 'origin/main'

caotao před 1 týdnem
rodič
revize
69235e0d5b

+ 4 - 0
module-his/module-his-biz/src/main/java/com/yc/ship/module/his/controller/admin/tradeorder/vo/TradeOrderRespVO.java

@@ -105,6 +105,10 @@ public class TradeOrderRespVO {
     @ExcelProperty("备注")
     private String remark;
 
+    @Schema(description = "计调备注")
+    @ExcelProperty("计调备注")
+    private String jdRemark;
+
     @Schema(description = "携程需要的", example = "891")
     @ExcelProperty("携程需要的")
     private String itemId;

+ 101 - 51
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -30,8 +30,9 @@ import com.yc.ship.module.product.utils.ProductRedisUtils;
 import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import me.zhyd.oauth.utils.UuidUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -42,6 +43,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -67,6 +69,9 @@ public class VoyageApiImpl implements VoyageApi {
     @Resource
     private VoyageStockDistributeNewService voyageStockDistributeNewService;
 
+    @Resource
+    private RedissonClient redissonClient;
+
     @Resource
     private ProductRedisUtils productRedisUtils;
 
@@ -80,57 +85,84 @@ public class VoyageApiImpl implements VoyageApi {
     private VoyageStockDetailLogMapper voyageStockDetailLogMapper;
 
     @Override
-    @Transactional(propagation = Propagation.NESTED,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void preReduceStock(ReduceStockReqDTO reqDTO) {
         log.info("开始初定订单扣库存:请求参数:{}", JSONObject.toJSONString(reqDTO));
         //TODO: 当前阶段不考虑门店库存
         log.info("开始初定订单扣库存:订单ID:{}old订单ID:{}", reqDTO.getOrderId(), reqDTO.getOldOrderId());
 
-//        // 锁放到最外层去
-        String uuid = UuidUtils.getUUID();
-        //判断是分销商还是门店下单 1:分销商,2:门店
-        Integer type = reqDTO.getType();
-        //分销商下单,当前阶段不考虑门店下单
-        if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
-            //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
-            //初定扣分销商库存
-            //先返还初定扣的库存,使用修改前一步订单的 ID
-            preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
-            log.info("先还该订单的库存-orderId: {}", reqDTO.getOrderId());
-            if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
-                log.info("如果是修改就还修改前的订单的库存-oldOrderId: {}", reqDTO.getOldOrderId());
-                preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+        Long voyageId = reqDTO.getVoyageId();
+        //现在给整个航次的库存加锁
+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
+        RLock lock = redissonClient.getLock(lockKey);
+        //用来控制redis缓存
+        try {
+            lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
+            //判断是分销商还是门店下单 1:分销商,2:门店
+            Integer type = reqDTO.getType();
+            //分销商下单,当前阶段不考虑门店下单
+            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
+                //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
+                //初定扣分销商库存
+                //先返还初定扣的库存,使用修改前一步订单的 ID
+                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+                log.info("先还该订单的库存-orderId: {}", reqDTO.getOrderId());
+                if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
+                    log.info("如果是修改就还修改前的订单的库存-oldOrderId: {}", reqDTO.getOldOrderId());
+                    preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+                }
+                //再去扣初定的库存
+                preReduceStockDistributor(reqDTO, uuid);
+            }
+        } finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
             }
-            //再去扣初定的库存
-            preReduceStockDistributor(reqDTO, uuid);
         }
     }
 
     @Override
-    @Transactional(propagation = Propagation.NESTED,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void preCancelReduceStock(ReduceStockReqDTO reqDTO) {
         //TODO: 当前阶段不考虑门店库存
         log.info("开始初定订单还库存:请求参数:{}", JSONObject.toJSONString(reqDTO));
-        String uuid = UuidUtils.getUUID();
-        //判断是分销商还是门店下单 1:分销商,2:门店
-        Integer type = reqDTO.getType();
-        //分销商下单,当前阶段不考虑门店下单
-        if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
-            //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
-            //初定扣分销商库存
-            preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
-            if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
-                preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+        Long voyageId = reqDTO.getVoyageId();
+        //现在给整个航次的库存加锁
+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
+            //判断是分销商还是门店下单 1:分销商,2:门店
+            Integer type = reqDTO.getType();
+            //分销商下单,当前阶段不考虑门店下单
+            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
+                //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
+                //初定扣分销商库存
+                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+                if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
+                    preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+                }
+            }
+        } finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
             }
         }
     }
 
     @Override
-    @Transactional(propagation = Propagation.NESTED,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void reduceStock(ReduceStockReqDTO reqDTO) {
         //TODO: 当前阶段不考虑门店库存
         log.info("开始确定订单扣库存:请求参数:{}", JSONObject.toJSONString(reqDTO));
+        Long voyageId = reqDTO.getVoyageId();
+        //现在给整个航次的库存加锁
+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
+        RLock lock = redissonClient.getLock(lockKey);
         try {
+            lock.lock(60, TimeUnit.SECONDS);
             String uuid = UuidUtils.getUUID();
             //判断是分销商还是门店下单 1:分销商,2:门店
             Integer type = reqDTO.getType();
@@ -152,39 +184,57 @@ public class VoyageApiImpl implements VoyageApi {
             }
         } catch (Exception e) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            log.error("开始确定订单扣库存异常", e);
-            if (e instanceof RuntimeException) {
-                throw (RuntimeException) e;
+            log.error("开始确定订单扣库存异常:{}", e.getMessage());
+            throw e;
+        } finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
             }
-            throw new RuntimeException("确定订单扣库存失败:" + e.getMessage(), e);
+
         }
     }
 
     @Override
-    @Transactional(propagation = Propagation.NESTED,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void cancelReduceStock(ReduceStockReqDTO reqDTO) {
         log.info("开始确定订单还库存:请求参数:{}", JSONObject.toJSONString(reqDTO));
         //TODO: 当前阶段不考虑门店库存
-        String uuid = UuidUtils.getUUID();
-        //判断是分销商还是门店下单 1:分销商,2:门店
-        Integer type = reqDTO.getType();
-        //分销商下单,当前阶段不考虑门店下单
-        if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
-            //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
-            //初定扣分销商库存
-            cancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
-            if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
-                cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+        Long voyageId = reqDTO.getVoyageId();
+        //现在给整个航次的库存加锁
+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
+            //判断是分销商还是门店下单 1:分销商,2:门店
+            Integer type = reqDTO.getType();
+            //分销商下单,当前阶段不考虑门店下单
+            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
+                //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
+                //初定扣分销商库存
+                cancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+                if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
+                    cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
+                }
+            }
+        } finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
             }
         }
     }
 
     @Override
-    @Transactional(propagation = Propagation.NESTED,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void cancelReduceStockNew(ReduceStockReqDTO reqDTO) {
         log.error("开始确定订单还库存:请求参数:{}", JSONObject.toJSONString(reqDTO));
         //TODO: 当前阶段不考虑门店库存
+        Long voyageId = reqDTO.getVoyageId();
+        //现在给整个航次的库存加锁
+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
+        RLock lock = redissonClient.getLock(lockKey);
         try {
+            lock.lock(60, TimeUnit.SECONDS);
             String uuid = UuidUtils.getUUID();
             //判断是分销商还是门店下单 1:分销商,2:门店
             Integer type = reqDTO.getType();
@@ -198,12 +248,12 @@ public class VoyageApiImpl implements VoyageApi {
                 }
             }
         } catch (Exception e) {
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            log.error("取消订单还库存异常", e);
-            if (e instanceof RuntimeException) {
-                throw (RuntimeException) e;
+            log.error("取消订单还库存异常:{}", e.getMessage());
+            e.printStackTrace();
+        }finally {
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
             }
-            throw new RuntimeException("取消订单还库存失败:" + e.getMessage(), e);
         }
     }
 

+ 4 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/TradeOrderRespNewVO.java

@@ -89,6 +89,10 @@ public class TradeOrderRespNewVO {
     @ExcelProperty("备注")
     private String remark;
 
+    @Schema(description = "计调备注")
+    @ExcelProperty("计调备注")
+    private String jdRemark;
+
     @Schema(description = "销售来源", example = "31758")
     private String sourceId;
 

+ 5 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/TradeOrderRespVO.java

@@ -168,6 +168,11 @@ public class TradeOrderRespVO {
     @ExcelProperty("备注")
     private String remark;
 
+
+    @Schema(description = "计调备注")
+    @ExcelProperty("计调备注")
+    private String jdRemark;
+
     @Schema(description = "营销政策备注")
 //    @ExcelProperty("营销政策备注")
     private String auditRemark;

+ 35 - 96
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java

@@ -171,37 +171,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     @Resource
     private DistributorCategoryMapper distributorCategoryMapper;
 
-    private boolean registerUnlockAfterTransaction(RLock lock, String lockKey) {
-        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
-            log.warn("当前无事务同步,航次锁将在 finally 中释放,lockKey:{}", lockKey);
-            return false;
-        }
-        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
-            @Override
-            public void afterCompletion(int status) {
-                log.info("订单事务完成,释放航次锁,lockKey:{},status:{}", lockKey, status);
-                unlockStockLock(lock, lockKey);
-            }
-        });
-        return true;
-    }
-
-    private void unlockStockLock(RLock lock, String lockKey) {
-        if (lock == null) {
-            return;
-        }
-        try {
-            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
-                lock.unlock();
-                log.info("航次锁释放完成,lockKey:{}", lockKey);
-            } else {
-                log.warn("跳过航次锁释放,当前线程未持有锁,lockKey:{}", lockKey);
-            }
-        } catch (Exception e) {
-            log.error("航次锁释放异常,lockKey:{}", lockKey, e);
-        }
-    }
-
     @Override
     public PageResult<TradeOrderRespVO> getPlatOrderPage(TradeOrderPageReqVO pageReqVO) {
         IPage<TradeOrderRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
@@ -289,13 +258,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         try {
             //1.构建订单
             tradeOrderBO = buildCreateOrder(orderCreateReqDTO);
-            Long voyageId = tradeOrderBO.getTradeOrderDO().getVoyageId();
-            if (voyageId != null) {
-                stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
-                stockLock = redissonClient.getLock(stockLockKey);
-                stockLock.lock();
-                unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-            }
             //2.下单前处理
             try {
                 beforeOrderCreate(tradeOrderBO);
@@ -332,8 +294,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         } catch (Exception e) {
             log.error("下单失败:", e);
             return CommonResult.error(ORDER_CREATE_FAIL);
-        } finally {
-
         }
     }
 
@@ -341,34 +301,23 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public CommonResult<TradeOrderRespDTO> createShipOrder(ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO) {
         TradeOrderBO tradeOrderBO = null;
-        RLock stockLock = null;
-        String stockLockKey = null;
-        boolean unlockRegistered = false;
         try {
             //1.构建订单
             tradeOrderBO = buildShipCreateOrder(shipTradeOrderCreateReqVO);
-            stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, tradeOrderBO.getTradeOrderDO().getVoyageId());
-            stockLock = redissonClient.getLock(stockLockKey);
-            try {
-                stockLock.lock();
-                unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                //2.下单前处理
-                beforeOrderCreate(tradeOrderBO);
-                //3.保存订单
-                tradeOrderRepositoryService.saveOrder(tradeOrderBO);
-                //4下单成功回调
-                tradeSupplierCallbackService.afterAllOrderCreate(tradeOrderBO.getTradeOrderDO());
-                //5.下单后处理
-                afterOrderCreate(tradeOrderBO);
-                TradeOrderRespDTO tradeOrderRespDTO = new TradeOrderRespDTO().setOrderId(tradeOrderBO.getTradeOrderDO().getId()).setOrderNo(tradeOrderBO.getTradeOrderDO().getOrderNo())
-                        .setPayAmount(tradeOrderBO.getTradeOrderDO().getPayAmount()).setOriginPayAmount(tradeOrderBO.getExtraInfo().getOriginPayAmount())
-                        .setDiscountAmount(tradeOrderBO.getExtraInfo().getDiscountAmount()).setMarketingId(tradeOrderBO.getExtraInfo().getMarketingCouponCodeId())
-                        .setOrderStatus(tradeOrderBO.getTradeOrderDO().getOrderStatus())
-                        .setMarketingName(tradeOrderBO.getExtraInfo().getMarketingName());
-                return CommonResult.success(tradeOrderRespDTO);
-            } finally {
-
-            }
+            //2.下单前处理
+            beforeOrderCreate(tradeOrderBO);
+            //3.保存订单
+            tradeOrderRepositoryService.saveOrder(tradeOrderBO);
+            //4下单成功回调
+            tradeSupplierCallbackService.afterAllOrderCreate(tradeOrderBO.getTradeOrderDO());
+            //5.下单后处理
+            afterOrderCreate(tradeOrderBO);
+            TradeOrderRespDTO tradeOrderRespDTO = new TradeOrderRespDTO().setOrderId(tradeOrderBO.getTradeOrderDO().getId()).setOrderNo(tradeOrderBO.getTradeOrderDO().getOrderNo())
+                    .setPayAmount(tradeOrderBO.getTradeOrderDO().getPayAmount()).setOriginPayAmount(tradeOrderBO.getExtraInfo().getOriginPayAmount())
+                    .setDiscountAmount(tradeOrderBO.getExtraInfo().getDiscountAmount()).setMarketingId(tradeOrderBO.getExtraInfo().getMarketingCouponCodeId())
+                    .setOrderStatus(tradeOrderBO.getTradeOrderDO().getOrderStatus())
+                    .setMarketingName(tradeOrderBO.getExtraInfo().getMarketingName());
+            return CommonResult.success(tradeOrderRespDTO);
         } catch (ServiceException e) {
             ExceptionUtils.log(log, "下单失败:", e);
             handleAfterOrderCreateFail(e.getCode(), tradeOrderBO);
@@ -383,43 +332,33 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
     public CommonResult<TradeOrderRespDTO> modifyShipOrder(ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO) {
         TradeOrderBO tradeOrderBO = null;
-        RLock stockLock = null;
-        String stockLockKey = null;
-        boolean unlockRegistered = false;
         try {
             //1.构建订单
             tradeOrderBO = buildShipCreateOrder(shipTradeOrderCreateReqVO);
-            stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, tradeOrderBO.getTradeOrderDO().getVoyageId());
-            stockLock = redissonClient.getLock(stockLockKey);
-            try {
-                stockLock.lock();
-                unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                tradeOrderBO.setOldTradeOrderDO(shipTradeOrderCreateReqVO.getOldtradeOrderDO());
-                //2.下单前处理
-                beforeOrderCreate(tradeOrderBO);
-                //3.保存订单
-                tradeOrderBO.setUpdateTime(shipTradeOrderCreateReqVO.getUpdateTime());
 
-                String changedFields = BeanUtils.getChangedFields(shipTradeOrderCreateReqVO.getOldtradeOrderDO(), tradeOrderBO.getTradeOrderDO());
-                System.err.println("changedFields=" + changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
-                if (tradeOrderBO.getTradeOrderBindDO() != null) {
-                    tradeOrderBO.getTradeOrderBindDO().setRemark(changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
-                }
-                tradeOrderRepositoryService.modifyOrder(tradeOrderBO, shipTradeOrderCreateReqVO.getOldtradeOrderDO());
-                //4 下单成功回调
-//            tradeSupplierCallbackService.afterAllOrderCreate(tradeOrderBO.getTradeOrderDO());
-                //5.下单后处理
-                afterOrderModify(tradeOrderBO, changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
-                TradeOrderRespDTO tradeOrderRespDTO = new TradeOrderRespDTO().setOrderId(tradeOrderBO.getTradeOrderDO().getId()).setOrderNo(tradeOrderBO.getTradeOrderDO().getOrderNo())
-                        .setPayAmount(tradeOrderBO.getTradeOrderDO().getPayAmount()).setOriginPayAmount(tradeOrderBO.getExtraInfo().getOriginPayAmount())
-                        .setDiscountAmount(tradeOrderBO.getExtraInfo().getDiscountAmount()).setMarketingId(tradeOrderBO.getExtraInfo().getMarketingCouponCodeId())
-                        .setMarketingName(tradeOrderBO.getExtraInfo().getMarketingName())
-                        .setOrderStatus(tradeOrderBO.getTradeOrderDO().getOrderStatus())
-                        .setContent(changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
-                return CommonResult.success(tradeOrderRespDTO);
-            } finally {
+            tradeOrderBO.setOldTradeOrderDO(shipTradeOrderCreateReqVO.getOldtradeOrderDO());
+            //2.下单前处理
+            beforeOrderCreate(tradeOrderBO);
+            //3.保存订单
+            tradeOrderBO.setUpdateTime(shipTradeOrderCreateReqVO.getUpdateTime());
 
+            String changedFields = BeanUtils.getChangedFields(shipTradeOrderCreateReqVO.getOldtradeOrderDO(), tradeOrderBO.getTradeOrderDO());
+            System.err.println("changedFields=" + changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
+            if (tradeOrderBO.getTradeOrderBindDO() != null) {
+                tradeOrderBO.getTradeOrderBindDO().setRemark(changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
             }
+            tradeOrderRepositoryService.modifyOrder(tradeOrderBO, shipTradeOrderCreateReqVO.getOldtradeOrderDO());
+            //4 下单成功回调
+//            tradeSupplierCallbackService.afterAllOrderCreate(tradeOrderBO.getTradeOrderDO());
+            //5.下单后处理
+            afterOrderModify(tradeOrderBO, changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
+            TradeOrderRespDTO tradeOrderRespDTO = new TradeOrderRespDTO().setOrderId(tradeOrderBO.getTradeOrderDO().getId()).setOrderNo(tradeOrderBO.getTradeOrderDO().getOrderNo())
+                    .setPayAmount(tradeOrderBO.getTradeOrderDO().getPayAmount()).setOriginPayAmount(tradeOrderBO.getExtraInfo().getOriginPayAmount())
+                    .setDiscountAmount(tradeOrderBO.getExtraInfo().getDiscountAmount()).setMarketingId(tradeOrderBO.getExtraInfo().getMarketingCouponCodeId())
+                    .setMarketingName(tradeOrderBO.getExtraInfo().getMarketingName())
+                    .setOrderStatus(tradeOrderBO.getTradeOrderDO().getOrderStatus())
+                    .setContent(changedFields + shipTradeOrderCreateReqVO.getChangedFields1());
+            return CommonResult.success(tradeOrderRespDTO);
         } catch (ServiceException e) {
             try {
                 ExceptionUtils.log(log, "订单修改失败:", e);

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

@@ -8,10 +8,7 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcelFactory;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.metadata.Head;
-import com.alibaba.excel.metadata.data.ImageData;
-import com.alibaba.excel.metadata.data.WriteCellData;
 import com.alibaba.excel.util.DateUtils;
-import com.alibaba.excel.util.FileUtils;
 import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
 import com.alibaba.excel.write.merge.AbstractMergeStrategy;
 import com.alibaba.excel.write.metadata.WriteSheet;
@@ -25,7 +22,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fhs.core.trans.anno.IgnoreTrans;
 import com.yc.ship.framework.common.enums.UserTypeEnum;
 import com.yc.ship.framework.common.lang.Asserts;
 import com.yc.ship.framework.common.pojo.CommonResult;
@@ -34,7 +30,6 @@ import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.framework.common.util.object.ObjectUtils;
 import com.yc.ship.framework.dict.core.DictFrameworkUtils;
-import com.yc.ship.framework.excel.core.merge.MergeStrategy;
 import com.yc.ship.framework.ip.core.utils.AreaUtils;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.security.core.LoginUser;
@@ -76,7 +71,6 @@ import com.yc.ship.module.product.api.ProductApi;
 import com.yc.ship.module.product.api.VoyageApi;
 import com.yc.ship.module.product.api.dto.*;
 import com.yc.ship.module.product.controller.admin.voyage.vo.VoyageRespVO;
-import com.yc.ship.module.trade.controller.admin.order.vo.order.PublicOrderVoyageRespVO;
 import com.yc.ship.module.product.dal.dataobject.priceroommodeltype.PriceRoomModelTypeDO;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.enums.DistributorOrStoreEnum;
@@ -128,8 +122,6 @@ 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;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
@@ -137,7 +129,9 @@ import com.yc.ship.module.trade.service.order.TradeOrderService;
 import com.yc.ship.module.trade.service.otc.OtcTradeOrderService;
 import com.yc.ship.module.trade.service.pay.TradeOrderPayService;
 import com.yc.ship.module.trade.service.refund.TradeRefundRepositoryService;
+import com.yc.ship.module.trade.service.refund.TradeRefundService;
 import com.yc.ship.module.trade.utils.AgencyAuthUtils;
+import com.yc.ship.module.trade.utils.IdCardProvinceUtil;
 import com.yc.ship.module.trade.utils.excel.ExcelStyleHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -146,7 +140,6 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.RegionUtil;
 import org.apache.poi.util.IOUtils;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jetbrains.annotations.NotNull;
 import org.redisson.api.RLock;
@@ -154,11 +147,12 @@ import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionSynchronization;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import javax.annotation.Resource;
-import java.io.*;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.Duration;
@@ -207,37 +201,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Resource
     private NotifyMessageSendApi notifyMessageSendApi;
 
-    private boolean registerUnlockAfterTransaction(RLock lock, String lockKey) {
-        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
-            log.warn("当前无事务同步,航次锁将在 finally 中释放,lockKey:{}", lockKey);
-            return false;
-        }
-        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
-            @Override
-            public void afterCompletion(int status) {
-                log.info("订单事务完成,释放航次锁,lockKey:{},status:{}", lockKey, status);
-                unlockStockLock(lock, lockKey);
-            }
-        });
-        return true;
-    }
-
-    private void unlockStockLock(RLock lock, String lockKey) {
-        if (lock == null) {
-            return;
-        }
-        try {
-            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
-                lock.unlock();
-                log.info("航次锁释放完成,lockKey:{}", lockKey);
-            } else {
-                log.warn("跳过航次锁释放,当前线程未持有锁,lockKey:{}", lockKey);
-            }
-        } catch (Exception e) {
-            log.error("航次锁释放异常,lockKey:{}", lockKey, e);
-        }
-    }
-
     @Resource
     private ResourceRoomModelService resourceRoomModelService;
     @Resource
@@ -554,7 +517,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                         .set(TradeOrderDO::getConfirmDate, confireDate)
                         .set(TradeOrderDO::getAuditStatus, tradeOrderDO.getAuditStatus() + 1)
                         .set(TradeOrderDO::getUpdateTime, LocalDateTime.now())
-                        .set(TradeOrderDO::getDeposiStatus, 1)
                         .eq(TradeOrderDO::getId, orderId);
                 if(amount.compareTo(BigDecimal.ZERO) != 0){
                     updateWrapper.set(TradeOrderDO::getPayAmount, newPayAmount);
@@ -662,20 +624,13 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 List<OrderRoomUseDTO> orderRoomUseDTOList = tradeVisitorMapper.selectRoomShipVisitor2(lastTradeOrder.getId());
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
-                String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, reqDTO.getVoyageId());
-                RLock stockLock = redissonClient.getLock(stockLockKey);
-                boolean unlockRegistered = false;
-                try {
-                    stockLock.lock();
-                    unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                    Integer orderStatus = reqDTO.getOrderStatus();
-                    if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
-                        voyageApi.preReduceStock(reqDTO);
-                    } else {
-                        reqDTO.setOldOrderStatus(lastTradeOrder.getOrderStatus());
-                        voyageApi.reduceStock(reqDTO);
-                    }
-                } finally {
+
+                Integer orderStatus = reqDTO.getOrderStatus();
+                if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
+                    voyageApi.preReduceStock(reqDTO);
+                } else {
+                    reqDTO.setOldOrderStatus(lastTradeOrder.getOrderStatus());
+                    voyageApi.reduceStock(reqDTO);
                 }
 
                 Map<String, Object> extMap = new HashMap<>();
@@ -1387,10 +1342,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
             int oldorderStatus =  TradeOrderStatusEnum.YD.getStatus();
             if(tradeOrderDO.getConfirmDate()!=null){
-                oldorderStatus = TradeOrderStatusEnum.CANCELED.getStatus();
+                oldorderStatus = TradeOrderStatusEnum.UNPAID.getStatus();
             }
             if(tradeOrderDO.getPayStatus()!=null && tradeOrderDO.getPayStatus()==1){
-                oldorderStatus = TradeOrderStatusEnum.CANCELED.getStatus();
+                oldorderStatus = TradeOrderStatusEnum.UNUSED.getStatus();
             }
             tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("order_status",oldorderStatus).set("audit_status", 5).set("damaged_status",3).eq("id", orderId));
 
@@ -1535,24 +1490,15 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
             List<OrderRoomUseDTO> orderRoomUseDTOList = tradeVisitorMapper.selectRoomShipVisitor2(lastTradeOrder.getId());
             reqDTO.setOrderRoomList(orderRoomUseDTOList);
-            String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, reqDTO.getVoyageId());
-            RLock stockLock = redissonClient.getLock(stockLockKey);
-            boolean unlockRegistered = false;
-            try {
-                stockLock.lock();
-                unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                Integer orderStatus = reqDTO.getOrderStatus();
-                if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
-                    voyageApi.preReduceStock(reqDTO);
-                } else {
-                    reqDTO.setOldOrderStatus(lastTradeOrder.getOrderStatus());
-                    voyageApi.reduceStock(reqDTO);
-                }
-            } finally {
 
+            Integer orderStatus = reqDTO.getOrderStatus();
+            if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
+                voyageApi.preReduceStock(reqDTO);
+            } else {
+                reqDTO.setOldOrderStatus(lastTradeOrder.getOrderStatus());
+                voyageApi.reduceStock(reqDTO);
             }
 
-
             Map<String, Object> extMap = new HashMap<>();
             extMap.put("result", "审核撤回");
             TradeOrderLogUtils.setOrderInfo(orderId, tradeOrderDO.getOrderStatus(), tradeOrderDO.getOrderStatus(), extMap);
@@ -2421,14 +2367,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         //现在给整个订单号的加锁
         String lockKey = String.format(ProductRedisKeyConstants.ORDER_REDIS_KEY_PREFIX, orderNo);
         RLock lock = redissonClient.getLock(lockKey);
-        //现在给整个航次的库存加锁
-        String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
-        RLock stockLock = redissonClient.getLock(stockLockKey);
-        boolean stockUnlockRegistered = false;
         try {
             lock.lock(60, TimeUnit.SECONDS);
-            stockLock.lock();
-            stockUnlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
             TradeOrderTotalVO summary = createVO.getSummary();
             BigDecimal realAmount = summary.getRealMoney();
             BigDecimal orderMoney = summary.getOrderMoney();
@@ -2779,14 +2719,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         //现在给整个订单号的加锁
         String lockKey = String.format(ProductRedisKeyConstants.ORDER_REDIS_KEY_PREFIX, orderNo);
         RLock lock = redissonClient.getLock(lockKey);
-        //现在给整个航次的库存加锁
-        String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
-        RLock stockLock = redissonClient.getLock(stockLockKey);
         boolean stockUnlockRegistered = false;
         try {
             lock.lock(60, TimeUnit.SECONDS);
-            stockLock.lock();
-            stockUnlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
             Date updateTime = new Date();
             // 构建创建订单的参数
             ShipTradeOrderCreateReqVO shipTradeOrderCreateReqVO = BeanUtils.toBean(createVO, ShipTradeOrderCreateReqVO.class);

+ 4 - 43
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/pay/impl/TradeOrderPayServiceImpl.java

@@ -132,37 +132,6 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
     @Resource
     private TradeOrderLogMapper tradeOrderLogMapper;
 
-    private boolean registerUnlockAfterTransaction(RLock lock, String lockKey) {
-        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
-            log.warn("当前无事务同步,航次锁将在 finally 中释放,lockKey:{}", lockKey);
-            return false;
-        }
-        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
-            @Override
-            public void afterCompletion(int status) {
-                log.info("订单事务完成,释放航次锁,lockKey:{},status:{}", lockKey, status);
-                unlockStockLock(lock, lockKey);
-            }
-        });
-        return true;
-    }
-
-    private void unlockStockLock(RLock lock, String lockKey) {
-        if (lock == null) {
-            return;
-        }
-        try {
-            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
-                lock.unlock();
-                log.info("航次锁释放完成,lockKey:{}", lockKey);
-            } else {
-                log.warn("跳过航次锁释放,当前线程未持有锁,lockKey:{}", lockKey);
-            }
-        } catch (Exception e) {
-            log.error("航次锁释放异常,lockKey:{}", lockKey, e);
-        }
-    }
-
     @Override
     public CommonResult<PayOrderRespVO> payOrder(PayOrderReqVO payOrderReqVO) {
         try {
@@ -573,19 +542,11 @@ public class TradeOrderPayServiceImpl implements TradeOrderPayService {
                     }
                 });
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
-                String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, reqDTO.getVoyageId());
-                RLock stockLock = redissonClient.getLock(stockLockKey);
-                boolean unlockRegistered = false;
-                try {
-                    stockLock.lock();
-                    unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                    if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
-                        voyageApi.preCancelReduceStock(reqDTO);
-                    } else {
-                        voyageApi.cancelReduceStock(reqDTO);
-                    }
-                } finally {
 
+                if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
+                    voyageApi.preCancelReduceStock(reqDTO);
+                } else {
+                    voyageApi.cancelReduceStock(reqDTO);
                 }
 
                 //添加订单日志

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

@@ -142,38 +142,6 @@ public class TradeRefundServiceImpl implements TradeRefundService {
     @Resource
     private RefundMapper refundMapper;
 
-    private boolean registerUnlockAfterTransaction(RLock lock, String lockKey) {
-        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
-            log.warn("当前无事务同步,航次锁将在 finally 中释放,lockKey:{}", lockKey);
-            return false;
-        }
-        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
-            @Override
-            public void afterCompletion(int status) {
-                log.info("订单事务完成,释放航次锁,lockKey:{},status:{}", lockKey, status);
-                unlockStockLock(lock, lockKey);
-            }
-        });
-        return true;
-    }
-
-    private void unlockStockLock(RLock lock, String lockKey) {
-        if (lock == null) {
-            return;
-        }
-        try {
-            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
-                lock.unlock();
-                log.info("航次锁释放完成,lockKey:{}", lockKey);
-            } else {
-                log.warn("跳过航次锁释放,当前线程未持有锁,lockKey:{}", lockKey);
-            }
-        } catch (Exception e) {
-            log.error("航次锁释放异常,lockKey:{}", lockKey, e);
-        }
-    }
-
-
     @Override
     public CommonResult<TradeRefundRespDTO> refund(TradeRefundCreateReqDTO refundCreateReqDTO) {
         String lockKey = String.format(UPDATE_ORDER_LOCK, refundCreateReqDTO.getOrderId());
@@ -354,16 +322,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
                 reqDTO.setUseRoomNum(BigDecimal.valueOf(tradeOrderTotal.getUseRoomTotalNum()));
                 List<OrderRoomUseDTO> orderRoomUseDTOList = tradeVisitorMapper.selectRefundRoomShipVisitor(tradeOrderDO.getId());
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
-                String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, reqDTO.getVoyageId());
-                RLock stockLock = redissonClient.getLock(stockLockKey);
-                boolean unlockRegistered = false;
-                try {
-                    stockLock.lock();
-                    unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                    voyageApi.cancelReduceStockNew(reqDTO);
-                } finally {
-
-                }
+                voyageApi.cancelReduceStockNew(reqDTO);
             } catch (Exception e) {
                 log.error("取消库存cancelReduceStock失败", e);
                 throw new RuntimeException("取消库存失败:" + e.getMessage(), e);
@@ -599,16 +558,7 @@ public class TradeRefundServiceImpl implements TradeRefundService {
                     }
                 });
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
-                String stockLockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, reqDTO.getVoyageId());
-                RLock stockLock = redissonClient.getLock(stockLockKey);
-                boolean unlockRegistered = false;
-                try {
-                    stockLock.lock();
-                    unlockRegistered = registerUnlockAfterTransaction(stockLock, stockLockKey);
-                    voyageApi.cancelReduceStock(reqDTO);
-                } finally {
-
-                }
+                voyageApi.cancelReduceStock(reqDTO);
             }
         } catch (ServiceException e) {
             e.printStackTrace();

+ 130 - 0
ship-server-web/src/test/java/com/yc/ship/RefundPayOrder.java

@@ -0,0 +1,130 @@
+package com.yc.ship;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.yc.ship.module.trade.framework.common.PayDigestUtil;
+import com.yc.ship.module.trade.framework.common.PayUtil;
+
+import java.net.URLEncoder;
+import java.util.Map;
+
+/**
+ * @author :qsl
+ * @description:TODO
+ * @date :2026/7/1 16:15
+ **/
+public class RefundPayOrder {
+
+    static final String mchId = "10000004";
+    /**
+     * 加签key
+     */
+    static final String reqKey = "M86l522AV6q613Ii4W6u8K48uW8vM1N6bFgyv769220MdYe9u37N4y7rI5mQ";
+    /**
+     * 验签key
+     */
+    static final String repKey = "Hpcl522AV6q613KIi46u6g6XuW8vM1N8bFgyv769770MdYe9u37M4y7rIpl8";
+
+    static final String baseUrl = "http://booking.vista-cruises.com/pay/api";
+
+    static final String notifyUrl = "http://booking.vista-cruises.com/ship-app-api/trade/payNotify"; // 本地环境测试,可到ngrok.cc网站注册
+    public static void main(String[] args) {
+        payOrderTest();  // 支付下单
+//        refundOrderTest();  // 退款创建退单
+        //quryRefundOrderTest(); //查询退单
+    }
+
+    static void payOrderTest() {
+        JSONObject paramMap = new JSONObject();
+        paramMap.put("mchId", mchId);                               // 商户ID
+        paramMap.put("mchOrderNo", "ZSHL"+System.currentTimeMillis());     // 商户订单号
+        paramMap.put("channelId", "ABC_JL_C2B");
+        paramMap.put("amount", 1);                                  // 支付金额,单位分
+        paramMap.put("currency", "cny");                            // 币种, cny-人民币
+        paramMap.put("clientIp", "127.0.0.1");                 // 用户地址,微信H5支付时要真实的
+        paramMap.put("device", "WEB");                              // 设备
+        paramMap.put("subject", "测试票,请勿购买");
+        paramMap.put("body", "测试票,请勿购买");
+        paramMap.put("notifyUrl", notifyUrl);                       // 回调URL
+        paramMap.put("returnUrl", "http://172.16.121.237:8100/");                       // 回调URL
+        paramMap.put("param1", "");                                 // 扩展参数1  1 微信 2 支付宝
+        paramMap.put("param2", "");                                 // 扩展参数1  1 微信 2 支付宝
+        paramMap.put("expireTime", "1800");                                 // 扩展参数2
+//        paramMap.put("payCode", "132857771924518653");    //付款码  用户被扫必传
+        paramMap.put("msgType", "");
+//        //附加参数
+        paramMap.put("extra", "{\"deviceType\":\"11\",\"secretText\":\"\",\"appVersion\":\"\",\"serialNum\":\"\",\"productId\":\"558873250097004544\",\"openId\":\"otZpM10ls6fycQU3rlclCTHzw8NM\",\"latitude\":\"16.1\",\"longitude\":\"16.1\"}");
+        String reqSign = PayDigestUtil.getSign(paramMap, reqKey);
+        paramMap.put("sign", reqSign);
+        // 签名
+        String reqData = "params=" + paramMap.toJSONString();
+        System.out.println("请求支付中心下单接口,请求数据:" + reqData);
+        long s1 = System.currentTimeMillis();
+        String url = baseUrl + "/pay/create_order?";
+        String result = PayUtil.call4Post(url + reqData);
+        System.out.println("请求支付中心下单接口,响应数据:" + result);
+        System.out.println("执行:"+(System.currentTimeMillis()-s1));
+    }
+
+    static void refundOrderTest() {
+        JSONObject paramMap = new JSONObject();
+        paramMap.put("mchId", mchId);                               // 商户ID
+        paramMap.put("mchRefundNo", "REFUND" + System.currentTimeMillis());     // 商户订单号
+        paramMap.put("channelId", "ABC_JL_C2B");
+        paramMap.put("currency", "cny");                            // 币种, cny-人民币
+        paramMap.put("clientIp", "127.0.0.1");                 // 用户地址,微信H5支付时要真实的
+        paramMap.put("device", "WEB");                              // 设备
+        paramMap.put("subject", "退款");
+        paramMap.put("body", "退款");
+        paramMap.put("notifyUrl", notifyUrl);                       // 回调URL
+        paramMap.put("param1", "");                                 // 扩展参数1
+        paramMap.put("param2", "");
+        paramMap.put("param4", "退款");
+        paramMap.put("amount", 	1); //单位分
+        // 退款金额
+        paramMap.put("channelUser", "oZbAa6hwbFOAG8k_yByGq3UXlcgk");  // 微信openId
+        paramMap.put("payOrderId","PDDY0020260104123816XXXX");
+
+        String reqSign = PayDigestUtil.getSign(paramMap, reqKey);
+        System.out.println("加密参数:"+paramMap+";reqKey="+reqKey);
+        System.out.println("sign="+reqSign);
+        paramMap.put("sign", reqSign);                              // 签名
+        String reqDataencode = "params=" + URLEncoder.encode(paramMap.toJSONString());
+        String reqData = "params=" + paramMap.toJSONString();
+        System.out.println("请求支付中心退款接口,请求数据:" + reqData);
+        String url = baseUrl + "/refund/create_order?";
+        String result = PayUtil.call4Post(url + reqDataencode);
+        System.out.println("请求支付中心退款接口,响应数据:" + result);
+        Map retMap = JSON.parseObject(result);
+        if("SUCCESS".equals(retMap.get("retCode")) && "SUCCESS".equalsIgnoreCase(retMap.get("resCode").toString())) {
+            // 验签
+            System.out.println(retMap);
+            String checkSign = PayDigestUtil.getSign(retMap, repKey, "sign", "payParams");
+            String retSign = (String) retMap.get("sign");
+            if(checkSign.equals(retSign)) {
+                System.out.println("=========支付中心退款验签成功=========");
+            }else {
+                System.err.println("=========支付中心退款验签失败=========");
+            }
+        }
+    }
+
+    static void quryRefundOrderTest() {
+        JSONObject paramMap = new JSONObject();
+        paramMap.put("mchId", mchId);                               // 商户ID
+        paramMap.put("mchOrderNo", "8739585736883499008");                     // 商户订单号
+        paramMap.put("refundOrderId", "RDY002026050418170608");                     // 支付订单号
+        paramMap.put("executeNotify", "false");                      // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统
+        paramMap.put("channelId", "ABC_JL_C2B");                      // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统
+        paramMap.put("param1", "");                      // 是否执行回调,true或false,如果为true当订单状态为支付成功(2)时,支付中心会再次回调一次业务系统
+
+        String reqSign = PayDigestUtil.getSign(paramMap, reqKey);
+        paramMap.put("sign", reqSign);                              // 签名
+        String reqData = "params=" + paramMap.toJSONString();
+        String url = baseUrl + "/query/refund?";
+        String result = PayUtil.call4Post(url + reqData);
+        System.out.println("请求支付中心退单查询接口,响应数据:" + result);
+
+    }
+
+}