调整信息维护页面并修复项目概览统计

This commit is contained in:
wkc
2026-05-06 18:22:26 +08:00
parent 0541ce0ac6
commit c64146ac40
33 changed files with 774 additions and 1831 deletions

View File

@@ -1,6 +1,7 @@
package com.ruoyi.ccdi.project.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.CcdiModelParam;
import com.ruoyi.ccdi.project.domain.CcdiProject;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectAbnormalAccountQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
@@ -39,12 +40,11 @@ import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionPageVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO;
import com.ruoyi.ccdi.project.domain.vo.ModelParamAllVO;
import com.ruoyi.ccdi.project.mapper.CcdiModelParamMapper;
import com.ruoyi.ccdi.project.mapper.CcdiProjectMapper;
import com.ruoyi.ccdi.project.mapper.CcdiBankTagResultMapper;
import com.ruoyi.ccdi.project.mapper.CcdiProjectOverviewEmployeeResultMapper;
import com.ruoyi.ccdi.project.mapper.CcdiProjectOverviewMapper;
import com.ruoyi.ccdi.project.service.ICcdiModelParamService;
import com.ruoyi.ccdi.project.service.ICcdiProjectOverviewService;
import com.ruoyi.common.exception.ServiceException;
import jakarta.servlet.http.HttpServletResponse;
@@ -74,6 +74,9 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
@Resource
private CcdiProjectMapper projectMapper;
@Resource
private CcdiModelParamMapper modelParamMapper;
@Resource
private CcdiProjectOverviewEmployeeResultMapper overviewEmployeeResultMapper;
@@ -89,9 +92,6 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
@Resource
private CcdiProjectOverviewReportPdfExporter reportPdfExporter;
@Resource
private ICcdiModelParamService modelParamService;
@Override
public CcdiProjectOverviewDashboardVO getDashboard(Long projectId) {
CcdiProject project = overviewMapper.selectDashboardBaseByProjectId(projectId);
@@ -328,7 +328,7 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
report.setUploadSubjects(defaultList(overviewMapper.selectReportUploadSubjects(projectId)).stream()
.peek(item -> item.setDataPeriod(formatDataPeriod(item.getMinTrxDate(), item.getMaxTrxDate())))
.toList());
report.setParams(buildReportParams(projectId));
report.setParams(buildReportParams(project));
report.setModelSummaries(defaultList(overviewMapper.selectReportRiskModelSummaries(projectId)));
report.setRiskPeople(defaultList(overviewMapper.selectReportRiskPeople(projectId)).stream()
.peek(item -> item.setActionLabel(ACTION_LABEL))
@@ -554,21 +554,23 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
return row;
}
private List<CcdiProjectOverviewReportParamVO> buildReportParams(Long projectId) {
ModelParamAllVO response = modelParamService.selectAllParams(projectId);
return defaultList(response == null ? null : response.getModels()).stream()
.flatMap(model -> defaultList(model.getParams()).stream().map(param -> {
CcdiProjectOverviewReportParamVO row = new CcdiProjectOverviewReportParamVO();
row.setModelName(model.getModelName());
row.setParamName(param.getParamName());
row.setParamValue(param.getParamValue());
row.setParamUnit(param.getParamUnit());
row.setParamDesc(param.getParamDesc());
return row;
}))
private List<CcdiProjectOverviewReportParamVO> buildReportParams(CcdiProject project) {
Long effectiveProjectId = "default".equals(project.getConfigType()) ? 0L : project.getProjectId();
return defaultList(modelParamMapper.selectByProjectId(effectiveProjectId)).stream()
.map(this::buildReportParamRow)
.toList();
}
private CcdiProjectOverviewReportParamVO buildReportParamRow(CcdiModelParam param) {
CcdiProjectOverviewReportParamVO row = new CcdiProjectOverviewReportParamVO();
row.setModelName(param.getModelName());
row.setParamName(param.getParamName());
row.setParamValue(param.getParamValue());
row.setParamUnit(param.getParamUnit());
row.setParamDesc(param.getParamDesc());
return row;
}
private String formatDataPeriod(String minTrxDate, String maxTrxDate) {
if (minTrxDate == null || minTrxDate.isBlank() || maxTrxDate == null || maxTrxDate.isBlank()) {
return "-";

View File

@@ -1,7 +1,9 @@
package com.ruoyi.ccdi.project.service;
import java.util.Arrays;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
class CcdiProjectOverviewServiceStructureTest {
@@ -35,4 +37,15 @@ class CcdiProjectOverviewServiceStructureTest {
assertNotNull(clazz.getMethod("refreshOverviewEmployeeResults", Long.class, String.class));
assertNotNull(clazz.getMethod("refreshProjectRiskCounts", Long.class, String.class));
}
@Test
void overviewServiceImplShouldNotDependOnModelParamService() throws Exception {
Class<?> clazz = Class.forName(
"com.ruoyi.ccdi.project.service.impl.CcdiProjectOverviewServiceImpl"
);
assertFalse(Arrays.stream(clazz.getDeclaredFields()).anyMatch(field ->
"com.ruoyi.ccdi.project.service.ICcdiModelParamService".equals(field.getType().getName())
));
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.ccdi.project.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.CcdiModelParam;
import com.ruoyi.ccdi.project.domain.CcdiProject;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
@@ -16,6 +17,7 @@ import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewEmployeeHitRowVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewReportVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisDetailVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisBasicInfoVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisObjectRecordVO;
@@ -27,6 +29,7 @@ import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskPeopleOverviewVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectTopRiskPeopleVO;
import com.ruoyi.ccdi.project.mapper.CcdiModelParamMapper;
import com.ruoyi.ccdi.project.mapper.CcdiProjectMapper;
import com.ruoyi.ccdi.project.mapper.CcdiBankTagResultMapper;
import com.ruoyi.ccdi.project.mapper.CcdiProjectOverviewEmployeeResultMapper;
@@ -38,6 +41,7 @@ import java.util.List;
import org.springframework.mock.web.MockHttpServletResponse;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@@ -65,6 +69,9 @@ class CcdiProjectOverviewServiceImplTest {
@Mock
private CcdiProjectMapper projectMapper;
@Mock
private CcdiModelParamMapper modelParamMapper;
@Mock
private CcdiProjectOverviewEmployeeResultMapper overviewEmployeeResultMapper;
@@ -77,6 +84,9 @@ class CcdiProjectOverviewServiceImplTest {
@Mock
private CcdiProjectRiskDetailWorkbookExporter workbookExporter;
@Mock
private CcdiProjectOverviewReportPdfExporter reportPdfExporter;
@Test
void shouldBuildDashboardWithNoRiskCount() {
CcdiProject project = new CcdiProject();
@@ -300,6 +310,37 @@ class CcdiProjectOverviewServiceImplTest {
);
}
@Test
void shouldExportOverviewReportParamsFromDefaultProjectConfig() throws Exception {
CcdiProject project = new CcdiProject();
project.setProjectId(40L);
project.setProjectName("测试项目");
project.setConfigType("default");
when(projectMapper.selectById(40L)).thenReturn(project);
CcdiProject dashboardProject = new CcdiProject();
dashboardProject.setProjectId(40L);
dashboardProject.setTargetCount(10);
dashboardProject.setHighRiskCount(1);
dashboardProject.setMediumRiskCount(2);
dashboardProject.setLowRiskCount(3);
when(overviewMapper.selectDashboardBaseByProjectId(40L)).thenReturn(dashboardProject);
when(modelParamMapper.selectByProjectId(0L)).thenReturn(List.of(
buildModelParam("LARGE_TRANSACTION", "大额交易模型", "单笔金额", "1000", "", "单笔金额阈值")
));
MockHttpServletResponse response = new MockHttpServletResponse();
service.exportOverviewReport(response, 40L);
ArgumentCaptor<CcdiProjectOverviewReportVO> captor =
ArgumentCaptor.forClass(CcdiProjectOverviewReportVO.class);
verify(modelParamMapper).selectByProjectId(0L);
verify(reportPdfExporter).export(eq(response), captor.capture());
assertEquals(1, captor.getValue().getParams().size());
assertEquals("大额交易模型", captor.getValue().getParams().getFirst().getModelName());
assertEquals("单笔金额", captor.getValue().getParams().getFirst().getParamName());
}
@Test
void shouldReturnPersonAnalysisDetailWithBasicInfoAndGroupedAbnormalDetail() {
CcdiProject project = new CcdiProject();
@@ -539,6 +580,24 @@ class CcdiProjectOverviewServiceImplTest {
return result;
}
private CcdiModelParam buildModelParam(
String modelCode,
String modelName,
String paramName,
String paramValue,
String paramUnit,
String paramDesc
) {
CcdiModelParam param = new CcdiModelParam();
param.setModelCode(modelCode);
param.setModelName(modelName);
param.setParamName(paramName);
param.setParamValue(paramValue);
param.setParamUnit(paramUnit);
param.setParamDesc(paramDesc);
return param;
}
private CcdiProjectRiskHitTagVO buildHitTag(
String modelCode,
String modelName,