Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java =================================================================== diff -u -r41319 -r41401 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 41319) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 41401) @@ -8941,6 +8941,7 @@ JSONObject obj = null; if(recyclingRecord != null){ obj = recyclingRecordToJson(recyclingRecord); + addContainerInfo(obj.optJSONArray("classifyBaskets")); setLastTousseBarcode(recyclingRecord, obj); Map tdMap = getTdMap(recyclingRecord); setRecyclingItemInfo(recyclingRecord, obj, tdMap); @@ -9190,9 +9191,66 @@ } } } + @Override + public void addContainerInfo(JSONArray classifyBaskets) { + if (classifyBaskets == null || classifyBaskets.isEmpty()) { + return; + } + + // 提取所有有效的容器条码 + List validBarcodes = extractValidBarcodes(classifyBaskets); + if (validBarcodes.isEmpty()) { + return; + } + + // 批量查询颜色代码 + Map barcodeColorMap = containerManager.batchQueryColorCodes(validBarcodes); + + // 更新JSON数组 + updateClassifyBaskets(classifyBaskets, barcodeColorMap); + } + /** + * 提取有效条码 + * @param classifyBaskets + * @return + */ + private List extractValidBarcodes(JSONArray classifyBaskets) { + List validBarcodes = new ArrayList<>(); + if(classifyBaskets == null){ + return new ArrayList(); + } + for (int i = 0; i < classifyBaskets.size(); i++) { + JSONObject classifyBasket = classifyBaskets.getJSONObject(i); + String containerBarcode = classifyBasket.optString("containerBarcode"); + if (StringUtils.isNotBlank(containerBarcode)) { + validBarcodes.add(containerBarcode); + } + } + return validBarcodes; + } - /** + * 修改classifyBaskets中的篮筐颜色信息 + * @param classifyBaskets + * @param barcodeColorMap 篮筐颜色信息 key:barcode value:colorCode + */ + private void updateClassifyBaskets(JSONArray classifyBaskets, Map barcodeColorMap) { + if(MapUtils.isEmpty(barcodeColorMap)){ + return; + } + for (int i = 0; i < classifyBaskets.size(); i++) { + JSONObject classifyBasket = classifyBaskets.getJSONObject(i); + String containerBarcode = classifyBasket.optString("containerBarcode"); + + if (StringUtils.isNotBlank(containerBarcode)) { + String colorCode = barcodeColorMap.get(containerBarcode); + if (colorCode != null) { + classifyBasket.put("colorCode", colorCode); + } + } + } + } + /** * 根据篮筐物品的lastTousseInstanceId,为篮筐物品设置被二次回收的器械包实例的条码 * @param recyclingRecord 回收记录 * @param obj @@ -11285,6 +11343,7 @@ if(container != null){ classifyBasketJson.put("containerStatus",container.getStatus()); classifyBasketJson.put("washClassifyType",container.getWashClassifyType()); + classifyBasketJson.put("containerColorCode",container.getColorCode()); } classifyBasketJson.put("", classifyBasket.getContainerStatus()); classifyBasketJson.put("containerName", classifyBasket.getContainerName()); @@ -11313,6 +11372,7 @@ JSONArray unfinishedPackingTask = null; Set shareDeparts = null;//共享科室 boolean isFixedBarcode = false; + String containerColorCode = null; JSONObject tousseInstanceOrgUnit = null;//器械包对应的科室,用来回收扫码标识牌或包实例时,自动填入科室。如果包的状态为已使用,则取该包所在的使用记录的录入科室;包的状态为已签收,则取签收科室;包的状态为已发货,则取发货到的科室。 Exception exception = null; TousseDefinition ancestorTd = null; @@ -11342,6 +11402,7 @@ if(!StringUtils.equals(container.getDepartCode(), AcegiHelper.getCurrentOrgUnitCode())){ errorMessage = "该清洗篮筐的科室为"+ container.getDepartName() +",只能扫描本科室的清洗篮筐条码!"; }else{ + containerColorCode = container.getColorCode(); try{ ClassifybasketVo classifybasketVo = getClassifyBasket(container, recyclingRecordId); JSONObject obj = classifybasketVo.getErrorObj(); @@ -11814,6 +11875,7 @@ map.put("idCardUseAmount", idCardUseAmount); map.put("isIDCardInstance", isIDCardInstance); map.put("shareDeparts", shareDeparts); + map.put("containerColorCode", containerColorCode); map.put("idCardInstance", idCardInstance); map.put("isTousseNeedMaintain", isTousseNeedMaintain); map.put("unSupplementMaterials", details); Index: ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/AllTests.java =================================================================== diff -u -r41397 -r41401 --- ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/AllTests.java (.../AllTests.java) (revision 41397) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/AllTests.java (.../AllTests.java) (revision 41401) @@ -28,6 +28,8 @@ UnPackingDisinfectGoodsInstanceTests.class, FindWashDataListTest.class, AssociatedWashDataTests.class, + AddContainerInfoForClassifyBasket.class, + BatchQueryColorCodesTests.class, RecyclingRecordTableManagerTests.class, FindWashDataListTest.class, AssociatedWashDataTests.class, Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/container/Container.java =================================================================== diff -u -r39254 -r41401 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/container/Container.java (.../Container.java) (revision 39254) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/container/Container.java (.../Container.java) (revision 41401) @@ -134,6 +134,12 @@ * (from:SZSZLYY-17 灭菌框装载时增加灭菌篮筐的灭菌方式限制(PDA优先)) */ private String sterilingMode; + + /** + * 色码 + * 容器信息中增加"篮筐颜色"设置项GDSKQYY-30 + */ + private String colorCode; public static Map ColumnNameAndPoPropertyNameMap = new LinkedHashMap(2); @@ -357,5 +363,13 @@ public void setSterilingMode(String sterilingMode) { this.sterilingMode = sterilingMode; } + + public String getColorCode() { + return colorCode; + } + + public void setColorCode(String colorCode) { + this.colorCode = colorCode; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/container/service/ContainerManagerImpl.java =================================================================== diff -u -r40668 -r41401 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/container/service/ContainerManagerImpl.java (.../ContainerManagerImpl.java) (revision 40668) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/container/service/ContainerManagerImpl.java (.../ContainerManagerImpl.java) (revision 41401) @@ -9,10 +9,12 @@ import com.forgon.disinfectsystem.entity.basedatamanager.container.ContainerBinding; import com.forgon.exception.SystemException; import com.forgon.tools.StrutsParamUtils; + import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.Query; import org.hibernate.Session; @@ -912,4 +914,34 @@ } return containerBindingInfos; } + @Override + public Map batchQueryColorCodes(List barcodes) { + if (CollectionUtils.isEmpty(barcodes)) { + return Collections.emptyMap(); + } + + // 构建IN查询参数占位符 + String placeholders = String.join(",", Collections.nCopies(barcodes.size(), "?")); + + String sql = "SELECT bd.barcode, c.colorCode " + + "FROM " + BarcodeDevice.class.getSimpleName() + " bd " + + "JOIN " + Container.class.getSimpleName() + " c ON c.id = bd.id " + + "WHERE bd.barcode IN (" + placeholders + ") "; + + List params = new ArrayList<>(barcodes); + + List> results = objectDao.findSqlByParam(sql, params); + if(CollectionUtils.isEmpty(results)){ + return new HashMap(); + } + Map barcodeColorMap = new HashMap<>(); + for (Map row : results) { + String barcode = (String) row.get("barcode"); + String colorCode = (String) row.get("colorCode"); + if (StringUtils.isNotBlank(barcode) && StringUtils.isNotBlank(colorCode)) { + barcodeColorMap.put(barcode, colorCode); + } + } + return barcodeColorMap; + } } Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManager.java =================================================================== diff -u -r40937 -r41401 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManager.java (.../RecyclingRecordManager.java) (revision 40937) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManager.java (.../RecyclingRecordManager.java) (revision 41401) @@ -349,5 +349,10 @@ * @return */ public JSONObject checkCleanType(TousseDefinition td, Set tousseDefinitionIds); + /** + * 添加容器的信息 比如颜色 + * @param classifyBaskets + */ + public void addContainerInfo(JSONArray classifyBaskets); } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/service/AddContainerInfoForClassifyBasket.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/service/AddContainerInfoForClassifyBasket.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/service/AddContainerInfoForClassifyBasket.java (revision 41401) @@ -0,0 +1,511 @@ +package test.forgon.disinfectsystem.recyclingrecord.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.forgon.disinfectsystem.basedatamanager.container.service.ContainerManager; +import com.forgon.disinfectsystem.recyclingrecord.service.RecyclingRecordManagerImpl; +/** + * 添加容器的信息 比如颜色 + * + */ +public class AddContainerInfoForClassifyBasket { + @InjectMocks + private RecyclingRecordManagerImpl recyclingRecordManagerImpl; + + @Mock + private ContainerManager containerManager; + + + private AutoCloseable closeable; + @Before + public void setUp() { + closeable = MockitoAnnotations.openMocks(this); + } + @After + public void tearDown() throws Exception { + closeable.close(); + } + // 测试 addContainerInfo 方法 + @Test + public void testAddContainerInfo_WithValidBarcodes() { + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", "BARCODE002"); + basket2.put("name", "篮子2"); + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + + // Mock 容器管理器返回颜色代码 + Map colorMap = new HashMap<>(); + colorMap.put("BARCODE001", "#FF0000"); + colorMap.put("BARCODE002", "#00FF00"); + when(containerManager.batchQueryColorCodes(anyList())).thenReturn(colorMap); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证颜色代码被正确添加 + assertEquals("#FF0000", classifyBaskets.getJSONObject(0).getString("colorCode")); + assertEquals("#00FF00", classifyBaskets.getJSONObject(1).getString("colorCode")); + + // 验证调用了容器管理器 + verify(containerManager).batchQueryColorCodes(anyList()); + } + + @Test + public void testAddContainerInfo_WithNullClassifyBaskets() { + // 执行测试 - 传入 null + recyclingRecordManagerImpl.addContainerInfo(null); + + // 验证没有调用容器管理器 + verify(containerManager, never()).batchQueryColorCodes(anyList()); + } + + @Test + public void testAddContainerInfo_WithEmptyClassifyBaskets() { + // 准备测试数据 - 空数组 + JSONArray classifyBaskets = new JSONArray(); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证没有调用容器管理器 + verify(containerManager, never()).batchQueryColorCodes(anyList()); + } + + @Test + public void testAddContainerInfo_WithNoValidBarcodes() { + // 准备测试数据 - 没有有效条码 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("name", "篮子1"); // 没有 containerBarcode + basket1.put("containerBarcode", ""); // 空条码 + + JSONObject basket2 = new JSONObject(); + basket2.put("name", "篮子2"); + basket2.put("containerBarcode", " "); // 空白条码 + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证没有调用容器管理器 + verify(containerManager, never()).batchQueryColorCodes(anyList()); + } + + @Test + public void testAddContainerInfo_WithPartialValidBarcodes() { + // 准备测试数据 - 部分有效条码 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); // 有效条码 + basket1.put("name", "篮子1"); + + JSONObject basket2 = new JSONObject(); + basket2.put("name", "篮子2"); // 没有条码 + + JSONObject basket3 = new JSONObject(); + basket3.put("containerBarcode", "BARCODE003"); // 有效条码 + basket3.put("name", "篮子3"); + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + classifyBaskets.add(basket3); + + // Mock 容器管理器返回颜色代码 + Map colorMap = new HashMap<>(); + colorMap.put("BARCODE001", "#FF0000"); + colorMap.put("BARCODE003", "#0000FF"); + when(containerManager.batchQueryColorCodes(anyList())).thenReturn(colorMap); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证颜色代码被正确添加 + assertEquals("#FF0000", classifyBaskets.getJSONObject(0).getString("colorCode")); + assertFalse(classifyBaskets.getJSONObject(1).containsKey("colorCode")); // 没有条码的篮子没有颜色 + assertEquals("#0000FF", classifyBaskets.getJSONObject(2).getString("colorCode")); + + // 验证只查询了有效条码 + verify(containerManager).batchQueryColorCodes(argThat(list -> + list.size() == 2 && list.contains("BARCODE001") && list.contains("BARCODE003"))); + } + + @Test + public void testAddContainerInfo_WithEmptyColorMap() { + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + classifyBaskets.add(basket1); + + // Mock 容器管理器返回空颜色映射 + when(containerManager.batchQueryColorCodes(anyList())).thenReturn(new HashMap<>()); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证没有添加颜色代码 + assertFalse(classifyBaskets.getJSONObject(0).containsKey("colorCode")); + + // 验证调用了容器管理器 + verify(containerManager).batchQueryColorCodes(anyList()); + } + + @Test + public void testAddContainerInfo_WithNullColorMap() { + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + classifyBaskets.add(basket1); + + // Mock 容器管理器返回 null + when(containerManager.batchQueryColorCodes(anyList())).thenReturn(null); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证没有添加颜色代码 + assertFalse(classifyBaskets.getJSONObject(0).containsKey("colorCode")); + + // 验证调用了容器管理器 + verify(containerManager).batchQueryColorCodes(anyList()); + } + + // 测试 extractValidBarcodes 私有方法 + + @Test + public void testExtractValidBarcodes_AllValid() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("extractValidBarcodes", JSONArray.class); + method.setAccessible(true); + + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", "BARCODE002"); + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + + // 执行测试 + @SuppressWarnings("unchecked") + List result = (List) method.invoke(recyclingRecordManagerImpl, classifyBaskets); + + // 验证结果 + assertNotNull(result); + assertEquals(2, result.size()); + assertTrue(result.contains("BARCODE001")); + assertTrue(result.contains("BARCODE002")); + } + + @Test + public void testExtractValidBarcodes_MixedValidAndInvalid() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("extractValidBarcodes", JSONArray.class); + method.setAccessible(true); + + // 准备测试数据 - 混合有效和无效条码 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); // 有效 + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", ""); // 无效 - 空字符串 + + JSONObject basket3 = new JSONObject(); + basket3.put("containerBarcode", " "); // 无效 - 空白 + + JSONObject basket4 = new JSONObject(); + basket4.put("name", "没有条码"); // 无效 - 缺少字段 + + JSONObject basket5 = new JSONObject(); + basket5.put("containerBarcode", "BARCODE005"); // 有效 + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + classifyBaskets.add(basket3); + classifyBaskets.add(basket4); + classifyBaskets.add(basket5); + + // 执行测试 + @SuppressWarnings("unchecked") + List result = (List) method.invoke(recyclingRecordManagerImpl, classifyBaskets); + + // 验证结果 - 只包含有效条码 + assertNotNull(result); + assertEquals(2, result.size()); + assertTrue(result.contains("BARCODE001")); + assertTrue(result.contains("BARCODE005")); + } + + @Test + public void testExtractValidBarcodes_EmptyArray() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("extractValidBarcodes", JSONArray.class); + method.setAccessible(true); + + // 准备测试数据 - 空数组 + JSONArray classifyBaskets = new JSONArray(); + + // 执行测试 + @SuppressWarnings("unchecked") + List result = (List) method.invoke(recyclingRecordManagerImpl, classifyBaskets); + + // 验证结果 - 空列表 + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @Test + public void testExtractValidBarcodes_NullArray() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("extractValidBarcodes", JSONArray.class); + method.setAccessible(true); + + // 执行测试 - 传入 null + @SuppressWarnings("unchecked") + List result = (List) method.invoke(recyclingRecordManagerImpl, (JSONArray) null); + + // 验证结果 - 空列表 + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + // 测试 updateClassifyBaskets 私有方法 + + @Test + public void testUpdateClassifyBaskets_AllBarcodesHaveColors() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("updateClassifyBaskets", + JSONArray.class, Map.class); + method.setAccessible(true); + + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", "BARCODE002"); + basket2.put("name", "篮子2"); + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + + // 准备颜色映射 + Map colorMap = new HashMap<>(); + colorMap.put("BARCODE001", "#FF0000"); + colorMap.put("BARCODE002", "#00FF00"); + + // 执行测试 + method.invoke(recyclingRecordManagerImpl, classifyBaskets, colorMap); + + // 验证颜色代码被正确添加 + assertEquals("#FF0000", classifyBaskets.getJSONObject(0).getString("colorCode")); + assertEquals("#00FF00", classifyBaskets.getJSONObject(1).getString("colorCode")); + } + + @Test + public void testUpdateClassifyBaskets_SomeBarcodesMissingColors() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("updateClassifyBaskets", + JSONArray.class, Map.class); + method.setAccessible(true); + + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); // 有颜色 + basket1.put("name", "篮子1"); + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", "BARCODE002"); // 没有颜色 + basket2.put("name", "篮子2"); + + JSONObject basket3 = new JSONObject(); + basket3.put("containerBarcode", "BARCODE003"); // 有颜色 + basket3.put("name", "篮子3"); + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + classifyBaskets.add(basket3); + + // 准备颜色映射 - 只包含部分条码的颜色 + Map colorMap = new HashMap<>(); + colorMap.put("BARCODE001", "#FF0000"); + colorMap.put("BARCODE003", "#0000FF"); + + // 执行测试 + method.invoke(recyclingRecordManagerImpl, classifyBaskets, colorMap); + + // 验证颜色代码被正确添加 + assertEquals("#FF0000", classifyBaskets.getJSONObject(0).getString("colorCode")); + assertFalse(classifyBaskets.getJSONObject(1).containsKey("colorCode")); // 没有颜色 + assertEquals("#0000FF", classifyBaskets.getJSONObject(2).getString("colorCode")); + } + + @Test + public void testUpdateClassifyBaskets_WithInvalidBarcodes() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("updateClassifyBaskets", + JSONArray.class, Map.class); + method.setAccessible(true); + + // 准备测试数据 - 包含无效条码 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); // 有效条码 + basket1.put("name", "篮子1"); + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", ""); // 无效条码 + basket2.put("name", "篮子2"); + + JSONObject basket3 = new JSONObject(); + basket3.put("name", "篮子3"); // 没有条码 + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + classifyBaskets.add(basket3); + + // 准备颜色映射 + Map colorMap = new HashMap<>(); + colorMap.put("BARCODE001", "#FF0000"); + + // 执行测试 + method.invoke(recyclingRecordManagerImpl, classifyBaskets, colorMap); + + // 验证只有有效条码的篮子被更新 + assertEquals("#FF0000", classifyBaskets.getJSONObject(0).getString("colorCode")); + assertFalse(classifyBaskets.getJSONObject(1).containsKey("colorCode")); // 无效条码 + assertFalse(classifyBaskets.getJSONObject(2).containsKey("colorCode")); // 没有条码 + } + + @Test + public void testUpdateClassifyBaskets_EmptyColorMap() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("updateClassifyBaskets", + JSONArray.class, Map.class); + method.setAccessible(true); + + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + classifyBaskets.add(basket1); + + // 准备空颜色映射 + Map colorMap = new HashMap<>(); + + // 执行测试 + method.invoke(recyclingRecordManagerImpl, classifyBaskets, colorMap); + + // 验证没有添加颜色代码 + assertFalse(classifyBaskets.getJSONObject(0).containsKey("colorCode")); + } + + @Test + public void testUpdateClassifyBaskets_NullColorMap() throws Exception { + // 使用反射测试私有方法 + Method method = recyclingRecordManagerImpl.getClass().getDeclaredMethod("updateClassifyBaskets", + JSONArray.class, Map.class); + method.setAccessible(true); + + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + classifyBaskets.add(basket1); + + // 执行测试 - 传入 null 颜色映射 + method.invoke(recyclingRecordManagerImpl, classifyBaskets, null); + + // 验证没有添加颜色代码 + assertFalse(classifyBaskets.getJSONObject(0).containsKey("colorCode")); + } + + // 集成测试 - 测试完整流程 + + @Test + public void testAddContainerInfo_Integration() { + // 准备测试数据 + JSONArray classifyBaskets = new JSONArray(); + JSONObject basket1 = new JSONObject(); + basket1.put("containerBarcode", "BARCODE001"); + basket1.put("name", "篮子1"); + + JSONObject basket2 = new JSONObject(); + basket2.put("containerBarcode", "BARCODE002"); + basket2.put("name", "篮子2"); + + JSONObject basket3 = new JSONObject(); + basket3.put("name", "篮子3"); // 没有条码 + + classifyBaskets.add(basket1); + classifyBaskets.add(basket2); + classifyBaskets.add(basket3); + + // Mock 容器管理器 + Map colorMap = new HashMap<>(); + colorMap.put("BARCODE001", "#FF0000"); + colorMap.put("BARCODE002", "#00FF00"); + when(containerManager.batchQueryColorCodes(anyList())).thenReturn(colorMap); + + // 执行测试 + recyclingRecordManagerImpl.addContainerInfo(classifyBaskets); + + // 验证完整流程 + assertEquals("#FF0000", classifyBaskets.getJSONObject(0).getString("colorCode")); + assertEquals("#00FF00", classifyBaskets.getJSONObject(1).getString("colorCode")); + assertFalse(classifyBaskets.getJSONObject(2).containsKey("colorCode")); + + // 验证只查询了有效条码 + verify(containerManager).batchQueryColorCodes(argThat(list -> + list.size() == 2 && list.contains("BARCODE001") && list.contains("BARCODE002"))); + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/container/service/ContainerManager.java =================================================================== diff -u -r40663 -r41401 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/container/service/ContainerManager.java (.../ContainerManager.java) (revision 40663) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/container/service/ContainerManager.java (.../ContainerManager.java) (revision 41401) @@ -148,4 +148,10 @@ * @return */ public JSONArray getContainerBindingInfo(Long sterilizationContainerId); + /** + * 获取条码对应的颜色 + * @param barcodes + * @return + */ + public Map batchQueryColorCodes(List barcodes); } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/service/BatchQueryColorCodesTests.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/service/BatchQueryColorCodesTests.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/recyclingrecord/service/BatchQueryColorCodesTests.java (revision 41401) @@ -0,0 +1,421 @@ +package test.forgon.disinfectsystem.recyclingrecord.service; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.forgon.disinfectsystem.basedatamanager.container.service.ContainerManagerImpl; +import com.forgon.tools.hibernate.ObjectDao; +/** + * 获取篮筐条码对应的颜色 + * + */ +public class BatchQueryColorCodesTests { + + @InjectMocks + private ContainerManagerImpl containerManagerImpl; + + @Mock + private ObjectDao objectDao; + private AutoCloseable closeable; + @Before + public void setUp() { + closeable = MockitoAnnotations.openMocks(this); + } + @After + public void tearDown() throws Exception { + closeable.close(); + } + // 测试 batchQueryColorCodes 方法 + + @Test + public void testBatchQueryColorCodes_WithValidBarcodes() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002", "BARCODE003"); + + // Mock 数据库查询结果 + List> mockResults = new ArrayList<>(); + Map row1 = new HashMap<>(); + row1.put("barcode", "BARCODE001"); + row1.put("colorCode", "#FF0000"); + + Map row2 = new HashMap<>(); + row2.put("barcode", "BARCODE002"); + row2.put("colorCode", "#00FF00"); + + Map row3 = new HashMap<>(); + row3.put("barcode", "BARCODE003"); + row3.put("colorCode", "#0000FF"); + + mockResults.add(row1); + mockResults.add(row2); + mockResults.add(row3); + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 + assertNotNull(result); + assertEquals(3, result.size()); + assertEquals("#FF0000", result.get("BARCODE001")); + assertEquals("#00FF00", result.get("BARCODE002")); + assertEquals("#0000FF", result.get("BARCODE003")); + + // 验证 SQL 查询被正确调用 - 修正参数验证 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithEmptyBarcodes() { + // 准备测试数据 - 空列表 + List barcodes = new ArrayList<>(); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 返回空映射 + assertNotNull(result); + assertTrue(result.isEmpty()); + + // 验证没有执行数据库查询 + verify(objectDao, never()).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithNullBarcodes() { + // 执行测试 - 传入 null + Map result = containerManagerImpl.batchQueryColorCodes(null); + + // 验证结果 - 返回空映射 + assertNotNull(result); + assertTrue(result.isEmpty()); + + // 验证没有执行数据库查询 + verify(objectDao, never()).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithPartialValidResults() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002", "BARCODE003"); + + // Mock 数据库查询结果 - 部分有效 + List> mockResults = new ArrayList<>(); + Map row1 = new HashMap<>(); + row1.put("barcode", "BARCODE001"); + row1.put("colorCode", "#FF0000"); // 有效 + + Map row2 = new HashMap<>(); + row2.put("barcode", "BARCODE002"); + row2.put("colorCode", ""); // 无效 - 空颜色代码 + + Map row3 = new HashMap<>(); + row3.put("barcode", "BARCODE003"); + row3.put("colorCode", " "); // 无效 - 空白颜色代码 + + Map row4 = new HashMap<>(); + row4.put("barcode", null); // 无效 - null 条码 + row4.put("colorCode", "#00FF00"); + + // 注意:BARCODE004 不应该出现在结果中,因为 SQL 查询使用了 IN 子句 + // Map row5 = new HashMap<>(); + // row5.put("barcode", "BARCODE004"); // 不在查询列表中的条码 + // row5.put("colorCode", "#FFFF00"); + + mockResults.add(row1); + mockResults.add(row2); + mockResults.add(row3); + mockResults.add(row4); + // mockResults.add(row5); // 移除这个,因为不应该返回 + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 只包含有效的数据 + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals("#FF0000", result.get("BARCODE001")); + assertFalse(result.containsKey("BARCODE002")); // 空颜色代码被过滤 + assertFalse(result.containsKey("BARCODE003")); // 空白颜色代码被过滤 + + // 验证 SQL 查询被正确调用 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithNullResults() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002"); + + // Mock 数据库返回 null + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(null); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 返回空映射 + assertNotNull(result); + assertTrue(result.isEmpty()); + + // 验证 SQL 查询被调用 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithEmptyResults() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002"); + + // Mock 数据库返回空列表 + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(new ArrayList<>()); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 返回空映射 + assertNotNull(result); + assertTrue(result.isEmpty()); + + // 验证 SQL 查询被调用 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithMissingColorCodeField() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002"); + + // Mock 数据库查询结果 - 缺少 colorCode 字段 + List> mockResults = new ArrayList<>(); + Map row1 = new HashMap<>(); + row1.put("barcode", "BARCODE001"); + // 缺少 colorCode 字段 + + Map row2 = new HashMap<>(); + row2.put("barcode", "BARCODE002"); + row2.put("colorCode", "#00FF00"); // 有颜色代码 + + mockResults.add(row1); + mockResults.add(row2); + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 只包含有颜色代码的数据 + assertNotNull(result); + assertEquals(1, result.size()); + assertFalse(result.containsKey("BARCODE001")); // 缺少颜色代码被过滤 + assertEquals("#00FF00", result.get("BARCODE002")); + + // 验证 SQL 查询被调用 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithMissingBarcodeField() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002"); + + // Mock 数据库查询结果 - 缺少 barcode 字段 + List> mockResults = new ArrayList<>(); + Map row1 = new HashMap<>(); + row1.put("colorCode", "#FF0000"); // 缺少 barcode 字段 + + Map row2 = new HashMap<>(); + row2.put("barcode", "BARCODE002"); + row2.put("colorCode", "#00FF00"); // 有颜色代码 + + mockResults.add(row1); + mockResults.add(row2); + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 只包含有条码的数据 + assertNotNull(result); + assertEquals(1, result.size()); + assertFalse(result.containsKey("BARCODE001")); // 缺少条码被过滤 + assertEquals("#00FF00", result.get("BARCODE002")); + + // 验证 SQL 查询被调用 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_WithNullColorCode() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002"); + + // Mock 数据库查询结果 - null 颜色代码 + List> mockResults = new ArrayList<>(); + Map row1 = new HashMap<>(); + row1.put("barcode", "BARCODE001"); + row1.put("colorCode", null); // null 颜色代码 + + Map row2 = new HashMap<>(); + row2.put("barcode", "BARCODE002"); + row2.put("colorCode", "#00FF00"); // 有效颜色代码 + + mockResults.add(row1); + mockResults.add(row2); + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 - 只包含非null颜色代码的数据 + assertNotNull(result); + assertEquals(1, result.size()); + assertFalse(result.containsKey("BARCODE001")); // null 颜色代码被过滤 + assertEquals("#00FF00", result.get("BARCODE002")); + + // 验证 SQL 查询被调用 + verify(objectDao).findSqlByParam(anyString(), anyList()); + } + + @Test + public void testBatchQueryColorCodes_SQLGeneration() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002", "BARCODE003"); + + // Mock 数据库查询结果 + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(new ArrayList<>()); + + // 执行测试 + containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证 SQL 语句正确生成 + ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor paramsCaptor = ArgumentCaptor.forClass(List.class); + + verify(objectDao).findSqlByParam(sqlCaptor.capture(), paramsCaptor.capture()); + + // 验证 SQL 语句 + String sql = sqlCaptor.getValue(); + assertNotNull(sql); + assertTrue(sql.contains("SELECT bd.barcode, c.colorCode")); + assertTrue(sql.contains("FROM BarcodeDevice bd")); + assertTrue(sql.contains("JOIN Container c ON c.id = bd.id")); + assertTrue(sql.contains("WHERE bd.barcode IN (?,?,?)")); // 3个占位符 + + // 验证参数 + List params = paramsCaptor.getValue(); + assertEquals(3, params.size()); + assertEquals("BARCODE001", params.get(0)); + assertEquals("BARCODE002", params.get(1)); + assertEquals("BARCODE003", params.get(2)); + } + + @Test + public void testBatchQueryColorCodes_WithSingleBarcode() { + // 准备测试数据 - 单个条码 + List barcodes = Arrays.asList("BARCODE001"); + + // Mock 数据库查询结果 + List> mockResults = new ArrayList<>(); + Map row1 = new HashMap<>(); + row1.put("barcode", "BARCODE001"); + row1.put("colorCode", "#FF0000"); + + mockResults.add(row1); + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals("#FF0000", result.get("BARCODE001")); + + // 验证 SQL 语句正确生成 + ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); + verify(objectDao).findSqlByParam(sqlCaptor.capture(), anyList()); + + String sql = sqlCaptor.getValue(); + assertTrue(sql.contains("WHERE bd.barcode IN (?)")); // 1个占位符 + } + + @Test + public void testBatchQueryColorCodes_WithLargeBarcodeList() { + // 准备测试数据 - 大量条码 + List barcodes = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + barcodes.add("BARCODE" + String.format("%03d", i)); + } + + // Mock 数据库查询结果 + List> mockResults = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + Map row = new HashMap<>(); + row.put("barcode", "BARCODE" + String.format("%03d", i)); + row.put("colorCode", "#" + String.format("%06d", i)); + mockResults.add(row); + } + + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(mockResults); + + // 执行测试 + Map result = containerManagerImpl.batchQueryColorCodes(barcodes); + + // 验证结果 + assertNotNull(result); + assertEquals(10, result.size()); + for (int i = 1; i <= 10; i++) { + String barcode = "BARCODE" + String.format("%03d", i); + String expectedColor = "#" + String.format("%06d", i); + assertEquals(expectedColor, result.get(barcode)); + } + + // 验证 SQL 语句正确生成 + ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); + verify(objectDao).findSqlByParam(sqlCaptor.capture(), anyList()); + + String sql = sqlCaptor.getValue(); + assertTrue(sql.contains("WHERE bd.barcode IN (?,?,?,?,?,?,?,?,?,?)")); // 10个占位符 + } + + // 性能测试 + @Test(timeout = 5000) + public void testBatchQueryColorCodes_Performance() { + // 准备测试数据 + List barcodes = Arrays.asList("BARCODE001", "BARCODE002", "BARCODE003"); + + // Mock 数据库查询结果 + when(objectDao.findSqlByParam(anyString(), anyList())).thenReturn(new ArrayList<>()); + + // 执行测试 + containerManagerImpl.batchQueryColorCodes(barcodes); + + // 如果方法在超时时间内完成,测试通过 + } +}