From 979b90568286cb3c3cfe6e9748e5470a0dfc7a03 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Tue, 24 Mar 2026 17:15:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=93=E9=A1=B9=E6=A0=B8?= =?UTF-8?q?=E6=9F=A5=E5=AE=B6=E5=BA=AD=E8=B5=84=E4=BA=A7=E8=B4=9F=E5=80=BA?= =?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 --- ...-asset-liability-backend-implementation.md | 309 +++++++++++++++++ ...asset-liability-frontend-implementation.md | 328 ++++++++++++++++++ ...heck-family-asset-liability-plan-record.md | 25 ++ 3 files changed, 662 insertions(+) create mode 100644 docs/plans/backend/2026-03-24-special-check-family-asset-liability-backend-implementation.md create mode 100644 docs/plans/frontend/2026-03-24-special-check-family-asset-liability-frontend-implementation.md create mode 100644 docs/reports/implementation/2026-03-24-special-check-family-asset-liability-plan-record.md diff --git a/docs/plans/backend/2026-03-24-special-check-family-asset-liability-backend-implementation.md b/docs/plans/backend/2026-03-24-special-check-family-asset-liability-backend-implementation.md new file mode 100644 index 00000000..93f527ce --- /dev/null +++ b/docs/plans/backend/2026-03-24-special-check-family-asset-liability-backend-implementation.md @@ -0,0 +1,309 @@ +# Special Check Family Asset Liability 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. + +**Goal:** 为专项排查页新增“员工家庭资产负债专项核查”后端查询能力,支持项目内员工列表出数与单个员工家庭收入、资产、负债明细展开。 + +**Architecture:** 采用专项核查专用查询链路,不复用结果总览员工结果表。新增 `CcdiProjectSpecialCheckController + Service + Mapper`,按项目内已入库流水命中的员工范围聚合本人与配偶的收入、资产、征信本金余额,并拆成列表接口与详情接口两条只读查询。 + +**Tech Stack:** Java 21, Spring Boot 3, MyBatis XML, Maven, JUnit 5 + +--- + +### Task 1: 定义专项核查接口契约、DTO 与 VO + +**Files:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityListQueryDTO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityDetailQueryDTO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListItemVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyIncomeDetailVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetItemVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetDetailVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtItemVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtDetailVO.java` +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityDetailVO.java` +- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerContractTest.java` + +- [ ] **Step 1: Write the failing test** + +为控制器契约补静态/反射测试,锁定以下路径和方法: + +- `GET /ccdi/project/special-check/family-asset-liability/list` +- `GET /ccdi/project/special-check/family-asset-liability/detail` + +并锁定 DTO / VO 基本字段: + +- 列表入参:`projectId` +- 详情入参:`projectId`、`staffIdCard` +- 列表项:`staffIdCard`、`staffCode`、`staffName`、`deptName`、`totalIncome`、`totalAsset`、`totalDebt`、`comparisonAmount`、`riskLevelCode`、`riskLevelName` +- 详情:`incomeDetail`、`assetDetail`、`debtDetail`、`summary` + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckControllerContractTest +``` + +Expected: + +- `FAIL` +- 原因是控制器、DTO、VO 尚未创建 + +- [ ] **Step 3: Write minimal implementation** + +补齐控制器、服务接口、DTO 与 VO。 + +控制器要求: + +- 继续使用 `@Tag`、`@Operation` +- 权限沿用 `@PreAuthorize("@ss.hasPermi('ccdi:project:query')")` +- 返回统一使用 `AjaxResult.success(...)` + +DTO 要求: + +- 使用独立 DTO,不直接裸接 `Long` +- `projectId`、`staffIdCard` 做基础非空约束 + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckControllerContractTest +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityListQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectFamilyAssetLiabilityDetailQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListItemVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityListVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyIncomeDetailVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetItemVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetDetailVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtItemVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyDebtDetailVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectFamilyAssetLiabilityDetailVO.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerContractTest.java +git commit -m "定义专项核查家庭资产负债接口契约" +``` + +### Task 2: 实现项目员工范围与列表聚合 SQL + +**Files:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java` +- Create: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml` +- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java` + +- [ ] **Step 1: Write the failing test** + +新增 Mapper XML 测试,锁定以下核心 SQL 口径: + +- 项目员工范围沿用“项目内已入库流水命中且能匹配员工主数据”的口径 +- 配偶通过 `relation_type = '配偶'` 识别 +- 收入使用 `annual_income` +- 资产使用 `current_value` +- 负债使用 `principal_balance` +- 风险等级边界为 `<= 1.5`、`> 1.5 and <= 3`、`> 3` + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckMapperListSqlTest +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在 `CcdiProjectSpecialCheckMapper.xml` 中实现列表查询。 + +实现要求: + +- 先抽取项目员工基础集合,避免明细聚合时丢失“无资产/无负债/无配偶”的员工 +- 家庭总年收入 = 本人年收入 + 配偶年收入,均需 `COALESCE(..., 0)` +- 家庭总资产需限定持有人为“员工本人 + 配偶” +- 家庭总负债需限定归属人为“员工本人 + 配偶” +- 输出 `comparisonAmount = totalIncome + totalDebt` +- 风险等级同时输出 `riskLevelCode` 和 `riskLevelName` +- 排序建议先按风险等级倒序,再按 `comparisonAmount desc`,最后按 `staff_name asc` + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckMapperListSqlTest +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperListSqlTest.java +git commit -m "补充专项核查家庭资产负债列表查询" +``` + +### Task 3: 实现详情聚合 SQL 与明细结构 + +**Files:** +- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java` +- Modify: `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml` +- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java` + +- [ ] **Step 1: Write the failing test** + +新增详情查询 XML 测试,锁定以下内容: + +- 详情必须返回收入、资产、负债三组结构 +- 资产明细包含:资产名称、大类、小类、持有人、当前估值、估值日期 +- 负债明细包含:负债名称、大类、小类、债权人类型、归属人、本金余额、查询日期 +- 本人与配偶小计必须拆开 + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckMapperDetailSqlTest +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在 Mapper 中新增详情查询与结果映射。 + +实现要求: + +- 详情接口按 `projectId + staffIdCard` 查询 +- 先校验该员工属于当前项目员工范围,再返回详情 +- 资产、负债列表都要显式带出“归属人”名称或证件号映射 +- 详情返回值中保留 `summary`,避免前端展开区自行重复计算 +- 对空列表返回空数组,不返回 `null` + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckMapperDetailSqlTest +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapper.java ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectSpecialCheckMapper.xml ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckMapperDetailSqlTest.java +git commit -m "补充专项核查家庭资产负债详情查询" +``` + +### Task 4: 完成服务组装与控制器返回 + +**Files:** +- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImpl.java` +- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImplTest.java` +- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java` + +- [ ] **Step 1: Write the failing test** + +补服务层与控制器测试,覆盖: + +- 项目不存在时返回统一异常 +- 列表接口返回空列表而不是 `null` +- 详情接口在员工不属于当前项目时返回明确错误 +- 详情 `summary` 中金额与列表同口径 + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckServiceImplTest,CcdiProjectSpecialCheckControllerTest +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在服务层: + +- 校验项目存在性 +- 调用 Mapper 查询列表与详情 +- 空数据场景统一封装为空列表或空明细结构 +- 不在服务层新增与本次需求无关的缓存、异步、预计算逻辑 + +在控制器层: + +- 直接接收 DTO +- 维持 GET 查询模式 +- 返回 `AjaxResult.success(...)` + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckServiceImplTest,CcdiProjectSpecialCheckControllerTest +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImpl.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java +git commit -m "完成专项核查家庭资产负债服务组装" +``` + +### Task 5: 写实施记录与验证记录 + +**Files:** +- Create: `docs/reports/implementation/2026-03-24-special-check-family-asset-liability-backend-record.md` +- Create: `docs/tests/records/2026-03-24-special-check-family-asset-liability-backend-verification.md` + +- [ ] **Step 1: Write implementation record** + +在 `docs/reports/implementation/2026-03-24-special-check-family-asset-liability-backend-record.md` 中记录: + +- 本次新增的接口、Mapper、DTO、VO、测试文件 +- 项目员工范围口径 +- 收入、资产、负债、风险等级的计算口径 +- 未扩展到其他家庭成员的范围说明 + +- [ ] **Step 2: Run targeted verification and record output** + +Run: + +```bash +mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckControllerContractTest,CcdiProjectSpecialCheckMapperListSqlTest,CcdiProjectSpecialCheckMapperDetailSqlTest,CcdiProjectSpecialCheckServiceImplTest,CcdiProjectSpecialCheckControllerTest +``` + +Expected: + +- `PASS` + +将实际执行命令、结果和结论记录到 `docs/tests/records/2026-03-24-special-check-family-asset-liability-backend-verification.md`。 + +- [ ] **Step 3: Commit** + +```bash +git add docs/reports/implementation/2026-03-24-special-check-family-asset-liability-backend-record.md docs/tests/records/2026-03-24-special-check-family-asset-liability-backend-verification.md +git commit -m "补充专项核查家庭资产负债后端记录" +``` diff --git a/docs/plans/frontend/2026-03-24-special-check-family-asset-liability-frontend-implementation.md b/docs/plans/frontend/2026-03-24-special-check-family-asset-liability-frontend-implementation.md new file mode 100644 index 00000000..0c79eb82 --- /dev/null +++ b/docs/plans/frontend/2026-03-24-special-check-family-asset-liability-frontend-implementation.md @@ -0,0 +1,328 @@ +# Special Check Family Asset Liability 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. + +**Goal:** 将项目详情专项排查页从占位页升级为真实页面,新增“员工家庭资产负债专项核查”卡片,支持项目内员工列表展示与行内展开详情。 + +**Architecture:** 保持 `SpecialCheck.vue` 作为专项排查页入口,不新增路由或平行页面。前端拆成“主容器 + 专项核查列表区块 + 行内展开详情”三层结构,列表接口与详情接口分开请求,样式沿用结果总览已有卡片、表格、标签和空态语言。 + +**Tech Stack:** Vue 2, Element UI, Axios (`@/utils/request`), Node.js + +--- + +### Task 1: 补专项核查 API 封装 + +**Files:** +- Create: `ruoyi-ui/src/api/ccdi/projectSpecialCheck.js` +- Test: `ruoyi-ui/tests/unit/special-check-family-asset-liability-api.test.js` + +- [ ] **Step 1: Write the failing test** + +新增接口契约静态断言,锁定以下方法与路径: + +- `getFamilyAssetLiabilityList` +- `getFamilyAssetLiabilityDetail` +- `/ccdi/project/special-check/family-asset-liability/list` +- `/ccdi/project/special-check/family-asset-liability/detail` + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-family-asset-liability-api.test.js +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在 API 模块中新增: + +- `getFamilyAssetLiabilityList(projectId)` +- `getFamilyAssetLiabilityDetail(projectId, staffIdCard)` + +要求: + +- 统一使用 `@/utils/request` +- 详情接口透传 `projectId` 与 `staffIdCard` +- 不和 `projectOverview.js` 混写 + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-family-asset-liability-api.test.js +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ruoyi-ui/src/api/ccdi/projectSpecialCheck.js ruoyi-ui/tests/unit/special-check-family-asset-liability-api.test.js +git commit -m "补充专项核查家庭资产负债前端接口" +``` + +### Task 2: 将 SpecialCheck.vue 从占位页升级为页面主容器 + +**Files:** +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue` +- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/specialCheck.mock.js` +- Test: `ruoyi-ui/tests/unit/special-check-layout.test.js` +- Test: `ruoyi-ui/tests/unit/special-check-states.test.js` + +- [ ] **Step 1: Write the failing test** + +补页面主容器静态断言,锁定以下内容: + +- `SpecialCheck.vue` 不再渲染“功能开发中...” +- 页面包含专项核查卡片标题“员工家庭资产负债专项核查” +- 页面保留 `loading / empty / loaded` 三态结构 + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-layout.test.js +node tests/unit/special-check-states.test.js +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在 `SpecialCheck.vue` 中: + +- 引入真实列表接口 +- 维持页面级 `loading / empty / loaded` 状态 +- 页面主卡片采用与结果总览一致的白卡结构 +- `specialCheck.mock.js` 仅保留空态和骨架所需结构,不额外扩展伪业务数据 + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-layout.test.js +node tests/unit/special-check-states.test.js +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue ruoyi-ui/src/views/ccdiProject/components/detail/specialCheck.mock.js ruoyi-ui/tests/unit/special-check-layout.test.js ruoyi-ui/tests/unit/special-check-states.test.js +git commit -m "升级专项排查页主容器" +``` + +### Task 3: 实现员工家庭核查列表与风险标签 + +**Files:** +- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue` +- Test: `ruoyi-ui/tests/unit/special-check-family-table.test.js` +- Test: `ruoyi-ui/tests/unit/special-check-risk-tag.test.js` + +- [ ] **Step 1: Write the failing test** + +新增区块组件静态断言,锁定: + +- 列表字段包含姓名、身份证号、所属部门、家庭总年收入、家庭总资产、家庭总负债、风险情况、操作 +- 风险情况使用标签展示 +- 操作列文案为“查看详情” + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-family-table.test.js +node tests/unit/special-check-risk-tag.test.js +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在 `FamilyAssetLiabilitySection.vue` 中: + +- 接收列表数据与加载状态 +- 使用 `el-table` 渲染员工家庭核查列表 +- 风险标签颜色与结果总览现有标签语义保持一致 +- 金额统一格式化为元或万元显示,前后一致即可,不增加额外切换控件 + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-family-table.test.js +node tests/unit/special-check-risk-tag.test.js +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue ruoyi-ui/tests/unit/special-check-family-table.test.js ruoyi-ui/tests/unit/special-check-risk-tag.test.js +git commit -m "补充专项核查家庭资产负债列表展示" +``` + +### Task 4: 实现行内展开详情与按需查询 + +**Files:** +- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilityDetail.vue` +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue` +- Test: `ruoyi-ui/tests/unit/special-check-detail-expand.test.js` +- Test: `ruoyi-ui/tests/unit/special-check-detail-layout.test.js` + +- [ ] **Step 1: Write the failing test** + +新增详情展开断言,锁定: + +- 点击“查看详情”后在当前行内展开 +- 不出现弹窗、抽屉或路由跳转 +- 详情固定分为收入、资产、负债三组 +- 资产和负债明细均以表格或列表形式展开 + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-detail-expand.test.js +node tests/unit/special-check-detail-layout.test.js +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +在 `FamilyAssetLiabilitySection.vue` 中: + +- 管理当前展开员工 `expandedStaffIdCard` +- 首次展开时调用详情接口 +- 再次点击同一行时收起 +- 切换项目 `projectId` 时清空展开状态和详情缓存 + +在 `FamilyAssetLiabilityDetail.vue` 中: + +- 展示收入明细、本人与配偶小计 +- 展示资产合计与资产明细列表 +- 展示负债合计与负债明细列表 +- 对空明细显示局部空态,不额外跳页 + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-detail-expand.test.js +node tests/unit/special-check-detail-layout.test.js +``` + +Expected: + +- `PASS` + +- [ ] **Step 5: Commit** + +```bash +git add ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilityDetail.vue ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue ruoyi-ui/tests/unit/special-check-detail-expand.test.js ruoyi-ui/tests/unit/special-check-detail-layout.test.js +git commit -m "补充专项核查家庭资产负债详情展开" +``` + +### Task 5: 对齐结果总览视觉并补记录 + +**Files:** +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue` +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue` +- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilityDetail.vue` +- Test: `ruoyi-ui/tests/unit/special-check-visual-alignment.test.js` +- Create: `docs/reports/implementation/2026-03-24-special-check-family-asset-liability-frontend-record.md` +- Create: `docs/tests/records/2026-03-24-special-check-family-asset-liability-frontend-verification.md` + +- [ ] **Step 1: Write the failing test** + +新增样式/结构静态断言,锁定: + +- 使用结果总览同类白卡容器结构 +- 标题、副标题、表格头、风险标签与页面留白节奏统一 +- 页面不再出现占位图标与“功能开发中...”文案 + +- [ ] **Step 2: Run test to verify it fails** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-visual-alignment.test.js +``` + +Expected: + +- `FAIL` + +- [ ] **Step 3: Write minimal implementation** + +收口样式与文档: + +- 对齐结果总览现有 `section-card / block-header / el-table` 风格 +- 保持桌面端阅读密度稳定 +- 确认空态、加载态、异常态都在当前卡片内解决 +- 写前端实施记录与验证记录 + +- [ ] **Step 4: Run test to verify it passes** + +Run: + +```bash +cd ruoyi-ui +node tests/unit/special-check-family-asset-liability-api.test.js +node tests/unit/special-check-layout.test.js +node tests/unit/special-check-states.test.js +node tests/unit/special-check-family-table.test.js +node tests/unit/special-check-risk-tag.test.js +node tests/unit/special-check-detail-expand.test.js +node tests/unit/special-check-detail-layout.test.js +node tests/unit/special-check-visual-alignment.test.js +``` + +Expected: + +- `PASS` + +将执行命令与结果记录到 `docs/tests/records/2026-03-24-special-check-family-asset-liability-frontend-verification.md`。 + +- [ ] **Step 5: Commit** + +```bash +git add ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilitySection.vue ruoyi-ui/src/views/ccdiProject/components/detail/FamilyAssetLiabilityDetail.vue docs/reports/implementation/2026-03-24-special-check-family-asset-liability-frontend-record.md docs/tests/records/2026-03-24-special-check-family-asset-liability-frontend-verification.md ruoyi-ui/tests/unit/special-check-visual-alignment.test.js +git commit -m "完成专项核查家庭资产负债前端实现" +``` diff --git a/docs/reports/implementation/2026-03-24-special-check-family-asset-liability-plan-record.md b/docs/reports/implementation/2026-03-24-special-check-family-asset-liability-plan-record.md new file mode 100644 index 00000000..53f53247 --- /dev/null +++ b/docs/reports/implementation/2026-03-24-special-check-family-asset-liability-plan-record.md @@ -0,0 +1,25 @@ +# 2026-03-24 专项核查页员工家庭资产负债专项核查实施计划记录 + +## 本次产出 + +- 新增后端实施计划 `docs/plans/backend/2026-03-24-special-check-family-asset-liability-backend-implementation.md` +- 新增前端实施计划 `docs/plans/frontend/2026-03-24-special-check-family-asset-liability-frontend-implementation.md` + +## 计划拆分结论 + +- 后端计划聚焦专项核查专用接口、聚合 SQL、服务组装和后端验证记录 +- 前端计划聚焦专项排查页容器升级、专项核查卡片、行内展开详情和前端验证记录 +- 两端均不复用结果总览员工结果表,也不新增平行页面或弹窗详情 + +## 关键执行约束 + +- 员工范围沿用项目内已入库流水命中的员工 +- 配偶缺失数据按 `0` 参与计算 +- 家庭总资产按 `current_value` 汇总 +- 家庭总负债按 `principal_balance` 汇总 +- 详情交互固定为当前卡片内行展开 + +## 后续动作 + +- 按实施计划顺序执行后端与前端任务 +- 每端实施完成后分别补实施记录与验证记录