@ -157,6 +157,8 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					     *  药 品 批 量 扫 码 
 
			
		
	
		
			
				
					     * / 
 
			
		
	
		
			
				
					    public  BaseResponse  batchProcessDrugCodes ( AddOrderCodeRequest  addOrderCodeRequest ,  AuthAdmin  authAdmin )  { 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        IoCollectSet  collectSet  =  collectSetService . getSet ( ) ; 
 
			
		
	
		
			
				
					        long  startTime  =  System . currentTimeMillis ( ) ; 
 
			
		
	
		
			
				
					        AddCodeResult  addCodeResult  =  new  AddCodeResult ( ) ; 
 
			
		
	
		
			
				
					        List < String >  codeList  =  addOrderCodeRequest . getCodeList ( ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -293,8 +295,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					            orderEntity . setFifoSplitTag ( addOrderRequest . getFifoSplitTag ( ) ) ; 
 
			
		
	
		
			
				
					            orderService . insertOrder ( orderEntity ) ; 
 
			
		
	
		
			
				
					            addOrderRequest . setBillNo ( orderNo ) ; 
 
			
		
	
		
			
				
					        }  else 
 
			
		
	
		
			
				
					            orderEntity  =  isExit ; 
 
			
		
	
		
			
				
					        }  else  orderEntity  =  isExit ; 
 
			
		
	
		
			
				
					        try  { 
 
			
		
	
		
			
				
					            // 创建异步任务
 
 
			
		
	
		
			
				
					            List < CompletableFuture < VailCodeResultResponse > >  futures  =  udiEntityMap . entrySet ( ) . stream ( ) . map ( entry  - >  { 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -324,7 +325,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					                            udiEntity . setSerialNo ( addOrderRequest . getSerialNo ( ) ) ; 
 
			
		
	
		
			
				
					                        } 
 
			
		
	
		
			
				
					                        // 处理药品追溯码
 
 
			
		
	
		
			
				
					                        BaseResponse  baseResponse  =  addDrugOrder ( addOrderRequest ,  udiEntity ,  code ,  groupNumber ,  bussinessTypeEntity ,  udiRelevanceMap . get ( udiEntity . getUdi ( ) ) ,  authAdmin ,  invWarehouseEntity ; 
 
			
		
	
		
			
				
					                        BaseResponse  baseResponse  =  addDrugOrder ( addOrderRequest ,  udiEntity ,  code ,  groupNumber ,  bussinessTypeEntity ,  udiRelevanceMap . get ( udiEntity . getUdi ( ) ) ,  authAdmin ,  invWarehouseEntity , collectSet  ); 
 
			
		
	
		
			
				
					                        // 处理结果
 
 
			
		
	
		
			
				
					                        if  ( baseResponse . getCode ( )  = =  20000 )  { 
 
			
		
	
		
			
				
					                            resultResponse . setStatus ( 1 ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -378,7 +379,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					    / * * 
 
			
		
	
		
			
				
					     *  药 品 扫 码 添 加 校 验 
 
			
		
	
		
			
				
					     * / 
 
			
		
	
		
			
				
					    public  BaseResponse  addDrugOrder ( AddOrderRequest  addOrderRequest ,  UdiEntity  udiEntity ,  String  code ,  Integer  groupNumber ,  BasicBussinessTypeEntity  bussinessTypeEntity ,  UdiRelevanceResponse  udiRelevanceResponse ,  AuthAdmin  authAdmin ,  InvWarehouseEntity  invWarehouseEntity { 
 
			
		
	
		
			
				
					    public  BaseResponse  addDrugOrder ( AddOrderRequest  addOrderRequest ,  UdiEntity  udiEntity ,  String  code ,  Integer  groupNumber ,  BasicBussinessTypeEntity  bussinessTypeEntity ,  UdiRelevanceResponse  udiRelevanceResponse ,  AuthAdmin  authAdmin ,  InvWarehouseEntity  invWarehouseEntity , IoCollectSet  collectSet  ) { 
 
			
		
	
		
			
				
					        AddCodeResult  addCodeResult  =  new  AddCodeResult ( ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // 检查码是否空
 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -386,7 +387,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					            return  ResultVOUtils . error ( 500 ,  "无效条码" ) ; 
 
			
		
	
		
			
				
					        } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        if  ( IntUtil . value ( . getNotCodeType ( ) )  ! =  0  & &  ( bussinessTypeEntity . getAction ( ) . equals ( ConstantType . SPLIT_OUT )  | |  bussinessTypeEntity . getAction ( ) . equals ( ConstantType . SPLIT_RETURN ) ) )  { 
 
			
		
	
		
			
				
					        if  ( IntUtil . value ( collectSet. getNoCodeScan ( ) )  & &  IntUtil . value (  udiRelevanceResponse. getNotCodeType ( ) )  ! =  0  & &  ( bussinessTypeEntity . getAction ( ) . equals ( ConstantType . SPLIT_OUT )  | |  bussinessTypeEntity . getAction ( ) . equals ( ConstantType . SPLIT_RETURN ) ) )  { 
 
			
		
	
		
			
				
					            return  ResultVOUtils . error ( 500 ,  "当前为无码类型产品,无需扫码!" ) ; 
 
			
		
	
		
			
				
					        } 
 
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -630,7 +631,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					            } 
 
			
		
	
		
			
				
					            if  ( bussinessTypeEntity . getAction ( ) . equals ( ConstantType . SPLIT_OUT ) )  { 
 
			
		
	
		
			
				
					                //工位上货 只允许上货一个产品 开关以及控制
 
 
			
		
	
		
			
				
					                
 
			
		
	
		
			
				
					// 
  
			
		
	
		
			
				
					                // 判断货位里面是否有相同产品
 
 
			
		
	
		
			
				
					                if  ( orderEntity  ! =  null  & &  StrUtil . isNotEmpty ( orderEntity . getWorkPlaceQueueCode ( ) ) )  { 
 
			
		
	
		
			
				
					                    SysWorkplace  sysWorkplace  =  sysWorkplaceService . getOne ( new  LambdaQueryWrapper < SysWorkplace > ( ) . eq ( SysWorkplace : : getWorkplaceId ,  addOrderRequest . getWorkPlaceCode ( ) ) ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -775,8 +776,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					        } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // 按照关联ID和批次号分组码实体
 
 
			
		
	
		
			
				
					        Map < String ,  List < IoCodeTempEntity > >  groupedTempEntities  =  codeTempEntities . stream ( ) 
 
			
		
	
		
			
				
					                . collect ( Collectors . groupingBy ( entity  - >  entity . getRelId ( )  +  ":"  +  StrUtil . trimToEmpty ( entity . getBatchNo ( ) ) ) ) ; 
 
			
		
	
		
			
				
					        Map < String ,  List < IoCodeTempEntity > >  groupedTempEntities  =  codeTempEntities . stream ( ) . collect ( Collectors . groupingBy ( entity  - >  entity . getRelId ( )  +  ":"  +  StrUtil . trimToEmpty ( entity . getBatchNo ( ) ) ) ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // 使用synchronized块来保护关键部分
 
 
			
		
	
		
			
				
					        // 获取当前订单的所有明细码
 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -788,21 +788,14 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					            } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            IoCodeTempEntity  representative  =  group . get ( 0 ) ; 
 
			
		
	
		
			
				
					            UdiRelevanceResponse  udiRelevanceResponse  =  udiRelevanceService . selectSupGroupById ( 
 
			
		
	
		
			
				
					                    representative . getRelId ( ) , 
 
			
		
	
		
			
				
					                    representative . getSupId ( ) ) ; 
 
			
		
	
		
			
				
					            UdiRelevanceResponse  udiRelevanceResponse  =  udiRelevanceService . selectSupGroupById ( representative . getRelId ( ) ,  representative . getSupId ( ) ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            // 计算该组的总数量
 
 
			
		
	
		
			
				
					            int  totalCount  =  group . stream ( ) . mapToInt ( IoCodeTempEntity : : getMyCount ) . sum ( ) ; 
 
			
		
	
		
			
				
					            int  totalReCount  =  group . stream ( ) . mapToInt ( IoCodeTempEntity : : getMyReCount ) . sum ( ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            // 在数据库层面使用悲观锁或乐观锁查询现有记录
 
 
			
		
	
		
			
				
					            IoOrderDetailCodeEntity  existingEntity  =  orderDetailCodeDao . selectOne ( 
 
			
		
	
		
			
				
					                    new  QueryWrapper < IoOrderDetailCodeEntity > ( ) 
 
			
		
	
		
			
				
					                            . eq ( "orderIdFk" ,  orderEntity . getBillNo ( ) ) 
 
			
		
	
		
			
				
					                            . eq ( "bindRlFk" ,  representative . getRelId ( ) ) 
 
			
		
	
		
			
				
					                            . eq ( StrUtil . isNotEmpty ( representative . getBatchNo ( ) ) ,  "batchNo" ,  representative . getBatchNo ( ) ) 
 
			
		
	
		
			
				
					                            . last ( "limit 1  FOR UPDATE" ) ) ;  // 添加行级锁
 
 
			
		
	
		
			
				
					            IoOrderDetailCodeEntity  existingEntity  =  orderDetailCodeDao . selectOne ( new  QueryWrapper < IoOrderDetailCodeEntity > ( ) . eq ( "orderIdFk" ,  orderEntity . getBillNo ( ) ) . eq ( "bindRlFk" ,  representative . getRelId ( ) ) . eq ( StrUtil . isNotEmpty ( representative . getBatchNo ( ) ) ,  "batchNo" ,  representative . getBatchNo ( ) ) . last ( "limit 1  FOR UPDATE" ) ) ;  // 添加行级锁
 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            IoOrderDetailCodeEntity  resultDetailEntity ; 
 
			
		
	
		
			
				
					            if  ( existingEntity  ! =  null )  { 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -834,10 +827,7 @@ public class AddCoodeService {
 
			
		
	
		
			
				
					        } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        // 返回最新的明细码列表
 
 
			
		
	
		
			
				
					        return  orderDetailCodeDao . selectList ( 
 
			
		
	
		
			
				
					                new  QueryWrapper < IoOrderDetailCodeEntity > ( ) 
 
			
		
	
		
			
				
					                        . select ( "id" ,  "count" ,  "reCount" ,  "bindRlFk" ,  "batchNo" ,  "price" ) 
 
			
		
	
		
			
				
					                        . eq ( "orderIdFk" ,  orderEntity . getBillNo ( ) ) ) ; 
 
			
		
	
		
			
				
					        return  orderDetailCodeDao . selectList ( new  QueryWrapper < IoOrderDetailCodeEntity > ( ) . select ( "id" ,  "count" ,  "reCount" ,  "bindRlFk" ,  "batchNo" ,  "price" ) . eq ( "orderIdFk" ,  orderEntity . getBillNo ( ) ) ) ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    public  Integer  getMaxGroupNumber ( )  {