|  |  |  | @ -67,6 +67,7 @@ import java.io.InputStream; | 
			
		
	
		
			
				
					|  |  |  |  | import java.text.ParseException; | 
			
		
	
		
			
				
					|  |  |  |  | import java.text.SimpleDateFormat; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.*; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.concurrent.ConcurrentHashMap; | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.stream.Collectors; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | @Service | 
			
		
	
	
		
			
				
					|  |  |  | @ -463,12 +464,22 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 添加一个用于同步的Map,存储正在处理的单号
 | 
			
		
	
		
			
				
					|  |  |  |  |     private static final Map<String, Object> BILL_LOCKS = new ConcurrentHashMap<>(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void importPrescribe(List<BasicSkPrescribeEntity> basicSkPrescribeEntities) { | 
			
		
	
		
			
				
					|  |  |  |  |         //下载处方
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (CollUtil.isEmpty(basicSkPrescribeEntities)) basicSkPrescribeEntities = basicSkPrescribeService.list(); | 
			
		
	
		
			
				
					|  |  |  |  |         List<SysWorkplaceResponse> allWorksList = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  |         for (BasicSkPrescribeEntity basicSkPrescribeEntity : basicSkPrescribeEntities) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (collectOrderMapper.exists(new LambdaQueryWrapper<IoCollectOrder>().eq(IoCollectOrder::getBillNo, basicSkPrescribeEntity.getCode()))) { | 
			
		
	
		
			
				
					|  |  |  |  |             // 获取单号
 | 
			
		
	
		
			
				
					|  |  |  |  |             String billNo = basicSkPrescribeEntity.getCode(); | 
			
		
	
		
			
				
					|  |  |  |  |             // 为每个单号创建一个锁对象,如果已存在则使用现有的
 | 
			
		
	
		
			
				
					|  |  |  |  |             Object billLock = BILL_LOCKS.computeIfAbsent(billNo, k -> new Object()); | 
			
		
	
		
			
				
					|  |  |  |  |             // 使用同步块确保同一单号的处理是同步的
 | 
			
		
	
		
			
				
					|  |  |  |  |             synchronized (billLock) { | 
			
		
	
		
			
				
					|  |  |  |  |                 try { | 
			
		
	
		
			
				
					|  |  |  |  |                     if (collectOrderMapper.exists(new LambdaQueryWrapper<IoCollectOrder>().eq(IoCollectOrder::getBillNo, billNo))) { | 
			
		
	
		
			
				
					|  |  |  |  |                         continue; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                     SysWorkplaceDocumentEntity sysWorkplaceDocumentEntity = sysWorkplaceDocumentService.findByBusType(basicSkPrescribeEntity.getAddr()); | 
			
		
	
	
		
			
				
					|  |  |  | @ -497,14 +508,12 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             IoCollectOrder collectOrder = IoCollectOrder.builder().billNo(basicSkPrescribeEntity.getCode()).busType(sysWorkplaceDocumentEntity.getDocumentTypeCode()).fromType("HIS系统").fromCorp(basicSkPrescribeEntity.getSickerCode()).workPlaceCode(defaultWorkplace[0]).billTime(MsDateUtil.localToDate(basicSkPrescribeEntity.getPrescribeDate())).createTime(new Date()).createUser(basicSkPrescribeEntity.getCreateUser()).backupOrderRemark1(basicSkPrescribeEntity.getStooutNo()).updateTime(new Date()).orderCirType(sysWorkplaceDocumentEntity.getOrderCirType()).splitStatus(0).tagStatus(0).remark(basicSkPrescribeEntity.getRemark()).build(); | 
			
		
	
		
			
				
					|  |  |  |  |                     IoCollectOrder collectOrder = IoCollectOrder.builder().billNo(billNo).busType(sysWorkplaceDocumentEntity.getDocumentTypeCode()).fromType("HIS系统").fromCorp(basicSkPrescribeEntity.getSickerCode()).workPlaceCode(defaultWorkplace[0]).billTime(MsDateUtil.localToDate(basicSkPrescribeEntity.getPrescribeDate())).createTime(new Date()).createUser(basicSkPrescribeEntity.getCreateUser()).backupOrderRemark1(basicSkPrescribeEntity.getStooutNo()).updateTime(new Date()).orderCirType(sysWorkplaceDocumentEntity.getOrderCirType()).splitStatus(0).tagStatus(0).remark(basicSkPrescribeEntity.getRemark()).build(); | 
			
		
	
		
			
				
					|  |  |  |  |                     if (collectOrder.getWorkPlaceCode() != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                         collectOrder.setTagStatus(1); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                     save(collectOrder); | 
			
		
	
		
			
				
					|  |  |  |  |             List<BasicSkPrescribeItemEntity> basicSkPrescribeItemEntities = basicSkPrescirbeDetailService.findByPrescribeNum(basicSkPrescribeEntity.getCode()); | 
			
		
	
		
			
				
					|  |  |  |  |                     List<BasicSkPrescribeItemEntity> basicSkPrescribeItemEntities = basicSkPrescirbeDetailService.findByPrescribeNum(billNo); | 
			
		
	
		
			
				
					|  |  |  |  |                     List<IoCollectOrderBiz> collectOrderBizs = new ArrayList<>(); | 
			
		
	
		
			
				
					|  |  |  |  |                     for (BasicSkPrescribeItemEntity bizEntity : basicSkPrescribeItemEntities) { | 
			
		
	
		
			
				
					|  |  |  |  |                         UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(bizEntity.getRelId() + ""); | 
			
		
	
	
		
			
				
					|  |  |  | @ -517,12 +526,15 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |                         collectOrderBizs.add(collectOrderBiz); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                     if (CollUtil.isNotEmpty(collectOrderBizs)) collectOrderBizService.saveBatch(collectOrderBizs); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                     allWorksList.addAll(sysWorkplaces); | 
			
		
	
		
			
				
					|  |  |  |  |                     if (IntUtil.value(sysWorkplaceDocumentEntity.getAutoTag()) == 1 && IntUtil.value(collectOrder.getTagStatus()) == 1) { | 
			
		
	
		
			
				
					|  |  |  |  |                 splitFifoCodeService.lockInventoryByOrder(collectOrder.getBillNo(), 1); | 
			
		
	
		
			
				
					|  |  |  |  |                         splitFifoCodeService.lockInventoryByOrder(billNo, 1); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } finally { | 
			
		
	
		
			
				
					|  |  |  |  |                     // 处理完成后,移除锁对象,释放内存
 | 
			
		
	
		
			
				
					|  |  |  |  |                     BILL_LOCKS.remove(billNo); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -540,11 +552,17 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |     public void importPrescribe(List<IoCollectOrder> ioCollectOrderList, CollectOrderRequest collectOrderRequest) { | 
			
		
	
		
			
				
					|  |  |  |  |         String addr = collectOrderRequest.getBusType(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (CollUtil.isNotEmpty(ioCollectOrderList)) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             //是否自动转成待处理单据
 | 
			
		
	
		
			
				
					|  |  |  |  |             IoCollectSet collectSet = collectSetService.getSet(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             for (IoCollectOrder collectOrder : ioCollectOrderList) { | 
			
		
	
		
			
				
					|  |  |  |  |                 // 获取单号
 | 
			
		
	
		
			
				
					|  |  |  |  |                 String billNo = collectOrder.getBillNo(); | 
			
		
	
		
			
				
					|  |  |  |  |                 // 为每个单号创建一个锁对象,如果已存在则使用现有的
 | 
			
		
	
		
			
				
					|  |  |  |  |                 Object billLock = BILL_LOCKS.computeIfAbsent(billNo, k -> new Object()); | 
			
		
	
		
			
				
					|  |  |  |  |                 // 使用同步块确保同一单号的处理是同步的
 | 
			
		
	
		
			
				
					|  |  |  |  |                 synchronized (billLock) { | 
			
		
	
		
			
				
					|  |  |  |  |                     try { | 
			
		
	
		
			
				
					|  |  |  |  |                         IoCollectOrderOrigin ioCollectOrderOrigin = new IoCollectOrderOrigin(); | 
			
		
	
		
			
				
					|  |  |  |  |                         if (collectOrderMapper.exists(new LambdaQueryWrapper<IoCollectOrder>().eq(IoCollectOrder::getBillNo, collectOrder.getBillNo()))) { | 
			
		
	
		
			
				
					|  |  |  |  |                             continue; | 
			
		
	
	
		
			
				
					|  |  |  | @ -561,9 +579,6 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |                         List<IoCollectOrderBiz> bizList = collectOrder.getBizList(); | 
			
		
	
		
			
				
					|  |  |  |  |                         if (CollUtil.isNotEmpty(bizList)) { | 
			
		
	
		
			
				
					|  |  |  |  |                             //先清空 原来的biz
 | 
			
		
	
		
			
				
					|  |  |  |  |                     String billNo = collectOrder.getBillNo(); | 
			
		
	
		
			
				
					|  |  |  |  |                     collectOrderBizOriginService.remove(new LambdaUpdateWrapper<IoCollectOrderBizOrigin>().eq(IoCollectOrderBizOrigin::getOrderIdFk, billNo)); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                             for (IoCollectOrderBiz collectOrderBiz : bizList) { | 
			
		
	
		
			
				
					|  |  |  |  |                                 if (collectOrderBiz.getRelId() != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                                     UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(collectOrderBiz.getRelId() + ""); | 
			
		
	
	
		
			
				
					|  |  |  | @ -578,6 +593,7 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |                                 } | 
			
		
	
		
			
				
					|  |  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |  |                             List<IoCollectOrderBizOrigin> ioCollectOrderBizOrigins = BeanCopyUtils.copyList(bizList, IoCollectOrderBizOrigin.class); | 
			
		
	
		
			
				
					|  |  |  |  |                             collectOrderBizOriginService.remove(new LambdaUpdateWrapper<IoCollectOrderBizOrigin>().eq(IoCollectOrderBizOrigin::getOrderIdFk, billNo)); | 
			
		
	
		
			
				
					|  |  |  |  |                             collectOrderBizOriginService.saveBatch(ioCollectOrderBizOrigins); | 
			
		
	
		
			
				
					|  |  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -589,6 +605,11 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |                                 collectOrderBizService.saveBatch(bizList); | 
			
		
	
		
			
				
					|  |  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |  |                     } finally { | 
			
		
	
		
			
				
					|  |  |  |  |                         // 处理完成后,移除锁对象,释放内存
 | 
			
		
	
		
			
				
					|  |  |  |  |                         BILL_LOCKS.remove(billNo); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -820,7 +841,7 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public Boolean decideOrder(CollectOrderRequest request, Long userId) { | 
			
		
	
		
			
				
					|  |  |  |  |         //判断当前用户是否已经绑定改工位
 | 
			
		
	
		
			
				
					|  |  |  |  |         //判断当前用户是否已经绑定该工位
 | 
			
		
	
		
			
				
					|  |  |  |  |         SysWorkplace workplace = sysWorkplaceService.getWorkplaceByUser(request, userId); | 
			
		
	
		
			
				
					|  |  |  |  |         if (workplace == null) { | 
			
		
	
		
			
				
					|  |  |  |  |             throw new JsonException(500, "当前用户未绑定该工位"); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |