diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java index 99c81a68..0cc566fc 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java @@ -1,9 +1,14 @@ package com.ruoyi.ccdi.project.service.impl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.ccdi.project.domain.CcdiProject; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewStatVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardsVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewItemVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleItemVO; @@ -86,6 +91,37 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi return topRiskPeople; } + @Override + public CcdiProjectRiskModelCardsVO getRiskModelCards(Long projectId) { + ensureProjectExists(projectId); + + CcdiProjectRiskModelCardsVO cards = new CcdiProjectRiskModelCardsVO(); + cards.setCardList(defaultList(overviewMapper.selectRiskModelCardsByProjectId(projectId))); + return cards; + } + + @Override + public CcdiProjectRiskModelPeopleVO getRiskModelPeople(CcdiProjectRiskModelPeopleQueryDTO queryDTO) { + ensureProjectExists(queryDTO.getProjectId()); + normalizeRiskModelPeopleQuery(queryDTO); + + Page page = new Page<>( + defaultPageNum(queryDTO.getPageNum()), + defaultPageSize(queryDTO.getPageSize()) + ); + Page resultPage = overviewMapper.selectRiskModelPeoplePage(page, queryDTO); + + List rows = defaultList(resultPage == null ? null : resultPage.getRecords()) + .stream() + .peek(item -> item.setActionLabel(ACTION_LABEL)) + .toList(); + + CcdiProjectRiskModelPeopleVO people = new CcdiProjectRiskModelPeopleVO(); + people.setRows(rows); + people.setTotal(resultPage == null ? 0L : resultPage.getTotal()); + return people; + } + @Override @Transactional(rollbackFor = Exception.class) public void refreshProjectRiskCounts(Long projectId, String operator) { @@ -130,6 +166,14 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi getRequiredProject(projectId); } + private void normalizeRiskModelPeopleQuery(CcdiProjectRiskModelPeopleQueryDTO queryDTO) { + if (queryDTO.getMatchMode() == null || queryDTO.getMatchMode().isBlank()) { + queryDTO.setMatchMode("ANY"); + return; + } + queryDTO.setMatchMode(queryDTO.getMatchMode().trim().toUpperCase()); + } + private CcdiProjectOverviewStatVO buildStat(String key, String label, Integer value) { CcdiProjectOverviewStatVO stat = new CcdiProjectOverviewStatVO(); stat.setKey(key); @@ -156,6 +200,18 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi return value == null ? 0 : value; } + private long defaultPageNum(Integer pageNum) { + return pageNum == null || pageNum < 1 ? 1L : pageNum.longValue(); + } + + private long defaultPageSize(Integer pageSize) { + return pageSize == null || pageSize < 1 ? 10L : pageSize.longValue(); + } + + private List defaultList(List value) { + return value == null ? List.of() : value; + } + private CcdiProject getRequiredProject(Long projectId) { CcdiProject project = projectMapper.selectById(projectId); if (project == null) { diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java index 92e7a4a9..4637842b 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java @@ -1,8 +1,14 @@ package com.ruoyi.ccdi.project.service.impl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.ccdi.project.domain.CcdiProject; +import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardsVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO; +import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO; import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO; import com.ruoyi.ccdi.project.mapper.CcdiProjectMapper; @@ -18,7 +24,10 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -108,6 +117,8 @@ class CcdiProjectOverviewServiceImplTest { assertThrows(ServiceException.class, () -> service.getRiskPeopleOverview(99L)); assertThrows(ServiceException.class, () -> service.getTopRiskPeople(99L)); + assertThrows(ServiceException.class, () -> service.getRiskModelCards(99L)); + assertThrows(ServiceException.class, () -> service.getRiskModelPeople(buildRiskModelPeopleQuery(99L))); } @Test @@ -127,4 +138,100 @@ class CcdiProjectOverviewServiceImplTest { verify(projectMapper).updateRiskCountsByProjectId(eq(43L), eq(2), eq(1), eq(3), eq("tester")); } + + @Test + void shouldWrapRiskModelCardsIntoCardList() { + CcdiProject project = new CcdiProject(); + project.setProjectId(40L); + when(projectMapper.selectById(40L)).thenReturn(project); + + CcdiProjectRiskModelCardVO card = new CcdiProjectRiskModelCardVO(); + card.setModelCode("MODEL_A"); + card.setWarningCount(3); + when(overviewMapper.selectRiskModelCardsByProjectId(40L)).thenReturn(List.of(card)); + + CcdiProjectRiskModelCardsVO result = service.getRiskModelCards(40L); + + assertNotNull(result.getCardList()); + assertEquals(1, result.getCardList().size()); + assertEquals("MODEL_A", result.getCardList().getFirst().getModelCode()); + assertEquals(3, result.getCardList().getFirst().getWarningCount()); + } + + @Test + void shouldWrapRiskModelPeopleRowsTotalAndActionLabel() { + CcdiProject project = new CcdiProject(); + project.setProjectId(40L); + when(projectMapper.selectById(40L)).thenReturn(project); + + CcdiProjectRiskModelPeopleItemVO item = new CcdiProjectRiskModelPeopleItemVO(); + item.setStaffName("王五"); + item.setStaffCode("10001"); + + Page page = new Page<>(2, 5); + page.setRecords(List.of(item)); + page.setTotal(11); + when(overviewMapper.selectRiskModelPeoplePage(any(Page.class), any(CcdiProjectRiskModelPeopleQueryDTO.class))) + .thenReturn(page); + + CcdiProjectRiskModelPeopleVO result = service.getRiskModelPeople(buildRiskModelPeopleQuery(40L)); + + assertNotNull(result.getRows()); + assertEquals(1, result.getRows().size()); + assertEquals(11L, result.getTotal()); + assertEquals("查看详情", result.getRows().getFirst().getActionLabel()); + } + + @Test + void shouldReturnEmptyCollectionsForRiskModelCardsAndPeople() { + CcdiProject project = new CcdiProject(); + project.setProjectId(40L); + when(projectMapper.selectById(40L)).thenReturn(project); + when(overviewMapper.selectRiskModelCardsByProjectId(40L)).thenReturn(List.of()); + + Page emptyPage = new Page<>(1, 10); + emptyPage.setRecords(List.of()); + emptyPage.setTotal(0); + when(overviewMapper.selectRiskModelPeoplePage(any(Page.class), any(CcdiProjectRiskModelPeopleQueryDTO.class))) + .thenReturn(emptyPage); + + CcdiProjectRiskModelCardsVO cards = service.getRiskModelCards(40L); + CcdiProjectRiskModelPeopleVO people = service.getRiskModelPeople(buildRiskModelPeopleQuery(40L)); + + assertNotNull(cards.getCardList()); + assertEquals(0, cards.getCardList().size()); + assertNotNull(people.getRows()); + assertEquals(0, people.getRows().size()); + assertEquals(0L, people.getTotal()); + } + + @Test + void shouldDefaultRiskModelPeopleMatchModeToAny() { + CcdiProject project = new CcdiProject(); + project.setProjectId(40L); + when(projectMapper.selectById(40L)).thenReturn(project); + + Page emptyPage = new Page<>(1, 10); + emptyPage.setRecords(List.of()); + emptyPage.setTotal(0); + when(overviewMapper.selectRiskModelPeoplePage(any(Page.class), any(CcdiProjectRiskModelPeopleQueryDTO.class))) + .thenReturn(emptyPage); + + CcdiProjectRiskModelPeopleQueryDTO queryDTO = buildRiskModelPeopleQuery(40L); + queryDTO.setMatchMode(null); + service.getRiskModelPeople(queryDTO); + + verify(overviewMapper).selectRiskModelPeoplePage( + any(Page.class), + argThat(query -> "ANY".equals(query.getMatchMode())) + ); + } + + private CcdiProjectRiskModelPeopleQueryDTO buildRiskModelPeopleQuery(Long projectId) { + CcdiProjectRiskModelPeopleQueryDTO queryDTO = new CcdiProjectRiskModelPeopleQueryDTO(); + queryDTO.setProjectId(projectId); + queryDTO.setPageNum(1); + queryDTO.setPageSize(10); + return queryDTO; + } }