From 559572da8c3f8522fcbc658e3c054310e394eda9 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Sat, 28 Mar 2026 16:06:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A3=8E=E9=99=A9=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E5=91=98=E5=B7=A5=E8=B4=9F=E9=9D=A2=E5=BE=81=E4=BF=A1?= =?UTF-8?q?=E5=AE=9E=E6=96=BD=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-credit-negative-backend-implementation.md | 250 +++++++++++++ ...credit-negative-frontend-implementation.md | 333 ++++++++++++++++++ ...il-employee-credit-negative-plan-record.md | 17 + 3 files changed, 600 insertions(+) create mode 100644 docs/plans/backend/2026-03-28-risk-detail-employee-credit-negative-backend-implementation.md create mode 100644 docs/plans/frontend/2026-03-28-risk-detail-employee-credit-negative-frontend-implementation.md create mode 100644 docs/reports/implementation/2026-03-28-risk-detail-employee-credit-negative-plan-record.md diff --git a/docs/plans/backend/2026-03-28-risk-detail-employee-credit-negative-backend-implementation.md b/docs/plans/backend/2026-03-28-risk-detail-employee-credit-negative-backend-implementation.md new file mode 100644 index 00000000..90c0789e --- /dev/null +++ b/docs/plans/backend/2026-03-28-risk-detail-employee-credit-negative-backend-implementation.md @@ -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 + +``` + +```java +Page page = new Page<>( + defaultPageNum(queryDTO.getPageNum()), + defaultPageSize(queryDTO.getPageSize()) +); +Page 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 "补充结果总览员工负面征信后端回归测试" +``` diff --git a/docs/plans/frontend/2026-03-28-risk-detail-employee-credit-negative-frontend-implementation.md b/docs/plans/frontend/2026-03-28-risk-detail-employee-credit-negative-frontend-implementation.md new file mode 100644 index 00000000..ebb884ad --- /dev/null +++ b/docs/plans/frontend/2026-03-28-risk-detail-employee-credit-negative-frontend-implementation.md @@ -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 +
+
+
+
员工负面征信信息
+
展示当前项目员工的负面征信信息
+
+
+ + + + + + + +
+``` + +```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 "完成风险明细员工负面征信前端实现" +``` diff --git a/docs/reports/implementation/2026-03-28-risk-detail-employee-credit-negative-plan-record.md b/docs/reports/implementation/2026-03-28-risk-detail-employee-credit-negative-plan-record.md new file mode 100644 index 00000000..14a86fd7 --- /dev/null +++ b/docs/reports/implementation/2026-03-28-risk-detail-employee-credit-negative-plan-record.md @@ -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` 负面信息,不接入负债明细 + +## 备注 + +- 依据仓库约定,本次已分别输出前端、后端两份执行文档 +- 后续若进入实施阶段,应优先按计划中的测试先行步骤执行