Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r34351 -r34434 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 34351) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 34434) @@ -70,6 +70,7 @@ import com.forgon.disinfectsystem.basedata.becleanitem.service.BeCleanItemManager; import com.forgon.disinfectsystem.basedata.becleanitem.service.ClassifiedItemManager; import com.forgon.disinfectsystem.basedata.becleanitem.service.ClassifyBasketManager; +import com.forgon.disinfectsystem.basedatamanager.cleanmethod.service.CleanMethodManager; import com.forgon.disinfectsystem.basedatamanager.container.service.ContainerManager; import com.forgon.disinfectsystem.basedatamanager.container.service.ReviewedBasketManager; import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; @@ -84,10 +85,12 @@ import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; import com.forgon.disinfectsystem.entity.assestmanagement.DiposableGoodsInstance; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.basedatamanager.cleanmethod.CleanMethod; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; import com.forgon.disinfectsystem.entity.basedatamanager.imagefilemanager.ImageFile; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.rinser.Rinser; import com.forgon.disinfectsystem.entity.basedatamanager.sterilisation.Sterilisation; import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.taskGroup.TaskGroup; @@ -270,6 +273,11 @@ private StorageLocationManager storageLocationManager; private ClassifiedItemManager classifiedItemManager; + + private CleanMethodManager cleanMethodManager; + public void setCleanMethodManager(CleanMethodManager cleanMethodManager) { + this.cleanMethodManager = cleanMethodManager; + } /** * 聚合包装配 */ @@ -3663,6 +3671,11 @@ tousseDefinition.getTousseDefinitionShowName(), barcode)); } + //新创建,还没有进行回收 + if(objectDao.countBySql("select count(*) from ClassifiedItem where idCardBarcode='"+ barcode +"'") == 0){ + throw new RuntimeException("标识牌条码为"+ barcode +"的【"+ tousseDefinition.getName() +"】新创建,还没有进行回收!"); + } + //标识牌刚完成回收,还没录入清洗记录,也没产生包实例 JSONObject idCardInstanceJsonObj = new JSONObject(); JSONObject tousseDefinitionJsonObj = new JSONObject(); JSONObject idCardDefinitionJsonObj = new JSONObject(); @@ -3671,8 +3684,19 @@ .getId()); String msg = getErrorDamageRemarkByPackingTasks(packingTaskList); Long lastTousseInstanceId = idCardInstance.getLastTousseInstanceId(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if(DatabaseUtil.isPoIdValid(lastTousseInstanceId)){ TousseInstance ti = tousseInstanceManager.get(lastTousseInstanceId); + if(TousseInstance.STATUS_PACKED.equals(ti.getStatus()) + || TousseInstance.STATUS_REVIEWED.equals(ti.getStatus()) + || TousseInstance.STATUS_STERILING.equals(ti.getStatus()) + || TousseInstance.STATUS_STERILED.equals(ti.getStatus()) + || TousseInstance.STATUS_DELAY_CONFIRM.equals(ti.getStatus()) + || TousseInstance.STATUS_SHIPPED.equals(ti.getStatus()) + || TousseInstance.STATUS_SIGNED.equals(ti.getStatus()) + || TousseInstance.STATUS_USED.equals(ti.getStatus())){ + throw new RuntimeException("标识牌条码为"+ barcode +"的【"+ tousseDefinition.getName() +"】的状态为"+ ti.getStatus() +"," + tousseInstanceManager.getDateStrByTousseInstanceStatus(ti)); + } ErrorDamageRemark errorDamageRemark = ti.getErrorDamageRemark(); if(errorDamageRemark != null){ idCardInstanceJsonObj.put("errorDamageRemarkId", errorDamageRemark.getId()); @@ -3712,7 +3736,76 @@ idCardDefinitionJsonObj); JSONArray packingTaskInfoList = new JSONArray(); if(packingTaskList != null){ + List classifyBaskets = new ArrayList(); for (PackingTask packingTask : packingTaskList) { + String classifyBasketIds = packingTask.getClassifyBasketIds(); + if(StringUtils.isNotBlank(classifyBasketIds)){ + Set classifyBasketIdsArr = SqlUtils.splitStringToSet(classifyBasketIds, ";"); + List classifyBasketsOfArr = classifyBasketManager.getByHql(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("id", classifyBasketIdsArr)); + classifyBaskets.addAll(classifyBasketsOfArr); + }else if(DatabaseUtil.isPoIdValid(packingTask.getClassifyBasket_id())){ + if(DatabaseUtil.isPoIdValid(packingTask.getClassifyBasket_id())){ + classifyBaskets.add(classifyBasketManager.get(packingTask.getClassifyBasket_id())); + } + }else if(MathTools.equals(PackingTask.TASK_RECYCLINGRECORD, packingTask.getTaskType()) && StringUtils.isNotBlank(packingTask.getBasketBarcode())){ + Container basket = containerManager.getContainerByBarcode(packingTask.getBasketBarcode()); + if(Container.CONTAINER_STATUS_WASHLOADING.equals(basket.getStatus())){ + RecyclingRecord rr = (RecyclingRecord)objectDao.getById(RecyclingRecord.class.getSimpleName(), packingTask.getSourceId()); + if(rr != null){ + throw new RuntimeException("标识牌条码为"+ barcode +"的【"+ tousseDefinition.getName() +"】的状态为已回收,回收时间:" + sdf.format(rr.getRecyclingTime())); + } + } + } + } + SupplyRoomConfig supplyRoomConfig = supplyRoomConfigManager.getSystemParamsObj(); + + boolean releaseBasketAfterReturn = supplyRoomConfig != null && supplyRoomConfig.ftReleaseBasketAfterReturn()?true:false; + for (ClassifyBasket cb : classifyBaskets) { + //验证篮筐是否清洗 + Container basket = containerManager.getContainerByBarcode(cb.getContainerBarcode()); + String status = basket.getStatus(); + if (Container.CONTAINER_STATUS_WASHLOADING.equals(status)) { + errorMsg = "标识牌条码为"+ barcode +"的【"+ tousseDefinition.getName() +"】的状态为已回收"; + if(cb.getRecyclingTime() != null){ + errorMsg += ",回收时间:" + sdf.format(cb.getRecyclingTime()); + } + throw new RuntimeException(errorMsg); + }else if(Container.CONTAINER_STATUS_WASHING.equals(status)){ + List washRecords = washAndDisinfectRecordManager.getByHql(" washStatus='"+ status +"' and classifyBaskets.id="+ cb.getId()); + errorMsg = "标识牌条码为"+ barcode +"的【"+ tousseDefinition.getName() +"】正在清洗,不能进行装配!"; + WashAndDisinfectRecord washRecord = washRecords.get(0); + if(DatabaseUtil.isPoIdValid(washRecord.getRinserId())){ + Rinser rinser = (Rinser)objectDao.getById(Rinser.class.getSimpleName(), washRecord.getRinserId()); + if(rinser == null){ + continue; + } + CleanMethod cleanMethod = cleanMethodManager.getCleanMethodByName(washRecord.getDisinfectProgram()); + if(cleanMethod != null && cleanMethod.getCleanMinutes() != null && cleanMethod.getCleanMinutes() > 0){ + washAndDisinfectRecordManager.timingAutoCompleteWashRecord(cleanMethod.getCleanMinutes(), washRecord,releaseBasketAfterReturn); + } + Calendar endDate = Calendar.getInstance(); + endDate.setTime(washRecord.getStartDate()); + endDate.add(Calendar.MINUTE, cleanMethod.getCleanMinutes()); + errorMsg += "清洗结束时间:" + sdf.format(endDate.getTime()); + } + }else if(Container.CONTAINER_STATUS_WASHED.equals(status)){ + //验证篮筐清洗完成时间是否清洗完成 + if(supplyRoomConfig != null){ + //清洗时间结束后再装配 + Boolean isPackingAfterWashTimeEnd = supplyRoomConfig.getIsPackingAfterWashTimeEnd(); + if(isPackingAfterWashTimeEnd == null || isPackingAfterWashTimeEnd){; + if(cb != null && cb.getWashEndTime() != null){ + if(cb.getWashEndTime().after(new Date())){ + errorMsg = "标识牌条码为"+ barcode +"的【"+ tousseDefinition.getName() +"】正在清洗,不能进行装配!"; + errorMsg += "清洗结束时间:" + sdf.format(cb.getWashEndTime().getTime()); + throw new RuntimeException(errorMsg); + } + } + } + } + } + } + for (PackingTask packingTask : packingTaskList) { List vos = getWaitPackingTaskTaskVoList(packingTask.getId(), taskGroup, null, null,null, 0, 0); if(CollectionUtils.isNotEmpty(vos)){ for (WaitPackingTaskVo vo : vos) { @@ -3724,6 +3817,9 @@ } } if(CollectionUtils.isEmpty(packingTaskInfoList)){ + if(CollectionUtils.isNotEmpty(packingTaskList)){ + throw new RuntimeException("标识牌条码为"+ barcode + "的【"+ tousseDefinition.getName() +"】属于"+ tousseDefinition.getTaskGroup() +",请进入到该任务组进行装配!"); + } throw new RuntimeException(taskGroup + "不存在该标识牌对应的装配任务!"); } idCardInstanceJsonObj.put("packingTaskInfo", packingTaskInfoList); Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java =================================================================== diff -u -r34424 -r34434 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 34424) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 34434) @@ -1903,6 +1903,10 @@ addLogInfo(params,record.getId()); boolean isChangeApplyDepart = isChangeApplyDepartment(record); + List tousseOfTousseItems = getTousseDefinitionsOfTousseItems(record.getRecyclingApplication()); + if(CollectionUtils.isNotEmpty(tousseOfTousseItems)){ + tousseDefinitions.addAll(tousseOfTousseItems); + } //更新申请单(如果是回收页面直接产添加回收记录则创建申请单) updateInvoicePlan(record,recyclingContext, tousseItemJson, deleteTousseItems, tousseDefinitions, errorDamageDetail, basketItemJson, urgentTousseItems,isForeignTousseApplication,isChangeApplyDepart,tousseDefIdTousseItemVoMap); @@ -1972,6 +1976,22 @@ // throw new RuntimeException("测试"); } /** + * 一次性查询申请单里的包定义 + * @param invoicePlan + * @return + */ + private List getTousseDefinitionsOfTousseItems(InvoicePlan invoicePlan){ + List tds = null; + if(invoicePlan != null && CollectionUtils.isNotEmpty(invoicePlan.getApplicationItems())){ + Set tdIds = new HashSet(); + for (TousseItem ti : invoicePlan.getApplicationItems()) { + tdIds.add(ti.getTousseDefinitionId()); + } + tds = tousseDefinitionManager.getCollection(tdIds); + } + return tds; + } + /** * 设置回收拍照信息 * @param recyclingRecord 回收记录 * @param cameraPhotoInfo 拍照信息 @@ -3848,24 +3868,63 @@ List urgentTousseItems,List tousseDefinitions,Map tousseItemIdAndUrgentAmountMap) { InvoicePlan invoicePlan = null; List tousseItems = null; - for (int i = 0; i < urgentTousseItems.size(); i++) { + Map> packingTasksMap = new HashMap>(); + Set needPackingTds = new HashSet(); + for (int i = 0; i < urgentTousseItems.size(); i++) {//收集需要装配的包定义id UrgentTousseItem urgentTousseItem = urgentTousseItems.get(i); - String tousseName = urgentTousseItem.getTousseName(); Long tousseDefinitionID = urgentTousseItem.getTousseDefinitionID(); + if(!DatabaseUtil.isPoIdValid(tousseDefinitionID)){ + throw new RuntimeException("加急物品参数错误!"); + } Integer urgentAmount = urgentTousseItem.getUrgentAmount(); if (urgentAmount == null){ urgentAmount = 0; } + if(urgentAmount < 0){ + throw new RuntimeException("加急数量必须大于0!"); + } + TousseDefinition td = getTousseDefinition(tousseDefinitions, tousseDefinitionID); + if(td.needPacking()){ + needPackingTds.add(td.getId()); + } + } + if(CollectionUtils.isNotEmpty(needPackingTds)){ + String sql = "where po.sourceId = " + recyclingRecord.getId() + " and po.taskType = " + + PackingTask.TASK_RECYCLINGRECORD + + " and " + + SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseDefinition.id", needPackingTds); + List packingTasks = objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + if(CollectionUtils.isNotEmpty(packingTasks)){ + for (PackingTask packingTask : packingTasks) { + if(packingTask.getTousseDefinition() == null){ + continue; + } + List packingTasksOfTd = packingTasksMap.get(packingTask.getTousseDefinition().getId()); + if(packingTasksOfTd == null){ + packingTasksOfTd = new ArrayList(); + } + packingTasksOfTd.add(packingTask); + packingTasksMap.put(packingTask.getTousseDefinition().getId(), packingTasksOfTd); + } + } + } + for (int i = 0; i < urgentTousseItems.size(); i++) { + UrgentTousseItem urgentTousseItem = urgentTousseItems.get(i); + Long tousseDefinitionID = urgentTousseItem.getTousseDefinitionID(); if(!DatabaseUtil.isPoIdValid(tousseDefinitionID)){ throw new RuntimeException("加急物品参数错误!"); } + Integer urgentAmount = urgentTousseItem.getUrgentAmount(); + if (urgentAmount == null){ + urgentAmount = 0; + } if(urgentAmount < 0){ throw new RuntimeException("加急数量必须大于0!"); } + String tousseName = urgentTousseItem.getTousseName(); TousseDefinition td = getTousseDefinition(tousseDefinitions, tousseDefinitionID); - if(td.needPacking()){ - List packingTasks = packingManager.getPackingTask(recyclingRecord.getId(), tousseDefinitionID, PackingTask.TASK_RECYCLINGRECORD); + List packingTasks = packingTasksMap.get(tousseDefinitionID); if(CollectionUtils.isEmpty(packingTasks) && urgentAmount.intValue() > 0){ //看是否已经回收,可能未回收(部分回收的情况) RecyclingItem ri = findRecyclingItem(recyclingRecord, tousseDefinitionID); @@ -4243,9 +4302,9 @@ TousseItem appItem = appTousseItemMap.get(tousseDefinitionID); if(appItem == null){ //tousseDefinitionID可能是祖先包定义的id(如消毒物品),那根据祖先id查找申请项 - List tds = tousseDefinitionManager.getCollection(appTousseItemMap.keySet()); - if(CollectionUtils.isNotEmpty(tds)){ - TousseDefinition findTd = tousseDefinitionManager.findByAncestorId(tds, tousseDefinitionID); + TousseDefinition td = getTousseDefinition(tousseDefinitions, tousseDefinitionID); + if(td != null){ + TousseDefinition findTd = tousseDefinitionManager.findByAncestorId(tousseDefinitions, tousseDefinitionID); if(findTd != null){ appItem = appTousseItemMap.get(findTd.getId()); } @@ -7991,6 +8050,7 @@ List tdList = tousseDefinitionManager.getCollection(tdIds); List tousseNames = new ArrayList(); if(CollectionUtils.isNotEmpty(tdList)){ + checkTousseStatus(recyclingRecordId, tdIds); for (int k = 0; k < tdList.size(); k++) { TousseDefinition td = tdList.get(k); if(getAmountOfPacked(recyclingRecordId, td, classifyBasketId) > 0){ @@ -8016,7 +8076,38 @@ } return arr; } - + /** + * 检查回收记录的包状态 是否是已装配 已审核 已灭菌 + * @param recyclingRecordId + * @param tdIds + */ + private void checkTousseStatus(Long recyclingRecordId, Set tdIds){ + String sql = " po.idCardInstanceID is not null and po.recyclingRecordId=" + recyclingRecordId + + " and po.status in ('"+ + TousseInstance.STATUS_PACKED + +"','"+ + TousseInstance.STATUS_REVIEWED + +"','"+ + TousseInstance.STATUS_STERILED + +"')" + + " and "+ SqlUtils.getNonStringFieldInLargeCollectionsPredicate("po.tousseDefinition.id", tdIds); + List tis = tousseInstanceManager.getByHql(sql); + if(CollectionUtils.isNotEmpty(tis)){ + TousseInstance ti = tis.get(0); + //标识牌条码为xxx的yyy的当前状态为:zzz,不允许删除!操作时间:2022-08-20 18:05:14” + IDCardInstance idCardInstance = (IDCardInstance)objectDao.getById(IDCardInstance.class.getSimpleName(), ti.getIdCardInstanceID()); + String msg = "标识牌条码为"+ idCardInstance.getBarcode() +"的"+ ti.getTousseName() +"的当前状态为:"+ ti.getStatus() +",不允许删除!操作时间:"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + if(TousseInstance.STATUS_PACKED.equals(ti.getStatus())){ + msg += sdf.format(ti.getOperationTime()); + }else if(TousseInstance.STATUS_REVIEWED.equals(ti.getStatus())){ + msg += sdf.format(ti.getReviewTime()); + }else if(TousseInstance.STATUS_STERILED.equals(ti.getStatus())){ + msg += sdf.format(ti.getSterileEndDate()); + } + throw new SystemException(msg); + } + } @Override @SuppressWarnings("unchecked") public JSONArray loadApplicationTousseSplitByOrgUnit(Long recyclingRecordId) { Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/action/RecyclingRecordAction.java =================================================================== diff -u -r34346 -r34434 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/action/RecyclingRecordAction.java (.../RecyclingRecordAction.java) (revision 34346) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/action/RecyclingRecordAction.java (.../RecyclingRecordAction.java) (revision 34434) @@ -662,23 +662,23 @@ * 打开历史回收记录,做扣减回收数量验证 */ public void verifyDeleteItemsInBasket(){ - boolean success = false; JSONArray arr = null; + JSONObject jsonObj = null; try { Long recyclingRecordId = StrutsParamUtils.getPraramLongValue("recyclingRecordId", 0L); String delInfo = StrutsParamUtils.getPraramValue("delInfo", null); if(StringUtils.isBlank(delInfo)){ throw new SystemException("参数delInfo为空"); } arr = recyclingRecordManager.verifyDeleteItemsInBasket(delInfo, recyclingRecordId); - success = true; + jsonObj = JSONUtil.buildJsonObject(true, arr); } catch (Exception e) { e.printStackTrace(); + jsonObj = JSONUtil.buildJsonObject(false, e.getMessage()); } if(arr == null){ arr = new JSONArray(); } - JSONObject jsonObj = JSONUtil.buildJsonObject(success, arr); StrutsResponseUtils.output(jsonObj); } /** Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r34321 -r34434 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 34321) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 34434) @@ -8861,10 +8861,10 @@ break; case TousseInstance.STATUS_DELAY_CONFIRM: case TousseInstance.STATUS_STERILING: - dateStr = ti.getSterileStartDate(); + dateStr = ti.getSterileStartTime(); break; case TousseInstance.STATUS_STERILED: - dateStr = ti.getSterileEndDate(); + dateStr = ti.getSterileEndTime(); break; case TousseInstance.STATUS_SHIPPED: dateStr = ti.getInvoiceSendTimeStr();