Jelajahi Sumber

fix: 退回把库存锁添加到订单层去

luofeiyun 1 Minggu lalu
induk
melakukan
49085f5e8c

+ 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);
         }
     }
 

+ 36 - 101
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,36 +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 {
-                if (unlockRegistered) {
-                    unlockStockLock(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);
         } catch (ServiceException e) {
             ExceptionUtils.log(log, "下单失败:", e);
             handleAfterOrderCreateFail(e.getCode(), tradeOrderBO);
@@ -385,45 +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 {
-                if (unlockRegistered) {
-                    unlockStockLock(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);
         } catch (ServiceException e) {
             try {
                 ExceptionUtils.log(log, "订单修改失败:", e);

+ 20 - 95
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
@@ -662,23 +625,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 {
-                    if (unlockRegistered) {
-                        unlockStockLock(stockLock, stockLockKey);
-                    }
+
+                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<>();
@@ -1538,25 +1491,14 @@ 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 {
-                if (unlockRegistered) {
-                    unlockStockLock(stockLock, stockLockKey);
-                }
-            }
 
+            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", "审核撤回");
@@ -2426,14 +2368,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();
@@ -2702,9 +2638,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             if (lock.isHeldByCurrentThread() && lock.isLocked()) {
                 lock.unlock();
             }
-            if (!stockUnlockRegistered) {
-                unlockStockLock(stockLock, stockLockKey);
-            }
         }
     }
 
@@ -2787,14 +2720,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);
@@ -3219,9 +3147,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             if (lock.isHeldByCurrentThread() && lock.isLocked()) {
                 lock.unlock();
             }
-            if (!stockUnlockRegistered) {
-                unlockStockLock(stockLock, stockLockKey);
-            }
         }
     }
 

+ 5 - 46
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,21 +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 (unlockRegistered) {
-                        unlockStockLock(stockLock, stockLockKey);
-                    }
+
+                if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
+                    voyageApi.preCancelReduceStock(reqDTO);
+                } else {
+                    voyageApi.cancelReduceStock(reqDTO);
                 }
 
                 //添加订单日志

+ 2 - 56
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,18 +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 {
-                    if (unlockRegistered) {
-                        unlockStockLock(stockLock, stockLockKey);
-                    }
-                }
+                voyageApi.cancelReduceStockNew(reqDTO);
             } catch (Exception e) {
                 log.error("取消库存cancelReduceStock失败", e);
                 throw new RuntimeException("取消库存失败:" + e.getMessage(), e);
@@ -601,18 +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 {
-                    if (unlockRegistered) {
-                        unlockStockLock(stockLock, stockLockKey);
-                    }
-                }
+                voyageApi.cancelReduceStock(reqDTO);
             }
         } catch (ServiceException e) {
             e.printStackTrace();