Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java =================================================================== diff -u -r41338 -r41340 --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 41338) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImpl.java (.../SterilizationRecordManagerImpl.java) (revision 41340) @@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest; +import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.model.ScanMonitoringResult; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.model.SterilisationNotice; import com.forgon.tools.compare.ObjectUtils; import net.sf.json.JSONArray; @@ -3327,14 +3328,7 @@ return (int)diff; } } - - /** - * 验证验证是否需要扫描监测包条码 - * @param sr - * @param sterilizationRecord - * @param tousseInstanceBarcodes - */ - private void isNeedScanMonitoringTousse(SterilizationRecord sterilizationRecord, Collection allTousseInstances) { + void isNeedScanMonitoringTousse(SterilizationRecord sterilizationRecord, Collection allTousseInstances) { Sterilizer sr = sterilizerManager.getSterilizerByName(sterilizationRecord.getSterilizerName()); String monitorTousseDisplay = sr.getMonitorTousseDisplay(); @@ -3401,75 +3395,33 @@ } } } - - boolean unScanMonitorPackageBarcode = false; - boolean unScanChemistryPackageBarcode = false; + ScanMonitoringResult result = new ScanMonitoringResult(); String[] monitorTousseDisplayArray = monitorTousseDisplay.split(";"); for (int i = 0; i < monitorTousseDisplayArray.length; i++) { String item = monitorTousseDisplayArray[i]; - if(unScanMonitorPackageBarcode && unScanChemistryPackageBarcode){ + if(result.isUnScanMonitorPackageBarcode() && result.isUnScanChemistryPackageBarcode()){ break; } //每炉(第1炉除外) if (item.indexOf(Sterilizer.MONITORTOUSSEDISPLAY_EVERYTHING) >= 0 && frequency != 1) { - if (item.indexOf("生物") >= 0 && item.indexOf("化学") >= 0 && StringUtils.isBlank(monitorPackageBarcode) && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanMonitorPackageBarcode = true; - unScanChemistryPackageBarcode = true; - break; - } else if (item.indexOf("生物") >= 0 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } else if (item.indexOf("化学") >= 0 && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanChemistryPackageBarcode = true; - } else if (item.indexOf("生物") == -1 && item.indexOf("化学") == -1 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } + if (checkItem(item, monitorPackageBarcode, chemistryPackageBarcode, result)) break; } //每天第一炉 if (item.indexOf(Sterilizer.MONITORTOUSSEDISPLAY_FIRST) >= 0 && frequency == 1) { - if (item.indexOf("生物") >= 0 && item.indexOf("化学") >= 0 && StringUtils.isBlank(monitorPackageBarcode) && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanMonitorPackageBarcode = true; - unScanChemistryPackageBarcode = true; - break; - } else if (item.indexOf("生物") >= 0 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } else if (item.indexOf("化学") >= 0 && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanChemistryPackageBarcode = true; - } else if (item.indexOf("生物") == -1 && item.indexOf("化学") == -1 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } + if (checkItem(item, monitorPackageBarcode, chemistryPackageBarcode, result)) break; } //有植入物时 if (item.indexOf(Sterilizer.MONITORTOUSSEDISPLAY_IMPLANT) >= 0 && includeImplant) { - if (item.indexOf("生物") >= 0 && item.indexOf("化学") >= 0 && StringUtils.isBlank(monitorPackageBarcode) && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanMonitorPackageBarcode = true; - unScanChemistryPackageBarcode = true; - break; - } else if (item.indexOf("生物") >= 0 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } else if (item.indexOf("化学") >= 0 && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanChemistryPackageBarcode = true; - } else if (item.indexOf("生物") == -1 && item.indexOf("化学") == -1 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } + if (checkItem(item, monitorPackageBarcode, chemistryPackageBarcode, result)) break; } //有外来器械包时 if (item.indexOf(Sterilizer.MONITORTOUSSEDISPLAY_FOREIGN_TOUSSE) >= 0 && includeForeignTousse) { - if (item.indexOf("生物") >= 0 && item.indexOf("化学") >= 0 && StringUtils.isBlank(monitorPackageBarcode) && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanMonitorPackageBarcode = true; - unScanChemistryPackageBarcode = true; - break; - } else if (item.indexOf("生物") >= 0 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } else if (item.indexOf("化学") >= 0 && StringUtils.isBlank(chemistryPackageBarcode)) { - unScanChemistryPackageBarcode = true; - } else if (item.indexOf("生物") == -1 && item.indexOf("化学") == -1 && StringUtils.isBlank(monitorPackageBarcode)) { - unScanMonitorPackageBarcode = true; - } + if (checkItem(item, monitorPackageBarcode, chemistryPackageBarcode, result)) break; } } @@ -3478,20 +3430,35 @@ // 无论灭菌炉管理里的【监测包扫描提示默认值】是如何设置的, // 录入灭菌记录时扫描生物监测包后不强制要求扫描化学监测包, // 即扫描生物监测包后,化学监测包可扫可不扫,如果扫了生物监测包但是没有扫描化学监测包,也可以保存灭菌记录,不用进行提示。 - unScanChemistryPackageBarcode = false; + result.setUnScanChemistryPackageBarcode(false); } - if(unScanMonitorPackageBarcode && unScanChemistryPackageBarcode){ + if(result.isUnScanMonitorPackageBarcode() && result.isUnScanChemistryPackageBarcode()){ throw new UnScanSterilizationMonitoringPackageException("请扫描化学监测包条码和生物监测包条码!"); - }else if(unScanMonitorPackageBarcode){ + }else if(result.isUnScanMonitorPackageBarcode()){ throw new UnScanSterilizationMonitoringPackageException("请扫描生物监测包条码!"); - }else if(unScanChemistryPackageBarcode){ + }else if(result.isUnScanChemistryPackageBarcode()){ throw new UnScanSterilizationMonitoringPackageException("请扫描化学监测包条码!"); } } } - /** + private static boolean checkItem(String item, String monitorPackageBarcode, String chemistryPackageBarcode, ScanMonitoringResult result) { + if (item.indexOf("生物") >= 0 && item.indexOf("化学") >= 0 && StringUtils.isBlank(monitorPackageBarcode) && StringUtils.isBlank(chemistryPackageBarcode)) { + result.setUnScanMonitorPackageBarcode(true); + result.setUnScanChemistryPackageBarcode(true); + return true; + } else if (item.indexOf("生物") >= 0 && StringUtils.isBlank(monitorPackageBarcode)) { + result.setUnScanMonitorPackageBarcode(true); + } else if (item.indexOf("化学") >= 0 && StringUtils.isBlank(chemistryPackageBarcode)) { + result.setUnScanChemistryPackageBarcode(true); + } else if (item.indexOf("生物") == -1 && item.indexOf("化学") == -1 && StringUtils.isBlank(monitorPackageBarcode)) { + result.setUnScanMonitorPackageBarcode(true); + } + return false; + } + + /** * 删除篮筐内器械包 * @param delTousseJsonArr 删除的器械包和篮筐信息 * @param sterilizationRecord 灭菌记录 Index: ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/model/ScanMonitoringResult.java =================================================================== diff -u --- ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/model/ScanMonitoringResult.java (revision 0) +++ ssts-sterile/src/main/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/model/ScanMonitoringResult.java (revision 41340) @@ -0,0 +1,31 @@ +package com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.model; + +/** + * 监测包扫描提示检查结果 + */ +public class ScanMonitoringResult { + /** + * 是否未扫描生物监测包 + */ + private boolean unScanMonitorPackageBarcode = false; + /** + * 是否未扫描化学监测包 + */ + private boolean unScanChemistryPackageBarcode = false; + + public boolean isUnScanMonitorPackageBarcode() { + return unScanMonitorPackageBarcode; + } + + public void setUnScanMonitorPackageBarcode(boolean unScanMonitorPackageBarcode) { + this.unScanMonitorPackageBarcode = unScanMonitorPackageBarcode; + } + + public boolean isUnScanChemistryPackageBarcode() { + return unScanChemistryPackageBarcode; + } + + public void setUnScanChemistryPackageBarcode(boolean unScanChemistryPackageBarcode) { + this.unScanChemistryPackageBarcode = unScanChemistryPackageBarcode; + } +} Index: ssts-sterile/src/test/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImplIsNeedScanMonitoringTousseTest.java =================================================================== diff -u --- ssts-sterile/src/test/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImplIsNeedScanMonitoringTousseTest.java (revision 0) +++ ssts-sterile/src/test/java/com/forgon/disinfectsystem/sterilizationmanager/sterilizationrecord/service/SterilizationRecordManagerImplIsNeedScanMonitoringTousseTest.java (revision 41340) @@ -0,0 +1,550 @@ +package com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service; + +import com.forgon.Constants; +import com.forgon.disinfectsystem.basedatamanager.sterilisation.service.SterilisationManager; +import com.forgon.disinfectsystem.basedatamanager.sterilizer.service.SterilizerManager; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilisation.Sterilisation; +import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.packing.ReviewedBasket; +import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.exception.UnScanSterilizationMonitoringPackageException; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.ConfigUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.MockitoAnnotations; + +import java.util.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +public class SterilizationRecordManagerImplIsNeedScanMonitoringTousseTest { + + @InjectMocks + private SterilizationRecordManagerImpl sterilizationRecordManager; + + @Mock + private SterilizerManager sterilizerManager; + + @Mock + private SterilisationManager sterilisationManager; + + @Mock + private ObjectDao objectDao; + + @Mock + private TousseInstanceManager tousseInstanceManager; + + private AutoCloseable autoCloseable; + + @Before + public void setUp() { + autoCloseable = MockitoAnnotations.openMocks(this); + } + + @After + public void tearDown() throws Exception { + autoCloseable.close(); + } + + /** + * 测试用例1:灭菌程序中的“进行监测包提示”字段为“否”,不抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_ScanMonitoringTousseNo() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizationType("testType"); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + Sterilisation sterilisation = new Sterilisation(); + sterilisation.setScanMonitoringTousse(Constants.STR_NO); + when(sterilisationManager.getSterilisationByName("testType")).thenReturn(sterilisation); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例2:生物监测包条码已被使用,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_MonitorPackageBarcodeUsed() { + SterilizationRecord record = new SterilizationRecord(); + record.setMonitorPackageBarcode("usedBarcode"); + record.setId(1L); + record.setSterilizerName("testSterilizer"); + Sterilizer sterilizer = new Sterilizer(); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + when(objectDao.countBySql("select count(id) from sterilizationRecord where monitorPackageBarcode = 'usedBarcode' and id <> 1")).thenReturn(1); + + assertThrows(UnScanSterilizationMonitoringPackageException.class, () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + } + + /** + * 测试用例3:化学监测包条码已被使用,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_ChemistryPackageBarcodeUsed() { + SterilizationRecord record = new SterilizationRecord(); + record.setChemistryPackageBarcode("usedBarcode"); + record.setId(1L); + record.setSterilizerName("testSterilizer"); + Sterilizer sterilizer = new Sterilizer(); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + when(objectDao.countBySql("select count(id) from sterilizationRecord where chemistryPackageBarcode = 'usedBarcode' and id <> 1")).thenReturn(1); + + assertThrows(UnScanSterilizationMonitoringPackageException.class, () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包和化学监测包但都未扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BiologicalAndChemistryButBothNotScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描化学监测包条码和生物监测包条码!", e.getMessage()); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包和化学监测包但生物监测包未扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BiologicalAndChemistryButBiologicalNotScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setChemistryPackageBarcode("chemistryBarcode"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描生物监测包条码!", e.getMessage()); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包和化学监测包但化学监测包未扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BiologicalAndChemistryButChemistryNotScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setMonitorPackageBarcode("biologicalBarcode"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描化学监测包条码!", e.getMessage()); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包和化学监测包并且都扫描了,正常通过。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BiologicalAndChemistryWithBothScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setMonitorPackageBarcode("biologicalBarcode"); + record.setChemistryPackageBarcode("chemistryBarcode"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包但没有扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BiologicalWithoutScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setChemistryPackageBarcode("chemistryBarcode"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描生物监测包条码!", e.getMessage()); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包并且扫描了,正常通过。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BiologicalAndScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setMonitorPackageBarcode("biologicalBarcode"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描化学监测包但没有扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_ChemistryWithoutScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setChemistryPackageBarcode(""); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描化学监测包条码!", e.getMessage()); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包并且扫描了,正常通过。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_ChemistryAndScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + record.setChemistryPackageBarcode("chemistryBarcode"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,不需要扫描生物监测包和化学监测包,并且都没扫。不知道为什么,这里需要提示扫描生物监测包 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BothNotNeed() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描生物监测包条码!", e.getMessage()); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,不需要扫描生物监测包和化学监测包,然后扫描了生物检测包,通过 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BothNotNeedAndBiologicalScanned() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setMonitorPackageBarcode("biologicalBarcode"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例4:监测包扫描提示默认值为“每炉(第1炉除外)”,需要扫描生物监测包和化学监测包并且都没扫,但当前是第1炉,通过 + */ + @Test + public void testIsNeedScanMonitoringTousse_Everything_BothNeedButWithFrequencyOne() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(1); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例5:监测包扫描提示默认值为“每天第一炉”,需要扫描化学监测包但未扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_First_Chemistry() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(1); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每天第1炉_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + assertThrows(UnScanSterilizationMonitoringPackageException.class, () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + } + + /** + * 测试用例5:监测包扫描提示默认值为“每天第一炉”,需要扫描化学监测包但未扫描,不过当前炉次为2。可以通过。 + */ + @Test + public void testIsNeedScanMonitoringTousse_First_Chemistry_withFrequencyTwo() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每天第1炉_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例6:监测包扫描提示默认值为“有植入物时”,需要扫描生物监测包但未扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Implant_Biological() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("有植入物时_生物"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + TousseInstance instance = new TousseInstance(); + TousseDefinition definition = new TousseDefinition(); + definition.setIncludeImplant(TousseDefinition.INCLUDE_IMPLANT); + instance.setTousseDefinition(definition); + Collection instances = new ArrayList<>(); + instances.add(instance); + + assertThrows(UnScanSterilizationMonitoringPackageException.class, () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, instances)); + } + + /** + * 测试用例6:监测包扫描提示默认值为“有植入物时”,需要扫描生物监测包但未扫描,不过器械包不包含植入物,正常通过。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Implant_Biological_NotIncludeImplant() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setId(12L); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("有植入物时_生物"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + TousseInstance instance = new TousseInstance(); + TousseDefinition definition = new TousseDefinition(); + definition.setIncludeImplant(TousseDefinition.UNINCLUDE_IMPLANT); + instance.setTousseDefinition(definition); + List instances = new ArrayList<>(); + instances.add(instance); + when(tousseInstanceManager.getTousseInstancesOfSterilization_tousseInstance(12L)).thenReturn(instances); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例7:监测包扫描提示默认值为“有外来器械包时”,需要扫描化学监测包但未扫描,抛出异常。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Foreign_Chemistry() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("有外来器械包时_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + TousseInstance instance = new TousseInstance(); + TousseDefinition definition = new TousseDefinition(); + definition.setTousseType(TousseDefinition.PACKAGE_TYPE_FOREIGN); + instance.setTousseDefinition(definition); + Collection instances = new ArrayList<>(); + instances.add(instance); + + assertThrows(UnScanSterilizationMonitoringPackageException.class, () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, instances)); + } + + /** + * 测试用例7:监测包扫描提示默认值为“有外来器械包时”,需要扫描化学监测包但未扫描,不过不包含外来器械,正常通过。 + */ + @Test + public void testIsNeedScanMonitoringTousse_Foreign_Chemistry_WithoutForeignTousse() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("有外来器械包时_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + TousseInstance instance = new TousseInstance(); + TousseDefinition definition = new TousseDefinition(); + definition.setTousseType(TousseDefinition.PACKAGE_TYPE_COMBO); + instance.setTousseDefinition(definition); + List instances = new ArrayList<>(); + instances.add(instance); + + ReviewedBasket basket = new ReviewedBasket(); + basket.setId(3L); + record.setReviewedBaskets(Arrays.asList(basket)); + when(objectDao.findBySql(eq(TousseInstance.class.getSimpleName()), anyString())).thenReturn(instances); + + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + /** + * 测试用例8:系统配置“扫描生物监测包不强制扫描化学监测包”为true,扫描生物监测包后不强制扫描化学监测包。 + */ + @Test + public void testIsNeedScanMonitoringTousse_ScanningTheBiologicalMonitoringPackageDoesNotForceTheScanningOfTheChemicalMonitoringPackage() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setMonitorPackageBarcode("biologicalBarcode"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + try(MockedStatic mockedStatic = mockStatic(ConfigUtils.class)){ + when(ConfigUtils.getSystemSetConfigByNameBool("scanningTheBiologicalMonitoringPackageDoesNotForceTheScanningOfTheChemicalMonitoringPackage")).thenReturn(true); + assertDoesNotThrow(() -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + } + } + + /** + * 测试用例9:组合多种配置:每炉(第1炉除外)_生物;每天第1炉_化学;有植入物时_生物_化学 + */ + @Test + public void testIsNeedScanMonitoringTousse_CombinationOfMultipleConfigurations() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(1); + Sterilizer sterilizer = new Sterilizer(); + sterilizer.setMonitorTousseDisplay("每炉(第1炉除外)_生物;每天第1炉_化学;有植入物时_生物_化学"); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + + // 生效的是 每天第1炉_化学 + UnScanSterilizationMonitoringPackageException e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描化学监测包条码!", e.getMessage()); + + // 扫描化学监测包就可以了 + record.setChemistryPackageBarcode("chemistryBarcode"); + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + + // 不扫化学监测包,炉次修改为2,生效的是 每炉(第1炉除外)_生物 + record.setChemistryPackageBarcode(null); + record.setFrequency(2); + + e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, null)); + assertEquals("请扫描生物监测包条码!", e.getMessage()); + + // 扫描生物监测包就可以了 + record.setMonitorPackageBarcode("biologicalBarcode"); + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + + // 不扫生物监测包,有植入物,第3炉,生效的是 每炉(第1炉除外)_生物和有植入物时_生物_化学 + record.setMonitorPackageBarcode(null); + record.setFrequency(3); + + // 构建【器械包/植入物器械包/聚合包/外来器械包/自定义器械包】这些器械包 + List allTousseInstances = buildMultiTousseInstance(); + + e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, allTousseInstances)); + assertEquals("请扫描化学监测包条码和生物监测包条码!", e.getMessage()); + + // 扫描生物监测包 + record.setMonitorPackageBarcode("biologicalBarcode"); + e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, allTousseInstances)); + assertEquals("请扫描化学监测包条码!", e.getMessage()); + + // 不强制扫描化学监测包, 可以通过 + try(MockedStatic mockedStatic = mockStatic(ConfigUtils.class)){ + when(ConfigUtils.getSystemSetConfigByNameBool("scanningTheBiologicalMonitoringPackageDoesNotForceTheScanningOfTheChemicalMonitoringPackage")).thenReturn(true); + sterilizationRecordManager.isNeedScanMonitoringTousse(record, allTousseInstances); + } + + e = assertThrows(UnScanSterilizationMonitoringPackageException.class, + () -> sterilizationRecordManager.isNeedScanMonitoringTousse(record, allTousseInstances)); + assertEquals("请扫描化学监测包条码!", e.getMessage()); + + // 扫描化学监测包就可以了 + record.setChemistryPackageBarcode("chemistryBarcode"); + sterilizationRecordManager.isNeedScanMonitoringTousse(record, allTousseInstances); + } + + /** + * 灭菌炉 监测包扫描提示默认值 为空,通过 + */ + @Test + public void testIsNeedScanMonitoringTousse_SterilizerMonitoringPackageScanPromptDefaultValueIsEmpty() { + SterilizationRecord record = new SterilizationRecord(); + record.setSterilizerName("testSterilizer"); + record.setFrequency(2); + Sterilizer sterilizer = new Sterilizer(); + when(sterilizerManager.getSterilizerByName("testSterilizer")).thenReturn(sterilizer); + sterilizationRecordManager.isNeedScanMonitoringTousse(record, null); + } + + private static List buildMultiTousseInstance() { + List allTousseInstances = new ArrayList<>(); + TousseInstance tousseInstance = new TousseInstance(); + TousseDefinition tousseDefinition = new TousseDefinition(); + tousseDefinition.setTousseType(TousseDefinition.PACKAGE_TYPE_INSIDE); + tousseInstance.setTousseDefinition(tousseDefinition); + allTousseInstances.add(tousseInstance); + + tousseInstance = new TousseInstance(); + tousseDefinition = new TousseDefinition(); + tousseDefinition.setIncludeImplant(TousseDefinition.INCLUDE_IMPLANT); + tousseInstance.setTousseDefinition(tousseDefinition); + allTousseInstances.add(tousseInstance); + + tousseInstance = new TousseInstance(); + tousseDefinition = new TousseDefinition(); + tousseDefinition.setTousseType(TousseDefinition.PACKAGE_TYPE_COMBO); + tousseInstance.setTousseDefinition(tousseDefinition); + allTousseInstances.add(tousseInstance); + + tousseInstance = new TousseInstance(); + tousseDefinition = new TousseDefinition(); + tousseDefinition.setTousseType(TousseDefinition.PACKAGE_TYPE_FOREIGN); + tousseInstance.setTousseDefinition(tousseDefinition); + allTousseInstances.add(tousseInstance); + + tousseInstance = new TousseInstance(); + tousseDefinition = new TousseDefinition(); + tousseDefinition.setTousseType(TousseDefinition.PACKAGE_TYPE_CUSTOM); + tousseInstance.setTousseDefinition(tousseDefinition); + allTousseInstances.add(tousseInstance); + return allTousseInstances; + } +}