Index: ssts-web/src/test/java/test/forgon/disinfectsystem/sterileRecord/BiologyMonitoringWarningTest.java =================================================================== diff -u -r17180 -r17827 --- ssts-web/src/test/java/test/forgon/disinfectsystem/sterileRecord/BiologyMonitoringWarningTest.java (.../BiologyMonitoringWarningTest.java) (revision 17180) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/sterileRecord/BiologyMonitoringWarningTest.java (.../BiologyMonitoringWarningTest.java) (revision 17827) @@ -43,11 +43,11 @@ /** * 测试生物监测结束的提醒功能 * - 模拟一下四种场景,并且立即触发定时器,断言结果是否和预期的一至 - 1、生物监测“未做”(此时生物监测状态为“未做”,定时器不会修改其生物监测的状态,不需要提示) - 2、生物监测“进行中”(此时生物监测状态为“进行中”,定时器不会修改其生物监测的状态,不需要提示) - 3、生物监测“已结束”(此时定时器立即修改其生物监测的状态为“已结束”,并且需要对当前登录用户做出弹框提示一次) - 4、生物监测“完成”(此时生物监测状态为“已确认”,定时器不会修改其生物监测的状态) + * 模拟一下四种场景,并且立即触发定时器,断言结果是否和预期的一至 + * 1、生物监测“未做”(此时生物监测状态为“未做”,定时器不会修改其生物监测的状态,不需要提示) + * 2、生物监测“进行中”(此时生物监测状态为“进行中”,定时器不会修改其生物监测的状态,不需要提示) + * 3、生物监测“已结束”(此时定时器立即修改其生物监测的状态为“已结束”,并且需要对当前登录用户做出弹框提示一次) + * 4、生物监测“完成”(此时生物监测状态为“已确认”,定时器不会修改其生物监测的状态) * */ @Test Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r17800 -r17827 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 17800) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 17827) @@ -352,7 +352,7 @@ // Map> tousseListMap = new HashMap>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List goodsStockList = new ArrayList(); - List records = getCollection("id", sterilizationRecordIds); + List records = getCollectionForUpdate("id", sterilizationRecordIds); //用锁的机制,这里解决并发的完成灭菌操作 if(CollectionUtils.isEmpty(records)){ return JSONUtil.buildJsonObject(false, "未找到对应的灭菌单"); } @@ -646,7 +646,7 @@ && supplyRoomConfig.getSupplyRoomType() == SupplyRoomConfig.SUPPLYROOM_TYPE_2; if (isSecondSupplyRoomUser) { SupplyRoomConfig supplyRoomConfigParams = supplyRoomConfigManager.getSystemParamsObj(); - //判断如果配置二级供应室是否自动发货不为否并且不需要灭菌完成确认时才自动发货,否则不自动发货 + //判断如果配置二级供应室是否自动发货不为否 if(supplyRoomConfigParams.enableSecondSupplyRoomAutoInvoice()){ //二级供应室 generateInvoiceForSecondSupplyRoom(sterilizationRecord , orgUnitCode , supplyRoomConfigParams.getIsSecondSupplyRoomAutoInvoice()); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/sterileRecord/SterieRecordManagerTests.java =================================================================== diff -u -r16891 -r17827 --- ssts-web/src/test/java/test/forgon/disinfectsystem/sterileRecord/SterieRecordManagerTests.java (.../SterieRecordManagerTests.java) (revision 16891) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/sterileRecord/SterieRecordManagerTests.java (.../SterieRecordManagerTests.java) (revision 17827) @@ -22,12 +22,16 @@ import test.forgon.disinfectsystem.AbstractCSSDTest; import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; +import com.forgon.runwithtrans.model.RunWithTransNewTask; import com.forgon.serialnumber.model.SerialNum; import com.forgon.tools.date.DateTools; @@ -42,6 +46,7 @@ private PackingManager packingManager; @Autowired private SterilizationRecordManager sterilizationRecordManager; + private SterilizationRecord sr = null; /** * 测试聚合包灭菌(无灭菌筐审核) */ @@ -605,4 +610,96 @@ assertEquals(TousseInstance.STATUS_STERILED, tousseInstance.getStatus()); } } + + /** + * 此方法主要测试二级供应室的完成灭菌的并发操作 + * 测试以下1种场景 + * 1、模拟三个用户同时对同一灭菌记录进行完成灭菌操作,并且config.js的配置,灭菌记录不需要确认,并且二级供应室启用自动发货(模式为:对回收自所有科室的物品) 预期结果:只创建一张发货单,并此灭菌记录的所有器械包关联此发货单 + */ + @Test + public void testCompleteSterilizationOfConcurrent() throws InterruptedException { + initCSSDData(); + + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + sr = createSterilizationRecordOfSecond(); + } + }); + Collection srIds = Collections.singleton(sr.getId()); + + Thread t1 = new Thread(){ + public void run() { + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + sterilizationRecordManager.completeSterilization(srIds, Constants.ORG_UNIT_CODE_OR, "oruser1全名", "oruser1全名", false); + } + }); + } + }; + t1.start(); + + Thread t2 = new Thread(){ + public void run() { + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + sterilizationRecordManager.completeSterilization(srIds, Constants.ORG_UNIT_CODE_OR, "oruser1全名", "oruser1全名", false); + } + }); + } + }; + + t2.start(); + Thread t3 = new Thread(){ + public void run() { + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + sterilizationRecordManager.completeSterilization(srIds, Constants.ORG_UNIT_CODE_OR, "oruser1全名", "oruser1全名", false); + } + }); + } + }; + t3.start(); + + t1.join(); + t2.join(); + t3.join(); + + assertEquals(invoiceManager.getAllInvoice().size(), 1); + } + + /** + * 创建一条灭菌记录(处理科室为二级供应室) + * @return + */ + private SterilizationRecord createSterilizationRecordOfSecond() { + //装配管理 + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseInstance ti_开胸包 = new TousseInstance(); + ti_开胸包.setTousseDefinition(td_开胸包); + ti_开胸包.setTousseName(td_开胸包.getName()); + ti_开胸包.setOperationTime(new Date()); + ti_开胸包.setBarcode(serialNumManager.getSerialNumberStr(SerialNum.TYPE_BARCODE)); + ti_开胸包.setType(BarcodeDevice.BARCODE_TYPE_PACKAGE); + ti_开胸包.setStatus(TousseInstance.STATUS_PACKED); + tousseInstanceManager.saveOrUpdate(ti_开胸包); + //审核管理 + packingManager.reviewTousseInstance(ti_开胸包.getId().toString(), "", "手术器械组", "oruser1全名", "oruser1", new Date()); + + //灭菌管理 + Sterilizer s_6号高温蒸汽灭菌炉 = sterilizerManager.getSterilizerByName("6号高温蒸汽灭菌炉"); //灭菌炉 + SterilizationRecord sr = new SterilizationRecord(); //灭菌记录 + sr.setStartDate(new Date()); + sr.setOrgUnitCoding(Constants.ORG_UNIT_CODE_OR); + sr.setSterilizationUser("oruser1全名"); + sr.setSterilizerName(s_6号高温蒸汽灭菌炉.getName()); + sr.setFrequency(2); + sr.setStatus(""); + Collection tousseInstanceBarcodes = Collections.singleton(ti_开胸包.getBarcode()); + sterilizationRecordManager.saveOrUpdateSterilizationRecord(sr, tousseInstanceBarcodes, new ArrayList(), null); + return sr; + } } Index: ssts-web/src/main/java/test/forgon/disinfectsystem/CSSDTestDataProcess.java =================================================================== diff -u -r17822 -r17827 --- ssts-web/src/main/java/test/forgon/disinfectsystem/CSSDTestDataProcess.java (.../CSSDTestDataProcess.java) (revision 17822) +++ ssts-web/src/main/java/test/forgon/disinfectsystem/CSSDTestDataProcess.java (.../CSSDTestDataProcess.java) (revision 17827) @@ -1510,6 +1510,7 @@ supplyRoomConfig.setInvoiceOrigin(SupplyRoomConfig.INVOICE_ORIGIN_RECYCLING); supplyRoomConfig.setDiposablePriceFluctuation(DIPOSABLEGOODS_PRICE_F); supplyRoomConfig.setIsPackingAfterWashTimeEnd(false); + supplyRoomConfig.setIsSecondSupplyRoomAutoInvoice(SupplyRoomConfig.SECONDSUPPLYROOM_AUTOINVOICE_FROMALLORG); supplyRoomConfigManager.saveOrUpdate(supplyRoomConfig); //一级供应室(测试供应室)