Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/model/UnusedTousseInstanceReportVo.java =================================================================== diff -u --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/model/UnusedTousseInstanceReportVo.java (revision 0) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/model/UnusedTousseInstanceReportVo.java (revision 41207) @@ -0,0 +1,47 @@ +package com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model; + +import java.util.List; +import java.util.Objects; + +public class UnusedTousseInstanceReportVo { + private String depart; + private String summary; + private List list; + + public String getDepart() { + return depart; + } + + public void setDepart(String depart) { + this.depart = depart; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (!(object instanceof UnusedTousseInstanceReportVo)) return false; + UnusedTousseInstanceReportVo that = (UnusedTousseInstanceReportVo) object; + return Objects.equals(depart, that.depart) && Objects.equals(summary, that.summary) && Objects.equals(list, that.list); + } + + @Override + public int hashCode() { + return Objects.hash(depart, summary, list); + } +} Index: ssts-reports/src/test/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandlerHandleTest.java =================================================================== diff -u -r41193 -r41207 --- ssts-reports/src/test/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandlerHandleTest.java (.../UnusedTousseInstanceHandlerHandleTest.java) (revision 41193) +++ ssts-reports/src/test/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandlerHandleTest.java (.../UnusedTousseInstanceHandlerHandleTest.java) (revision 41207) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.jasperreports.unusetousseinstance.handler; import com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model.UnusedTousseInstanceInfo; +import com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model.UnusedTousseInstanceReportVo; import com.forgon.tools.util.ForgonDateUtils; import org.junit.After; import org.junit.Before; @@ -57,8 +58,8 @@ Map paramMap = new HashMap<>(); List mockData = Arrays.asList( - createMockInfo("TestPackage"), - createMockInfo("TestPackage") + createMockInfo("手术室","TestPackage"), + createMockInfo("手术室","TestPackage") ); doReturn("这是sql").when(handler).buildSql(start, end, fmt, "testCpde","TestPackage"); @@ -70,15 +71,79 @@ // Assert assertNotNull(result); - assertEquals(2, result.size()); + assertEquals(1, result.size()); + UnusedTousseInstanceReportVo vo = (UnusedTousseInstanceReportVo) result.get(0); + assertEquals("手术室", vo.getDepart()); + assertEquals("这是总结", vo.getSummary()); + assertEquals(2, vo.getList().size()); assertTrue(paramMap.containsKey("summary")); assertEquals("这是总结", paramMap.get("summary")); verify(jdbcTemplate, data -> { String sql = data.getAllInvocations().get(0).getArgument(0); System.out.println(sql); }).query(anyString(), any(BeanPropertyRowMapper.class)); + verify(handler, times(2)).summary(mockData); } + @Test + public void testHandle_MultiDepartMultiTousseName_ReturnsResultsWithSummary() { + // Arrange + Map requestParams = new HashMap<>(); + requestParams.put("startDay", "2023-01-01 00:00:00"); + requestParams.put("endDay", "2023-01-31 23:59:59"); + Date start = ForgonDateUtils.safelyParseDate("2023-01-01 00:00:00", ForgonDateUtils.DATE_FORMAT_YYYYMMDDHHMMSS); + Date end = ForgonDateUtils.safelyParseDate("2023-01-31 23:59:59", ForgonDateUtils.DATE_FORMAT_YYYYMMDDHHMMSS); + String fmt = "yyyy-MM-dd HH24:MI:SS"; + + Map paramMap = new HashMap<>(); + + List mockData = Arrays.asList( + createMockInfo("手术室","缝合包"), + createMockInfo("手术室","缝合包"), + createMockInfo("手术室","钳子"), + createMockInfo("牙科","止血带") + ); + + doReturn("这是sql").when(handler).buildSql(start, end, fmt, null,null); + doReturn("缝合包x2、钳子x1、止血带x1").when(handler).summary(mockData); + doReturn("缝合包x2、钳子x1").when(handler).summary(Arrays.asList( + createMockInfo("手术室","缝合包"), + createMockInfo("手术室","缝合包"), + createMockInfo("手术室","钳子"))); + doReturn("止血带x1").when(handler).summary(Arrays.asList( + createMockInfo("牙科","止血带"))); + when(jdbcTemplate.query(eq("这是sql"), any(BeanPropertyRowMapper.class))).thenReturn(mockData); + + // Act + List result = handler.handle("reportName", "jasperReportName", requestParams, paramMap); + + // Assert + assertNotNull(result); + assertEquals(2, result.size()); + UnusedTousseInstanceReportVo vo = (UnusedTousseInstanceReportVo) result.get(0); + assertEquals("手术室", vo.getDepart()); + assertEquals("缝合包x2、钳子x1", vo.getSummary()); + assertEquals(3, vo.getList().size()); + vo = (UnusedTousseInstanceReportVo) result.get(1); + assertEquals("牙科", vo.getDepart()); + assertEquals("止血带x1", vo.getSummary()); + assertEquals(1, vo.getList().size()); + assertTrue(paramMap.containsKey("summary")); + assertEquals("缝合包x2、钳子x1、止血带x1", paramMap.get("summary")); + assertEquals("未使用器械包统计报表(2023-01-01 00:00:00至2023-01-31 23:59:59)", paramMap.get("title")); + verify(jdbcTemplate, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).query(anyString(), any(BeanPropertyRowMapper.class)); + verify(handler).summary(mockData); + verify(handler).summary(Arrays.asList( + createMockInfo("牙科","止血带"))); + verify(handler).summary(Arrays.asList( + createMockInfo("手术室","缝合包"), + createMockInfo("手术室","缝合包"), + createMockInfo("手术室","钳子"))); + } + /** * 测试缺少时间参数导致异常 */ @@ -182,8 +247,9 @@ } // 辅助方法创建测试对象 - private UnusedTousseInstanceInfo createMockInfo(String name) { + private UnusedTousseInstanceInfo createMockInfo(String depart, String name) { UnusedTousseInstanceInfo info = new UnusedTousseInstanceInfo(); + info.setDepart(depart); info.setTousseName(name); info.setBarcode("123456"); info.setRecyclingTime("2023-01-15 10:00:00"); Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandler.java =================================================================== diff -u -r41193 -r41207 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandler.java (.../UnusedTousseInstanceHandler.java) (revision 41193) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandler.java (.../UnusedTousseInstanceHandler.java) (revision 41207) @@ -6,6 +6,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.jasperreports.service.JasperReportsHandler; import com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model.UnusedTousseInstanceInfo; +import com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model.UnusedTousseInstanceReportVo; import com.forgon.tools.util.ForgonDateUtils; import com.forgon.tools.util.SqlUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -14,9 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static com.forgon.disinfectsystem.jasperreports.ReportsConstant.REPORT_NAME_UN_USE_TOUSSE_INSTANCE; @@ -50,8 +49,18 @@ String sql = buildSql(start, end, fmt, departCode, tousseName); List list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(UnusedTousseInstanceInfo.class)); String summary = summary(list); + Map> departToListMap =list.stream().collect(Collectors.groupingBy(UnusedTousseInstanceInfo::getDepart, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + List vos = departToListMap.entrySet().stream().map(entry->{ + UnusedTousseInstanceReportVo vo = new UnusedTousseInstanceReportVo(); + entry.getValue().sort(Comparator.comparing(UnusedTousseInstanceInfo::getTousseName)); + vo.setDepart(entry.getKey()); + vo.setSummary(summary(entry.getValue())); + vo.setList(entry.getValue()); + return vo; + }).collect(Collectors.toList()); parameterMap.put("summary", summary); - return list; + parameterMap.put("title","未使用器械包统计报表(" + startDay + "至" + endDay + ")"); + return vos; } String buildSql(Date start, Date end, String fmt, String departCode, String tousseName) {