| 
					
				 | 
			
			
				@@ -1,10 +1,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.yc.ship.module.product.service.voyage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.core.date.DatePattern; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import cn.hutool.core.date.DateUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.core.date.LocalDateTimeUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.core.util.IdUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.yc.ship.framework.common.exception.ServiceException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.framework.common.pojo.PageResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.framework.common.util.collection.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.framework.common.util.object.BeanUtils; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -16,9 +14,7 @@ import com.yc.ship.module.product.dal.mysql.pricevoyage.PriceVoyageMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyage.VoyageMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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.YesOrNoEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.yc.ship.module.product.utils.VoyageUUCodeUtils; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -113,55 +109,51 @@ public class VoyageServiceImpl implements VoyageService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //现在给整个航次的库存加锁 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RLock lock = redissonClient.getLock(String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RLock lock = redissonClient.getLock(lockKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if(lock.tryLock(60,90, TimeUnit.SECONDS)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if(stockDO != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockMapper.updateById(voyageStockDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //新增时添加统计数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    List<RoomModelFloorNumDTO> list = shipApi.queryRoomModelFloorToNum(reqVO.getShipId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    int intSum = list.stream().mapToInt(RoomModelFloorNumDTO::getNum).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    BigDecimal sum = BigDecimal.valueOf(intSum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setTotalNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setShareNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setRealTotalNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setNotShelfNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setShelfedNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setBookNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setCanSellNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setVirtualNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setOversoldNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setSurplusNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDO.setVoyageId(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockMapper.insert(voyageStockDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //添加库存详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    List<VoyageStockDetailDO> stockDetailDOS = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    list.stream().forEach(item -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        VoyageStockDetailDO stockDetailDO = new VoyageStockDetailDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setVoyageId(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setRoomModelId(item.getRoomModelId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setRoomModelName(item.getRoomModelName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setFloor(item.getFloor()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setTotalNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setRealTotalNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setShelfNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setNotShelfNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setShelfedNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setBookNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setCanSellNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setOversoldNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setVirtualNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDO.setSurplusNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        stockDetailDOS.add(stockDetailDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    voyageStockDetailMapper.insertBatch(stockDetailDOS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            lock.lock(60, TimeUnit.SECONDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if(stockDO != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockMapper.updateById(voyageStockDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //新增时添加统计数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<RoomModelFloorNumDTO> list = shipApi.queryRoomModelFloorToNum(reqVO.getShipId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int intSum = list.stream().mapToInt(RoomModelFloorNumDTO::getNum).sum(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                BigDecimal sum = BigDecimal.valueOf(intSum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setTotalNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setShareNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setRealTotalNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setNotShelfNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setShelfedNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setBookNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setCanSellNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setVirtualNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setOversoldNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setSurplusNum(sum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDO.setVoyageId(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockMapper.insert(voyageStockDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //添加库存详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<VoyageStockDetailDO> stockDetailDOS = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                list.stream().forEach(item -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    VoyageStockDetailDO stockDetailDO = new VoyageStockDetailDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setVoyageId(voyageId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setRoomModelId(item.getRoomModelId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setRoomModelName(item.getRoomModelName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setFloor(item.getFloor()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setTotalNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setRealTotalNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setShelfNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setNotShelfNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setShelfedNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setBookNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setCanSellNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setOversoldNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setVirtualNum(BigDecimal.ZERO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDO.setSurplusNum(BigDecimal.valueOf(item.getNum())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    stockDetailDOS.add(stockDetailDO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                voyageStockDetailMapper.insertBatch(stockDetailDOS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }catch (ServiceException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("创建航次失败:",e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("创建航次失败:",e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if(lock.isHeldByCurrentThread() && lock.isLocked()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 lock.unlock(); 
			 |