完成结果总览模型区服务组装

This commit is contained in:
wkc
2026-03-20 11:15:57 +08:00
parent 12fa064a48
commit 164a82d883
2 changed files with 163 additions and 0 deletions

View File

@@ -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<CcdiProjectRiskModelPeopleItemVO> page = new Page<>(
defaultPageNum(queryDTO.getPageNum()),
defaultPageSize(queryDTO.getPageSize())
);
Page<CcdiProjectRiskModelPeopleItemVO> resultPage = overviewMapper.selectRiskModelPeoplePage(page, queryDTO);
List<CcdiProjectRiskModelPeopleItemVO> 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 <T> List<T> defaultList(List<T> value) {
return value == null ? List.of() : value;
}
private CcdiProject getRequiredProject(Long projectId) {
CcdiProject project = projectMapper.selectById(projectId);
if (project == null) {

View File

@@ -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<CcdiProjectRiskModelPeopleItemVO> 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<CcdiProjectRiskModelPeopleItemVO> 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<CcdiProjectRiskModelPeopleItemVO> 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;
}
}