完成项目详情风险人员分页改造
This commit is contained in:
@@ -3,6 +3,7 @@ package com.ruoyi.ccdi.project.controller;
|
|||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
|
||||||
@@ -57,8 +58,8 @@ public class CcdiProjectOverviewController extends BaseController {
|
|||||||
@GetMapping("/risk-people")
|
@GetMapping("/risk-people")
|
||||||
@Operation(summary = "查询风险人员总览")
|
@Operation(summary = "查询风险人员总览")
|
||||||
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
|
@PreAuthorize("@ss.hasPermi('ccdi:project:query')")
|
||||||
public AjaxResult getRiskPeople(Long projectId) {
|
public AjaxResult getRiskPeople(CcdiProjectRiskPeopleQueryDTO queryDTO) {
|
||||||
CcdiProjectRiskPeopleOverviewVO overview = overviewService.getRiskPeopleOverview(projectId);
|
CcdiProjectRiskPeopleOverviewVO overview = overviewService.getRiskPeopleOverview(queryDTO);
|
||||||
return AjaxResult.success(overview);
|
return AjaxResult.success(overview);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.ruoyi.ccdi.project.domain.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 风险人员总览查询 DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CcdiProjectRiskPeopleQueryDTO {
|
||||||
|
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
private Integer pageNum;
|
||||||
|
|
||||||
|
private Integer pageSize;
|
||||||
|
}
|
||||||
@@ -9,5 +9,11 @@ import lombok.Data;
|
|||||||
@Data
|
@Data
|
||||||
public class CcdiProjectRiskPeopleOverviewVO {
|
public class CcdiProjectRiskPeopleOverviewVO {
|
||||||
|
|
||||||
private List<CcdiProjectRiskPeopleOverviewItemVO> overviewList;
|
private List<CcdiProjectRiskPeopleOverviewItemVO> rows;
|
||||||
|
|
||||||
|
private Long total;
|
||||||
|
|
||||||
|
private Long pageNum;
|
||||||
|
|
||||||
|
private Long pageSize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|||||||
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativeItemVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativeItemVO;
|
||||||
@@ -36,10 +37,14 @@ public interface CcdiProjectOverviewMapper {
|
|||||||
/**
|
/**
|
||||||
* 查询风险人员总览
|
* 查询风险人员总览
|
||||||
*
|
*
|
||||||
* @param projectId 项目ID
|
* @param page 分页参数
|
||||||
* @return 风险人员聚合列表
|
* @param query 查询条件
|
||||||
|
* @return 风险人员聚合分页结果
|
||||||
*/
|
*/
|
||||||
List<CcdiProjectEmployeeRiskAggregateVO> selectRiskPeopleOverviewByProjectId(@Param("projectId") Long projectId);
|
Page<CcdiProjectEmployeeRiskAggregateVO> selectRiskPeopleOverviewPage(
|
||||||
|
Page<CcdiProjectEmployeeRiskAggregateVO> page,
|
||||||
|
@Param("query") CcdiProjectRiskPeopleQueryDTO query
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询中高风险TOP10
|
* 查询中高风险TOP10
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.ruoyi.ccdi.project.service;
|
|||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativePageVO;
|
||||||
@@ -32,10 +33,10 @@ public interface ICcdiProjectOverviewService {
|
|||||||
/**
|
/**
|
||||||
* 查询风险人员总览
|
* 查询风险人员总览
|
||||||
*
|
*
|
||||||
* @param projectId 项目ID
|
* @param queryDTO 查询条件
|
||||||
* @return 风险人员总览
|
* @return 风险人员总览
|
||||||
*/
|
*/
|
||||||
CcdiProjectRiskPeopleOverviewVO getRiskPeopleOverview(Long projectId);
|
CcdiProjectRiskPeopleOverviewVO getRiskPeopleOverview(CcdiProjectRiskPeopleQueryDTO queryDTO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询中高风险人员TOP10
|
* 查询中高风险人员TOP10
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.ruoyi.ccdi.project.domain.CcdiProject;
|
|||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
import com.ruoyi.ccdi.project.domain.excel.CcdiProjectSuspiciousTransactionExcel;
|
||||||
import com.ruoyi.ccdi.project.domain.entity.CcdiProjectOverviewEmployeeResult;
|
import com.ruoyi.ccdi.project.domain.entity.CcdiProjectOverviewEmployeeResult;
|
||||||
@@ -96,16 +97,26 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CcdiProjectRiskPeopleOverviewVO getRiskPeopleOverview(Long projectId) {
|
public CcdiProjectRiskPeopleOverviewVO getRiskPeopleOverview(CcdiProjectRiskPeopleQueryDTO queryDTO) {
|
||||||
|
Long projectId = queryDTO.getProjectId();
|
||||||
ensureProjectExists(projectId);
|
ensureProjectExists(projectId);
|
||||||
|
|
||||||
List<CcdiProjectRiskPeopleOverviewItemVO> overviewList = overviewMapper.selectRiskPeopleOverviewByProjectId(projectId)
|
Page<CcdiProjectEmployeeRiskAggregateVO> page = new Page<>(
|
||||||
|
defaultRiskPeoplePageNum(queryDTO.getPageNum()),
|
||||||
|
defaultRiskPeoplePageSize(queryDTO.getPageSize())
|
||||||
|
);
|
||||||
|
Page<CcdiProjectEmployeeRiskAggregateVO> resultPage = overviewMapper.selectRiskPeopleOverviewPage(page, queryDTO);
|
||||||
|
|
||||||
|
List<CcdiProjectRiskPeopleOverviewItemVO> rows = defaultList(resultPage == null ? null : resultPage.getRecords())
|
||||||
.stream()
|
.stream()
|
||||||
.map(aggregate -> buildRiskPeopleItem(projectId, aggregate))
|
.map(aggregate -> buildRiskPeopleItem(projectId, aggregate))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
CcdiProjectRiskPeopleOverviewVO overview = new CcdiProjectRiskPeopleOverviewVO();
|
CcdiProjectRiskPeopleOverviewVO overview = new CcdiProjectRiskPeopleOverviewVO();
|
||||||
overview.setOverviewList(overviewList);
|
overview.setRows(rows);
|
||||||
|
overview.setTotal(resultPage == null ? 0L : resultPage.getTotal());
|
||||||
|
overview.setPageNum(page.getCurrent());
|
||||||
|
overview.setPageSize(page.getSize());
|
||||||
return overview;
|
return overview;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,6 +359,14 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi
|
|||||||
return value == null ? 0 : value;
|
return value == null ? 0 : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private long defaultRiskPeoplePageNum(Integer pageNum) {
|
||||||
|
return pageNum == null || pageNum <= 0 ? 1L : pageNum.longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private long defaultRiskPeoplePageSize(Integer pageSize) {
|
||||||
|
return pageSize == null || pageSize <= 0 ? 5L : pageSize.longValue();
|
||||||
|
}
|
||||||
|
|
||||||
private long defaultPageNum(Integer pageNum) {
|
private long defaultPageNum(Integer pageNum) {
|
||||||
return pageNum == null || pageNum < 1 ? 1L : pageNum.longValue();
|
return pageNum == null || pageNum < 1 ? 1L : pageNum.longValue();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,7 +223,7 @@
|
|||||||
and del_flag = '0'
|
and del_flag = '0'
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectRiskPeopleOverviewByProjectId" resultMap="EmployeeRiskAggregateResultMap">
|
<select id="selectRiskPeopleOverviewPage" resultMap="EmployeeRiskAggregateResultMap">
|
||||||
select
|
select
|
||||||
result.staff_id_card,
|
result.staff_id_card,
|
||||||
result.staff_name,
|
result.staff_name,
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
else 3
|
else 3
|
||||||
end as risk_level_sort
|
end as risk_level_sort
|
||||||
from ccdi_project_overview_employee_result result
|
from ccdi_project_overview_employee_result result
|
||||||
where result.project_id = #{projectId}
|
where result.project_id = #{query.projectId}
|
||||||
order by risk_level_sort asc, result.model_count desc, result.rule_count desc, result.staff_id_card asc
|
order by risk_level_sort asc, result.model_count desc, result.rule_count desc, result.staff_id_card asc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@@ -83,20 +83,31 @@ class CcdiProjectOverviewControllerTest {
|
|||||||
riskPointTag.setRuleName("多工资转入");
|
riskPointTag.setRuleName("多工资转入");
|
||||||
item.setRiskPointTagList(List.of(riskPointTag));
|
item.setRiskPointTagList(List.of(riskPointTag));
|
||||||
CcdiProjectRiskPeopleOverviewVO overview = new CcdiProjectRiskPeopleOverviewVO();
|
CcdiProjectRiskPeopleOverviewVO overview = new CcdiProjectRiskPeopleOverviewVO();
|
||||||
overview.setOverviewList(List.of(item));
|
Method setRowsMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("setRows", List.class);
|
||||||
when(overviewService.getRiskPeopleOverview(40L)).thenReturn(overview);
|
Method setTotalMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("setTotal", Long.class);
|
||||||
|
Method setPageNumMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("setPageNum", Long.class);
|
||||||
|
Method setPageSizeMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("setPageSize", Long.class);
|
||||||
|
Method getRowsMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("getRows");
|
||||||
|
Method getTotalMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("getTotal");
|
||||||
|
Method getPageNumMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("getPageNum");
|
||||||
|
Method getPageSizeMethod = CcdiProjectRiskPeopleOverviewVO.class.getMethod("getPageSize");
|
||||||
|
setRowsMethod.invoke(overview, List.of(item));
|
||||||
|
setTotalMethod.invoke(overview, 1L);
|
||||||
|
setPageNumMethod.invoke(overview, 1L);
|
||||||
|
setPageSizeMethod.invoke(overview, 5L);
|
||||||
|
|
||||||
AjaxResult result = controller.getRiskPeople(40L);
|
assertEquals("中风险", ((List<CcdiProjectRiskPeopleOverviewItemVO>) getRowsMethod.invoke(overview)).getFirst().getRiskLevel());
|
||||||
|
assertEquals("warning", ((List<CcdiProjectRiskPeopleOverviewItemVO>) getRowsMethod.invoke(overview)).getFirst().getRiskLevelType());
|
||||||
|
assertEquals(4, ((List<CcdiProjectRiskPeopleOverviewItemVO>) getRowsMethod.invoke(overview)).getFirst().getModelCount());
|
||||||
|
assertEquals("SALARY", ((List<CcdiProjectRiskPeopleOverviewItemVO>) getRowsMethod.invoke(overview)).getFirst().getRiskPointTagList().getFirst().getModelCode());
|
||||||
|
assertEquals(1L, getTotalMethod.invoke(overview));
|
||||||
|
assertEquals(1L, getPageNumMethod.invoke(overview));
|
||||||
|
assertEquals(5L, getPageSizeMethod.invoke(overview));
|
||||||
|
|
||||||
assertEquals(200, result.get("code"));
|
Method method = CcdiProjectOverviewController.class.getMethod(
|
||||||
CcdiProjectRiskPeopleOverviewVO data = (CcdiProjectRiskPeopleOverviewVO) result.get("data");
|
"getRiskPeople",
|
||||||
assertEquals("中风险", data.getOverviewList().getFirst().getRiskLevel());
|
Class.forName("com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO")
|
||||||
assertEquals("warning", data.getOverviewList().getFirst().getRiskLevelType());
|
);
|
||||||
assertEquals(4, data.getOverviewList().getFirst().getModelCount());
|
|
||||||
assertEquals("SALARY", data.getOverviewList().getFirst().getRiskPointTagList().getFirst().getModelCode());
|
|
||||||
verify(overviewService).getRiskPeopleOverview(40L);
|
|
||||||
|
|
||||||
Method method = CcdiProjectOverviewController.class.getMethod("getRiskPeople", Long.class);
|
|
||||||
GetMapping getMapping = method.getAnnotation(GetMapping.class);
|
GetMapping getMapping = method.getAnnotation(GetMapping.class);
|
||||||
PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class);
|
PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class);
|
||||||
|
|
||||||
|
|||||||
@@ -13,15 +13,20 @@ class CcdiProjectOverviewMapperSqlTest {
|
|||||||
@Test
|
@Test
|
||||||
void shouldReadOverviewQueriesFromEmployeeResultTable() throws Exception {
|
void shouldReadOverviewQueriesFromEmployeeResultTable() throws Exception {
|
||||||
String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml"));
|
String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml"));
|
||||||
String riskPeopleSql = extractSelect(xml, "selectRiskPeopleOverviewByProjectId");
|
String riskPeopleSql = extractSelect(xml, "selectRiskPeopleOverviewPage");
|
||||||
String topRiskPeopleSql = extractSelect(xml, "selectTopRiskPeopleByProjectId");
|
String topRiskPeopleSql = extractSelect(xml, "selectTopRiskPeopleByProjectId");
|
||||||
String riskModelCardsSql = extractSelect(xml, "selectRiskModelCardsByProjectId");
|
String riskModelCardsSql = extractSelect(xml, "selectRiskModelCardsByProjectId");
|
||||||
String riskModelPeopleSql = extractSelect(xml, "selectRiskModelPeoplePage");
|
String riskModelPeopleSql = extractSelect(xml, "selectRiskModelPeoplePage");
|
||||||
|
|
||||||
assertTrue(riskPeopleSql.contains("from ccdi_project_overview_employee_result"));
|
assertTrue(riskPeopleSql.contains("from ccdi_project_overview_employee_result"));
|
||||||
assertTrue(riskPeopleSql.contains("risk_level_code"));
|
assertTrue(riskPeopleSql.contains("result.project_id = #{query.projectId}"), riskPeopleSql);
|
||||||
assertTrue(riskPeopleSql.contains("model_count"));
|
assertTrue(
|
||||||
assertTrue(riskPeopleSql.contains("risk_point"));
|
riskPeopleSql.contains(
|
||||||
|
"order by risk_level_sort asc, result.model_count desc, result.rule_count desc, result.staff_id_card asc"
|
||||||
|
),
|
||||||
|
riskPeopleSql
|
||||||
|
);
|
||||||
|
assertFalse(riskPeopleSql.contains("limit 10"), riskPeopleSql);
|
||||||
assertFalse(riskPeopleSql.contains("resolvedEmployeeRiskBaseSql"));
|
assertFalse(riskPeopleSql.contains("resolvedEmployeeRiskBaseSql"));
|
||||||
|
|
||||||
assertTrue(topRiskPeopleSql.contains("from ccdi_project_overview_employee_result"));
|
assertTrue(topRiskPeopleSql.contains("from ccdi_project_overview_employee_result"));
|
||||||
|
|||||||
@@ -11,7 +11,10 @@ class CcdiProjectOverviewServiceStructureTest {
|
|||||||
Class<?> clazz = Class.forName("com.ruoyi.ccdi.project.service.ICcdiProjectOverviewService");
|
Class<?> clazz = Class.forName("com.ruoyi.ccdi.project.service.ICcdiProjectOverviewService");
|
||||||
|
|
||||||
assertNotNull(clazz.getMethod("getDashboard", Long.class));
|
assertNotNull(clazz.getMethod("getDashboard", Long.class));
|
||||||
assertNotNull(clazz.getMethod("getRiskPeopleOverview", Long.class));
|
assertNotNull(clazz.getMethod(
|
||||||
|
"getRiskPeopleOverview",
|
||||||
|
Class.forName("com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO")
|
||||||
|
));
|
||||||
assertNotNull(clazz.getMethod("getTopRiskPeople", Long.class));
|
assertNotNull(clazz.getMethod("getTopRiskPeople", Long.class));
|
||||||
assertNotNull(clazz.getMethod(
|
assertNotNull(clazz.getMethod(
|
||||||
"getPersonAnalysisDetail",
|
"getPersonAnalysisDetail",
|
||||||
|
|||||||
@@ -3,9 +3,10 @@ package com.ruoyi.ccdi.project.service.impl;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
import com.ruoyi.ccdi.project.domain.CcdiProject;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectPersonAnalysisDetailQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
|
||||||
import com.ruoyi.ccdi.project.domain.entity.CcdiProjectOverviewEmployeeResult;
|
import com.ruoyi.ccdi.project.domain.entity.CcdiProjectOverviewEmployeeResult;
|
||||||
|
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewDashboardVO;
|
||||||
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewEmployeeHitRowVO;
|
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewEmployeeHitRowVO;
|
||||||
@@ -39,6 +40,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.argThat;
|
import static org.mockito.ArgumentMatchers.argThat;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.clearInvocations;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@@ -85,6 +88,7 @@ class CcdiProjectOverviewServiceImplTest {
|
|||||||
CcdiProject project = new CcdiProject();
|
CcdiProject project = new CcdiProject();
|
||||||
project.setProjectId(40L);
|
project.setProjectId(40L);
|
||||||
when(projectMapper.selectById(40L)).thenReturn(project);
|
when(projectMapper.selectById(40L)).thenReturn(project);
|
||||||
|
CcdiProjectRiskPeopleQueryDTO queryDTO = buildRiskPeopleQuery(40L);
|
||||||
|
|
||||||
CcdiProjectEmployeeRiskAggregateVO aggregate = new CcdiProjectEmployeeRiskAggregateVO();
|
CcdiProjectEmployeeRiskAggregateVO aggregate = new CcdiProjectEmployeeRiskAggregateVO();
|
||||||
aggregate.setStaffName("李四");
|
aggregate.setStaffName("李四");
|
||||||
@@ -95,24 +99,70 @@ class CcdiProjectOverviewServiceImplTest {
|
|||||||
aggregate.setRiskLevelCode("HIGH");
|
aggregate.setRiskLevelCode("HIGH");
|
||||||
aggregate.setModelCount(3);
|
aggregate.setModelCount(3);
|
||||||
aggregate.setRiskPoint("大额单笔收入、疑似兼职");
|
aggregate.setRiskPoint("大额单笔收入、疑似兼职");
|
||||||
when(overviewMapper.selectRiskPeopleOverviewByProjectId(40L)).thenReturn(List.of(aggregate));
|
Page<CcdiProjectEmployeeRiskAggregateVO> resultPage = new Page<>(1, 5);
|
||||||
|
resultPage.setRecords(List.of(aggregate));
|
||||||
|
resultPage.setTotal(1L);
|
||||||
|
when(overviewMapper.selectRiskPeopleOverviewPage(any(Page.class), any(CcdiProjectRiskPeopleQueryDTO.class)))
|
||||||
|
.thenReturn(resultPage);
|
||||||
when(overviewMapper.selectRiskHitTagsByScope(40L, "330000000000000001", null)).thenReturn(List.of(
|
when(overviewMapper.selectRiskHitTagsByScope(40L, "330000000000000001", null)).thenReturn(List.of(
|
||||||
buildHitTag("LARGE_TRANSACTION", "大额交易模型", "RULE_A", "大额单笔收入", "HIGH"),
|
buildHitTag("LARGE_TRANSACTION", "大额交易模型", "RULE_A", "大额单笔收入", "HIGH"),
|
||||||
buildHitTag("PART_TIME", "兼职取酬模型", "RULE_B", "疑似兼职", "MEDIUM")
|
buildHitTag("PART_TIME", "兼职取酬模型", "RULE_B", "疑似兼职", "MEDIUM")
|
||||||
));
|
));
|
||||||
|
|
||||||
CcdiProjectRiskPeopleOverviewVO overview = service.getRiskPeopleOverview(40L);
|
CcdiProjectRiskPeopleOverviewVO overview = service.getRiskPeopleOverview(queryDTO);
|
||||||
|
|
||||||
assertEquals(1, overview.getOverviewList().size());
|
assertEquals(1, overview.getRows().size());
|
||||||
assertEquals(8, overview.getOverviewList().getFirst().getRiskCount());
|
assertEquals(1L, overview.getTotal());
|
||||||
assertEquals("高风险", overview.getOverviewList().getFirst().getRiskLevel());
|
assertEquals(1L, overview.getPageNum());
|
||||||
assertEquals("danger", overview.getOverviewList().getFirst().getRiskLevelType());
|
assertEquals(5L, overview.getPageSize());
|
||||||
assertEquals(3, overview.getOverviewList().getFirst().getModelCount());
|
assertEquals(8, overview.getRows().getFirst().getRiskCount());
|
||||||
assertEquals(2, overview.getOverviewList().getFirst().getRiskPointTagList().size());
|
assertEquals("高风险", overview.getRows().getFirst().getRiskLevel());
|
||||||
assertEquals("LARGE_TRANSACTION", overview.getOverviewList().getFirst().getRiskPointTagList().getFirst().getModelCode());
|
assertEquals("danger", overview.getRows().getFirst().getRiskLevelType());
|
||||||
assertEquals("大额交易模型", overview.getOverviewList().getFirst().getRiskPointTagList().getFirst().getModelName());
|
assertEquals(3, overview.getRows().getFirst().getModelCount());
|
||||||
assertEquals("大额单笔收入、疑似兼职", overview.getOverviewList().getFirst().getRiskPoint());
|
assertEquals(2, overview.getRows().getFirst().getRiskPointTagList().size());
|
||||||
assertEquals("查看详情", overview.getOverviewList().getFirst().getActionLabel());
|
assertEquals("LARGE_TRANSACTION", overview.getRows().getFirst().getRiskPointTagList().getFirst().getModelCode());
|
||||||
|
assertEquals("大额交易模型", overview.getRows().getFirst().getRiskPointTagList().getFirst().getModelName());
|
||||||
|
assertEquals("大额单笔收入、疑似兼职", overview.getRows().getFirst().getRiskPoint());
|
||||||
|
assertEquals("查看详情", overview.getRows().getFirst().getActionLabel());
|
||||||
|
verify(overviewMapper).selectRiskPeopleOverviewPage(
|
||||||
|
argThat(page -> page.getCurrent() == 1L && page.getSize() == 5L),
|
||||||
|
argThat(query -> query.getProjectId().equals(40L))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldDefaultRiskPeoplePageNumAndPageSizeToOneAndFive() {
|
||||||
|
CcdiProject project = new CcdiProject();
|
||||||
|
project.setProjectId(40L);
|
||||||
|
when(projectMapper.selectById(40L)).thenReturn(project);
|
||||||
|
|
||||||
|
Page<CcdiProjectEmployeeRiskAggregateVO> emptyPage = new Page<>(1, 5);
|
||||||
|
emptyPage.setRecords(List.of());
|
||||||
|
emptyPage.setTotal(0L);
|
||||||
|
when(overviewMapper.selectRiskPeopleOverviewPage(any(Page.class), any(CcdiProjectRiskPeopleQueryDTO.class)))
|
||||||
|
.thenReturn(emptyPage);
|
||||||
|
|
||||||
|
CcdiProjectRiskPeopleQueryDTO queryDTO = new CcdiProjectRiskPeopleQueryDTO();
|
||||||
|
queryDTO.setProjectId(40L);
|
||||||
|
service.getRiskPeopleOverview(queryDTO);
|
||||||
|
|
||||||
|
verify(overviewMapper).selectRiskPeopleOverviewPage(
|
||||||
|
argThat(page -> page.getCurrent() == 1L && page.getSize() == 5L),
|
||||||
|
any(CcdiProjectRiskPeopleQueryDTO.class)
|
||||||
|
);
|
||||||
|
|
||||||
|
clearInvocations(overviewMapper);
|
||||||
|
|
||||||
|
CcdiProjectRiskPeopleQueryDTO invalidQuery = new CcdiProjectRiskPeopleQueryDTO();
|
||||||
|
invalidQuery.setProjectId(40L);
|
||||||
|
invalidQuery.setPageNum(0);
|
||||||
|
invalidQuery.setPageSize(-1);
|
||||||
|
service.getRiskPeopleOverview(invalidQuery);
|
||||||
|
|
||||||
|
verify(overviewMapper, times(1)).selectRiskPeopleOverviewPage(
|
||||||
|
argThat(page -> page.getCurrent() == 1L && page.getSize() == 5L),
|
||||||
|
any(CcdiProjectRiskPeopleQueryDTO.class)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -141,7 +191,7 @@ class CcdiProjectOverviewServiceImplTest {
|
|||||||
void shouldThrowWhenProjectDoesNotExist() {
|
void shouldThrowWhenProjectDoesNotExist() {
|
||||||
when(projectMapper.selectById(99L)).thenReturn(null);
|
when(projectMapper.selectById(99L)).thenReturn(null);
|
||||||
|
|
||||||
assertThrows(ServiceException.class, () -> service.getRiskPeopleOverview(99L));
|
assertThrows(ServiceException.class, () -> service.getRiskPeopleOverview(buildRiskPeopleQuery(99L)));
|
||||||
assertThrows(ServiceException.class, () -> service.getTopRiskPeople(99L));
|
assertThrows(ServiceException.class, () -> service.getTopRiskPeople(99L));
|
||||||
assertThrows(ServiceException.class, () -> service.getRiskModelCards(99L));
|
assertThrows(ServiceException.class, () -> service.getRiskModelCards(99L));
|
||||||
assertThrows(ServiceException.class, () -> service.getRiskModelPeople(buildRiskModelPeopleQuery(99L)));
|
assertThrows(ServiceException.class, () -> service.getRiskModelPeople(buildRiskModelPeopleQuery(99L)));
|
||||||
@@ -358,6 +408,14 @@ class CcdiProjectOverviewServiceImplTest {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CcdiProjectRiskPeopleQueryDTO buildRiskPeopleQuery(Long projectId) {
|
||||||
|
CcdiProjectRiskPeopleQueryDTO queryDTO = new CcdiProjectRiskPeopleQueryDTO();
|
||||||
|
queryDTO.setProjectId(projectId);
|
||||||
|
queryDTO.setPageNum(1);
|
||||||
|
queryDTO.setPageSize(5);
|
||||||
|
return queryDTO;
|
||||||
|
}
|
||||||
|
|
||||||
private CcdiProjectRiskModelPeopleQueryDTO buildRiskModelPeopleQuery(Long projectId) {
|
private CcdiProjectRiskModelPeopleQueryDTO buildRiskModelPeopleQuery(Long projectId) {
|
||||||
CcdiProjectRiskModelPeopleQueryDTO queryDTO = new CcdiProjectRiskModelPeopleQueryDTO();
|
CcdiProjectRiskModelPeopleQueryDTO queryDTO = new CcdiProjectRiskModelPeopleQueryDTO();
|
||||||
queryDTO.setProjectId(projectId);
|
queryDTO.setProjectId(projectId);
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# 项目详情风险总览员工列表分页后端实施记录
|
||||||
|
|
||||||
|
## 1. 实施概述
|
||||||
|
|
||||||
|
- 实施日期:2026-03-29
|
||||||
|
- 实施范围:项目详情“风险总览”员工列表后端分页接口、分页 SQL、服务映射与测试回归
|
||||||
|
- 实施结果:后端代码改造完成,定向回归通过
|
||||||
|
|
||||||
|
本次实施按设计文档完成以下内容:
|
||||||
|
|
||||||
|
- 新增 `CcdiProjectRiskPeopleQueryDTO`,统一承接 `projectId/pageNum/pageSize`
|
||||||
|
- 将 `GET /ccdi/project/overview/risk-people` 改为标准分页返回结构
|
||||||
|
- 将风险人员查询从全量列表改为 MyBatis Plus `Page` 真分页
|
||||||
|
- 为 `risk-people` 单独固定默认分页 `1/5`
|
||||||
|
|
||||||
|
## 2. 实际修改文件
|
||||||
|
|
||||||
|
### 2.1 后端代码
|
||||||
|
|
||||||
|
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectRiskPeopleQueryDTO.java`
|
||||||
|
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectRiskPeopleOverviewVO.java`
|
||||||
|
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewController.java`
|
||||||
|
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java`
|
||||||
|
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java`
|
||||||
|
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java`
|
||||||
|
- `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml`
|
||||||
|
|
||||||
|
### 2.2 测试代码
|
||||||
|
|
||||||
|
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/CcdiProjectOverviewServiceStructureTest.java`
|
||||||
|
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java`
|
||||||
|
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java`
|
||||||
|
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImplTest.java`
|
||||||
|
|
||||||
|
## 3. 关键实施说明
|
||||||
|
|
||||||
|
### 3.1 接口契约调整
|
||||||
|
|
||||||
|
- 控制器 `getRiskPeople` 从接收单个 `projectId` 改为接收 `CcdiProjectRiskPeopleQueryDTO`
|
||||||
|
- 服务接口同步改为 `getRiskPeopleOverview(CcdiProjectRiskPeopleQueryDTO queryDTO)`
|
||||||
|
- 风险人员返回结构从 `overviewList` 迁移为:
|
||||||
|
- `rows`
|
||||||
|
- `total`
|
||||||
|
- `pageNum`
|
||||||
|
- `pageSize`
|
||||||
|
|
||||||
|
### 3.2 分页实现
|
||||||
|
|
||||||
|
- Mapper 新增 `selectRiskPeopleOverviewPage(Page<CcdiProjectEmployeeRiskAggregateVO> page, @Param("query") CcdiProjectRiskPeopleQueryDTO query)`
|
||||||
|
- SQL 数据源保持 `ccdi_project_overview_employee_result` 不变
|
||||||
|
- SQL 排序规则保持:
|
||||||
|
- `risk_level_sort asc`
|
||||||
|
- `result.model_count desc`
|
||||||
|
- `result.rule_count desc`
|
||||||
|
- `result.staff_id_card asc`
|
||||||
|
- 本次未新增补丁接口,也未调整风险口径与标签组装逻辑
|
||||||
|
|
||||||
|
### 3.3 默认值策略
|
||||||
|
|
||||||
|
- `risk-people` 未复用其他列表的 `pageSize = 10`
|
||||||
|
- 在 `CcdiProjectOverviewServiceImpl` 中单独补充:
|
||||||
|
- `defaultRiskPeoplePageNum`
|
||||||
|
- `defaultRiskPeoplePageSize`
|
||||||
|
- 缺省与非法值统一回落为 `1/5`
|
||||||
|
|
||||||
|
## 4. 测试与验证
|
||||||
|
|
||||||
|
执行命令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -am -Dtest=CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest -Dsurefire.failIfNoSpecifiedTests=false test
|
||||||
|
```
|
||||||
|
|
||||||
|
验证结果:
|
||||||
|
|
||||||
|
- `CcdiProjectOverviewServiceStructureTest` 通过
|
||||||
|
- `CcdiProjectOverviewControllerTest` 通过
|
||||||
|
- `CcdiProjectOverviewMapperSqlTest` 通过
|
||||||
|
- `CcdiProjectOverviewServiceImplTest` 通过
|
||||||
|
- 共 25 个测试通过,无 failure 或 error
|
||||||
|
|
||||||
|
## 5. 实施结论
|
||||||
|
|
||||||
|
- 项目详情“风险总览”员工列表后端已完成真实分页化改造。
|
||||||
|
- 接口输出已从旧 `overviewList` 收口到标准分页结构 `rows + total + pageNum + pageSize`。
|
||||||
|
- 排序规则保持不变,本次未新增任何兼容性补丁接口。
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
# 项目详情风险总览员工列表分页前端实施记录
|
||||||
|
|
||||||
|
## 1. 实施概述
|
||||||
|
|
||||||
|
- 实施日期:2026-03-29
|
||||||
|
- 实施范围:风险总览员工列表前端分页 API、首屏分页装配、局部分页组件与测试回归
|
||||||
|
- 实施结果:前端代码改造完成,定向回归与真实浏览器翻页回归通过
|
||||||
|
|
||||||
|
本次实施按设计文档完成以下内容:
|
||||||
|
|
||||||
|
- `projectOverview.js` 中的 `getOverviewRiskPeople` 改为参数对象透传
|
||||||
|
- `PreliminaryCheck.vue` 首屏固定拉取风险员工第一页 5 条
|
||||||
|
- `RiskPeopleSection.vue` 接管局部分页状态、局部 loading 与翻页请求
|
||||||
|
- 修复 `Pagination` 与 `.sync` 联动下的翻页误拦截问题,确保点击页码后会真正发起指定页请求
|
||||||
|
|
||||||
|
## 2. 实际修改文件
|
||||||
|
|
||||||
|
### 2.1 前端代码
|
||||||
|
|
||||||
|
- `ruoyi-ui/src/api/ccdi/projectOverview.js`
|
||||||
|
- `ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue`
|
||||||
|
- `ruoyi-ui/src/views/ccdiProject/components/detail/RiskPeopleSection.vue`
|
||||||
|
- `ruoyi-ui/src/views/ccdiProject/components/detail/preliminaryCheck.mock.js`
|
||||||
|
|
||||||
|
### 2.2 测试代码
|
||||||
|
|
||||||
|
- `ruoyi-ui/tests/unit/project-overview-api.test.js`
|
||||||
|
- `ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js`
|
||||||
|
- `ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination-load.test.js`
|
||||||
|
- `ruoyi-ui/tests/unit/preliminary-check-risk-people-binding.test.js`
|
||||||
|
- `ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination.test.js`
|
||||||
|
|
||||||
|
## 3. 关键实施说明
|
||||||
|
|
||||||
|
### 3.1 API 改造
|
||||||
|
|
||||||
|
- `getOverviewRiskPeople` 从 `getOverviewRiskPeople(projectId)` 改为 `getOverviewRiskPeople(params)`
|
||||||
|
- 透传字段固定为:
|
||||||
|
- `projectId`
|
||||||
|
- `pageNum`
|
||||||
|
- `pageSize`
|
||||||
|
|
||||||
|
### 3.2 首屏数据装配
|
||||||
|
|
||||||
|
- `PreliminaryCheck.vue` 在 `Promise.all` 中改为请求:
|
||||||
|
- `getOverviewRiskPeople({ projectId: this.projectId, pageNum: 1, pageSize: 5 })`
|
||||||
|
- `createOverviewLoadedData` 将 `riskPeople` 统一归一为:
|
||||||
|
- `rows`
|
||||||
|
- `total`
|
||||||
|
- `pageNum`
|
||||||
|
- `pageSize`
|
||||||
|
|
||||||
|
### 3.3 局部分页实现
|
||||||
|
|
||||||
|
- `RiskPeopleSection.vue` 新增 `projectId` 入参
|
||||||
|
- 组件内部维护:
|
||||||
|
- `pageNum`
|
||||||
|
- `pageSize`
|
||||||
|
- `total`
|
||||||
|
- `tableLoading`
|
||||||
|
- `localRows`
|
||||||
|
- 翻页时直接调用 `getOverviewRiskPeople` 拉取指定页,并只更新当前表格数据
|
||||||
|
- 去除 `handlePageChange` 中基于同步后 `pageNum` 的提前返回,避免页码样式切换成功但数据未刷新
|
||||||
|
|
||||||
|
## 4. 测试与验证
|
||||||
|
|
||||||
|
执行命令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/project-overview-api.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination-load.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-risk-people-binding.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
验证结果:
|
||||||
|
|
||||||
|
- 5 条前端定向测试全部通过
|
||||||
|
- 首屏分页装配、分页条渲染与翻页调用链均通过结构校验
|
||||||
|
- 浏览器实测确认风险人员区点击第 2 页后会发出 `pageNum=2&pageSize=5` 请求,列表由第一页的“郑强、郭瑞、黄伟怡、许琳建、王欣”切换为第二页的“朱磊明、杨磊瑞、邓桂英、郑欣、董杰”
|
||||||
|
|
||||||
|
## 5. 实施结论
|
||||||
|
|
||||||
|
- 项目详情“风险总览”员工列表前端已完成分页化改造。
|
||||||
|
- 本次未改动风险模型区与风险明细区逻辑,仅对风险人员区做分页收口。
|
||||||
|
- 翻页行为已限制为局部刷新,不会再次触发整页结果总览并发请求。
|
||||||
|
- 真实浏览器回归已覆盖到页码点击场景,分页状态与表格数据保持一致。
|
||||||
@@ -5,12 +5,16 @@
|
|||||||
- 新增风险总览员工列表分页后端实施计划 1 份。
|
- 新增风险总览员工列表分页后端实施计划 1 份。
|
||||||
- 新增风险总览员工列表分页前端实施计划 1 份。
|
- 新增风险总览员工列表分页前端实施计划 1 份。
|
||||||
- 本次计划按统一接口改造方案收口为:保留 `GET /ccdi/project/overview/risk-people` 路径,改为标准分页返回 `rows + total + pageNum + pageSize`。
|
- 本次计划按统一接口改造方案收口为:保留 `GET /ccdi/project/overview/risk-people` 路径,改为标准分页返回 `rows + total + pageNum + pageSize`。
|
||||||
- 本轮仅完成实施计划沉淀,尚未进入代码实现阶段。
|
- 已按计划完成后端与前端实现,并补齐对应验证记录与实施记录。
|
||||||
|
|
||||||
## 新增文件
|
## 新增文件
|
||||||
|
|
||||||
- `docs/plans/backend/2026-03-29-project-detail-risk-overview-risk-people-pagination-backend-implementation.md`
|
- `docs/plans/backend/2026-03-29-project-detail-risk-overview-risk-people-pagination-backend-implementation.md`
|
||||||
- `docs/plans/frontend/2026-03-29-project-detail-risk-overview-risk-people-pagination-frontend-implementation.md`
|
- `docs/plans/frontend/2026-03-29-project-detail-risk-overview-risk-people-pagination-frontend-implementation.md`
|
||||||
|
- `docs/tests/records/2026-03-29-project-detail-risk-overview-risk-people-pagination-backend-verification.md`
|
||||||
|
- `docs/tests/records/2026-03-29-project-detail-risk-overview-risk-people-pagination-frontend-verification.md`
|
||||||
|
- `docs/reports/implementation/2026-03-29-project-detail-risk-overview-risk-people-pagination-backend-implementation.md`
|
||||||
|
- `docs/reports/implementation/2026-03-29-project-detail-risk-overview-risk-people-pagination-frontend-implementation.md`
|
||||||
|
|
||||||
## 计划结论
|
## 计划结论
|
||||||
|
|
||||||
@@ -29,4 +33,26 @@
|
|||||||
|
|
||||||
- 本次按仓库规范,将实施计划分别落到 `docs/plans/backend/` 与 `docs/plans/frontend/`。
|
- 本次按仓库规范,将实施计划分别落到 `docs/plans/backend/` 与 `docs/plans/frontend/`。
|
||||||
- 因本仓库协作约定禁止开启 subagent,计划头部已明确执行时应在当前会话使用 `superpowers:executing-plans`。
|
- 因本仓库协作约定禁止开启 subagent,计划头部已明确执行时应在当前会话使用 `superpowers:executing-plans`。
|
||||||
- 本次补充的是计划文档与计划记录,因此同步新增本计划记录作为本次改动的实施文档。
|
- 本次执行阶段同步补充后端与前端的验证记录、实施记录。
|
||||||
|
|
||||||
|
## 执行记录
|
||||||
|
|
||||||
|
### 2026-03-29 后端执行结果
|
||||||
|
|
||||||
|
- 新增 `CcdiProjectRiskPeopleQueryDTO`,将 `risk-people` 接口入参统一为 `projectId/pageNum/pageSize`
|
||||||
|
- 将 `CcdiProjectRiskPeopleOverviewVO` 返回结构从 `overviewList` 调整为 `rows + total + pageNum + pageSize`
|
||||||
|
- 为 `CcdiProjectOverviewMapper` / XML 新增 `selectRiskPeopleOverviewPage`,基于 `ccdi_project_overview_employee_result` 实现数据库真分页
|
||||||
|
- 在 `CcdiProjectOverviewServiceImpl` 中为 `risk-people` 单独固定默认分页 `1/5`
|
||||||
|
- 后端回归命令:`mvn -pl ccdi-project -am -Dtest=CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest -Dsurefire.failIfNoSpecifiedTests=false test`
|
||||||
|
|
||||||
|
### 2026-03-29 前端执行结果
|
||||||
|
|
||||||
|
- `getOverviewRiskPeople` 改为参数对象透传分页参数
|
||||||
|
- `PreliminaryCheck.vue` 首屏固定拉取第一页 5 条风险员工数据,并改用 `rows` 分页结构判断加载结果
|
||||||
|
- `RiskPeopleSection.vue` 接管 `pageNum/pageSize/total/tableLoading/localRows`,翻页时仅刷新当前列表
|
||||||
|
- 前端回归命令:
|
||||||
|
- `node ruoyi-ui/tests/unit/project-overview-api.test.js`
|
||||||
|
- `node ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js`
|
||||||
|
- `node ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination-load.test.js`
|
||||||
|
- `node ruoyi-ui/tests/unit/preliminary-check-risk-people-binding.test.js`
|
||||||
|
- `node ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination.test.js`
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# 项目详情风险总览员工列表分页后端验证记录
|
||||||
|
|
||||||
|
## 验证范围
|
||||||
|
|
||||||
|
- `risk-people` 分页接口契约
|
||||||
|
- `risk-people` 控制器返回结构
|
||||||
|
- 风险人员分页 SQL 结构与排序
|
||||||
|
- 风险人员分页服务映射与默认值
|
||||||
|
|
||||||
|
## 设计文档检查
|
||||||
|
|
||||||
|
- 已核对设计文档路径:`docs/design/2026-03-29-project-detail-risk-overview-risk-people-pagination-design.md`
|
||||||
|
|
||||||
|
## 验证命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -am -Dtest=CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest -Dsurefire.failIfNoSpecifiedTests=false test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 验证结果
|
||||||
|
|
||||||
|
- 验证日期:2026-03-29
|
||||||
|
- 首轮契约测试按计划先失败,失败点为缺少 `CcdiProjectRiskPeopleQueryDTO` 与 `CcdiProjectRiskPeopleOverviewVO` 的分页字段访问器。
|
||||||
|
- 完成分页 DTO、VO、Controller、Service、Mapper 与 XML 改造后,重新执行上述命令,`CcdiProjectOverviewServiceStructureTest`、`CcdiProjectOverviewControllerTest`、`CcdiProjectOverviewMapperSqlTest`、`CcdiProjectOverviewServiceImplTest` 共 25 个测试全部通过。
|
||||||
|
- Maven 过程中仅出现 Mockito 动态 agent 的现有 JDK 警告,无新增 failure 或 error。
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
|
||||||
|
- `GET /ccdi/project/overview/risk-people` 已改为标准分页接口,入参为 `projectId + pageNum + pageSize`。
|
||||||
|
- 接口已稳定返回 `rows + total + pageNum + pageSize`。
|
||||||
|
- 风险人员查询已基于 `ccdi_project_overview_employee_result` 实现数据库真分页,排序规则保持 `risk_level_sort asc, model_count desc, rule_count desc, staff_id_card asc` 不变。
|
||||||
|
- `risk-people` 默认分页已固定回落为 `pageNum = 1`、`pageSize = 5`。
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# 项目详情风险总览员工列表分页前端验证记录
|
||||||
|
|
||||||
|
## 验证范围
|
||||||
|
|
||||||
|
- 风险人员分页 API 封装
|
||||||
|
- 结果总览首屏风险人员分页数据装配
|
||||||
|
- 风险人员区局部分页与局部刷新
|
||||||
|
|
||||||
|
## 设计文档检查
|
||||||
|
|
||||||
|
- 已核对设计文档路径:`docs/design/2026-03-29-project-detail-risk-overview-risk-people-pagination-design.md`
|
||||||
|
|
||||||
|
## 验证命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/project-overview-api.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination-load.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-risk-people-binding.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-risk-people-pagination.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
浏览器验证补充:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui && npm run dev -- --port 1026
|
||||||
|
java -jar ruoyi-admin/target/ruoyi-admin.jar --server.port=62319
|
||||||
|
```
|
||||||
|
|
||||||
|
## 验证结果
|
||||||
|
|
||||||
|
- 验证日期:2026-03-29
|
||||||
|
- 首轮 API 测试按计划先失败,失败点为 `getOverviewRiskPeople` 仍保留旧签名 `getOverviewRiskPeople(projectId)`。
|
||||||
|
- 完成 API、`PreliminaryCheck.vue`、`RiskPeopleSection.vue` 与 `preliminaryCheck.mock.js` 改造后,重新执行上述 5 条测试命令,全部通过。
|
||||||
|
- 结构测试确认首屏固定请求第一页 `pageNum = 1`、`pageSize = 5`,风险人员区读取 `rows + total + pageNum + pageSize`,翻页时调用 `getOverviewRiskPeople` 独立刷新当前列表。
|
||||||
|
- 浏览器联调时发现 `RiskPeopleSection.vue` 的 `handlePageChange` 会在 `.sync` 已提前更新 `pageNum` 后错误命中 `if (page === this.pageNum)`,表现为页码高亮切换到第 2 页,但表格仍停留在第一页,且不会发起 `pageNum=2` 请求。
|
||||||
|
- 去除该提前返回后,重新执行前端定向测试全部通过;浏览器实测在项目详情 `http://127.0.0.1:1026/ccdiProject/detail/62?tab=overview` 点击风险人员分页第 2 页后,已发出 `GET /dev-api/ccdi/project/overview/risk-people?projectId=62&pageNum=2&pageSize=5`,列表由“郑强、郭瑞、黄伟怡、许琳建、王欣”切换为“朱磊明、杨磊瑞、邓桂英、郑欣、董杰”。
|
||||||
|
- 由于本机现有 `62318` 后端仍返回旧 `overviewList` 结构,浏览器验证阶段额外启动了 `62319` 端口的新包,并仅将风险人员接口请求转发到该端口完成真机校验。
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
|
||||||
|
- 风险总览员工列表前端已固定为每页 5 条。
|
||||||
|
- 首屏只请求第一页分页数据,不再依赖旧 `overviewList` 结构。
|
||||||
|
- 翻页逻辑已下沉到 `RiskPeopleSection.vue`,仅刷新当前风险人员列表,不重载结果总览其他区块。
|
||||||
|
- 浏览器回归确认分页页码、请求参数与表格内容已保持一致。
|
||||||
@@ -8,11 +8,15 @@ export function getOverviewDashboard(projectId) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getOverviewRiskPeople(projectId) {
|
export function getOverviewRiskPeople(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/ccdi/project/overview/risk-people',
|
url: '/ccdi/project/overview/risk-people',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: { projectId }
|
params: {
|
||||||
|
projectId: params.projectId,
|
||||||
|
pageNum: params.pageNum,
|
||||||
|
pageSize: params.pageSize
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<overview-stats :summary="currentData.summary" />
|
<overview-stats :summary="currentData.summary" />
|
||||||
<risk-people-section
|
<risk-people-section
|
||||||
|
:project-id="projectId"
|
||||||
:section-data="currentData.riskPeople"
|
:section-data="currentData.riskPeople"
|
||||||
:selected-model-codes="selectedModelCodes"
|
:selected-model-codes="selectedModelCodes"
|
||||||
@view-project-analysis="handleRiskPeopleProjectAnalysis"
|
@view-project-analysis="handleRiskPeopleProjectAnalysis"
|
||||||
@@ -201,7 +202,11 @@ export default {
|
|||||||
try {
|
try {
|
||||||
const [dashboardRes, riskPeopleRes, riskModelCardsRes, suspiciousRes, creditNegativeRes] = await Promise.all([
|
const [dashboardRes, riskPeopleRes, riskModelCardsRes, suspiciousRes, creditNegativeRes] = await Promise.all([
|
||||||
getOverviewDashboard(this.projectId),
|
getOverviewDashboard(this.projectId),
|
||||||
getOverviewRiskPeople(this.projectId),
|
getOverviewRiskPeople({
|
||||||
|
projectId: this.projectId,
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
}),
|
||||||
getOverviewRiskModelCards(this.projectId),
|
getOverviewRiskModelCards(this.projectId),
|
||||||
getOverviewSuspiciousTransactions({
|
getOverviewSuspiciousTransactions({
|
||||||
projectId: this.projectId,
|
projectId: this.projectId,
|
||||||
@@ -232,7 +237,7 @@ export default {
|
|||||||
|
|
||||||
const hasOverviewData = Boolean(
|
const hasOverviewData = Boolean(
|
||||||
(Array.isArray(dashboardData.stats) && dashboardData.stats.length) ||
|
(Array.isArray(dashboardData.stats) && dashboardData.stats.length) ||
|
||||||
(Array.isArray(riskPeopleData.overviewList) && riskPeopleData.overviewList.length) ||
|
(Array.isArray(riskPeopleData.rows) && riskPeopleData.rows.length) ||
|
||||||
(Array.isArray(riskModelCardsData.cardList) && riskModelCardsData.cardList.length)
|
(Array.isArray(riskModelCardsData.cardList) && riskModelCardsData.cardList.length)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<el-button size="mini" type="text">导出</el-button>
|
<el-button size="mini" type="text">导出</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table :data="overviewList" class="people-table">
|
<el-table v-loading="tableLoading" :data="overviewList" class="people-table">
|
||||||
<el-table-column type="index" label="序号" width="60" />
|
<el-table-column type="index" label="序号" width="60" />
|
||||||
<el-table-column prop="name" label="姓名" min-width="100" />
|
<el-table-column prop="name" label="姓名" min-width="100" />
|
||||||
<el-table-column prop="idNo" label="身份证号" min-width="180" />
|
<el-table-column prop="idNo" label="身份证号" min-width="180" />
|
||||||
@@ -46,10 +46,21 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
<pagination
|
||||||
|
v-show="total > 0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="pageNum"
|
||||||
|
:limit.sync="pageSize"
|
||||||
|
:page-sizes="[5]"
|
||||||
|
layout="total, prev, pager, next, jumper"
|
||||||
|
@pagination="handlePageChange"
|
||||||
|
/>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { getOverviewRiskPeople } from "@/api/ccdi/projectOverview";
|
||||||
|
|
||||||
// 历史静态回归锚点:scope.row.actionLabel || "查看详情"
|
// 历史静态回归锚点:scope.row.actionLabel || "查看详情"
|
||||||
const CORE_TAG_PALETTE = {
|
const CORE_TAG_PALETTE = {
|
||||||
LARGE_TRANSACTION: {
|
LARGE_TRANSACTION: {
|
||||||
@@ -155,14 +166,39 @@ function normalizeOverviewRows(rows) {
|
|||||||
export default {
|
export default {
|
||||||
name: "RiskPeopleSection",
|
name: "RiskPeopleSection",
|
||||||
props: {
|
props: {
|
||||||
|
projectId: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
sectionData: {
|
sectionData: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => ({}),
|
default: () => ({}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
total: 0,
|
||||||
|
tableLoading: false,
|
||||||
|
localRows: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
overviewList() {
|
overviewList() {
|
||||||
return normalizeOverviewRows(this.sectionData.overviewList);
|
return this.localRows;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
sectionData: {
|
||||||
|
immediate: true,
|
||||||
|
deep: true,
|
||||||
|
handler() {
|
||||||
|
this.localRows = normalizeOverviewRows(this.sectionData && this.sectionData.rows);
|
||||||
|
this.total = (this.sectionData && this.sectionData.total) || 0;
|
||||||
|
this.pageNum = (this.sectionData && this.sectionData.pageNum) || 1;
|
||||||
|
this.pageSize = (this.sectionData && this.sectionData.pageSize) || 5;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -172,6 +208,29 @@ export default {
|
|||||||
handleViewProject(row) {
|
handleViewProject(row) {
|
||||||
this.$emit("view-project-analysis", row);
|
this.$emit("view-project-analysis", row);
|
||||||
},
|
},
|
||||||
|
handlePageChange({ page }) {
|
||||||
|
this.loadRiskPeoplePage(page);
|
||||||
|
},
|
||||||
|
async loadRiskPeoplePage(pageNum) {
|
||||||
|
if (!this.projectId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.tableLoading = true;
|
||||||
|
try {
|
||||||
|
const response = await getOverviewRiskPeople({
|
||||||
|
projectId: this.projectId,
|
||||||
|
pageNum,
|
||||||
|
pageSize: 5,
|
||||||
|
});
|
||||||
|
const data = (response && response.data) || {};
|
||||||
|
this.localRows = normalizeOverviewRows(data.rows);
|
||||||
|
this.total = data.total || 0;
|
||||||
|
this.pageNum = data.pageNum || pageNum;
|
||||||
|
this.pageSize = data.pageSize || 5;
|
||||||
|
} finally {
|
||||||
|
this.tableLoading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export const mockOverviewData = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
riskPeople: {
|
riskPeople: {
|
||||||
overviewList: [
|
rows: [
|
||||||
{
|
{
|
||||||
name: "李四",
|
name: "李四",
|
||||||
idNo: "331081199003230321",
|
idNo: "331081199003230321",
|
||||||
@@ -444,9 +444,12 @@ export function createOverviewLoadedData({
|
|||||||
},
|
},
|
||||||
riskPeople: {
|
riskPeople: {
|
||||||
...mockOverviewData.riskPeople,
|
...mockOverviewData.riskPeople,
|
||||||
overviewList: Array.isArray(riskPeopleData && riskPeopleData.overviewList)
|
rows: Array.isArray(riskPeopleData && riskPeopleData.rows)
|
||||||
? riskPeopleData.overviewList
|
? riskPeopleData.rows
|
||||||
: [],
|
: [],
|
||||||
|
total: riskPeopleData && riskPeopleData.total ? riskPeopleData.total : 0,
|
||||||
|
pageNum: riskPeopleData && riskPeopleData.pageNum ? riskPeopleData.pageNum : 1,
|
||||||
|
pageSize: riskPeopleData && riskPeopleData.pageSize ? riskPeopleData.pageSize : 5,
|
||||||
},
|
},
|
||||||
riskModels: {
|
riskModels: {
|
||||||
...mockOverviewData.riskModels,
|
...mockOverviewData.riskModels,
|
||||||
@@ -480,7 +483,10 @@ export const mockOverviewStateData = {
|
|||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
riskPeople: {
|
riskPeople: {
|
||||||
overviewList: [],
|
rows: [],
|
||||||
|
total: 0,
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
},
|
},
|
||||||
riskModels: {
|
riskModels: {
|
||||||
...mockOverviewData.riskModels,
|
...mockOverviewData.riskModels,
|
||||||
|
|||||||
@@ -31,7 +31,10 @@ const loadOverviewDataBlock = source.match(
|
|||||||
assert(loadOverviewDataBlock, "入口页应继续并发请求仪表盘、风险人员、模型卡片、涉疑交易和员工负面征信");
|
assert(loadOverviewDataBlock, "入口页应继续并发请求仪表盘、风险人员、模型卡片、涉疑交易和员工负面征信");
|
||||||
[
|
[
|
||||||
"getOverviewDashboard(this.projectId)",
|
"getOverviewDashboard(this.projectId)",
|
||||||
"getOverviewRiskPeople(this.projectId)",
|
"getOverviewRiskPeople({",
|
||||||
|
"projectId: this.projectId",
|
||||||
|
"pageNum: 1",
|
||||||
|
"pageSize: 5",
|
||||||
"getOverviewRiskModelCards(this.projectId)",
|
"getOverviewRiskModelCards(this.projectId)",
|
||||||
"getOverviewSuspiciousTransactions({",
|
"getOverviewSuspiciousTransactions({",
|
||||||
"getOverviewEmployeeCreditNegative({",
|
"getOverviewEmployeeCreditNegative({",
|
||||||
@@ -41,6 +44,7 @@ assert(loadOverviewDataBlock, "入口页应继续并发请求仪表盘、风险
|
|||||||
"createOverviewLoadedData",
|
"createOverviewLoadedData",
|
||||||
"dashboardData",
|
"dashboardData",
|
||||||
"riskPeopleData",
|
"riskPeopleData",
|
||||||
|
"riskPeopleData.rows",
|
||||||
"riskModelCardsData",
|
"riskModelCardsData",
|
||||||
"creditNegativeData",
|
"creditNegativeData",
|
||||||
].forEach((token) => assert(source.includes(token), token));
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
|||||||
@@ -8,16 +8,20 @@ const source = fs.readFileSync(
|
|||||||
);
|
);
|
||||||
|
|
||||||
[
|
[
|
||||||
"sectionData.overviewList",
|
"sectionData.rows",
|
||||||
"normalizeOverviewRows",
|
"normalizeOverviewRows",
|
||||||
"normalizeRiskPointTags",
|
"normalizeRiskPointTags",
|
||||||
"riskCount",
|
"riskCount",
|
||||||
"riskPoint",
|
"riskPoint",
|
||||||
"modelCount",
|
"modelCount",
|
||||||
|
"pageNum",
|
||||||
|
"pageSize",
|
||||||
|
"total",
|
||||||
"riskLevelType",
|
"riskLevelType",
|
||||||
].forEach((token) => assert(source.includes(token), token));
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
|
||||||
assert(!source.includes("sectionData.topRiskList"), "不应再绑定TOP10列表");
|
assert(!source.includes("sectionData.topRiskList"), "不应再绑定TOP10列表");
|
||||||
|
assert(!source.includes("sectionData.overviewList"), "风险人员列表不应再绑定 overviewList");
|
||||||
|
|
||||||
assert(!source.includes("scope.row.riskLevelType || 'danger'"), "riskLevelType fallback");
|
assert(!source.includes("scope.row.riskLevelType || 'danger'"), "riskLevelType fallback");
|
||||||
assert(source.includes('scope.row.actionLabel || "查看详情"'), "actionLabel fallback");
|
assert(source.includes('scope.row.actionLabel || "查看详情"'), "actionLabel fallback");
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
const assert = require("assert");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
const source = fs.readFileSync(
|
||||||
|
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/PreliminaryCheck.vue"),
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
const mockSource = fs.readFileSync(
|
||||||
|
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/preliminaryCheck.mock.js"),
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
|
||||||
|
[
|
||||||
|
"getOverviewRiskPeople({",
|
||||||
|
"projectId: this.projectId",
|
||||||
|
"pageNum: 1",
|
||||||
|
"pageSize: 5",
|
||||||
|
"riskPeopleData.rows",
|
||||||
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
|
||||||
|
[
|
||||||
|
"rows",
|
||||||
|
"total",
|
||||||
|
"pageNum",
|
||||||
|
"pageSize",
|
||||||
|
].forEach((token) => assert(mockSource.includes(token), `riskPeople 应保存 ${token}`));
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
const assert = require("assert");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
const entrySource = fs.readFileSync(
|
||||||
|
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/PreliminaryCheck.vue"),
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
const sectionSource = fs.readFileSync(
|
||||||
|
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/RiskPeopleSection.vue"),
|
||||||
|
"utf8"
|
||||||
|
);
|
||||||
|
|
||||||
|
[
|
||||||
|
':project-id="projectId"',
|
||||||
|
':section-data="currentData.riskPeople"',
|
||||||
|
].forEach((token) => assert(entrySource.includes(token), token));
|
||||||
|
|
||||||
|
[
|
||||||
|
"sectionData.rows",
|
||||||
|
"pageNum",
|
||||||
|
"pageSize",
|
||||||
|
"total",
|
||||||
|
"<pagination",
|
||||||
|
':page-sizes="[5]"',
|
||||||
|
"handlePageChange",
|
||||||
|
"loadRiskPeoplePage",
|
||||||
|
"getOverviewRiskPeople",
|
||||||
|
"tableLoading",
|
||||||
|
].forEach((token) => assert(sectionSource.includes(token), token));
|
||||||
|
|
||||||
|
assert(!sectionSource.includes("if (page === this.pageNum)"), "分页切换不应被同步后的 pageNum 提前拦截");
|
||||||
@@ -27,6 +27,14 @@ const source = fs.readFileSync(
|
|||||||
"/ccdi/project/overview/top-risk-people",
|
"/ccdi/project/overview/top-risk-people",
|
||||||
].forEach((token) => assert(!source.includes(token), token));
|
].forEach((token) => assert(!source.includes(token), token));
|
||||||
|
|
||||||
|
[
|
||||||
|
"getOverviewRiskPeople(params)",
|
||||||
|
"/ccdi/project/overview/risk-people",
|
||||||
|
"projectId: params.projectId",
|
||||||
|
"pageNum: params.pageNum",
|
||||||
|
"pageSize: params.pageSize",
|
||||||
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
|
||||||
const riskModelPeopleFn = source.match(
|
const riskModelPeopleFn = source.match(
|
||||||
/export function getOverviewRiskModelPeople\(params\) \{[\s\S]*?params:\s*\{([\s\S]*?)\}\s*\}\s*\)/m
|
/export function getOverviewRiskModelPeople\(params\) \{[\s\S]*?params:\s*\{([\s\S]*?)\}\s*\}\s*\)/m
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user