| 
					
				 | 
			
			
				@@ -7,14 +7,17 @@ import com.yc.ship.module.product.api.dto.ReduceStockReqDTO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewDetailReqVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewRespVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockLogDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockRoomUsedDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockLogMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockRoomUsedMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.enums.DistributorOrStoreEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.yc.ship.module.product.enums.VoyageStockLogTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.service.voyagestockdistribute.VoyageStockDistributeNewService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.resource.api.room.RoomApi; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -60,6 +63,9 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private VoyageStockRoomUsedMapper voyageStockRoomUsedMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private VoyageStockLogMapper voyageStockLogMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void preReduceStock(ReduceStockReqDTO reqDTO) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -84,11 +90,57 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void preCancelReduceStock(ReduceStockReqDTO 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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Integer type = reqDTO.getType();//判断是分销商还是门店下单 1:分销商,2:门店 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (type == DistributorOrStoreEnum.DISTRIBUTOR.getValue()) {//分销商下单,当前阶段不考虑门店下单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //初定扣分销商库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                preCancelReduceStockDistributor(reqDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(lock.isHeldByCurrentThread() && lock.isLocked()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                lock.unlock(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 预定扣分销商库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 初定取消还分销商库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param reqDTO 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void preCancelReduceStockDistributor(ReduceStockReqDTO reqDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer type = reqDTO.getType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long voyageId = reqDTO.getVoyageId(); //航次ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long distributorId = reqDTO.getDistributorId(); //分销商ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long storeId = reqDTO.getStoreId(); //门店ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BigDecimal totalUseNum = reqDTO.getUseRoomNum(); //总共使用房间数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long orderId = reqDTO.getOrderId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer orderStatus = reqDTO.getOrderStatus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //删除已使用房间记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockRoomUsedMapper.deleteByOrderId(orderId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 初定扣分销商库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param reqDTO 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private void preReduceStockDistributor(ReduceStockReqDTO reqDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //航次库存操作日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VoyageStockLogDO voyageStockLogDO = new VoyageStockLogDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Integer type = reqDTO.getType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Long voyageId = reqDTO.getVoyageId(); //航次ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Long distributorId = reqDTO.getDistributorId(); //分销商ID 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -97,6 +149,12 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Long orderId = reqDTO.getOrderId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Integer orderStatus = reqDTO.getOrderStatus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockLogDO.setVoyageId(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockLogDO.setType(2);//标识减少 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockLogDO.setOrderId(orderId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockLogDO.setOrderStatus(orderStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockLogDO.setOperateType(VoyageStockLogTypeEnum.ORDER_PRE_SUB.getValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 获取航次总库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(stockDO == null) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -166,7 +224,11 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setVirtualNum(totalUseNum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setRealNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 stockDO.setVirtualNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 扣实际房间数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum()))); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -175,6 +237,7 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 扣共享库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyageStockLogDO.setShareNum(totalUseNum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             voyageStockMapper.updateById(stockDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //分销商已分配库存,扣自身库存 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -233,7 +296,11 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setVirtualNum(totalUseNum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setRealNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 stockDO.setVirtualNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 扣实际房间数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum()))); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -242,6 +309,7 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 扣共享库存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyageStockLogDO.setShareNum(totalUseNum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             voyageStockMapper.updateById(stockDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 添加房间使用记录 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -268,5 +336,7 @@ public class VoyageApiImpl implements VoyageApi{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             voyageStockRoomUsedMapper.insertBatch(roomUsedList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 添加库存日志 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyageStockLogMapper.insert(voyageStockLogDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |