Index: ssts-web/src/test/java/test/forgon/disinfectsystem/waste/TousseInstanceWasteTests.java =================================================================== diff -u -r26269 -r40634 --- ssts-web/src/test/java/test/forgon/disinfectsystem/waste/TousseInstanceWasteTests.java (.../TousseInstanceWasteTests.java) (revision 26269) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/waste/TousseInstanceWasteTests.java (.../TousseInstanceWasteTests.java) (revision 40634) @@ -229,4 +229,55 @@ } } + /** + * 测试废弃灭菌中的包 + */ + @Test + public void discardTousseInstanceWhenStatusIsSteriling(){ + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + TousseInstance tousseInstance_开胸包1 = new TousseInstance(); + tousseInstance_开胸包1.setTousseDefinition(td_开胸包); + tousseInstance_开胸包1.setStatus(TousseInstance.STATUS_REVIEWED); + tousseInstance_开胸包1.setBarcode(serialNumManager.getSerialNumberStr(SerialNum.TYPE_BARCODE)); + tousseInstanceManager.save(tousseInstance_开胸包1); + + TousseInstance tousseInstance_开颅包1 = new TousseInstance(); + tousseInstance_开颅包1.setTousseDefinition(td_开颅包); + tousseInstance_开颅包1.setStatus(TousseInstance.STATUS_REVIEWED); + tousseInstance_开颅包1.setBarcode(serialNumManager.getSerialNumberStr(SerialNum.TYPE_BARCODE)); + tousseInstanceManager.save(tousseInstance_开颅包1); + + //篮筐01 + Container container = containerManager.getContainerByBarcode(Constants.Barcode.REVIEW_BASKET_1); + //调用灭菌装载至篮筐01 + tousseInstanceManager.addTousseInstanceToBasket( + container.getBarcode(), tousseInstance_开胸包1.getBarcode(), null); + + tousseInstanceManager.addTousseInstanceToBasket( + container.getBarcode(), tousseInstance_开颅包1.getBarcode(), null); + objectDao.getHibernateSession().refresh(container); + objectDao.getHibernateSession().refresh(tousseInstance_开胸包1); + objectDao.getHibernateSession().refresh(tousseInstance_开颅包1); + AssertJUnit.assertEquals(Container.CONTAINER_STATUS_STERILIZELOADING, container.getStatus()); + List waitWasteTousseInstanceList = new ArrayList(); + tousseInstance_开胸包1.setStatus(TousseInstance.STATUS_STERILING); + tousseInstance_开颅包1.setStatus(TousseInstance.STATUS_STERILING); + objectDao.update(tousseInstance_开胸包1); + objectDao.update(tousseInstance_开颅包1); + waitWasteTousseInstanceList.add(tousseInstance_开胸包1); + tousseInstanceManager.discardTousseInstance(waitWasteTousseInstanceList, "测试废弃灭菌中的包"); + objectDao.getHibernateSession().refresh(tousseInstance_开胸包1); + objectDao.getHibernateSession().refresh(container); + AssertJUnit.assertEquals(TousseInstance.STATUS_DISCARD, tousseInstance_开胸包1.getStatus()); + AssertJUnit.assertEquals(TousseInstance.STATUS_STERILING, tousseInstance_开颅包1.getStatus()); + AssertJUnit.assertEquals(Container.CONTAINER_STATUS_STERILIZELOADING, container.getStatus()); + waitWasteTousseInstanceList.clear(); + waitWasteTousseInstanceList.add(tousseInstance_开颅包1); + tousseInstanceManager.discardTousseInstance(waitWasteTousseInstanceList, "测试废弃灭菌中的包"); + objectDao.getHibernateSession().refresh(tousseInstance_开颅包1); + objectDao.getHibernateSession().refresh(container); + AssertJUnit.assertEquals(TousseInstance.STATUS_DISCARD, tousseInstance_开颅包1.getStatus()); + AssertJUnit.assertEquals(Container.CONTAINER_STATUS_FREE, container.getStatus()); + } } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java =================================================================== diff -u -r40604 -r40634 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 40604) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManagerImpl.java (.../TousseInstanceManagerImpl.java) (revision 40634) @@ -722,7 +722,7 @@ //状态为已装配、已审核、灭菌中的包实例ID,如果已经入筐,要从灭菌篮筐中移除。(GDSRMYZHYY-35) List isPackedReviewedSterilingTousseInstanceIdList = new ArrayList(); //状态为已装配、已审核、灭菌中的包实例关联得篮筐实例id - List isPackedReviewedSterilingReviewedBasketIdList = new ArrayList(); + Set isPackedReviewedSterilingReviewedBasketIdList = new HashSet(); //状态不是已装配、已审核、灭菌中的包实例ID,所属仓库清空(所在位置保留不清空) List notPackedReviewedSterilingTousseInstanceIdList = new ArrayList(); Map subForeignProxyItemAmount = new HashMap<>();//key=ForeignProxyItem_id value=废弃的包实例数量 用于联动减少TousseItem.amount 以实现页面上看到发货计划数量减少 @@ -736,7 +736,10 @@ //进行过器械流转的包实例ID List tousseOperateTousseInstanceIdList = new ArrayList(); - + //灭菌记录对应废弃的各种包数量 用于废弃灭菌中的包时,移出篮筐后,修改灭菌记录的各个包数量字段 + Map sterilizationRecordIdToAmountInfo = new HashMap(); + //reviewedBasketId对应的灭菌记录id的map 用于废弃灭菌中的包时 查询不重复复查询篮筐对应的灭菌记录id + Map cbIdToSterilizationRecordId = new HashMap(); //当前器械包待废弃的包实例集合 List waitDiscardTousseInstanceList = new ArrayList(); for(TousseInstance tousseInstanceFirst : tousseInstances){ @@ -790,16 +793,39 @@ || tousseInstance.isSteriling()){ // 状态为灭菌中或者已审核的器械包被废弃时,如果已经入筐,要从灭菌篮筐中移除。(GDSRMYZHYY-35) if(DatabaseUtil.isPoIdValid(tousseInstance.getReviewBasket_id())){ - Long maxRBId = objectDao.getALongNum(" select max(rb.id) maxID from "+ ReviewedBasket.class.getSimpleName() - +" rb where exists (select 1 from " - + ReviewedBasket.class.getSimpleName() - +" cbn where cbn.id= " - + tousseInstance.getReviewBasket_id() - + " and rb.container_id=cbn.container_id) ", "maxID"); - if(MathTools.equals(tousseInstance.getReviewBasket_id(), maxRBId)){//说明是最大的篮筐实例 废弃最大的篮筐实例内的包 才修改容器状态 - isPackedReviewedSterilingReviewedBasketIdList.add(tousseInstance.getReviewBasket_id()); - } + if(!isPackedReviewedSterilingReviewedBasketIdList.contains(tousseInstance.getReviewBasket_id())){ + Long maxRBId = objectDao.getALongNum(" select max(rb.id) maxID from "+ ReviewedBasket.class.getSimpleName() + +" rb where exists (select 1 from " + + ReviewedBasket.class.getSimpleName() + +" cbn where cbn.id= " + + tousseInstance.getReviewBasket_id() + + " and rb.container_id=cbn.container_id) ", "maxID"); + if(MathTools.equals(tousseInstance.getReviewBasket_id(), maxRBId)){//说明是最大的篮筐实例 废弃最大的篮筐实例内的包 才修改容器状态 + isPackedReviewedSterilingReviewedBasketIdList.add(tousseInstance.getReviewBasket_id()); + if(tousseInstance.isSteriling()){ + Long stId = objectDao.getALongNum("select max(sterilizationRecord_id) maxID from " + + " sterilization_reviewed where reviewedBasket_id="+ maxRBId,"maxID"); + if(DatabaseUtil.isPoIdValid(stId)){ + cbIdToSterilizationRecordId.put(tousseInstance.getReviewBasket_id(), stId); + } + } + } + } + if(tousseInstance.isSteriling()){ + Long stId = cbIdToSterilizationRecordId.get(tousseInstance.getReviewBasket_id()); + if(DatabaseUtil.isPoIdValid(stId)){ + JSONObject amountInfo = null; + if(sterilizationRecordIdToAmountInfo.containsKey(stId)){ + amountInfo = sterilizationRecordIdToAmountInfo.get(stId); + }else{ + amountInfo = new JSONObject(); + } + addAmountInfo(amountInfo, tousseInstance); + sterilizationRecordIdToAmountInfo.put(stId, amountInfo); + } + } isPackedReviewedSterilingTousseInstanceIdList.add(tousseInstance.getId()); + } }else{ //状态不是已装配、已审核、灭菌中的器械包实例 @@ -852,18 +878,28 @@ +"','" + TousseInstance.STATUS_DELAY_CONFIRM +"') " - + SqlUtils.getInLongListSql("ti.reviewBasket_id", isPackedReviewedSterilingReviewedBasketIdList)); + + SqlUtils.getInLongListSql("ti.reviewBasket_id", isPackedReviewedSterilingReviewedBasketIdList) + + SqlUtils.getNonStringFieldNotInSql("ti.id", isPackedReviewedSterilingReviewedBasketIdList)); Set updateRbids = new HashSet<>(isPackedReviewedSterilingReviewedBasketIdList); //如果篮筐实例内不存在有效状态的包了 那么容器置为空闲 updateRbids.removeAll(rbIds); if(CollectionUtils.isNotEmpty(updateRbids)){ String updateSql = " update "+ Container.class.getSimpleName() - +" set status='空闲' where exists (select 1 from " + +" set status='"+ Container.CONTAINER_STATUS_FREE +"' where exists (select 1 from " + ReviewedBasket.class.getSimpleName() + " rb where rb.container_id=Container.id " +SqlUtils.getInLongListSql("rb.id", updateRbids) + " )"; objectDao.excuteSQL(updateSql); + objectDao.excuteSQL("delete from Sterilization_reviewed where not exists (select 1 from " + + TousseInstance.class.getSimpleName() + + " ti where ti.reviewBasket_id=Sterilization_reviewed.reviewedBasket_id) " + + SqlUtils.getInLongListSql("reviewedBasket_id", updateRbids)); + objectDao.excuteSQL("delete from "+ ReviewedBasket.class.getSimpleName() +" where not exists (select 1 from " + + TousseInstance.class.getSimpleName() + + " ti where ti.reviewBasket_id=ReviewedBasket.id) " + + SqlUtils.getInLongListSql("id", updateRbids)); + } } } @@ -903,6 +939,45 @@ if(CollectionUtils.isNotEmpty(tousseOperateTousseInstanceIdList)){ this.updateTousseInstanceTousseOperationNextOperationTime(tousseOperateTousseInstanceIdList, wasteDate); } + if(MapUtils.isNotEmpty(sterilizationRecordIdToAmountInfo)){ + for (Entry entry : sterilizationRecordIdToAmountInfo.entrySet()) { + Long stId = entry.getKey(); + SterilizationRecord sr = (SterilizationRecord)objectDao.getById(SterilizationRecord.class.getSimpleName(), stId); + JSONObject amountInfo = entry.getValue(); + int proxyTousseAmount = amountInfo.optInt("proxyTousseAmount"); + int dressingTousseAmount = amountInfo.optInt("dressingTousseAmount"); + int foreignTousseAmount = amountInfo.optInt("foreignTousseAmount"); + int tousseAmount = amountInfo.optInt("tousseAmount"); + int disinfectionAmount = amountInfo.optInt("disinfectionAmount"); + int amount = amountInfo.optInt("amount"); + if(sr.getAmount() != null && amount > 0){ + int subAmount = sr.getAmount() - amount; + sr.setAmount(subAmount > 0?subAmount:0); + } + if(sr.getProxyTousseAmount() != null && proxyTousseAmount > 0){ + int subAmount = sr.getProxyTousseAmount() - proxyTousseAmount; + sr.setProxyTousseAmount(subAmount > 0?subAmount:0); + } + if(sr.getDressingTousseAmount() != null && dressingTousseAmount > 0){ + int subAmount = sr.getDressingTousseAmount() - dressingTousseAmount; + sr.setDressingTousseAmount(subAmount > 0?subAmount:0); + } + if(sr.getForeignTousseAmount() != null && foreignTousseAmount > 0){ + int subAmount = sr.getForeignTousseAmount() - foreignTousseAmount; + sr.setForeignTousseAmount(subAmount > 0?subAmount:0); + + } + if(sr.getTousseAmount() != null && tousseAmount > 0){ + int subAmount = sr.getTousseAmount() - tousseAmount; + sr.setTousseAmount(subAmount > 0?subAmount:0); + } + if(sr.getDisinfectionAmount() != null && disinfectionAmount > 0){ + int subAmount = sr.getDisinfectionAmount() - disinfectionAmount; + sr.setDisinfectionAmount(subAmount > 0?subAmount:0); + } + objectDao.update(sr); + } + } if(CollectionUtils.isNotEmpty(subForeignProxyTousseInfos)){ handleSubForeignProxyItemAmount(subForeignProxyItemAmount); appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_FOREIGNPROXYDISINFECTION, Log.TYPE_UPDATE, @@ -913,7 +988,36 @@ } } } - + private void addAmountInfo(JSONObject amountInfo, TousseInstance tousseInstance){ + TousseDefinition td = tousseInstance.getTousseDefinition(); + // 敷料包 + if (td.isDressing()) { + if (DatabaseUtil.isPoIdValid(tousseInstance.getProxyDisinfection_id())) { + amountInfo.put("proxyTousseAmount", MathTools.add(1, amountInfo.optInt("proxyTousseAmount"))); + } else { + amountInfo.put("dressingTousseAmount", MathTools.add(1, amountInfo.optInt("dressingTousseAmount"))); + } + // 内部包 自定义器械包 灭菌物品 + } else if (td.isInsideTousse() + || td.isCustomTousse() + || td.isSterilizationTousse() || td.isComboTousse()) { + if (DatabaseUtil.isPoIdValid(tousseInstance.getProxyDisinfection_id())) { + amountInfo.put("proxyTousseAmount", MathTools.add(1, amountInfo.optInt("proxyTousseAmount"))); + } else if (TousseDefinition.STR_YES.equals(td.getIsForeignTousse())) { + amountInfo.put("foreignTousseAmount", MathTools.add(1, amountInfo.optInt("foreignTousseAmount"))); + } else { + amountInfo.put("tousseAmount", MathTools.add(1, amountInfo.optInt("tousseAmount"))); + } + // 外来器械包(包括但不限于"外来器械包"、"外来器械拆分小包"、"外来器械包当普通器械包") + } else if (td.isSplit() || td.isForeignTousse()) { + amountInfo.put("foreignTousseAmount", MathTools.add(1, amountInfo.optInt("foreignTousseAmount"))); + } else if (td.isForeignProxyTousse()) { + amountInfo.put("proxyTousseAmount", MathTools.add(1, amountInfo.optInt("proxyTousseAmount"))); + } else if(td.isDisinfection()){ + amountInfo.put("disinfectionAmount", MathTools.add(1, amountInfo.optInt("disinfectionAmount"))); + } + amountInfo.put("amount", MathTools.add(1, amountInfo.optInt("amount"))); + } @Override public void handleSubForeignProxyItemAmount(Map subForeignProxyItemAmount){ if(MapUtils.isEmpty(subForeignProxyItemAmount)){