Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImpl.java =================================================================== diff -u -r41399 -r41407 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImpl.java (.../HolidayConfigManagerImpl.java) (revision 41399) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImpl.java (.../HolidayConfigManagerImpl.java) (revision 41407) @@ -1,5 +1,6 @@ package com.forgon.disinfectsystem.basedatamanager.holiday.service; +import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.disinfectsystem.basedatamanager.holiday.model.HolidayType; import com.forgon.disinfectsystem.basedatamanager.holiday.param.HolidayConfigParam; import com.forgon.disinfectsystem.basedatamanager.holiday.param.JsonImportDateParam; @@ -10,6 +11,7 @@ import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.JacksonUtil; import com.forgon.tools.util.ForgonDateUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; @@ -27,7 +29,8 @@ @Service public class HolidayConfigManagerImpl extends BasePoManagerImpl implements HolidayConfigManager { - + @Autowired + private DateQueryAdapter dateQueryAdapter; @Override public void save(HolidayConfigParam holidayConfig) { validateParam(holidayConfig); @@ -54,15 +57,27 @@ @Override public List withYear(int year) { - String condition = "holidayDate between '" + year + "-01-01' and '" + year + "-12-31' order by holidayDate desc"; + String startDate = year + "-01-01"; + String endDate = year + "-12-31"; + + String condition = buildHolidayDateBetweenSql(startDate, endDate) + " order by holidayDate desc"; return getByHql(condition); } + private String buildHolidayDateBetweenSql(String startDate, String endDate) { + String fmt = "yyyy-MM-dd"; + String start = dateQueryAdapter.dateConverAdapter2(startDate, fmt); + String end = dateQueryAdapter.dateConverAdapter2(endDate, fmt); + return "holidayDate between " + start + " and " + end; + } + @Override public PagedDataResponse list(PagerParam param, Integer year) { String condition = "1=1"; if(year != null){ - condition = "holidayDate between '" + year + "-01-01' and '" + year + "-12-31'"; + String startDate = year + "-01-01"; + String endDate = year + "-12-31"; + condition = buildHolidayDateBetweenSql(startDate, endDate); } int total = count(condition); List rows = getByHql(condition, param.getStart(), param.getLimit(), "holidayDate desc"); @@ -139,7 +154,8 @@ String begin = ForgonDateUtils.safelyFormatDate(cal.getTime(), DATE_FORMAT_YYYYMMDD, ""); cal.add(Calendar.DAY_OF_MONTH, days*2); String end = ForgonDateUtils.safelyFormatDate(cal.getTime(), DATE_FORMAT_YYYYMMDD, ""); - return getByHql("holidayDate between '" + begin + "' and '" + end + "' order by holidayDate"); + String betweenSql = buildHolidayDateBetweenSql(begin, end); + return getByHql(betweenSql + " order by holidayDate"); } /** Index: ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplWithYearTest.java =================================================================== diff -u -r41391 -r41407 --- ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplWithYearTest.java (.../HolidayConfigManagerImplWithYearTest.java) (revision 41391) +++ ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplWithYearTest.java (.../HolidayConfigManagerImplWithYearTest.java) (revision 41407) @@ -1,10 +1,12 @@ package com.forgon.disinfectsystem.basedatamanager.holiday.service; +import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.disinfectsystem.entity.basedatamanager.holiday.HolidayConfig; 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 org.mockito.Spy; @@ -25,6 +27,8 @@ @InjectMocks @Spy private HolidayConfigManagerImpl holidayConfigManager; + @Mock + private DateQueryAdapter dateQueryAdapter; private AutoCloseable autoCloseable; @Before public void setUp() { @@ -47,6 +51,7 @@ createHolidayConfig(11L, "2024-01-01", 1, "元旦"), createHolidayConfig(12L, "2024-10-08", 2, "国庆节")); doReturn(expectedList).when(holidayConfigManager).getByHql(anyString()); + mockDateQueryAdapter("2024-01-01","2024-12-31"); List result = holidayConfigManager.withYear(year); @@ -55,7 +60,7 @@ assertEquals("2024-01-01", result.get(0).getHolidayDate().toString()); assertEquals("2024-10-08", result.get(1).getHolidayDate().toString()); - String sql = "holidayDate between '2024-01-01' and '2024-12-31' order by holidayDate desc"; + String sql = "holidayDate between "+toDate("2024-01-01")+" and "+toDate("2024-12-31")+" order by holidayDate desc"; verify(holidayConfigManager).getByHql(sql); } @@ -67,6 +72,7 @@ int year = 2099; doReturn(Collections.emptyList()).when(holidayConfigManager).getByHql(anyString()); + mockDateQueryAdapter("2099-01-01", "2099-12-31"); List result = holidayConfigManager.withYear(year); @@ -84,6 +90,7 @@ int year = 0; doReturn(Collections.emptyList()).when(holidayConfigManager).getByHql(anyString()); + mockDateQueryAdapter("0-01-01", "0-12-31"); List result = holidayConfigManager.withYear(year); @@ -103,4 +110,13 @@ config.setDateRemark(remark); return config; } + private void mockDateQueryAdapter(String startDate, String endDate) { + String format = "yyyy-MM-dd"; + when(dateQueryAdapter.dateConverAdapter2(startDate, format)).thenReturn("CONVERT(varchar(100), '" + startDate + "' , 23)"); + when(dateQueryAdapter.dateConverAdapter2(endDate, format)).thenReturn("CONVERT(varchar(100), '" + endDate + "' , 23)"); + } + + private String toDate(String date) { + return "CONVERT(varchar(100), '" + date + "' , 23)"; + } } Index: ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplListTest.java =================================================================== diff -u -r41391 -r41407 --- ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplListTest.java (.../HolidayConfigManagerImplListTest.java) (revision 41391) +++ ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplListTest.java (.../HolidayConfigManagerImplListTest.java) (revision 41407) @@ -1,12 +1,14 @@ package com.forgon.disinfectsystem.basedatamanager.holiday.service; +import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.disinfectsystem.common.params.PagerParam; import com.forgon.disinfectsystem.entity.basedatamanager.holiday.HolidayConfig; import com.forgon.response.PagedDataResponse; 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 org.mockito.Spy; @@ -18,8 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; /** * HolidayConfigManagerImpl#list 单元测试类 @@ -30,6 +31,8 @@ @InjectMocks @Spy private HolidayConfigManagerImpl holidayConfigManager; + @Mock + private DateQueryAdapter dateQueryAdapter; private AutoCloseable autoCloseable; @@ -76,9 +79,10 @@ createHolidayConfig(11L, "2024-01-01", 1, "元旦"), createHolidayConfig(12L, "2024-10-08", 2, "国庆节") ); + mockDateQueryAdapter("2024-01-01", "2024-12-31"); doReturn(expectedList).when(holidayConfigManager).getByHql( - eq("holidayDate between '2024-01-01' and '2024-12-31'"), anyInt(), anyInt(), anyString()); - doReturn(2).when(holidayConfigManager).count("holidayDate between '2024-01-01' and '2024-12-31'"); + eq("holidayDate between "+toDate("2024-01-01")+" and "+toDate("2024-12-31")), anyInt(), anyInt(), anyString()); + doReturn(2).when(holidayConfigManager).count("holidayDate between "+toDate("2024-01-01")+" and "+toDate("2024-12-31")); PagedDataResponse result = holidayConfigManager.list(param, year); @@ -88,9 +92,19 @@ assertEquals("2024-01-01", result.getRows().get(0).getHolidayDate().toString()); assertEquals("2024-10-08", result.getRows().get(1).getHolidayDate().toString()); - verify(holidayConfigManager).getByHql("holidayDate between '2024-01-01' and '2024-12-31'", 5, 20, "holidayDate desc"); + verify(holidayConfigManager).getByHql("holidayDate between "+toDate("2024-01-01")+" and "+toDate("2024-12-31"), 5, 20, "holidayDate desc"); } + private void mockDateQueryAdapter(String startDate, String endDate) { + String format = "yyyy-MM-dd"; + when(dateQueryAdapter.dateConverAdapter2(startDate, format)).thenReturn("CONVERT(varchar(100), '" + startDate + "' , 23)"); + when(dateQueryAdapter.dateConverAdapter2(endDate, format)).thenReturn("CONVERT(varchar(100), '" + endDate + "' , 23)"); + } + + private String toDate(String date) { + return "CONVERT(varchar(100), '" + date + "' , 23)"; + } + /** * 创建一个 HolidayConfig 对象辅助测试 * Index: ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplHolidayTypeOfDateTest.java =================================================================== diff -u -r41391 -r41407 --- ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplHolidayTypeOfDateTest.java (.../HolidayConfigManagerImplHolidayTypeOfDateTest.java) (revision 41391) +++ ssts-basedata/src/test/java/com/forgon/disinfectsystem/basedatamanager/holiday/service/HolidayConfigManagerImplHolidayTypeOfDateTest.java (.../HolidayConfigManagerImplHolidayTypeOfDateTest.java) (revision 41407) @@ -1,5 +1,6 @@ package com.forgon.disinfectsystem.basedatamanager.holiday.service; +import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.disinfectsystem.basedatamanager.holiday.model.HolidayType; import com.forgon.disinfectsystem.entity.basedatamanager.holiday.HolidayConfig; import com.forgon.tools.hibernate.ObjectDao; @@ -17,8 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; /** * HolidayConfigManagerImpl#holidayTypeOfToday 单元测试类 @@ -29,6 +29,8 @@ private HolidayConfigManagerImpl holidayConfigManager; @Mock private ObjectDao objectDao; + @Mock + private DateQueryAdapter dateQueryAdapter; private AutoCloseable autoCloseable; @@ -47,12 +49,23 @@ */ @Test public void testHolidayTypeOfDate_EmptyList_ReturnsNormal() { + mockDateQueryAdapter("2023-12-29", "2024-01-04"); doReturn(Collections.emptyList()).when(objectDao).findByHql(anyString()); HolidayType result = holidayConfigManager.holidayTypeOfDate(Date.valueOf("2024-01-01")); assertEquals(HolidayType.Normal, result); - verify(objectDao).findByHql("from HolidayConfig po where holidayDate between '2023-12-29' and '2024-01-04' order by holidayDate"); + verify(objectDao).findByHql("from HolidayConfig po where holidayDate between to_date('2023-12-29','yyyy-MM-dd') and to_date('2024-01-04','yyyy-MM-dd') order by holidayDate"); } + private void mockDateQueryAdapter(String startDate, String endDate) { + String format = "yyyy-MM-dd"; + when(dateQueryAdapter.dateConverAdapter2(startDate, format)).thenReturn("to_date('" + startDate + "','" + format + "')"); + when(dateQueryAdapter.dateConverAdapter2(endDate, format)).thenReturn("to_date('" + endDate + "','" + format + "')"); + } + + private String toDate(String date) { + return "to_date('" + date + "','yyyy-MM-dd')"; + } + /** * 测试前面连续3天是假期时,返回 LongAfter */ @@ -64,10 +77,11 @@ createHolidayConfig("2024-01-03", 1) ); doReturn(configs).when(objectDao).findByHql(anyString()); + mockDateQueryAdapter("2024-01-01", "2024-01-07"); HolidayType result = holidayConfigManager.holidayTypeOfDate(Date.valueOf("2024-01-04")); assertEquals(HolidayType.LongAfter, result); - verify(objectDao).findByHql("from HolidayConfig po where holidayDate between '2024-01-01' and '2024-01-07' order by holidayDate"); + verify(objectDao).findByHql("from HolidayConfig po where holidayDate between "+toDate("2024-01-01")+" and "+toDate("2024-01-07")+" order by holidayDate"); } /** @@ -81,10 +95,10 @@ createHolidayConfig("2024-01-04", 1) ); doReturn(configs).when(objectDao).findByHql(anyString()); - + mockDateQueryAdapter("2023-12-29", "2024-01-04"); HolidayType result = holidayConfigManager.holidayTypeOfDate(Date.valueOf("2024-01-01")); assertEquals(HolidayType.LongBefore, result); - verify(objectDao).findByHql("from HolidayConfig po where holidayDate between '2023-12-29' and '2024-01-04' order by holidayDate"); + verify(objectDao).findByHql("from HolidayConfig po where holidayDate between "+toDate("2023-12-29")+" and "+toDate("2024-01-04")+" order by holidayDate"); } /**