Przeglądaj źródła

库存扣减优化

lishiqiang 2 tygodni temu
rodzic
commit
04a22b7b01

+ 3 - 1
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/api/dto/ReduceStockReqDTO.java

@@ -11,13 +11,14 @@ import java.util.List;
 public class ReduceStockReqDTO {
 
     @Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
-    private Long OrderId;
+    private Long orderId;
 
     @Schema(description = "旧订单ID,用于还库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long oldOrderId;
 
     @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer orderStatus;
+    private Integer oldOrderStatus;
 
     @Schema(description = "航次ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long voyageId;
@@ -36,5 +37,6 @@ public class ReduceStockReqDTO {
 
     @Schema(description = "订单使用房间列表")
     List<OrderRoomUseDTO> orderRoomList;
+    List<OrderRoomUseDTO> oldOrderRoomList;
 
 }

+ 102 - 83
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -2,7 +2,7 @@ package com.yc.ship.module.product.api;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.yc.ship.framework.common.exception.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.common.util.object.BeanUtils;
 import com.yc.ship.module.product.api.dto.OrderRoomUseDTO;
@@ -27,11 +27,12 @@ import com.yc.ship.module.product.enums.YesOrNoEnum;
 import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
 import com.yc.ship.module.product.service.voyagestockdistribute.VoyageStockDistributeNewService;
 import com.yc.ship.module.product.utils.ProductRedisUtils;
-import com.yc.ship.module.resource.api.room.RoomApi;
+import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
@@ -48,6 +49,9 @@ import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.e
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception0;
 import static com.yc.ship.module.product.enums.ErrorCodeConstants.*;
 
+/**
+ * @author qsl
+ */
 @Service
 @Slf4j
 public class VoyageApiImpl implements VoyageApi {
@@ -64,9 +68,6 @@ public class VoyageApiImpl implements VoyageApi {
     @Resource
     private VoyageStockDistributeNewService voyageStockDistributeNewService;
 
-    @Resource
-    private RoomApi roomApi;
-
     @Resource
     private RedissonClient redissonClient;
 
@@ -83,10 +84,10 @@ public class VoyageApiImpl implements VoyageApi {
     private VoyageStockDetailLogMapper voyageStockDetailLogMapper;
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void preReduceStock(ReduceStockReqDTO reqDTO) {
         //TODO: 当前阶段不考虑门店库存
-        log.info("开始初定订单扣库存:订单ID:"+reqDTO.getOrderId()+"old订单ID:"+reqDTO.getOldOrderId());
+        log.info("开始初定订单扣库存:订单ID:{}old订单ID:{}", reqDTO.getOrderId(), reqDTO.getOldOrderId());
 
         Long voyageId = reqDTO.getVoyageId();
         //现在给整个航次的库存加锁
@@ -102,29 +103,23 @@ public class VoyageApiImpl implements VoyageApi {
                 //初定扣分销商库存
                 //先返还初定扣的库存,使用修改前一步订单的 ID
                 preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType());
-                log.info("先还该订单的库存-orderId: "+reqDTO.getOrderId());
-                if(reqDTO.getOldOrderId() != null && reqDTO.getOldOrderId() != reqDTO.getOrderId()) {
-                    log.info("如果是修改就还修改前的订单的库存-oldOrderId: "+reqDTO.getOldOrderId());
+                log.info("先还该订单的库存-orderId: {}", reqDTO.getOrderId());
+                if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
+                    log.info("如果是修改就还修改前的订单的库存-oldOrderId: {}", reqDTO.getOldOrderId());
                     preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType());
                 }
                 //再去扣初定的库存
                 preReduceStockDistributor(reqDTO);
             }
-        } catch (ServiceException e) {
-            throw exception0(e.getCode(), e.getMessage());
         } finally {
-            try {
-                if (lock.isHeldByCurrentThread() && lock.isLocked()) {
-                    lock.unlock();
-                }
-            } catch (Exception e) {
-                log.error("释放锁异常", e);
+            if (lock.isHeldByCurrentThread() && lock.isLocked()) {
+                lock.unlock();
             }
         }
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void preCancelReduceStock(ReduceStockReqDTO reqDTO) {
         //TODO: 当前阶段不考虑门店库存
 
@@ -134,12 +129,14 @@ public class VoyageApiImpl implements VoyageApi {
         RLock lock = redissonClient.getLock(lockKey);
         try {
             lock.lock(60, TimeUnit.SECONDS);
-            Integer type = reqDTO.getType();//判断是分销商还是门店下单 1:分销商,2:门店
-            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {//分销商下单,当前阶段不考虑门店下单
+            //判断是分销商还是门店下单 1:分销商,2:门店
+            Integer type = reqDTO.getType();
+            //分销商下单,当前阶段不考虑门店下单
+            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
                 preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType());
-                if(reqDTO.getOldOrderId() != null && reqDTO.getOldOrderId() != reqDTO.getOrderId()) {
+                if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
                     preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType());
                 }
             }
@@ -151,7 +148,7 @@ public class VoyageApiImpl implements VoyageApi {
     }
 
     @Override
-    @Transactional
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void reduceStock(ReduceStockReqDTO reqDTO) {
         //TODO: 当前阶段不考虑门店库存
 
@@ -161,22 +158,27 @@ public class VoyageApiImpl implements VoyageApi {
         RLock lock = redissonClient.getLock(lockKey);
         try {
             lock.lock(60, TimeUnit.SECONDS);
-            Integer type = reqDTO.getType();//判断是分销商还是门店下单 1:分销商,2:门店
-            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {//分销商下单,当前阶段不考虑门店下单
+            //判断是分销商还是门店下单 1:分销商,2:门店
+            Integer type = reqDTO.getType();
+            //分销商下单,当前阶段不考虑门店下单
+            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
                 //先返还初定扣的库存
                 preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType());
-                if(reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
+                if (reqDTO.getOldOrderStatus() != null && reqDTO.getOldOrderStatus().equals(TradeOrderStatusEnum.YD.getStatus()) &&reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
                     preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType());
                 }
+                if(reqDTO.getOldOrderStatus() != null && (Objects.equals(reqDTO.getOldOrderStatus(), TradeOrderStatusEnum.UNPAID.getStatus())||Objects.equals(reqDTO.getOldOrderStatus(), TradeOrderStatusEnum.YD.getStatus()))){
+                    cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType());
+                }
                 //再去扣确定的库存
                 reduceStockDistributor(reqDTO);
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             throw e;
-        }finally {
+        } finally {
             if (lock.isHeldByCurrentThread() && lock.isLocked()) {
                 lock.unlock();
             }
@@ -185,7 +187,7 @@ public class VoyageApiImpl implements VoyageApi {
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
     public void cancelReduceStock(ReduceStockReqDTO reqDTO) {
         //TODO: 当前阶段不考虑门店库存
         Long voyageId = reqDTO.getVoyageId();
@@ -194,12 +196,14 @@ public class VoyageApiImpl implements VoyageApi {
         RLock lock = redissonClient.getLock(lockKey);
         try {
             lock.lock(60, TimeUnit.SECONDS);
-            Integer type = reqDTO.getType();//判断是分销商还是门店下单 1:分销商,2:门店
-            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {//分销商下单,当前阶段不考虑门店下单
+            //判断是分销商还是门店下单 1:分销商,2:门店
+            Integer type = reqDTO.getType();
+            //分销商下单,当前阶段不考虑门店下单
+            if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
                 cancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType());
-                if(reqDTO.getOldOrderId() != null && reqDTO.getOldOrderId() != reqDTO.getOrderId()) {
+                if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
                     cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType());
                 }
             }
@@ -214,7 +218,7 @@ public class VoyageApiImpl implements VoyageApi {
      * 确定状态时取消订单还库存
      */
     private void cancelReduceStockDistributor(Long orderId, Integer type) {
-        if(orderId == null) {
+        if (orderId == null) {
             return;
         }
         //退还航次总库存
@@ -228,14 +232,20 @@ public class VoyageApiImpl implements VoyageApi {
             VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId);
             //还航次总库存
             BigDecimal totalNum = voyageStockLogDO.getVirtualNum().add(voyageStockLogDO.getRealNum());
-            if(voyageStockLogDO.getStockType() != null && voyageStockLogDO.getStockType() == 1) {
-                stockDO.setShareNum(stockDO.getShareNum().add(voyageStockLogDO.getShareNum())); //退回共享库存
+            if (voyageStockLogDO.getStockType() != null && voyageStockLogDO.getStockType() == 1) {
+                //退回共享库存
+                stockDO.setShareNum(stockDO.getShareNum().add(voyageStockLogDO.getShareNum()));
             }
-            stockDO.setVirtualNum(stockDO.getVirtualNum().add(voyageStockLogDO.getVirtualNum())); //退回虚拟库存
-            stockDO.setRealTotalNum(stockDO.getRealTotalNum().add(voyageStockLogDO.getRealNum())); //退回真实库存
-            stockDO.setCanSellNum(stockDO.getCanSellNum().add(totalNum)); //退回可售库存
-            stockDO.setBookNum(stockDO.getBookNum().subtract(totalNum)); // 减去已预订数量
-            voyageStockMapper.updateById(stockDO);//更新航次总库存
+            //退回虚拟库存
+            stockDO.setVirtualNum(stockDO.getVirtualNum().add(voyageStockLogDO.getVirtualNum()));
+            //退回真实库存
+            stockDO.setRealTotalNum(stockDO.getRealTotalNum().add(voyageStockLogDO.getRealNum()));
+            //退回可售库存
+            stockDO.setCanSellNum(stockDO.getCanSellNum().add(totalNum));
+            // 减去已预订数量
+            stockDO.setBookNum(stockDO.getBookNum().subtract(totalNum));
+            //更新航次总库存
+            voyageStockMapper.updateById(stockDO);
             productRedisUtils.set(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, stockDO);
             //删除航次库存操作记录
             voyageStockLogMapper.deleteById(voyageStockLogDO);
@@ -252,7 +262,7 @@ public class VoyageApiImpl implements VoyageApi {
             //退还航次库存详情
             List<VoyageStockDetailDO> stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
             Map<String, BigDecimal> realNumMap = CollectionUtils.convertMap(detailLogList, item -> item.getRoomModelId() + "_" + item.getFloor(), VoyageStockDetailLogDO::getRealNum);
-            Map<String, BigDecimal> VirtualNumMap = CollectionUtils.convertMap(detailLogList, item -> item.getRoomModelId() + "_" + item.getFloor(), VoyageStockDetailLogDO::getVirtualNum);
+            Map<String, BigDecimal> virtualNumMap = CollectionUtils.convertMap(detailLogList, item -> item.getRoomModelId() + "_" + item.getFloor(), VoyageStockDetailLogDO::getVirtualNum);
 //            Map<String, BigDecimal> shareNumMap = CollectionUtils.convertMap(detailLogList, item -> item.getRoomModelId() + "_" + item.getFloor(), VoyageStockDetailLogDO::getShareNum);
             Map<String, BigDecimal> totalNumMap = CollectionUtils.convertMap(detailLogList, item -> item.getRoomModelId() + "_" + item.getFloor(), item -> item.getRealNum().add(item.getVirtualNum()));
 
@@ -261,8 +271,8 @@ public class VoyageApiImpl implements VoyageApi {
                 item.setBookNum(item.getBookNum().subtract(totalNumMap.get(key)));
                 item.setCanSellNum(item.getCanSellNum().add(totalNumMap.get(key)));
                 item.setRealTotalNum(item.getRealTotalNum().add(realNumMap.get(key)));
-                item.setVirtualNum(item.getVirtualNum().add(VirtualNumMap.get(key)));
-                if(stockType == 1) {//使用的是共享库存,才退回共享库存
+                item.setVirtualNum(item.getVirtualNum().add(virtualNumMap.get(key)));
+                if (stockType == 1) {//使用的是共享库存,才退回共享库存
                     item.setShareNum(item.getShareNum().add(totalNumMap.get(key)));
                 }
             });
@@ -277,8 +287,8 @@ public class VoyageApiImpl implements VoyageApi {
                 detailReqVO.setVoyageId(voyageId);
                 detailReqVO.setType(type);
                 detailReqVO.setObjectId(distributorId);
-                List<VoyageStockDistributeNewRespVO> distributeNewRespVOS = voyageStockDistributeNewService.getDetail(detailReqVO);
-                List<VoyageStockDistributeNewDO> list = BeanUtils.toBean(distributeNewRespVOS, VoyageStockDistributeNewDO.class);
+                List<VoyageStockDistributeNewRespVO> distributeNewResp = voyageStockDistributeNewService.getDetail(detailReqVO);
+                List<VoyageStockDistributeNewDO> list = BeanUtils.toBean(distributeNewResp, VoyageStockDistributeNewDO.class);
                 if (list != null && !list.isEmpty()) {
                     list.forEach(item -> {
                         String key = item.getRoomModelId() + "_" + item.getFloor();
@@ -286,7 +296,7 @@ public class VoyageApiImpl implements VoyageApi {
                         item.setBookNum(item.getBookNum() == null ? BigDecimal.ZERO : item.getBookNum().subtract(totalNumMap.get(key)));
                     });
                     voyageStockDistributeNewMapper.updateBatch(list);
-                    productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId+"_"+distributorId, list);
+                    productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, list);
                 }
             }
             // 删除库存详情初定记录
@@ -297,7 +307,6 @@ public class VoyageApiImpl implements VoyageApi {
 
     /**
      * 确定时扣库存,有限扣实际库存,不足再扣虚拟库存
-     *
      */
     private void reduceStockDistributor(ReduceStockReqDTO reqDTO) {
         //航次库存操作日志
@@ -306,15 +315,20 @@ public class VoyageApiImpl implements VoyageApi {
         List<VoyageStockDetailLogDO> detailLogList = new ArrayList<>();
 
         Integer type = reqDTO.getType();
-        Long voyageId = reqDTO.getVoyageId(); //航次ID
-        Long distributorId = reqDTO.getDistributorId(); //分销商ID
-        Long storeId = reqDTO.getStoreId(); //门店ID
-        BigDecimal totalUseNum = reqDTO.getUseRoomNum(); //总共使用房间数量
+        //航次ID
+        Long voyageId = reqDTO.getVoyageId();
+        //分销商ID
+        Long distributorId = reqDTO.getDistributorId();
+        //门店ID
+        Long storeId = reqDTO.getStoreId();
+        //总共使用房间数量
+        BigDecimal totalUseNum = reqDTO.getUseRoomNum();
         Long orderId = reqDTO.getOrderId();
         Integer orderStatus = reqDTO.getOrderStatus();
 
         voyageStockLogDO.setVoyageId(voyageId);
-        voyageStockLogDO.setType(2);//标识减少
+        //标识减少
+        voyageStockLogDO.setType(2);
         voyageStockLogDO.setOrderId(orderId);
         voyageStockLogDO.setOrderStatus(orderStatus);
         voyageStockLogDO.setOperateType(VoyageStockLogTypeEnum.ORDER_SUB.getValue());
@@ -322,19 +336,20 @@ public class VoyageApiImpl implements VoyageApi {
         voyageStockLogDO.setStoreId(storeId);
         // 获取航次总库存
         VoyageStockDO stockDO = productRedisUtils.get(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, VoyageStockDO.class, 1);
-        if(stockDO == null) {
+        if (stockDO == null) {
             stockDO = voyageStockMapper.selectById(voyageId);
         }
         if (stockDO == null) {
             throw exception(VOYAGE_NO_STOCK);
         }
+        voyageStockLogDO.setTenantId(stockDO.getTenantId());
         //共享库存
         BigDecimal shareNum = stockDO.getShareNum();
 
         //航次库存详情
         //航次库存详情
         List<VoyageStockDetailDO> stockDetailList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, VoyageStockDetailDO.class, 1);
-        if(CollectionUtils.isAnyEmpty(stockDetailList)) {
+        if (CollectionUtils.isAnyEmpty(stockDetailList)) {
             stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
         }
         //判断分销商库存是否存在
@@ -344,8 +359,8 @@ public class VoyageApiImpl implements VoyageApi {
         detailReqVO.setObjectId(distributorId);
         //先获取非共享库存(分销商库存)
         detailReqVO.setEnableShare(YesOrNoEnum.NO.getType());
-        List<VoyageStockDistributeNewRespVO> distributeNewResps = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId+"_"+distributorId, VoyageStockDistributeNewRespVO.class, 1);
-        if(CollectionUtils.isAnyEmpty(distributeNewResps)) {
+        List<VoyageStockDistributeNewRespVO> distributeNewResps = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, VoyageStockDistributeNewRespVO.class, 1);
+        if (CollectionUtils.isAnyEmpty(distributeNewResps)) {
             distributeNewResps = voyageStockDistributeNewService.getDetail(detailReqVO);
         }
         //订单使用房间详情
@@ -353,7 +368,8 @@ public class VoyageApiImpl implements VoyageApi {
         Map<String, BigDecimal> roomModelFloorNumMap = orderRoomList.stream()
                 .collect(Collectors.groupingBy(
                         OrderRoomUseDTO::getKey,
-                        Collectors.mapping(OrderRoomUseDTO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)) // 直接使用BigDecimal的reduce操作进行求和
+                        // 直接使用BigDecimal的reduce操作进行求和
+                        Collectors.mapping(OrderRoomUseDTO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
                 ));
         //分销商未分配库存,扣共享库存
         if (CollectionUtils.isAnyEmpty(distributeNewResps)) {
@@ -372,7 +388,7 @@ public class VoyageApiImpl implements VoyageApi {
                     useNum = BigDecimal.ZERO;
                 }
                 if (detailShareNum.compareTo(useNum) < 0) {
-                    log.error(String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), detailShareNum, useNum));
+                    log.error("{}", String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), detailShareNum, useNum));
                     throw exception0(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getCode(), String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), detailShareNum, useNum));
                 }
             });
@@ -459,7 +475,7 @@ public class VoyageApiImpl implements VoyageApi {
                     useNum = BigDecimal.ZERO;
                 }
                 if (canSellNum.compareTo(useNum) < 0) {
-                    log.error(String.format(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), canSellNum, useNum));
+                    log.error("{}", String.format(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), canSellNum, useNum));
                     throw exception0(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getCode(), String.format(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), canSellNum, useNum));
                 }
             });
@@ -588,15 +604,15 @@ public class VoyageApiImpl implements VoyageApi {
      * 初定取消还分销商库存
      */
     private void preCancelReduceStockDistributor(Long orderId, Integer type) {
-        if(orderId == null) {
+        if (orderId == null) {
             return;
         }
         //退还航次总库存
         //找到初定时扣库存的记录
         VoyageStockLogDO voyageStockLogDO = voyageStockLogMapper.selectByOrder(orderId);
-        log.info("进入初定还库存操作-orderId:"+orderId);
+        log.info("进入初定还库存操作-orderId:{}", orderId);
         if (voyageStockLogDO != null) {
-            log.info("进入初定还总库存操作-voyageStockLogDO:"+ JSONObject.toJSONString(voyageStockLogDO));
+            log.info("进入初定还总库存操作-voyageStockLogDO:{}", JSONObject.toJSONString(voyageStockLogDO));
             //删除已使用房间记录
             voyageStockRoomUsedMapper.deleteByOrderId(orderId);
             Long voyageId = voyageStockLogDO.getVoyageId();
@@ -605,7 +621,7 @@ public class VoyageApiImpl implements VoyageApi {
             //还航次总库存
             BigDecimal totalNum = voyageStockLogDO.getVirtualNum().add(voyageStockLogDO.getRealNum());
             //退回共享库存
-            if(voyageStockLogDO.getStockType() != null && voyageStockLogDO.getStockType() == 1) {
+            if (voyageStockLogDO.getStockType() != null && voyageStockLogDO.getStockType() == 1) {
                 stockDO.setShareNum(stockDO.getShareNum().add(voyageStockLogDO.getShareNum()));
             }
             //退回虚拟库存
@@ -622,19 +638,19 @@ public class VoyageApiImpl implements VoyageApi {
             //删除航次库存操作记录
             voyageStockLogMapper.deleteById(voyageStockLogDO);
         } else {
-            log.error("订单取消时,未找到对应的航次库存操作记录,订单ID:{}", orderId);
+            log.error("订单取消时1,未找到对应的航次库存操作记录,订单ID:{}", orderId);
             return;
         }
         Long voyageId = voyageStockLogDO.getVoyageId();
         Long distributorId = voyageStockLogDO.getDistributorId();
         //找到初定时扣库存详情的记录
         List<VoyageStockDetailLogDO> detailLogList = voyageStockDetailLogMapper.selectListByOrder(orderId);
-        if(detailLogList.isEmpty()){
+        if (detailLogList.isEmpty()) {
             log.error("订单取消时,未找到对应的航次库存详情操作记录,订单ID:{}", orderId);
             return;
         }
         Integer stockType = detailLogList.get(0).getStockType();
-        log.info("进入初定还库存详情操作,使用库存的记录-detailLogList:" + JSONArray.toJSONString(detailLogList));
+        log.info("进入初定还库存详情操作,使用库存的记录-detailLogList:{}", JSONArray.toJSONString(detailLogList));
         //退还航次库存详情
         List<VoyageStockDetailDO> stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
         Map<String, BigDecimal> realNumMap = CollectionUtils.convertMap(detailLogList, item -> item.getRoomModelId() + "_" + item.getFloor(), VoyageStockDetailLogDO::getRealNum);
@@ -648,7 +664,8 @@ public class VoyageApiImpl implements VoyageApi {
             item.setCanSellNum(item.getCanSellNum().add(totalNumMap.get(key)));
             item.setRealTotalNum(item.getRealTotalNum().add(realNumMap.get(key)));
             item.setVirtualNum(item.getVirtualNum().add(virtualNumMap.get(key)));
-            if(stockType == 1) {//共享库存要还回库存详情
+            if (stockType == 1) {
+                //共享库存要还回库存详情
                 item.setShareNum(item.getShareNum().add(totalNumMap.get(key)));
             }
         });
@@ -669,21 +686,21 @@ public class VoyageApiImpl implements VoyageApi {
             if (list != null && !list.isEmpty()) {
                 list.forEach(item -> {
                     String key = item.getRoomModelId() + "_" + item.getFloor();
-                    if(item.getBookNum()==null){
+                    if (item.getBookNum() == null) {
                         item.setBookNum(BigDecimal.ZERO);
                     }
-                    if(item.getNum()==null){
+                    if (item.getNum() == null) {
                         item.setNum(BigDecimal.ZERO);
                     }
                     item.setNum(item.getNum().add(totalNumMap.get(key)));
                     item.setBookNum(item.getBookNum().subtract(totalNumMap.get(key)));
-                    if(item.getBookNum().compareTo(BigDecimal.ZERO)<0){
+                    if (item.getBookNum().compareTo(BigDecimal.ZERO) < 0) {
                         item.setBookNum(BigDecimal.ZERO);
                     }
                 });
                 log.info("进入初定还分销商库存详情操作,分销商库存还之后详情-distributeNewRespList:{}", JSONArray.toJSONString(distributeNewRespList));
                 voyageStockDistributeNewMapper.updateBatch(list);
-                productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" +distributorId, list);
+                productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, list);
             }
         }
         // 删除库存详情初定记录
@@ -694,10 +711,9 @@ public class VoyageApiImpl implements VoyageApi {
 
     /**
      * 初定扣分销商库存
-     *
      */
     private void preReduceStockDistributor(ReduceStockReqDTO reqDTO) {
-        log.info("进入初定扣库存操作-orderId:"+reqDTO.getOrderId());
+        log.info("进入初定扣库存操作-orderId:{}", reqDTO.getOrderId());
         //航次库存操作日志
         VoyageStockLogDO voyageStockLogDO = new VoyageStockLogDO();
         //航次库存详情操作日志
@@ -725,7 +741,7 @@ public class VoyageApiImpl implements VoyageApi {
         voyageStockLogDO.setStoreId(storeId);
         // 获取航次总库存
         VoyageStockDO stockDO = productRedisUtils.get(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, VoyageStockDO.class, 1);
-        if(stockDO == null) {
+        if (stockDO == null) {
             stockDO = voyageStockMapper.selectById(voyageId);
         }
         if (stockDO == null) {
@@ -736,7 +752,7 @@ public class VoyageApiImpl implements VoyageApi {
 
         //航次库存详情
         List<VoyageStockDetailDO> stockDetailList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, VoyageStockDetailDO.class, 1);
-        if(CollectionUtils.isAnyEmpty(stockDetailList)) {
+        if (CollectionUtils.isAnyEmpty(stockDetailList)) {
             stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
         }
         //判断分销商库存是否存在
@@ -746,8 +762,8 @@ public class VoyageApiImpl implements VoyageApi {
         detailReqVO.setObjectId(distributorId);
         //先获取非共享库存(分销商库存)
         detailReqVO.setEnableShare(YesOrNoEnum.NO.getType());
-        List<VoyageStockDistributeNewRespVO> distributeNewRespList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId+"_"+distributorId, VoyageStockDistributeNewRespVO.class, 1);
-        if(CollectionUtils.isAnyEmpty(distributeNewRespList)) {
+        List<VoyageStockDistributeNewRespVO> distributeNewRespList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, VoyageStockDistributeNewRespVO.class, 1);
+        if (CollectionUtils.isAnyEmpty(distributeNewRespList)) {
             distributeNewRespList = voyageStockDistributeNewService.getDetail(detailReqVO);
         }
         //订单使用房间详情
@@ -777,7 +793,7 @@ public class VoyageApiImpl implements VoyageApi {
                     useNum = BigDecimal.ZERO;
                 }
                 if (detailShareNum.compareTo(useNum) < 0) {
-                    log.error(String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), detailShareNum, useNum));
+                    log.error("{}", String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), detailShareNum, useNum));
                     throw exception0(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getCode(), String.format(VOYAGE_SHARE_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), detailShareNum, useNum));
                 }
             });
@@ -790,7 +806,8 @@ public class VoyageApiImpl implements VoyageApi {
                 //航次库存详情操作日志
                 VoyageStockDetailLogDO voyageStockDetailLogDO = new VoyageStockDetailLogDO();
                 voyageStockDetailLogDO.setVoyageId(voyageId);
-                voyageStockDetailLogDO.setType(2);//标识减少
+                //标识减少
+                voyageStockDetailLogDO.setType(2);
                 voyageStockDetailLogDO.setOrderId(orderId);
                 voyageStockDetailLogDO.setOrderStatus(orderStatus);
                 voyageStockDetailLogDO.setOperateType(VoyageStockLogTypeEnum.ORDER_PRE_SUB.getValue());
@@ -798,7 +815,8 @@ public class VoyageApiImpl implements VoyageApi {
                 voyageStockDetailLogDO.setFloor(item.getFloor());
                 voyageStockDetailLogDO.setDistributorId(distributorId);
                 voyageStockDetailLogDO.setStoreId(storeId);
-                voyageStockDetailLogDO.setStockType(1); //1共享库存
+                //1共享库存
+                voyageStockDetailLogDO.setStockType(1);
 
 
                 // 减可售房间数
@@ -863,7 +881,7 @@ public class VoyageApiImpl implements VoyageApi {
                     useNum = BigDecimal.ZERO;
                 }
                 if (canSellNum.compareTo(useNum) < 0) {
-                    log.error(String.format(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), canSellNum, useNum));
+                    log.error("{}", String.format(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), canSellNum, useNum));
                     throw exception0(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getCode(), String.format(VOYAGE_DISTRIBUTOR_ROOM_NOT_ENOUGH.getMsg(), item.getRoomModelName(), item.getFloor(), canSellNum, useNum));
                 }
             });
@@ -905,7 +923,8 @@ public class VoyageApiImpl implements VoyageApi {
                 voyageStockDetailLogDO.setFloor(item.getFloor());
                 voyageStockDetailLogDO.setDistributorId(distributorId);
                 voyageStockDetailLogDO.setStoreId(storeId);
-                voyageStockDetailLogDO.setStockType(2); //2分销商库存
+                //2分销商库存
+                voyageStockDetailLogDO.setStockType(2);
 
                 // 减可售房间数
                 item.setCanSellNum(item.getCanSellNum().subtract(useNum));
@@ -979,7 +998,7 @@ public class VoyageApiImpl implements VoyageApi {
         if (!roomUsedList.isEmpty()) {
             voyageStockRoomUsedMapper.insertBatch(roomUsedList);
         }
-
+        voyageStockLogDO.setTenantId(stockDO.getTenantId());
         // 添加库存日志
         voyageStockLogMapper.insert(voyageStockLogDO);
         // 添加库存详情日志

+ 2 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockLogMapper.java

@@ -2,6 +2,7 @@ package com.yc.ship.module.product.dal.mysql.voyagestock;
 
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockLogDO;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -13,6 +14,7 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface VoyageStockLogMapper extends BaseMapperX<VoyageStockLogDO> {
 
+    @TenantIgnore
     default VoyageStockLogDO selectByOrder(Long orderId) {
         return selectOne( new LambdaQueryWrapperX<VoyageStockLogDO>().eq(VoyageStockLogDO::getOrderId, orderId)
                 .last("limit 1"));

+ 6 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockMapper.java

@@ -6,6 +6,7 @@ import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.query.MPJLambdaWrapperX;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.product.dal.dataobject.productBase.ProductBaseDO;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
@@ -22,6 +23,7 @@ import org.apache.ibatis.annotations.Select;
 @Mapper
 public interface VoyageStockMapper extends BaseMapperX<VoyageStockDO> {
 
+    @TenantIgnore
     default PageResult<VoyageStockDO> selectPage(VoyageStockPageReqVO reqVO) {
         /*return selectPage(reqVO, new LambdaQueryWrapperX<VoyageStockDO>()
                 .likeIfPresent(VoyageStockDO::getVoyageName, reqVO.getVoyageName())
@@ -40,6 +42,7 @@ public interface VoyageStockMapper extends BaseMapperX<VoyageStockDO> {
         return selectJoinPage(reqVO, VoyageStockDO.class, wrapperX);
     }
 
+    @TenantIgnore
     default void deleteByVoyageId(Long id) {
         delete(new LambdaQueryWrapperX<VoyageStockDO>().eq(VoyageStockDO::getVoyageId, id));
     }
@@ -50,12 +53,15 @@ public interface VoyageStockMapper extends BaseMapperX<VoyageStockDO> {
      * @return
      */
     @Select("select voyage_id from product_voyage_stock where deleted = 0 and voyage_id not in (select voyage_id from product_voyage_stock where shelfed_num <> 0 and ship_id = ${shipId})")
+    @TenantIgnore
     List<Long> selectNoShelfdNumVoyageIdsByShipId(@Param("shipId") Long shipId);
     /**
      * 获取未上架过库存的航次ID
      * @return
      */
+    @TenantIgnore
     List<Long> selectNoShelfdNumVoyageIdsByVoyageIds(@Param("shipId") Long shipId, @Param("voyageIds") List<Long> voyageIds);
 
+    @TenantIgnore
     VoyageStockTotalVO selectTotal(@Param("pageReqVO") VoyageStockPageReqVO pageReqVO);
 }

+ 4 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestockdetail/VoyageStockDetailMapper.java

@@ -2,6 +2,7 @@ package com.yc.ship.module.product.dal.mysql.voyagestockdetail;
 
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -16,6 +17,7 @@ import java.util.List;
 public interface VoyageStockDetailMapper extends BaseMapperX<VoyageStockDetailDO> {
 
 
+    @TenantIgnore
     default List<VoyageStockDetailDO> selectListByVoyageId(Long voyageId) {
         return selectList(new LambdaQueryWrapperX<VoyageStockDetailDO>()
                 .eq(VoyageStockDetailDO::getVoyageId, voyageId)
@@ -23,11 +25,13 @@ public interface VoyageStockDetailMapper extends BaseMapperX<VoyageStockDetailDO
                 .orderByAsc(VoyageStockDetailDO::getFloor));
     }
 
+    @TenantIgnore
     default void deleteByVoyageId(Long voyageId) {
         delete(new LambdaQueryWrapperX<VoyageStockDetailDO>()
                 .eq(VoyageStockDetailDO::getVoyageId, voyageId));
     }
 
+    @TenantIgnore
     default void deleteByVoyageIds(List<Long> voyageIds) {
         delete(new LambdaQueryWrapperX<VoyageStockDetailDO>()
                 .in(VoyageStockDetailDO::getVoyageId, voyageIds));

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

@@ -44,6 +44,9 @@ public interface TradeVisitorMapper extends BaseMapperX<TradeVisitorDO> {
     List<TradeVisitorDO> selectShipVisitor(@Param("orderId") Long orderId);
     List<OrderRoomUseDTO> selectRoomShipVisitor(@Param("orderId") Long orderId);
 
+    @TenantIgnore
+    List<OrderRoomUseDTO> selectRoomShipVisitor2(@Param("orderId") Long orderId);
+
     /**
      * 获取游轮的游客
      * @param orderIds

+ 9 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/handler/TradeStockOrderHandler.java

@@ -10,6 +10,7 @@ import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderRoomModelDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
 import com.yc.ship.module.trade.dal.mysql.order.TradeOrderRoomModelMapper;
+import com.yc.ship.module.trade.dal.mysql.order.TradeVisitorMapper;
 import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
 import com.yc.ship.module.trade.service.order.TradeOrderService;
 import com.yc.ship.module.trade.service.order.bo.TradeOrderBO;
@@ -39,11 +40,14 @@ public class TradeStockOrderHandler implements TradeOrderHandler{
     @Resource
     private TradeOrderService tradeOrderService;
 
+    @Resource
+    private TradeVisitorMapper tradeVisitorMapper;
+
     @Resource
     private TradeOrderRoomModelMapper tradeOrderRoomModelMapper;
 
     @Override
-    public void beforeOrderCreate(TradeOrderBO order) throws Exception {
+    public void beforeOrderCreate(TradeOrderBO order) {
         Integer sellMethod = order.getTradeOrderDO().getSellMethod();
         if (sellMethod == 1||sellMethod == 4||sellMethod == 7||sellMethod == 0||sellMethod == 3) {
             reduceStock(order);
@@ -51,7 +55,7 @@ public class TradeStockOrderHandler implements TradeOrderHandler{
 
     }
 
-    private void reduceStock(TradeOrderBO order) throws  Exception{
+    private void reduceStock(TradeOrderBO order) {
         ReduceStockReqDTO reqDTO = new ReduceStockReqDTO();
         TradeOrderDO lastOrder = order.getOldTradeOrderDO();
         if(lastOrder != null){
@@ -81,6 +85,9 @@ public class TradeStockOrderHandler implements TradeOrderHandler{
         if(Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
             voyageApi.preReduceStock(reqDTO);
         }else {
+            if(lastOrder!= null) {
+                reqDTO.setOldOrderStatus(lastOrder.getOrderStatus());
+            }
             voyageApi.reduceStock(reqDTO);
         }
     }

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

@@ -21,8 +21,6 @@ import java.util.List;
  */
 public interface OtcTradeOrderService {
 
-    String KEY_MARK_CHANGE_ORDER = "changeOrder:confirm:key:%d";
-
 
     /**
      * 窗口支付订单

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

@@ -2,7 +2,6 @@ package com.yc.ship.module.trade.service.otc.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
@@ -66,7 +65,8 @@ import com.yc.ship.module.system.api.dict.DictDataApi;
 import com.yc.ship.module.system.api.dict.dto.DictDataRespDTO;
 import com.yc.ship.module.system.api.user.AdminUserApi;
 import com.yc.ship.module.system.api.user.dto.AdminUserRespDTO;
-import com.yc.ship.module.trade.api.dto.*;
+import com.yc.ship.module.trade.api.dto.TradeOrderPayDTO;
+import com.yc.ship.module.trade.api.dto.TradeOrderRespDTO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.*;
 import com.yc.ship.module.trade.controller.admin.order.vo.otc.PrintRespVO;
 import com.yc.ship.module.trade.controller.admin.order.vo.refund.*;
@@ -88,9 +88,7 @@ import com.yc.ship.module.trade.enums.*;
 import com.yc.ship.module.trade.framework.annotation.TradeOrderLog;
 import com.yc.ship.module.trade.framework.common.ThreadLocalUtil;
 import com.yc.ship.module.trade.framework.common.TradeOrderLogUtils;
-import com.yc.ship.module.trade.framework.common.UserUtils;
 import com.yc.ship.module.trade.service.invoice.InvoiceService;
-import com.yc.ship.module.trade.service.order.AdminTradeOrderService;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.TradeOrderService;
 import com.yc.ship.module.trade.service.otc.OtcTradeOrderService;
@@ -103,7 +101,6 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.ss.util.RegionUtil;
 import org.jetbrains.annotations.NotNull;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -114,14 +111,13 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 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.util.collection.CollectionUtils.convertList;
 import static com.yc.ship.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
 import static com.yc.ship.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname;
-import static com.yc.ship.module.trade.enums.ApiConstants.*;
+import static com.yc.ship.module.trade.enums.ApiConstants.ORDER_CHANGE_TYPE_NEW;
 import static com.yc.ship.module.trade.enums.ErrorCodeConstants.*;
 
 
@@ -178,16 +174,11 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     @Resource
     private TradeOrderRepositoryService tradeOrderRepositoryService;
     @Resource
-    private AdminTradeOrderService adminTradeOrderService;
-    @Resource
     private InvoiceService invoiceService;
     @Resource
     private TradeRefundRepositoryService tradeRefundRepositoryService;
     @Resource
-    private StringRedisTemplate stringRedisTemplate;
-    @Resource
     private TradeOrderDeliveryMapper tradeOrderDeliveryMapper;
-
     @Resource
     private AgencyAuthUtils agencyAuthUtils;
 
@@ -281,112 +272,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         }
     }
 
-
-    private CommonResult<?> refundBeforeChangeOrder(LoginUser loginUser, OtcTradeChangeOrderReqVO otcTradeChangeOrderReqVO, TradeOrderDO tradeOrderDO, TradeOrderDO newTradeOrderDO, List<TradeDetailDO> changeDetailList) {
-
-        if (isChangeConfirmed(newTradeOrderDO.getId())) {
-            //已经确认过了,就不重复发起原订单退了
-            return CommonResult.success(null);
-        }
-
-        BigDecimal refundAmount;
-        Integer refundBackType;
-        if (otcTradeChangeOrderReqVO.getRealPayAmount().compareTo(BigDecimal.ZERO) <= 0) {
-            //要验证退款方式
-            Asserts.isTrue(ObjectUtils.equalsAny(otcTradeChangeOrderReqVO.getRefundBackType(), REFUND_BACK_TYPE_OFFLINE, REFUND_BACK_TYPE_ORIGINAL), "退款方式不正确{}", otcTradeChangeOrderReqVO.getRefundBackType());
-            refundAmount = otcTradeChangeOrderReqVO.getRealPayAmount().abs();
-            refundBackType = otcTradeChangeOrderReqVO.getRefundBackType();
-        } else {
-            refundAmount = BigDecimal.ZERO;
-            refundBackType = REFUND_BACK_TYPE_ORIGINAL;
-        }
-
-        CommonResult<TradeRefundCreateRespVO> refundResult = doRefundBeforeChangeOrder(loginUser, tradeOrderDO, newTradeOrderDO, refundAmount, refundBackType, changeDetailList);
-        if (refundResult.isError() || CollUtil.isNotEmpty(changeDetailList) && refundResult.getData().getSuccessList().size() != changeDetailList.size()
-                || CollUtil.isEmpty(changeDetailList) && refundResult.getData().getSuccessList().size() != 1) {
-            //说明改签失败,删除绑定关系,如果此订单在退款中,只有找工作人员人工退款,不可恢复,因为可能已经向供应商退款。
-            cancelChangeOrder(tradeOrderDO, newTradeOrderDO);
-            return CommonResult.error(ORDER_CHANGE_REFUND_FAIL);
-        }
-
-        //标记这个订单已经确认支付
-        markChangeOrder(newTradeOrderDO.getId());
-
-        return refundResult;
-    }
-
-    private CommonResult<?> payAfterChangeOrder(LoginUser loginUser, OtcTradeChangeOrderReqVO otcTradeChangeOrderReqVO, TradeOrderDO tradeOrderDO, TradeOrderDO newTradeOrderDO) {
-        PayOrderReqVO payOrderReqVO;
-        BigDecimal subPayAmount = otcTradeChangeOrderReqVO.getRealPayAmount();
-        if (subPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
-            payOrderReqVO = new PayOrderReqVO();
-            payOrderReqVO.setOrderId(newTradeOrderDO.getId());
-            payOrderReqVO.setPayType(PayTypeEnum.OTHER.getType());
-            payOrderReqVO.setPayAmount(newTradeOrderDO.getPayAmount());
-        } else {
-            Asserts.isTrue(otcTradeChangeOrderReqVO.getPayOrderParams() != null, "支付参数不能为空");
-            Asserts.isTrue(subPayAmount.compareTo(otcTradeChangeOrderReqVO.getPayOrderParams().getPayAmount()) == 0, "支付金额必须与改签金额一致");
-            payOrderReqVO = otcTradeChangeOrderReqVO.getPayOrderParams();
-            payOrderReqVO.setOrderId(newTradeOrderDO.getId());
-            payOrderReqVO.setPayAmount(subPayAmount);
-            if (payOrderReqVO.getPayParams() == null) {
-                payOrderReqVO.setPayParams(new PayOrderReqVO.PayParams());
-            }
-        }
-
-        //只需支付一次就出票
-        CommonResult<PayOrderRespVO> payResult = windowPayOrder(loginUser, payOrderReqVO);
-        if (payResult.isError()) {
-            return CommonResult.error(payResult);
-        }
-        //返回支付参数
-        return payResult;
-    }
-
-    private void cancelChangeOrder(TradeOrderDO oldtradeOrderDO, TradeOrderDO newTradeOrderDO) {
-        TradeOrderBindDO tradeOrderBindDO = new TradeOrderBindDO();
-        tradeOrderBindDO.setOrderId(oldtradeOrderDO.getId());
-        tradeOrderBindDO.setBindId(newTradeOrderDO.getId());
-        tradeOrderBindDO.setType(TradeOrderBindEnum.CHANGE.getType());
-        tradeOrderRepositoryService.cancelBindOrder(tradeOrderBindDO);
-
-        tradeOrderRepositoryService.cancelOrder(newTradeOrderDO.getId());
-    }
-
-    private CommonResult<TradeRefundCreateRespVO> doRefundBeforeChangeOrder(LoginUser loginUser, TradeOrderDO tradeOrderDO, TradeOrderDO newTradeOrderDO, BigDecimal refundAmount, Integer refundBackType, List<TradeDetailDO> changeDetailList) {
-        int refundType = CollUtil.isEmpty(changeDetailList) ? REFUND_TYPE_ORDER : REFUND_TYPE_ITEM;
-        TradeRefundCreateReqVO refundCreateReqVO = new TradeRefundCreateReqVO();
-        refundCreateReqVO.setRefundAmount(refundAmount);
-        refundCreateReqVO.setRefundBackType(refundBackType);
-        refundCreateReqVO.setRefundType(refundType);
-        refundCreateReqVO.setRefundMethod(REFUND_METHOD_CHANGE_ORDER);
-        refundCreateReqVO.setRefundChannel(RefundChannelEnum.WINDOW.getType());
-        refundCreateReqVO.setRefundReason("改签");
-        if (refundType == REFUND_TYPE_ORDER) {
-            List<TradeRefundCreateReqVO.RefundOrderInfo> orderInfoList = new ArrayList<>();
-            TradeRefundCreateReqVO.RefundOrderInfo refundOrderInfo = new TradeRefundCreateReqVO.RefundOrderInfo();
-            refundOrderInfo.setOrderNo(tradeOrderDO.getOrderNo());
-            refundOrderInfo.setOrderId(tradeOrderDO.getId());
-            orderInfoList.add(refundOrderInfo);
-            refundCreateReqVO.setOrderInfoList(orderInfoList);
-        } else {
-            List<TradeRefundCreateReqDTO.RefundItem> refundItemList = changeDetailList.stream().map(changeDetail -> {
-                TradeRefundCreateReqDTO.RefundItem refundItem = new TradeRefundCreateReqDTO.RefundItem();
-                refundItem.setOrderId(tradeOrderDO.getId());
-                refundItem.setOrderDetailId(changeDetail.getId());
-                refundItem.setOriginRefundAmount(changeDetail.getActualPrice());
-                refundItem.setRefundAmount(changeDetail.getActualPrice());
-                refundItem.setVoucherCode(changeDetail.getVoucherCode());
-                refundItem.setFee(BigDecimal.ZERO);
-                return refundItem;
-            }).collect(Collectors.toList());
-
-            refundCreateReqVO.setRefundItemList(refundItemList);
-        }
-
-        return adminTradeOrderService.refund(loginUser, refundCreateReqVO);
-    }
-
     @Override
     public CommonResult<?> queryOrderStatus(Long orderId) {
         TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);
@@ -516,9 +401,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
                 reqDTO.setOrderRoomList(orderRoomUseDTOList);
                 Integer orderStatus = reqDTO.getOrderStatus();
-                if(Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
+                if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
                     voyageApi.preReduceStock(reqDTO);
-                }else {
+                } else {
+                    reqDTO.setOldOrderStatus(lastTradeOrder.getOrderStatus());
                     voyageApi.reduceStock(reqDTO);
                 }
 
@@ -578,9 +464,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             List<OrderRoomUseDTO> orderRoomUseDTOList = tradeVisitorMapper.selectRoomShipVisitor(lastTradeOrder.getId());
             reqDTO.setOrderRoomList(orderRoomUseDTOList);
             Integer orderStatus = reqDTO.getOrderStatus();
-            if(Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
+            if (Objects.equals(orderStatus, TradeOrderStatusEnum.YD.getStatus())) {
                 voyageApi.preReduceStock(reqDTO);
-            }else {
+            } else {
+                reqDTO.setOldOrderStatus(lastTradeOrder.getOrderStatus());
                 voyageApi.reduceStock(reqDTO);
             }
 
@@ -588,36 +475,12 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             Map<String, Object> extMap = new HashMap<>();
             extMap.put("result", "审核撤回");
             TradeOrderLogUtils.setOrderInfo(orderId, tradeOrderDO.getOrderStatus(), tradeOrderDO.getOrderStatus(), extMap);
-        }else{
+        } else {
             return CommonResult.success("新增订单审核状态不能回退");
         }
         return CommonResult.success("撤回成功");
     }
 
-    private void saveSpecNumber(List<TradeOrderRespVO> orderList) {
-        List<DictDataRespDTO> dictList = dictDataApi.getDictDataList("project_specification_type");
-        orderList.forEach(spu -> {
-            // 统计各规格数量
-            AtomicReference<List<TradeDetailRespVO>> list = new AtomicReference<>(new ArrayList<>());
-            List<TradeDetailRespVO> detaillist = tradeDetailMapper.getOrderIdDetail(spu.getId()).stream().filter(item -> item.getVoucherStatus() == 1 || item.getVoucherStatus() == 2 || item.getVoucherStatus() == 3 || item.getVoucherStatus() == 6 || item.getVoucherStatus() == 8 || item.getVoucherStatus() == 9).collect(Collectors.toList());
-            if (!detaillist.isEmpty()) {
-                list.set(detaillist);
-                StringJoiner joiner = new StringJoiner("、");
-                for (DictDataRespDTO dict : dictList) {
-                    long count = list.get().stream().filter(item -> dict.getValue().equals(item.getSpecType())).count();
-                    if (count > 0) {
-                        joiner.add(dict.getLabel() + "*" + count);
-                    }
-                }
-                spu.setSpecNumber(joiner.toString());
-                spu.setNum(list.get().size());
-            } else {
-                spu.setSpecNumber("-");
-                spu.setNum(0);
-            }
-        });
-    }
-
 
     @Override
     public PageResult<TradeOrderRespVO> getOtcTradeOrderPage(TradeOrderPageReqVO pageReqVO) {
@@ -662,108 +525,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         TenantContextHolder.setIgnore(false);
         Long s2 = System.currentTimeMillis();
         log.info("getOtcTradeOrderUserPage执行时间:{}", s2 - s1);
-        List<DictDataRespDTO> dictList = dictDataApi.getDictDataList("project_specification_type");
-
-        iPage.getRecords().forEach(spu -> {
-            setSpecTypeInfo(spu, dictList);
-        });
-
-        String res = getTotalSpecTypeInfo(otcTradeOrderUserCount);
-        return new PageResult<>(iPage.getRecords(), iPage.getTotal(), res);
-    }
-
-    private void setSpecTypeInfo(TradeOrderRespVO spu, List<DictDataRespDTO> dictList) {
-        // 统计各规格数量
-        if (StrUtil.isNotBlank(spu.getAllSpecTypeInfo())) {
-            StringJoiner joiner = new StringJoiner("、");
-            spu.setNum(0);
-            for (String specInfo : spu.getAllSpecTypeInfo().split(",")) {
-                String[] infoArray = specInfo.split("\\*");
-                String specType = infoArray[0];
-                Integer count = Integer.parseInt(infoArray[1]);
-                DictDataRespDTO dictDataRespDTO = dictList.stream().filter(dict -> dict.getValue().equals(specType)).findFirst().orElse(null);
-                String label = dictDataRespDTO == null ? specType : dictDataRespDTO.getLabel();
-                if (count > 0) {
-                    joiner.add(label + "*" + count);
-                }
-                spu.setNum(spu.getNum() + count);
-                switch (specType) {
-                    case "carrying_children":
-                        spu.setCarryingChildrenNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "other":
-                        spu.setOtherNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "car_yd":
-                        spu.setCarYdNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "car_seat":
-                        spu.setCarSeatNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "free":
-                        spu.setFreeNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "half":
-                        spu.setHalfNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "full":
-                        spu.setFullNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    case "common":
-                        spu.setCommonNum(Integer.parseInt(String.valueOf(count)));
-                        break;
-                    default:
-                        spu.setOtherNum(spu.getOtherNum() + Integer.parseInt(String.valueOf(count)));
-                        break;
-                }
-            }
-            spu.setSpecNumber(joiner.toString());
-        } else {
-            spu.setSpecNumber("-");
-            spu.setNum(0);
-        }
-        if (spu.getSellerId() != null && !spu.getSellerId().isEmpty()) {
-            String nickName = UserUtils.getNickNameById(Long.parseLong(spu.getSellerId()));
-            if (nickName != null) {
-                spu.setSellerName(nickName);
-                spu.setBusinessName(nickName);
-            } else {
-                spu.setSellerName(spu.getSourceName());
-            }
-        }
-    }
-
-    private String getTotalSpecTypeInfo(TradeOrderCountRespVO otcTradeOrderUserCount) {
-        StringJoiner joiner = new StringJoiner("、");
-        if (otcTradeOrderUserCount.getFullNum() != null && otcTradeOrderUserCount.getFullNum() > 0) {
-            joiner.add("成人票" + "*" + otcTradeOrderUserCount.getFullNum());
-        }
-        if (otcTradeOrderUserCount.getHalfNum() != null && otcTradeOrderUserCount.getHalfNum() > 0) {
-            joiner.add("儿童票" + "*" + otcTradeOrderUserCount.getHalfNum());
-        }
-        if (otcTradeOrderUserCount.getFreeNum() != null && otcTradeOrderUserCount.getFreeNum() > 0) {
-            joiner.add("免票" + "*" + otcTradeOrderUserCount.getFreeNum());
-        }
-        if (otcTradeOrderUserCount.getCommonNum() != null && otcTradeOrderUserCount.getCommonNum() > 0) {
-            joiner.add("通用票" + "*" + otcTradeOrderUserCount.getCommonNum());
-        }
-        if (otcTradeOrderUserCount.getCarYdNum() != null && otcTradeOrderUserCount.getCarYdNum() > 0) {
-            joiner.add("优待票" + "*" + otcTradeOrderUserCount.getCarYdNum());
-        }
-        if (otcTradeOrderUserCount.getCarSeatNum() != null && otcTradeOrderUserCount.getCarSeatNum() > 0) {
-            joiner.add("座票" + "*" + otcTradeOrderUserCount.getCarSeatNum());
-        }
-        if (otcTradeOrderUserCount.getOtherNum() != null && otcTradeOrderUserCount.getOtherNum() > 0) {
-            joiner.add("其他票" + "*" + otcTradeOrderUserCount.getOtherNum());
-        }
-        if (otcTradeOrderUserCount.getCarryingChildrenNum() != null && otcTradeOrderUserCount.getCarryingChildrenNum() > 0) {
-            joiner.add("携童票" + "*" + otcTradeOrderUserCount.getCarryingChildrenNum());
-        }
-        joiner.add("实收金额" + otcTradeOrderUserCount.getTotalPayAmount());
-        return joiner.toString();
+        return new PageResult<>(iPage.getRecords(), iPage.getTotal());
     }
 
-
     @Override
     public PageResult<TradeOrderRespVO> getMiniTradeOrderPage(TradeOrderPageReqVO pageReqVO) {
         IPage<TradeOrderRespVO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
@@ -790,7 +554,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
         IPage<TradeOrderRespVO> iPage = tradeOrderMapper.getTradeOrderUserPage(page, pageReqVO);
         List<DictDataRespDTO> dictList = dictDataApi.getDictDataList("project_specification_type");
-        String res = "";
         iPage.getRecords().forEach(spu -> {
             // 统计各规格数量
             AtomicReference<List<TradeDetailRespVO>> list = new AtomicReference<>(new ArrayList<>());
@@ -798,44 +561,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             spu.setTotalNum(detaillist.size());
             List<TradeDetailRespVO> realDetaillist = detaillist.stream().filter(item -> item.getVoucherStatus() == 1 || item.getVoucherStatus() == 2 || item.getVoucherStatus() == 3 || item.getVoucherStatus() == 6 || item.getVoucherStatus() == 8 || item.getVoucherStatus() == 9).collect(Collectors.toList());
             if (!realDetaillist.isEmpty()) {
-                list.set(realDetaillist);
-                StringJoiner joiner = new StringJoiner("、");
-                for (DictDataRespDTO dict : dictList) {
-                    long count = list.get().stream().filter(item -> dict.getValue().equals(item.getSpecType())).count();
-                    if (count > 0) {
-                        joiner.add(dict.getLabel() + "*" + count);
-                    }
-                    switch (dict.getValue()) {
-                        case "carrying_children":
-                            spu.setCarryingChildrenNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "other":
-                            spu.setOtherNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "car_yd":
-                            spu.setCarYdNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "car_seat":
-                            spu.setCarSeatNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "free":
-                            spu.setFreeNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "half":
-                            spu.setHalfNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "full":
-                            spu.setFullNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        case "common":
-                            spu.setCommonNum(Integer.parseInt(String.valueOf(count)));
-                            break;
-                        default:
-                            spu.setOtherNum(spu.getOtherNum() + Integer.parseInt(String.valueOf(count)));
-                            break;
-                    }
-                }
-                spu.setSpecNumber(joiner.toString());
                 spu.setNum(list.get().size());
             } else {
                 spu.setSpecNumber("-");
@@ -1525,8 +1250,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 }
             }
         });
-        saveSpecNumber(iPage.getRecords());
-
         return new PageResult<>(iPage.getRecords(), iPage.getTotal());
     }
 
@@ -1546,7 +1269,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 }
             }
         });
-        saveSpecNumber(iPage.getRecords());
 
         return new PageResult<>(iPage.getRecords(), iPage.getTotal());
     }
@@ -1587,35 +1309,9 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         return vo;
     }
 
-    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_ADD)
-    public void addOrder(OtcTradeOrderCreateRespVO respVO, Long mainOrderId) {
-        TradeBindOrderReqDTO tradeBindOrderReqDTO = new TradeBindOrderReqDTO();
-        tradeBindOrderReqDTO.setOrderId(mainOrderId);
-        tradeBindOrderReqDTO.setBindId(respVO.getOrderId());
-        tradeBindOrderReqDTO.setType(TradeOrderBindEnum.ADD_ORDER.getType());
-        tradeOrderService.bindOrder(tradeBindOrderReqDTO);
-        //记录订单日志
-        TradeOrderLogUtils.setOrderInfo(mainOrderId, null, null, MapUtil.<String, Object>builder().put("newOrderNo", respVO.getOrderNo()).build());
-    }
-
-    private void setOrderPropertyFromLoginUser(LoginUser loginUser, TradeOrderCreateReqDTO.OrderProperty orderProperty, SellMethodEnum sellMethodEnum) {
-        AgencyUserLoginInfoRespDTO agencyUserLoginInfo = loginUser.getContext(AGENCY_LOGIN_INFO, AgencyUserLoginInfoRespDTO.class);
-        if (agencyUserLoginInfo != null) {
-            if (ObjectUtil.notEqual(sellMethodEnum, SellMethodEnum.OTC_MOVE_ORDER) && agencyUserLoginInfo.getMachineId() != null) {
-                orderProperty.setSourceId(agencyUserLoginInfo.getMachineId().toString());
-                orderProperty.setSourceName(agencyUserLoginInfo.getMachineName());
-            }
-            if (agencyUserLoginInfo.getStoreName() != null) {
-                orderProperty.setStoreId(agencyUserLoginInfo.getStoreId());
-                orderProperty.setStoreName(agencyUserLoginInfo.getStoreName());
-            }
-        }
-        orderProperty.setSellerId(loginUser.getId().toString());
-    }
 
     private void setShipOrderPropertyFromLoginUser(LoginUser loginUser, ShipTradeOrderCreateReqVO.OrderProperty orderProperty) {
         orderProperty.setSellerId(loginUser.getId().toString());
-//        orderProperty.setSellMethod(SellMethodEnum.WINDOW.getType());
     }
 
     @Override
@@ -1649,7 +1345,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     }
 
     @Override
-//    @Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     public CommonResult<?> createOtcOrder(LoginUser loginUser, TradeOrderOtcCreateVO createVO) {
         Long distributorId = createVO.getDistributorId() != null ? createVO.getDistributorId() : loginUser.getDistributorId();
         Long storeId = createVO.getStoreId() != null ? createVO.getStoreId() : loginUser.getStoreId();
@@ -1683,7 +1379,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         } else {
             orderNo = ship.getCode() + "-" + date + "-" + code + "-" + (maxOrderNo + 1);
         }
-//        List<TradeOrderCountryReqVO> countryData = createVO.getCountryData();
         TradeOrderTotalVO summary = createVO.getSummary();
         BigDecimal realAmount = summary.getRealMoney();
         BigDecimal orderMoney = summary.getOrderMoney();
@@ -1827,10 +1522,10 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         if (DateUtil.compare(travelDate, new Date()) < 0) {
             Asserts.isTrue(false, "选择的游玩日期不能早于当前时间");
         }
-        CommonResult<TradeOrderRespDTO> result = null;
+        CommonResult<TradeOrderRespDTO> result;
         try {
             result = doShipCreateOrder(loginUser, shipTradeOrderCreateReqVO);
-        }catch (Exception e) {
+        } catch (Exception e) {
             return CommonResult.error(500, e.getMessage());
         }
         if (result.isError()) {
@@ -1890,7 +1585,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
     }
 
     @Override
-//    @Transactional(rollbackFor = Exception.class)
+    @Transactional(rollbackFor = Exception.class)
     public CommonResult<?> motifyOtcOrder(LoginUser loginUser, TradeOrderOtcCreateVO createVO) {
         Long distributorId = createVO.getDistributorId() != null ? createVO.getDistributorId() : loginUser.getDistributorId();
         Long storeId = createVO.getStoreId() != null ? createVO.getStoreId() : loginUser.getStoreId();
@@ -2102,7 +1797,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         String msg = "";
         if (auditType > 0 && createVO.getIsYd() != 1) {
             AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, auditType).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
-            tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("audit_user", auditUserDO==null?"":auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).eq("id", neworderId));
+            tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", auditType).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.TRANSFER.getStatus()).set("audit_status", 1).eq("id", neworderId));
             msg = "修改提交成功,等待管理员审核";
         }
 
@@ -2289,23 +1984,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
         return orderRespNewVO;
     }
 
-    private void markChangeOrder(Long orderId) {
-        String key = String.format(KEY_MARK_CHANGE_ORDER, orderId);
-        stringRedisTemplate.opsForValue().set(key, orderId.toString(), 60, TimeUnit.MINUTES);
-    }
-
-    private boolean isChangeConfirmed(Long orderId) {
-        String key = String.format(KEY_MARK_CHANGE_ORDER, orderId);
-        String value = stringRedisTemplate.opsForValue().get(key);
-        return StrUtil.equals(value, orderId.toString());
-    }
-
-    public static void main(String[] args) {
-
-        System.out.println(DateUtil.beginOfDay(new Date()));
-    }
-
-
     @Override
     public File createConfirmaction(Long id, Double totalMoney) {
         TradeOrderConfirmationVO orderConfirmation = getOrderConfirmation(id);

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

@@ -103,6 +103,12 @@
         where order_id = #{orderId} and deleted =0
         group by room_model_id,floor,room_id
     </select>
+    <select id="selectRoomShipVisitor2"
+            resultType="com.yc.ship.module.product.api.dto.OrderRoomUseDTO">
+        select room_model_id,floor,room_id,count(1) num from  trade_visitor
+        where order_id = #{orderId}
+        group by room_model_id,floor,room_id
+    </select>
     <select id="queryRelatedVisitor"
             resultType="com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO">
         SELECT v1.*, v2.id associatedVisitorId