新增风险明细员工负面征信实施计划
This commit is contained in:
@@ -0,0 +1,250 @@
|
|||||||
|
# Risk Detail Employee Credit Negative Backend Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
>
|
||||||
|
> **Repo note:** 本仓库 `AGENTS.md` 明确禁止开启 subagent,执行本计划时请在当前会话使用 `superpowers:executing-plans`。
|
||||||
|
|
||||||
|
**Goal:** 为结果总览“风险明细”新增项目维度的员工负面征信分页查询能力,保证页面可以按当前项目结果总览员工口径展示负面征信列表。
|
||||||
|
|
||||||
|
**Architecture:** 后端继续收敛到 `CcdiProjectOverviewController -> ICcdiProjectOverviewService -> CcdiProjectOverviewMapper` 这一条结果总览链路,不复用全局征信维护接口。查询以 `ccdi_project_overview_employee_result` 限定项目员工范围,再与 `ccdi_credit_negative_info` 关联,仅输出存在负面征信记录的员工,并按 `query_date desc, person_id asc` 分页返回。
|
||||||
|
|
||||||
|
**Tech Stack:** Java 21, Spring Boot 3, MyBatis Plus `Page`, MyBatis XML, Maven, JUnit 5, Mockito, Swagger/OpenAPI
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: 建立结果总览员工负面征信接口契约
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectEmployeeCreditNegativeQueryDTO.java`
|
||||||
|
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectEmployeeCreditNegativeItemVO.java`
|
||||||
|
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectEmployeeCreditNegativePageVO.java`
|
||||||
|
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java`
|
||||||
|
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewController.java`
|
||||||
|
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/CcdiProjectOverviewServiceStructureTest.java`
|
||||||
|
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java`
|
||||||
|
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 先写失败测试,锁定新 DTO、VO、Service 方法和 Controller 路由**
|
||||||
|
|
||||||
|
```java
|
||||||
|
assertNotNull(clazz.getMethod(
|
||||||
|
"getEmployeeCreditNegative",
|
||||||
|
Class.forName("com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO")
|
||||||
|
));
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
assertEquals("/employee-credit-negative", getMapping.value()[0]);
|
||||||
|
assertEquals(List.of("projectId", "pageNum", "pageSize"), fieldNames);
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: 运行结构测试和控制器契约测试,确认当前仓库尚未暴露该能力**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -Dtest=CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewControllerTest test
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `CcdiProjectOverviewServiceStructureTest` 报 `NoSuchMethodException`
|
||||||
|
- `CcdiProjectOverviewControllerContractTest` 提示缺少 `/employee-credit-negative`
|
||||||
|
- `CcdiProjectOverviewControllerTest` 还没有对应控制器方法
|
||||||
|
|
||||||
|
- [ ] **Step 3: 写最小 DTO / VO / Controller / Service 签名**
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class CcdiProjectEmployeeCreditNegativeQueryDTO {
|
||||||
|
private Long projectId;
|
||||||
|
private Integer pageNum;
|
||||||
|
private Integer pageSize;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
@GetMapping("/employee-credit-negative")
|
||||||
|
public AjaxResult getEmployeeCreditNegative(CcdiProjectEmployeeCreditNegativeQueryDTO queryDTO) {
|
||||||
|
return AjaxResult.success(overviewService.getEmployeeCreditNegative(queryDTO));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: 回跑接口契约测试,确保新接口已被正确暴露**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -Dtest=CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewControllerTest test
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: PASS
|
||||||
|
|
||||||
|
- [ ] **Step 5: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectEmployeeCreditNegativeQueryDTO.java \
|
||||||
|
ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectEmployeeCreditNegativeItemVO.java \
|
||||||
|
ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectEmployeeCreditNegativePageVO.java \
|
||||||
|
ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectOverviewService.java \
|
||||||
|
ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewController.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/CcdiProjectOverviewServiceStructureTest.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java
|
||||||
|
git commit -m "新增结果总览员工负面征信接口契约"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 2: 落地项目员工负面征信 SQL 查询与分页服务
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java`
|
||||||
|
- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml`
|
||||||
|
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java`
|
||||||
|
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java`
|
||||||
|
- Create: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceEmployeeCreditNegativeTest.java`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 先写 SQL 结构测试和服务测试,锁定项目范围、负面字段与排序规则**
|
||||||
|
|
||||||
|
```java
|
||||||
|
assertTrue(employeeCreditSql.contains("from ccdi_project_overview_employee_result"), employeeCreditSql);
|
||||||
|
assertTrue(employeeCreditSql.contains("inner join ccdi_credit_negative_info"), employeeCreditSql);
|
||||||
|
assertTrue(employeeCreditSql.contains("result.project_id = #{query.projectId}"), employeeCreditSql);
|
||||||
|
assertTrue(employeeCreditSql.contains("order by neg.query_date desc, neg.person_id asc"), employeeCreditSql);
|
||||||
|
assertFalse(employeeCreditSql.contains("ccdi_debts_info"), employeeCreditSql);
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
verify(overviewMapper).selectEmployeeCreditNegativePage(
|
||||||
|
any(Page.class),
|
||||||
|
argThat(query -> query.getProjectId().equals(40L))
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: 运行测试,确认当前查询链路还不存在**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest test
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- SQL 测试提示缺少 `selectEmployeeCreditNegativePage`
|
||||||
|
- Service 测试编译失败或断言失败,提示未新增 mapper / service 能力
|
||||||
|
|
||||||
|
- [ ] **Step 3: 写最小 SQL 与服务实现**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<select id="selectEmployeeCreditNegativePage"
|
||||||
|
resultType="com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativeItemVO">
|
||||||
|
select
|
||||||
|
coalesce(neg.person_name, result.staff_name) as personName,
|
||||||
|
neg.person_id as personId,
|
||||||
|
neg.query_date as queryDate,
|
||||||
|
ifnull(neg.civil_cnt, 0) as civilCnt,
|
||||||
|
ifnull(neg.civil_lmt, 0) as civilLmt,
|
||||||
|
ifnull(neg.enforce_cnt, 0) as enforceCnt,
|
||||||
|
ifnull(neg.enforce_lmt, 0) as enforceLmt,
|
||||||
|
ifnull(neg.adm_cnt, 0) as admCnt,
|
||||||
|
ifnull(neg.adm_lmt, 0) as admLmt
|
||||||
|
from ccdi_project_overview_employee_result result
|
||||||
|
inner join ccdi_credit_negative_info neg
|
||||||
|
on neg.person_id = result.staff_id_card
|
||||||
|
where result.project_id = #{query.projectId}
|
||||||
|
order by neg.query_date desc, neg.person_id asc
|
||||||
|
</select>
|
||||||
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
Page<CcdiProjectEmployeeCreditNegativeItemVO> page = new Page<>(
|
||||||
|
defaultPageNum(queryDTO.getPageNum()),
|
||||||
|
defaultPageSize(queryDTO.getPageSize())
|
||||||
|
);
|
||||||
|
Page<CcdiProjectEmployeeCreditNegativeItemVO> resultPage =
|
||||||
|
overviewMapper.selectEmployeeCreditNegativePage(page, queryDTO);
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: 回跑 SQL 与服务测试,验证只返回项目内有负面征信的员工**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest test
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- SQL 测试确认不关联 `ccdi_debts_info`
|
||||||
|
- Service 测试确认分页结果包含 `rows` 和 `total`
|
||||||
|
- 项目不存在时继续抛 `ServiceException("项目不存在")`
|
||||||
|
|
||||||
|
- [ ] **Step 5: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java \
|
||||||
|
ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml \
|
||||||
|
ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceEmployeeCreditNegativeTest.java
|
||||||
|
git commit -m "实现结果总览员工负面征信分页查询"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 3: 补齐控制器返回与回归验证
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java`
|
||||||
|
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/CcdiProjectOverviewServiceStructureTest.java`
|
||||||
|
- Reference: `docs/superpowers/specs/2026-03-28-risk-detail-employee-credit-negative-design.md`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 在控制器测试里锁定返回字段和权限沿用**
|
||||||
|
|
||||||
|
```java
|
||||||
|
CcdiProjectEmployeeCreditNegativePageVO pageVO = new CcdiProjectEmployeeCreditNegativePageVO();
|
||||||
|
pageVO.setRows(List.of(item));
|
||||||
|
pageVO.setTotal(1L);
|
||||||
|
when(overviewService.getEmployeeCreditNegative(queryDTO)).thenReturn(pageVO);
|
||||||
|
|
||||||
|
AjaxResult result = controller.getEmployeeCreditNegative(queryDTO);
|
||||||
|
assertEquals(pageVO, result.get("data"));
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: 回跑控制器相关测试,确认没有破坏既有结果总览契约**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -Dtest=CcdiProjectOverviewControllerTest,CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewServiceStructureTest test
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: PASS
|
||||||
|
|
||||||
|
- [ ] **Step 3: 做一次后端最小回归**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mvn -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceEmployeeCreditNegativeTest,CcdiProjectOverviewControllerTest test
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 新增员工负面征信链路测试全部通过
|
||||||
|
- 结果总览既有涉疑交易和项目分析控制器测试不回归
|
||||||
|
|
||||||
|
- [ ] **Step 4: 记录实施边界**
|
||||||
|
|
||||||
|
将以下结论补到提交说明或实施记录中:
|
||||||
|
|
||||||
|
- 本次只新增项目维度负面征信列表
|
||||||
|
- 未改动全局征信维护接口
|
||||||
|
- 未接入负债明细
|
||||||
|
|
||||||
|
- [ ] **Step 5: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerTest.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectOverviewControllerContractTest.java \
|
||||||
|
ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/CcdiProjectOverviewServiceStructureTest.java
|
||||||
|
git commit -m "补充结果总览员工负面征信后端回归测试"
|
||||||
|
```
|
||||||
@@ -0,0 +1,333 @@
|
|||||||
|
# Risk Detail Employee Credit Negative Frontend Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||||
|
>
|
||||||
|
> **Repo note:** 本仓库 `AGENTS.md` 明确禁止开启 subagent,执行本计划时请在当前会话使用 `superpowers:executing-plans`。
|
||||||
|
|
||||||
|
**Goal:** 在结果总览“风险明细”中新增“员工负面征信信息”区块,按项目维度展示员工负面征信分页列表,并与现有涉疑交易区块并列呈现。
|
||||||
|
|
||||||
|
**Architecture:** 前端继续以 `PreliminaryCheck.vue` 作为结果总览入口,通过 `projectOverview.js` 新增员工负面征信接口封装,并在初次加载时注入 `riskDetails` 初始数据。`RiskDetailSection.vue` 负责渲染员工负面征信表格、空态和独立分页,并在后续翻页时直接调用结果总览专用接口,不复用全局征信维护页面或弹窗链路。
|
||||||
|
|
||||||
|
**Tech Stack:** Vue 2, Element UI, SCSS, axios request 封装, Node `assert` 结构测试
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: 新增结果总览员工负面征信前端 API 契约
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ruoyi-ui/src/api/ccdi/projectOverview.js`
|
||||||
|
- Test: `ruoyi-ui/tests/unit/project-overview-api.test.js`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 先写 API 契约测试,锁定接口名、路由和参数透传**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
[
|
||||||
|
"getOverviewEmployeeCreditNegative",
|
||||||
|
"/ccdi/project/overview/employee-credit-negative",
|
||||||
|
"projectId: params.projectId",
|
||||||
|
"pageNum: params.pageNum",
|
||||||
|
"pageSize: params.pageSize",
|
||||||
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: 运行测试,确认当前项目还未接入该 API**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/project-overview-api.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- FAIL,提示缺少 `getOverviewEmployeeCreditNegative`
|
||||||
|
|
||||||
|
- [ ] **Step 3: 写最小 API 封装**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export function getOverviewEmployeeCreditNegative(params) {
|
||||||
|
return request({
|
||||||
|
url: "/ccdi/project/overview/employee-credit-negative",
|
||||||
|
method: "get",
|
||||||
|
params: {
|
||||||
|
projectId: params.projectId,
|
||||||
|
pageNum: params.pageNum,
|
||||||
|
pageSize: params.pageSize,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: 回跑 API 契约测试**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/project-overview-api.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: PASS
|
||||||
|
|
||||||
|
- [ ] **Step 5: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ruoyi-ui/src/api/ccdi/projectOverview.js \
|
||||||
|
ruoyi-ui/tests/unit/project-overview-api.test.js
|
||||||
|
git commit -m "新增结果总览员工负面征信前端接口"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 2: 在结果总览入口加载员工负面征信初始数据
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue`
|
||||||
|
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/preliminaryCheck.mock.js`
|
||||||
|
- Modify: `ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js`
|
||||||
|
- Create: `ruoyi-ui/tests/unit/preliminary-check-credit-negative-load.test.js`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 先写失败测试,锁定父组件并发请求和 `riskDetails` 注入结构**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
assert(source.includes("getOverviewEmployeeCreditNegative"), "结果总览应加载员工负面征信接口");
|
||||||
|
assert(source.includes("employeeCreditNegativeList"), "riskDetails 应注入员工负面征信初始列表");
|
||||||
|
assert(source.includes("employeeCreditNegativeTotal"), "riskDetails 应注入员工负面征信总数");
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: 运行测试,确认当前入口页尚未接入该数据源**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-credit-negative-load.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- `preliminary-check-api-integration.test.js` 仍只有 4 个并发请求
|
||||||
|
- 新测试提示缺少员工负面征信数据装配
|
||||||
|
|
||||||
|
- [ ] **Step 3: 在父组件中并行加载新接口,并改造 mock 归一化结构**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const [dashboardRes, riskPeopleRes, riskModelCardsRes, suspiciousRes, creditNegativeRes] =
|
||||||
|
await Promise.all([
|
||||||
|
getOverviewDashboard(this.projectId),
|
||||||
|
getOverviewRiskPeople(this.projectId),
|
||||||
|
getOverviewRiskModelCards(this.projectId),
|
||||||
|
getOverviewSuspiciousTransactions({ projectId: this.projectId, suspiciousType: "ALL", pageNum: 1, pageSize: 5 }),
|
||||||
|
getOverviewEmployeeCreditNegative({ projectId: this.projectId, pageNum: 1, pageSize: 5 }),
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
riskDetails: {
|
||||||
|
projectId,
|
||||||
|
suspiciousTransactionList: normalizeSuspiciousTransactions(suspiciousData && suspiciousData.rows),
|
||||||
|
suspiciousType: "ALL",
|
||||||
|
total: suspiciousData && suspiciousData.total ? suspiciousData.total : 0,
|
||||||
|
employeeCreditNegativeList: normalizeEmployeeCreditNegativeRows(creditNegativeData && creditNegativeData.rows),
|
||||||
|
employeeCreditNegativeTotal: creditNegativeData && creditNegativeData.total ? creditNegativeData.total : 0,
|
||||||
|
abnormalAccountList: [],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: 回跑入口页相关测试**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-credit-negative-load.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: PASS
|
||||||
|
|
||||||
|
- [ ] **Step 5: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue \
|
||||||
|
ruoyi-ui/src/views/ccdiProject/components/detail/preliminaryCheck.mock.js \
|
||||||
|
ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js \
|
||||||
|
ruoyi-ui/tests/unit/preliminary-check-credit-negative-load.test.js
|
||||||
|
git commit -m "接通结果总览员工负面征信初始加载"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 3: 在 RiskDetailSection 中新增员工负面征信区块与独立分页
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue`
|
||||||
|
- Modify: `ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-layout.test.js`
|
||||||
|
- Create: `ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js`
|
||||||
|
- Create: `ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-pagination.test.js`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 先写失败测试,锁定新区块标题、列定义、空态和独立分页状态**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
[
|
||||||
|
"员工负面征信信息",
|
||||||
|
"展示当前项目员工的负面征信信息",
|
||||||
|
"员工姓名",
|
||||||
|
"身份证号",
|
||||||
|
"最近征信查询日期",
|
||||||
|
"民事案件笔数",
|
||||||
|
"民事案件金额",
|
||||||
|
"强制执行笔数",
|
||||||
|
"强制执行金额",
|
||||||
|
"行政处罚笔数",
|
||||||
|
"行政处罚金额",
|
||||||
|
"当前项目暂无员工负面征信信息",
|
||||||
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
[
|
||||||
|
"employeeCreditNegativeList",
|
||||||
|
"employeeCreditNegativeTotal",
|
||||||
|
"employeeCreditNegativePageNum",
|
||||||
|
"employeeCreditNegativePageSize",
|
||||||
|
"loadEmployeeCreditNegative",
|
||||||
|
"handleEmployeeCreditNegativePageChange",
|
||||||
|
].forEach((token) => assert(source.includes(token), token));
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 2: 运行测试,确认当前风险明细组件还没有该区块**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-layout.test.js
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-pagination.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 新测试 FAIL,提示缺少员工负面征信区块和独立分页状态
|
||||||
|
|
||||||
|
- [ ] **Step 3: 写最小 UI 与分页实现**
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<div class="block">
|
||||||
|
<div class="block-header">
|
||||||
|
<div>
|
||||||
|
<div class="block-title">员工负面征信信息</div>
|
||||||
|
<div class="block-subtitle">展示当前项目员工的负面征信信息</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
v-loading="employeeCreditNegativeLoading"
|
||||||
|
:data="employeeCreditNegativeList"
|
||||||
|
class="result-table"
|
||||||
|
>
|
||||||
|
<template slot="empty">
|
||||||
|
<el-empty :image-size="96" description="当前项目暂无员工负面征信信息" />
|
||||||
|
</template>
|
||||||
|
<el-table-column prop="personName" label="员工姓名" min-width="140" />
|
||||||
|
<el-table-column prop="personId" label="身份证号" min-width="180" />
|
||||||
|
<el-table-column prop="queryDate" label="最近征信查询日期" min-width="160" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
async loadEmployeeCreditNegative() {
|
||||||
|
const response = await getOverviewEmployeeCreditNegative({
|
||||||
|
projectId: this.projectId,
|
||||||
|
pageNum: this.employeeCreditNegativePageNum,
|
||||||
|
pageSize: 5,
|
||||||
|
});
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- [ ] **Step 4: 回跑风险明细相关测试**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-layout.test.js
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-pagination.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 员工负面征信区块结构、列定义、空态和分页状态测试全部通过
|
||||||
|
- 不影响现有涉疑交易布局测试
|
||||||
|
|
||||||
|
- [ ] **Step 5: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue \
|
||||||
|
ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-layout.test.js \
|
||||||
|
ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js \
|
||||||
|
ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-pagination.test.js
|
||||||
|
git commit -m "新增风险明细员工负面征信列表区块"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Task 4: 做一次结果总览前端最小回归
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Reference: `ruoyi-ui/tests/unit/preliminary-check-layout.test.js`
|
||||||
|
- Reference: `ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js`
|
||||||
|
- Reference: `ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-detail-dialog.test.js`
|
||||||
|
- Reference: `ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js`
|
||||||
|
|
||||||
|
- [ ] **Step 1: 回跑结果总览关键结构测试**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-layout.test.js
|
||||||
|
node ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-detail-dialog.test.js
|
||||||
|
node ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 入口页整体结构不回归
|
||||||
|
- 涉疑交易详情弹窗仍可用
|
||||||
|
- 新增员工负面征信区块测试通过
|
||||||
|
|
||||||
|
- [ ] **Step 2: 做一次前端静态构建验证**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ruoyi-ui
|
||||||
|
npm run build:prod
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 构建成功
|
||||||
|
- 没有因新增 API 或组件状态字段导致的编译错误
|
||||||
|
|
||||||
|
- [ ] **Step 3: 结束验证时清理本次启动的前端进程**
|
||||||
|
|
||||||
|
若本地为验证启动了 `npm run dev`,结束后执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
lsof -ti tcp:80 tcp:8080 tcp:8081 | xargs kill -9
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
- 不遗留前端调试进程
|
||||||
|
|
||||||
|
- [ ] **Step 4: 提交本任务**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git status --short
|
||||||
|
git add ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue \
|
||||||
|
ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue \
|
||||||
|
ruoyi-ui/src/views/ccdiProject/components/detail/preliminaryCheck.mock.js \
|
||||||
|
ruoyi-ui/src/api/ccdi/projectOverview.js \
|
||||||
|
ruoyi-ui/tests/unit/preliminary-check-api-integration.test.js \
|
||||||
|
ruoyi-ui/tests/unit/preliminary-check-credit-negative-load.test.js \
|
||||||
|
ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-layout.test.js \
|
||||||
|
ruoyi-ui/tests/unit/risk-detail-employee-credit-negative-pagination.test.js
|
||||||
|
git commit -m "完成风险明细员工负面征信前端实现"
|
||||||
|
```
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# 风险明细员工负面征信实施计划记录
|
||||||
|
|
||||||
|
## 本次改动
|
||||||
|
|
||||||
|
- 新增后端实施计划 `docs/plans/backend/2026-03-28-risk-detail-employee-credit-negative-backend-implementation.md`
|
||||||
|
- 新增前端实施计划 `docs/plans/frontend/2026-03-28-risk-detail-employee-credit-negative-frontend-implementation.md`
|
||||||
|
|
||||||
|
## 计划结论
|
||||||
|
|
||||||
|
- 后端沿用结果总览聚合链路,新增项目维度员工负面征信分页接口
|
||||||
|
- 前端在 `RiskDetailSection.vue` 中新增员工负面征信表格区块与独立分页
|
||||||
|
- 页面只展示 `ccdi_credit_negative_info` 负面信息,不接入负债明细
|
||||||
|
|
||||||
|
## 备注
|
||||||
|
|
||||||
|
- 依据仓库约定,本次已分别输出前端、后端两份执行文档
|
||||||
|
- 后续若进入实施阶段,应优先按计划中的测试先行步骤执行
|
||||||
Reference in New Issue
Block a user