Index: ssts-reports/src/test/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandlerBuildSqlTest.java =================================================================== diff -u -r41193 -r41225 --- ssts-reports/src/test/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandlerBuildSqlTest.java (.../UnusedTousseInstanceHandlerBuildSqlTest.java) (revision 41193) +++ ssts-reports/src/test/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandlerBuildSqlTest.java (.../UnusedTousseInstanceHandlerBuildSqlTest.java) (revision 41225) @@ -2,18 +2,20 @@ import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.SqlUtils; 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.Date; import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; /** * 单元测试类用于测试 UnusedTousseInstanceHandler 中的 buildSql 方法 @@ -27,15 +29,18 @@ private DateQueryAdapter dateQueryAdapter; private AutoCloseable mockCloseable; + private MockedStatic mockSqlUtils; @Before public void setUp() { mockCloseable = MockitoAnnotations.openMocks(this); + mockSqlUtils = mockStatic(SqlUtils.class); } @After public void tearDown() throws Exception { mockCloseable.close(); + mockSqlUtils.close(); } /** @@ -60,12 +65,18 @@ // Act String sql = handler.buildSql(start, end, fmt, departCode, tousseName); - String expectedSql = "select ou.name depart, ti.tousseName, bd.barcode,ti.recyclingTime " + String expectedSql = "select ou.name depart, ti.tousseName, bd.barcode,rr.recyclingTime " +"from TousseInstance ti join BarcodeDevice bd on bd.id = ti.id join OrgUnit ou on ou.orgUnitCoding = ti.departCoding " - +"where (ti.useRecord_id is null or ti.useRecord_id = 0) and ti.recyclingTime between '2023-01-01 00:00:00' and '2023-01-31 23:59:59'" + +"join RecyclingItem ri on ri.id = ti.recyclingItemId " + +"join RecyclingRecord rr on rr.id = ri.recyclingRecord_id " + +"where (ti.useRecord_id is null or ti.useRecord_id = 0) and rr.recyclingTime between '2023-01-01 00:00:00' and '2023-01-31 23:59:59'" +" and ti.tousseName = 'TestPackage' and ou.orgUnitCoding = 'TestDepartment'"; // Assert assertEquals(expectedSql, sql); + verify(dateQueryAdapter).dateConverAdapter2(formattedStart, fmt); + verify(dateQueryAdapter).dateConverAdapter2(formattedEnd, fmt); + mockSqlUtils.verify(() -> SqlUtils.checkInputParam(tousseName)); + mockSqlUtils.verify(() -> SqlUtils.checkInputParam(departCode)); } /** @@ -86,9 +97,11 @@ String sql = handler.buildSql(start, end, fmt, departCode, tousseName); System.out.println(sql); // Assert - String sql1 = "select ou.name depart, ti.tousseName, bd.barcode,ti.recyclingTime " + String sql1 = "select ou.name depart, ti.tousseName, bd.barcode,rr.recyclingTime " +"from TousseInstance ti join BarcodeDevice bd on bd.id = ti.id join OrgUnit ou on ou.orgUnitCoding = ti.departCoding " - +"where (ti.useRecord_id is null or ti.useRecord_id = 0) and ti.recyclingTime between '2023-01-01' and '2023-01-31'" + +"join RecyclingItem ri on ri.id = ti.recyclingItemId " + +"join RecyclingRecord rr on rr.id = ri.recyclingRecord_id " + +"where (ti.useRecord_id is null or ti.useRecord_id = 0) and rr.recyclingTime between '2023-01-01' and '2023-01-31'" +" and ou.orgUnitCoding = 'TestDepartment'"; assertEquals(sql1, sql); } @@ -137,4 +150,27 @@ assertTrue(sql.contains("ti.tousseName = 'test缝合包'")); // 应该没有这个条件 assertFalse(sql.contains("ou.orgUnitCoding = 'null'")); // 应该没有这个条件 } + + /** + * TC03: DepartCode 为 null 的情况 + */ + @Test + public void testBuildSql_NullDepartCodeAndTousseNameNull_DoesNotContainExtraCondition() { + // Arrange + Date start = new Date(); + Date end = new Date(); + String fmt = "yyyy-MM-dd"; + String tousseName = null; // null 字符串 + String departCode = null; + + when(dateQueryAdapter.dateConverAdapter2(anyString(), anyString())).thenReturn("'2023-01-01'","'2023-01-31'"); + + // Act + String sql = handler.buildSql(start, end, fmt, departCode, tousseName); + + // Assert + assertNotNull(sql); + assertFalse(sql.contains("ti.tousseName = 'null'")); // 应该没有这个条件 + assertFalse(sql.contains("ou.orgUnitCoding = 'null'")); // 应该没有这个条件 + } } Index: ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandler.java =================================================================== diff -u -r41207 -r41225 --- ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandler.java (.../UnusedTousseInstanceHandler.java) (revision 41207) +++ ssts-reports/src/main/java/com/forgon/disinfectsystem/jasperreports/unusetousseinstance/handler/UnusedTousseInstanceHandler.java (.../UnusedTousseInstanceHandler.java) (revision 41225) @@ -4,6 +4,8 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.model.OrgUnit; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.jasperreports.service.JasperReportsHandler; import com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model.UnusedTousseInstanceInfo; import com.forgon.disinfectsystem.jasperreports.unusetousseinstance.model.UnusedTousseInstanceReportVo; @@ -68,9 +70,11 @@ SqlUtils.checkInputParam(departCode); String startStr = dateQueryAdapter.dateConverAdapter2(ForgonDateUtils.safelyFormatDate(start, ForgonDateUtils.DATE_FORMAT_YYYYMMDDHHMMSS,""), fmt); String endStr = dateQueryAdapter.dateConverAdapter2(ForgonDateUtils.safelyFormatDate(end, ForgonDateUtils.DATE_FORMAT_YYYYMMDDHHMMSS, ""), fmt); - String sql = "select ou.name depart, ti.tousseName, bd.barcode,ti.recyclingTime from "+ TousseInstance.class.getSimpleName()+" ti join " - + BarcodeDevice.class.getSimpleName()+" bd on bd.id = ti.id join "+ OrgUnit.class.getSimpleName()+" ou on ou.orgUnitCoding = ti.departCoding where (ti.useRecord_id is null or ti.useRecord_id = 0) " + - "and ti.recyclingTime between "+startStr+" and "+endStr; + String sql = "select ou.name depart, ti.tousseName, bd.barcode,rr.recyclingTime from "+ TousseInstance.class.getSimpleName()+" ti join " + + BarcodeDevice.class.getSimpleName()+" bd on bd.id = ti.id join "+ OrgUnit.class.getSimpleName()+" ou on ou.orgUnitCoding = ti.departCoding join " + + RecyclingItem.class.getSimpleName()+" ri on ri.id = ti.recyclingItemId join " + + RecyclingRecord.class.getSimpleName()+" rr on rr.id = ri.recyclingRecord_id where (ti.useRecord_id is null or ti.useRecord_id = 0) " + + "and rr.recyclingTime between "+startStr+" and "+endStr; if(!StringUtils.isEmpty(tousseName)){ sql += " and ti.tousseName = '"+ tousseName +"'"; }