Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java =================================================================== diff -u -r40779 -r41120 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 40779) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 41120) @@ -4,6 +4,7 @@ import java.io.OutputStream; import java.sql.ResultSet; import java.sql.SQLException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -424,6 +425,8 @@ public String loadReviewRecord() { HttpServletResponse response = StrutsParamUtils.getResponse(); String taskGroup = StrutsParamUtils.getPraramValue("taskGroup", ""); + Date date = StrutsParamUtils.getDatePraramValue("date", null, new SimpleDateFormat("yyyy-MM-dd")); + Long tousseAncestorID = StrutsParamUtils.getPraramLongValue("tousseAncestorID", null); JsonConfig config = new JsonConfig(); PropertyFilter propertyFilter = new JsonPropertyFilter(new String[] { "tasks", "recyclingRecord" }); @@ -432,7 +435,7 @@ String message = ""; try { SqlUtils.checkInputParam(taskGroup); - vos = packingManager.getReviewerVoAtToday(taskGroup); + vos = packingManager.getReviewerVoAtToday(taskGroup, date, tousseAncestorID); } catch (SQLException e1) { e1.printStackTrace(); message = e1.getMessage(); Index: ssts-packing/src/test/java/com/forgon/disinfectsystem/packing/service/PackingManagerImplTest.java =================================================================== diff -u --- ssts-packing/src/test/java/com/forgon/disinfectsystem/packing/service/PackingManagerImplTest.java (revision 0) +++ ssts-packing/src/test/java/com/forgon/disinfectsystem/packing/service/PackingManagerImplTest.java (revision 41120) @@ -0,0 +1,493 @@ +package com.forgon.disinfectsystem.packing.service; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.packing.vo.ReviewerVo; +import com.forgon.tools.hibernate.ObjectDao; +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.MockedStatic; +import org.mockito.MockitoAnnotations; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.*; + +/** + * PackingManagerImpl 单元测试类 + */ +public class PackingManagerImplTest { + + @InjectMocks + private PackingManagerImpl packingManager; + + @Mock + private SupplyRoomConfigManager supplyRoomConfigManager; + + @Mock + private DateQueryAdapter dateQueryAdapter; + + @Mock + private ObjectDao objectDao; + + @Mock + private ResultSet resultSet; + + private AutoCloseable closeable; + private MockedStatic mockedAcegiHelper; + + @Before + public void setUp() { + closeable = MockitoAnnotations.openMocks(this); + mockedAcegiHelper = mockStatic(AcegiHelper.class); + } + + @After + public void tearDown() throws Exception { + closeable.close(); + mockedAcegiHelper.close(); + } + + /** + * 测试用例:TC001 - 基础路径覆盖 + * 输入:taskGroup=null, date=null, tousseAncestorID=null + * 预期:查询所有类型器械包的审核信息 + */ + @Test + public void testGetReviewerVoAtToday_BasicPath() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(null); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + mockedAcegiHelper.when(AcegiHelper::getLoginUser).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包A"); + when(resultSet.getString("reviewer")).thenReturn("审核人A"); + when(resultSet.getInt("amount")).thenReturn(5); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(null, (Date) null, null); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包A", vo.getTousseName()); + assertEquals("审核人A", vo.getReviewer()); + assertEquals(Integer.valueOf(5), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(startDateTime, fmt); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(endDateTime, fmt); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } + + /** + * 测试用例:TC002 - 任务组过滤 + * 输入:taskGroup="GROUP1", date=null, tousseAncestorID=null + * 预期:查询指定任务组的器械包审核信息 + */ + @Test + public void testGetReviewerVoAtToday_TaskGroupFilter() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + String taskGroup = "GROUP1"; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + JSONObject foreignTousseHandleDepartAndTaskGroupJsonobject = new JSONObject(); + foreignTousseHandleDepartAndTaskGroupJsonobject.put("taskGroup", "FOREIGN_GROUP"); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(foreignTousseHandleDepartAndTaskGroupJsonobject); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + mockedAcegiHelper.when(AcegiHelper::getLoginUser).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包B"); + when(resultSet.getString("reviewer")).thenReturn("审核人B"); + when(resultSet.getInt("amount")).thenReturn(3); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(taskGroup, (Date) null, null); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包B", vo.getTousseName()); + assertEquals("审核人B", vo.getReviewer()); + assertEquals(Integer.valueOf(3), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(1)).dateConverAdapter2(startDateTime, fmt); + verify(dateQueryAdapter, times(1)).dateConverAdapter2(endDateTime, fmt); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } + + /** + * 测试用例:TC003 - 日期过滤 + * 输入:taskGroup=null, date=指定日期, tousseAncestorID=null + * 预期:查询指定日期的器械包审核信息 + */ + @Test + public void testGetReviewerVoAtToday_DateFilter() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + Date specifiedDate = new Date(System.currentTimeMillis() - 86400000); // 昨天 + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(specifiedDate); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(null); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + mockedAcegiHelper.when(AcegiHelper::getLoginUser).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包C"); + when(resultSet.getString("reviewer")).thenReturn("审核人C"); + when(resultSet.getInt("amount")).thenReturn(2); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(null, specifiedDate, null); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包C", vo.getTousseName()); + assertEquals("审核人C", vo.getReviewer()); + assertEquals(Integer.valueOf(2), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(startDateTime, fmt); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(endDateTime, fmt); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } + + /** + * 测试用例:TC004 - 祖先ID过滤 + * 输入:taskGroup=null, date=null, tousseAncestorID=123L + * 预期:查询指定祖先ID的器械包审核信息 + */ + @Test + public void testGetReviewerVoAtToday_AncestorIDFilter() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + Long tousseAncestorID = 123L; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(null); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + mockedAcegiHelper.when(AcegiHelper::getLoginUser).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包D"); + when(resultSet.getString("reviewer")).thenReturn("审核人D"); + when(resultSet.getInt("amount")).thenReturn(1); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(null, (Date) null, tousseAncestorID); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包D", vo.getTousseName()); + assertEquals("审核人D", vo.getReviewer()); + assertEquals(Integer.valueOf(1), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(startDateTime, fmt); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(endDateTime, fmt); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } + + /** + * 测试用例:TC005 - 多条件组合过滤 + * 输入:taskGroup="GROUP1", date=指定日期, tousseAncestorID=123L + * 预期:查询指定任务组、日期和祖先ID的器械包审核信息 + */ + @Test + public void testGetReviewerVoAtToday_MultiConditionFilter() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + Date specifiedDate = new Date(System.currentTimeMillis() - 86400000); // 昨天 + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(specifiedDate); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + String taskGroup = "GROUP1"; + Long tousseAncestorID = 123L; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + JSONObject foreignTousseHandleDepartAndTaskGroupJsonobject = new JSONObject(); + foreignTousseHandleDepartAndTaskGroupJsonobject.put("taskGroup", "FOREIGN_GROUP"); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(foreignTousseHandleDepartAndTaskGroupJsonobject); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + mockedAcegiHelper.when(AcegiHelper::getLoginUser).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包E"); + when(resultSet.getString("reviewer")).thenReturn("审核人E"); + when(resultSet.getInt("amount")).thenReturn(4); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(taskGroup, specifiedDate, tousseAncestorID); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包E", vo.getTousseName()); + assertEquals("审核人E", vo.getReviewer()); + assertEquals(Integer.valueOf(4), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(anyString(), anyString()); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } + + /** + * 测试用例:TC006 - 外来器械分支 + * 输入:foreignTousseHandleDepartAndTaskGroupJsonobject=null + * 预期:不查询外来器械相关数据 + */ + @Test + public void testGetReviewerVoAtToday_NoForeignTousse() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(null); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + mockedAcegiHelper.when(AcegiHelper::getLoginUser).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包F"); + when(resultSet.getString("reviewer")).thenReturn("审核人F"); + when(resultSet.getInt("amount")).thenReturn(6); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(null, (Date) null, null); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包F", vo.getTousseName()); + assertEquals("审核人F", vo.getReviewer()); + assertEquals(Integer.valueOf(6), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(startDateTime, fmt); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(endDateTime, fmt); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } + + /** + * 测试用例:TC007 - 自定义器械包分支 + * 输入:customTousseDefaultTaskGroup 匹配 + * 预期:查询自定义器械包数据 + */ + @Test + public void testGetReviewerVoAtToday_CustomTousse() throws SQLException { + // 准备数据 + String orgUnitCode = "ORG001"; + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String startDateTime = currentDate + " 00:00:00"; + String endDateTime = currentDate + " 23:59:59"; + String fmt = "yyyy-MM-dd HH24:MI:SS"; + String taskGroup = "CUSTOM_GROUP"; + + LoginUserData loginUser = mock(LoginUserData.class); + when(loginUser.getOrgUnitCodingFromSupplyRoomConfig()).thenReturn(orgUnitCode); + + SupplyRoomConfig supplyRoomConfig = mock(SupplyRoomConfig.class); + when(supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode)).thenReturn(null); + when(supplyRoomConfig.getCustomTousseDefaultTaskGroup()).thenReturn("CUSTOM_GROUP"); + + when(AcegiHelper.getLoginUser()).thenReturn(loginUser); + when(supplyRoomConfigManager.getSystemParamsObj()).thenReturn(supplyRoomConfig); + when(dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)).thenReturn("TO_DATE('" + startDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(dateQueryAdapter.dateConverAdapter2(endDateTime, fmt)).thenReturn("TO_DATE('" + endDateTime + "', 'YYYY-MM-DD HH24:MI:SS')"); + when(objectDao.executeSql(anyString())).thenReturn(resultSet); + + when(resultSet.next()).thenReturn(true).thenReturn(false); + when(resultSet.getString("name")).thenReturn("器械包G"); + when(resultSet.getString("reviewer")).thenReturn("审核人G"); + when(resultSet.getInt("amount")).thenReturn(7); + + // 执行测试 + List result = packingManager.getReviewerVoAtToday(taskGroup, (Date) null, null); + + // 验证结果 + assertNotNull(result); + assertEquals(1, result.size()); + ReviewerVo vo = result.get(0); + assertEquals("器械包G", vo.getTousseName()); + assertEquals("审核人G", vo.getReviewer()); + assertEquals(Integer.valueOf(7), vo.getAmount()); + + // 验证调用 + mockedAcegiHelper.verify(AcegiHelper::getLoginUser); + verify(supplyRoomConfigManager, times(1)).getSystemParamsObj(); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(startDateTime, fmt); + verify(dateQueryAdapter, times(2)).dateConverAdapter2(endDateTime, fmt); + verify(objectDao, times(1)).executeSql(anyString()); + verify(objectDao, data -> { + String sql = data.getAllInvocations().get(0).getArgument(0); + System.out.println(sql); + }).executeSql(anyString()); + verify(resultSet, times(2)).next(); + verify(resultSet, times(1)).getString("name"); + verify(resultSet, times(1)).getString("reviewer"); + verify(resultSet, times(1)).getInt("amount"); + verify(resultSet).close(); + } +} Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r41044 -r41120 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 41044) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 41120) @@ -764,16 +764,23 @@ } return null; } - + public List getReviewerVoAtToday(String taskGroup) + throws SQLException { + return getReviewerVoAtToday(taskGroup, new Date(), null); + } + public List getReviewerVoAtToday(String taskGroup, String date, Long tousseAncestorID) throws SQLException { + Date d = DateTools.parseDateIfNotEmpty(date, new SimpleDateFormat("yyyy-MM-dd"), new Date()); + return getReviewerVoAtToday(taskGroup, d, tousseAncestorID); + } /** * 查询今天本组已审核的器械包(器械包、消毒物品、敷料包、外来器械包、外来器械拆分小包、自定义器械包、外部代理灭菌) */ @Override - public List getReviewerVoAtToday(String taskGroup) + public List getReviewerVoAtToday(String taskGroup, Date date, Long tousseAncestorID) throws SQLException { String orgUnitCode = AcegiHelper.getLoginUser() .getOrgUnitCodingFromSupplyRoomConfig(); - String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(date == null ? new Date() : date); String startDateTime = currentDate + " 00:00:00"; String endDateTime = currentDate + " 23:59:59"; String fmt = "yyyy-MM-dd HH24:MI:SS"; @@ -792,6 +799,9 @@ if(StringUtils.isNotBlank(taskGroup)){ sql += " and t.taskGroup = '" + taskGroup + "' "; } + if(tousseAncestorID != null){ + sql += " and d.ancestorID=" + tousseAncestorID + " "; + } //外来器械包默认处理科室及任务组 JSONObject foreignTousseHandleDepartAndTaskGroupJsonobject = supplyRoomConfig.getOneForeignTousseHandleDepartAndTaskGroupByDepartCode(orgUnitCode); if(foreignTousseHandleDepartAndTaskGroupJsonobject != null && (StringUtils.equals(taskGroup, foreignTousseHandleDepartAndTaskGroupJsonobject.optString("taskGroup")) || StringUtils.isBlank(taskGroup))){ @@ -800,9 +810,11 @@ "from tousseInstance i,tousseDefinition d where i.toussedefinition_id = d.id and d.tousseType in ('"+TousseDefinition.PACKAGE_TYPE_FOREIGN+"','"+TousseDefinition.PACKAGE_TYPE_SPLIT+"') " + "and i.reviewTime between "+dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)+" and " + dateQueryAdapter.dateConverAdapter2(endDateTime, fmt) - + " and i.orgUnitCoding = '" - + orgUnitCode - + "' "; + + " and i.orgUnitCoding = '" + orgUnitCode+ "' "; + + if(tousseAncestorID != null){ + sql += " and d.ancestorID=" + tousseAncestorID + " "; + } } if(StringUtils.equals(taskGroup, supplyRoomConfig.getCustomTousseDefaultTaskGroup()) || StringUtils.isBlank(taskGroup)){ @@ -811,9 +823,10 @@ "from tousseInstance i,tousseDefinition d where i.toussedefinition_id = d.id and d.tousseType in ('"+TousseDefinition.PACKAGE_TYPE_CUSTOM+"') " + "and i.reviewTime between "+dateQueryAdapter.dateConverAdapter2(startDateTime, fmt)+" and " + dateQueryAdapter.dateConverAdapter2(endDateTime, fmt) - + " and i.orgUnitCoding = '" - + orgUnitCode - + "' "; + + " and i.orgUnitCoding = '" + orgUnitCode + "' "; + if(tousseAncestorID != null){ + sql += " and d.ancestorID=" + tousseAncestorID + " "; + } } sql += ") alias group by alias.name,alias.reviewer, alias.isTraceable"; ResultSet rs = objectDao.executeSql(sql); Index: build.gradle =================================================================== diff -u -r41082 -r41120 --- build.gradle (.../build.gradle) (revision 41082) +++ build.gradle (.../build.gradle) (revision 41120) @@ -630,6 +630,14 @@ //HL7消息解析 compile group: 'ca.uhn.hapi', name: 'hapi-base', version: '2.3' compile group: 'ca.uhn.hapi', name: 'hapi-structures-v24', version: '2.3' + + // 单元测试 + testImplementation 'org.objenesis:objenesis:2.6' + testImplementation 'net.bytebuddy:byte-buddy:1.10.13' + testImplementation "net.bytebuddy:byte-buddy-agent:1.10.3" + testImplementation 'org.mockito:mockito-inline:3.4.6' + testImplementation 'org.mockito:mockito-core:3.4.6' + testImplementation 'org.mockito:mockito-junit-jupiter:3.4.6' } // 文件夹的名字必须用斜线结果,否则创建该文件夹不成功 @@ -1330,16 +1338,16 @@ //compile group: 'org.seleniumhq.selenium', name: 'selenium-server', version: '3.141.59' // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java //compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.10.0' - compile 'org.seleniumhq.selenium:selenium-api:4.10.0' - compile 'org.seleniumhq.selenium:selenium-remote-driver:4.10.0' - compile 'org.seleniumhq.selenium:selenium-chrome-driver:4.10.0' - compile 'org.seleniumhq.selenium:selenium-ie-driver:4.10.0' - compile 'org.seleniumhq.selenium:selenium-chromium-driver:4.10.0' - compile 'org.seleniumhq.selenium:selenium-support:4.10.0' - compile 'org.seleniumhq.selenium:selenium-json:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-api:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-remote-driver:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-chrome-driver:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-ie-driver:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-chromium-driver:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-support:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-json:4.10.0' //compile group: 'org.seleniumhq.selenium', name: 'selenium-server-standalone', version: '3.141.59' // HTTP 客户端(JDK8 用 selenium-http + OkHttp,而不是 jdk-client) - compile 'org.seleniumhq.selenium:selenium-http:4.10.0' + testCompile 'org.seleniumhq.selenium:selenium-http:4.10.0' // (如仍需 IE,再额外加) // implementation 'org.seleniumhq.selenium:selenium-ie-driver:4.10.0' Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java =================================================================== diff -u -r40779 -r41120 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 40779) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 41120) @@ -107,6 +107,9 @@ public List getReviewerVoAtToday(String taskGroup) throws SQLException; + public List getReviewerVoAtToday(String taskGroup, String date, Long tousseAncestorID) throws SQLException ; + public List getReviewerVoAtToday(String taskGroup, Date date, Long tousseAncestorID) + throws SQLException; public String loadTousseByPackingRecord(String packingRecordId); public String loadTousseByIds(String ids);