新增专项核查拓展查询前后端实施计划
This commit is contained in:
@@ -122,6 +122,11 @@
|
||||
|
||||
其中前两张卡片不修改现有交互,仅在其下方追加第三张卡片。
|
||||
|
||||
拓展查询卡片的渲染条件独立于家庭资产负债列表数据:
|
||||
|
||||
- 只要当前 `projectId` 有效,就应展示拓展查询卡片
|
||||
- 即使家庭资产负债列表为空,拓展查询卡片仍需可见并可使用
|
||||
|
||||
拓展查询卡片结构如下:
|
||||
|
||||
### 6.1 卡片头部
|
||||
@@ -140,7 +145,7 @@
|
||||
每个 Tab 使用独立查询栏:
|
||||
|
||||
- 采购记录:
|
||||
- 员工姓名
|
||||
- 申请人姓名
|
||||
- 申请日期范围
|
||||
- 搜索
|
||||
- 重置
|
||||
@@ -259,7 +264,7 @@ Tab 下方展示当前主题列表与分页。
|
||||
筛选条件:
|
||||
|
||||
- `projectId`
|
||||
- `staffName`
|
||||
- `applicantName`
|
||||
- `applyDateStart`
|
||||
- `applyDateEnd`
|
||||
|
||||
@@ -284,11 +289,12 @@ Tab 下方展示当前主题列表与分页。
|
||||
筛选条件:
|
||||
|
||||
- `projectId`
|
||||
- `staffName`
|
||||
- `interviewerName`
|
||||
|
||||
员工姓名口径:
|
||||
|
||||
- 按招聘记录的 `interviewer_name_1` 或 `interviewer_name_2` 检索
|
||||
- 同一条招聘记录若同时命中 `interviewer_name_1` 与 `interviewer_name_2`,列表结果必须按招聘记录主键去重
|
||||
|
||||
时间口径:
|
||||
|
||||
@@ -338,6 +344,9 @@ Tab 下方展示当前主题列表与分页。
|
||||
- 招聘拓展查询 DTO
|
||||
- 调动拓展查询 DTO
|
||||
|
||||
其中招聘主题查询字段命名统一使用 `interviewerName`,不再使用泛化的 `staffName`。
|
||||
采购主题查询字段命名统一使用 `applicantName`,不再使用泛化的 `staffName`。
|
||||
|
||||
列表返回对象按主题独立定义轻量 VO,仅保留列表必要字段。
|
||||
|
||||
详情返回可优先复用现有 VO 字段结构:
|
||||
|
||||
@@ -0,0 +1,362 @@
|
||||
# Special Check Extended Query Backend Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED: Use superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 为专项核查页新增“拓展查询”后端查询能力,支持在专项核查同范围员工内查询采购、招聘、调动记录,并提供各主题列表与详情接口。
|
||||
|
||||
**Architecture:** 延续 `CcdiProjectSpecialCheckController + Service + Mapper` 这条专项核查专用查询链路,不复用信息采集模块现有 `/list` 接口做前端拼装。员工范围统一复用 `projectEmployeeScopeSql`,在 `ccdi-project` 内新增 3 组主题查询 DTO、列表 VO 和明细查询方法,保证项目范围口径与当前专项核查完全一致。
|
||||
|
||||
**Tech Stack:** Java 21, Spring Boot 3, MyBatis XML, Maven, JUnit 5
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 定义拓展查询接口契约与主题 DTO/VO
|
||||
|
||||
**Files:**
|
||||
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckController.java`
|
||||
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectSpecialCheckService.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedPurchaseQueryDTO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedPurchaseDetailQueryDTO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedRecruitmentQueryDTO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedRecruitmentDetailQueryDTO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedTransferQueryDTO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedTransferDetailQueryDTO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedPurchaseListItemVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedPurchaseListVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedPurchaseDetailVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedRecruitmentListItemVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedRecruitmentListVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedRecruitmentDetailVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedTransferListItemVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedTransferListVO.java`
|
||||
- Create: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedTransferDetailVO.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckExtendedQueryContractTest.java`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增控制器契约测试,锁定以下接口路径与方法:
|
||||
|
||||
- `GET /ccdi/project/special-check/extended-query/purchase/list`
|
||||
- `GET /ccdi/project/special-check/extended-query/purchase/detail`
|
||||
- `GET /ccdi/project/special-check/extended-query/recruitment/list`
|
||||
- `GET /ccdi/project/special-check/extended-query/recruitment/detail`
|
||||
- `GET /ccdi/project/special-check/extended-query/transfer/list`
|
||||
- `GET /ccdi/project/special-check/extended-query/transfer/detail`
|
||||
|
||||
同时锁定 DTO / VO 基本字段:
|
||||
|
||||
- 采购列表入参:`projectId`、`applicantName`、`applyDateStart`、`applyDateEnd`、`pageNum`、`pageSize`
|
||||
- 招聘列表入参:`projectId`、`interviewerName`、`pageNum`、`pageSize`
|
||||
- 调动列表入参:`projectId`、`staffName`、`transferDateStart`、`transferDateEnd`、`pageNum`、`pageSize`
|
||||
- 3 个详情入参都必须带 `projectId` 和主题主键
|
||||
- 3 个列表 VO 都必须包含 `rows` 与 `total`
|
||||
- 列表项只保留设计文档约定的必要字段
|
||||
- 详情 VO 在 `ccdi-project` 模块内独立定义,不直接依赖 `ccdi-info-collection` 模块类
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedQueryContractTest
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
- 原因是新增接口契约、DTO、VO 尚未落地
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
补齐控制器方法、服务接口方法、DTO 与列表 VO。
|
||||
|
||||
实现要求:
|
||||
|
||||
- 控制器继续使用 `@Tag`、`@Operation`
|
||||
- 权限沿用 `@PreAuthorize("@ss.hasPermi('ccdi:project:query')")`
|
||||
- 详情接口命名直接使用业务主键,不引入额外包装对象
|
||||
- 采购主题查询字段必须命名为 `applicantName`,不要用泛化的 `staffName`
|
||||
- 招聘主题查询字段必须命名为 `interviewerName`,不要用泛化的 `staffName`
|
||||
- 3 个列表 DTO 都显式带 `pageNum / pageSize`,默认值与若依分页口径一致
|
||||
- 3 个列表返回体都显式带 `rows / total`
|
||||
- `projectId` 与 3 个详情主键字段都加非空校验
|
||||
- 采购、招聘、调动 3 类详情 VO 都在 `ccdi-project` 中定义,避免引入新的模块依赖
|
||||
- 详情 VO 字段分别对齐现有采购、招聘、调动独立页的详情展示结构
|
||||
- 返回统一使用 `AjaxResult.success(...)`
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedQueryContractTest
|
||||
```
|
||||
|
||||
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/CcdiProjectExtendedPurchaseQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedPurchaseDetailQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedRecruitmentQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedRecruitmentDetailQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedTransferQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectExtendedTransferDetailQueryDTO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedPurchaseListItemVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedPurchaseListVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedPurchaseDetailVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedRecruitmentListItemVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedRecruitmentListVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedRecruitmentDetailVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedTransferListItemVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedTransferListVO.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectExtendedTransferDetailVO.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckExtendedQueryContractTest.java
|
||||
git commit -m "定义专项核查拓展查询接口契约"
|
||||
```
|
||||
|
||||
### Task 2: 在 Mapper 中补采购主题项目范围列表与详情查询
|
||||
|
||||
**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/CcdiProjectSpecialCheckExtendedPurchaseSqlTest.java`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增采购主题 SQL 测试,锁定以下口径:
|
||||
|
||||
- 员工范围必须复用 `projectEmployeeScopeSql`
|
||||
- 列表只能返回项目范围内员工的采购记录
|
||||
- 员工姓名筛选命中 `applicant_name`
|
||||
- 时间范围筛选命中 `apply_date`
|
||||
- 分页必须按 `pageNum / pageSize` 生效,并返回总数
|
||||
- 列表字段只返回:`purchaseId`、`projectName`、`subjectName`、`applicantName`、`applyDate`
|
||||
- 详情按 `projectId + purchaseId` 查询,并校验记录属于项目范围员工
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedPurchaseSqlTest
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
在 Mapper 中新增采购主题列表与详情查询。
|
||||
|
||||
实现要求:
|
||||
|
||||
- 范围表先去重员工姓名,避免一名员工在项目范围内重复放大采购记录
|
||||
- 列表查询使用 MyBatis Plus `Page` 或等效分页结果承载 `rows / total`
|
||||
- 列表按 `apply_date desc, create_time desc, purchase_id desc` 排序
|
||||
- 采购详情映射到 `CcdiProjectExtendedPurchaseDetailVO`
|
||||
- `CcdiProjectExtendedPurchaseDetailVO` 字段按采购现有详情展示结构定义:基本信息、金额信息、供应商信息、日期信息、申请人信息、采购负责人信息、审计信息
|
||||
- 详情查不到时交给服务层统一转业务错误
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedPurchaseSqlTest
|
||||
```
|
||||
|
||||
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/CcdiProjectSpecialCheckExtendedPurchaseSqlTest.java
|
||||
git commit -m "补充专项核查采购拓展查询SQL"
|
||||
```
|
||||
|
||||
### Task 3: 在 Mapper 中补招聘与调动主题项目范围查询
|
||||
|
||||
**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/CcdiProjectSpecialCheckExtendedRecruitmentSqlTest.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckExtendedTransferSqlTest.java`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增招聘与调动 SQL 测试,锁定以下口径:
|
||||
|
||||
招聘:
|
||||
|
||||
- 员工范围必须复用 `projectEmployeeScopeSql`
|
||||
- 员工姓名口径不使用 `candName`
|
||||
- 检索字段必须是 `interviewer_name_1` 或 `interviewer_name_2`
|
||||
- 同一条招聘记录若同时命中面试官 1 和面试官 2,列表结果必须按 `recruit_id` 去重
|
||||
- 本次不增加招聘时间筛选
|
||||
- 分页必须按 `pageNum / pageSize` 生效,并返回总数
|
||||
- 列表字段只返回:`recruitId`、`recruitName`、`posName`、`interviewerNameSummary`、`admitStatus`
|
||||
|
||||
调动:
|
||||
|
||||
- 员工范围必须按范围员工姓名匹配到 `ccdi_base_staff.name`
|
||||
- 时间范围命中 `transfer_date`
|
||||
- 分页必须按 `pageNum / pageSize` 生效,并返回总数
|
||||
- 列表字段只返回:`staffName`、`transferType`、`deptNameBefore`、`deptNameAfter`、`transferDate`
|
||||
- 详情按 `projectId + id` 查询,并校验记录属于项目范围员工
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedRecruitmentSqlTest,CcdiProjectSpecialCheckExtendedTransferSqlTest
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
补齐招聘与调动主题 SQL。
|
||||
|
||||
实现要求:
|
||||
|
||||
- 招聘列表中生成 `interviewerNameSummary`,格式统一为“面试官1 / 面试官2”,单边为空时只输出存在值
|
||||
- 招聘列表查询必须按 `recruit_id` 去重,避免同一条记录因双面试官命中被重复返回并放大 `total`
|
||||
- 招聘详情映射到 `CcdiProjectExtendedRecruitmentDetailVO`
|
||||
- `CcdiProjectExtendedRecruitmentDetailVO` 字段按招聘现有详情展示结构定义:招聘项目信息、职位信息、候选人信息、录用信息、面试官信息、审计信息
|
||||
- 调动列表通过 `ccdi_staff_transfer.staff_id -> ccdi_base_staff.staff_id` 关联员工姓名
|
||||
- 调动详情映射到 `CcdiProjectExtendedTransferDetailVO`
|
||||
- `CcdiProjectExtendedTransferDetailVO` 字段按调动详情展示结构定义:基本信息、调动前信息、调动后信息、审计信息
|
||||
- 调动排序按 `transfer_date desc, create_time desc, id desc`
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedRecruitmentSqlTest,CcdiProjectSpecialCheckExtendedTransferSqlTest
|
||||
```
|
||||
|
||||
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/CcdiProjectSpecialCheckExtendedRecruitmentSqlTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckExtendedTransferSqlTest.java
|
||||
git commit -m "补充专项核查招聘调动拓展查询SQL"
|
||||
```
|
||||
|
||||
### Task 4: 完成服务层组装、项目校验与详情归属校验
|
||||
|
||||
**Files:**
|
||||
- Modify: `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/CcdiProjectSpecialCheckExtendedQueryServiceImplTest.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增服务层与控制器测试,覆盖:
|
||||
|
||||
- 项目不存在时统一返回“项目不存在”
|
||||
- 3 个列表接口都返回空列表而不是 `null`
|
||||
- 3 个列表接口都返回正确的 `total`
|
||||
- 分页参数变化时列表记录数和总数符合预期
|
||||
- 3 个详情接口在记录不属于当前项目范围员工时返回明确业务错误
|
||||
- 招聘列表的查询字段确实是 `interviewerName`
|
||||
- 控制器都走 `AjaxResult.success(...)`
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedQueryServiceImplTest,CcdiProjectSpecialCheckControllerTest
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
在服务层中:
|
||||
|
||||
- 复用当前 `ensureProjectExists` 校验思路
|
||||
- 新增 3 个列表方法和 3 个详情方法
|
||||
- 列表统一封装 `rows + total`
|
||||
- 空数据场景统一封装成 `rows = List.of()`、`total = 0`
|
||||
- 详情空数据统一抛出“当前记录不属于该项目专项核查范围”或同义明确错误
|
||||
- 采购、招聘、调动 3 个详情接口错误文案保持同一风格,便于前端提示和测试断言
|
||||
- 不引入缓存、异步刷新或额外结果表
|
||||
|
||||
在控制器中:
|
||||
|
||||
- 继续使用 `GET` 查询风格
|
||||
- 列表与详情返回结构保持专项核查域一致
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedQueryServiceImplTest,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/CcdiProjectSpecialCheckExtendedQueryServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckControllerTest.java
|
||||
git commit -m "完成专项核查拓展查询服务组装"
|
||||
```
|
||||
|
||||
### Task 5: 运行后端回归验证并沉淀测试记录
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/tests/records/2026-03-24-special-check-extended-query-backend-verification.md`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectSpecialCheckExtendedQueryContractTest.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckExtendedPurchaseSqlTest.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckExtendedRecruitmentSqlTest.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectSpecialCheckExtendedTransferSqlTest.java`
|
||||
- Test: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectSpecialCheckExtendedQueryServiceImplTest.java`
|
||||
|
||||
- [ ] **Step 1: Run focused backend test suite**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectSpecialCheckExtendedQueryContractTest,CcdiProjectSpecialCheckExtendedPurchaseSqlTest,CcdiProjectSpecialCheckExtendedRecruitmentSqlTest,CcdiProjectSpecialCheckExtendedTransferSqlTest,CcdiProjectSpecialCheckExtendedQueryServiceImplTest
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- 所有新增专项核查拓展查询测试 `PASS`
|
||||
- 分页相关断言一并通过
|
||||
|
||||
- [ ] **Step 2: Run module regression**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
mvn test -pl ccdi-project
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `PASS`
|
||||
- 若存在既有失败,需在记录中注明与本次改动是否相关
|
||||
|
||||
- [ ] **Step 3: Write verification record**
|
||||
|
||||
在 `docs/tests/records/2026-03-24-special-check-extended-query-backend-verification.md` 记录:
|
||||
|
||||
- 实际执行命令
|
||||
- 结果
|
||||
- 是否发现与项目范围口径相关的偏差
|
||||
- 若有失败,明确是否为既有问题
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add docs/tests/records/2026-03-24-special-check-extended-query-backend-verification.md
|
||||
git commit -m "补充专项核查拓展查询后端验证记录"
|
||||
```
|
||||
@@ -0,0 +1,366 @@
|
||||
# Special Check Extended Query Frontend Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED: Use superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 在项目详情专项核查页中新增“拓展查询”卡片,支持采购、招聘、调动 3 个主题的 Tab 切换、独立查询栏、列表分页和详情弹窗。
|
||||
|
||||
**Architecture:** 保持 `SpecialCheck.vue` 作为专项核查页主容器,不新增路由。前端新增独立的拓展查询区块组件和 3 个主题详情弹窗,继续通过 `@/api/ccdi/projectSpecialCheck.js` 统一封装专项核查域接口;每个 Tab 独立维护查询参数、列表状态和详情状态,避免主题之间互相污染。
|
||||
|
||||
**Tech Stack:** Vue 2, Element UI, Axios (`@/utils/request`), Node.js
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 扩展专项核查 API 封装
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-ui/src/api/ccdi/projectSpecialCheck.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-api.test.js`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增 API 契约静态断言,锁定以下方法与路径:
|
||||
|
||||
- `getExtendedPurchaseList`
|
||||
- `getExtendedPurchaseDetail`
|
||||
- `getExtendedRecruitmentList`
|
||||
- `getExtendedRecruitmentDetail`
|
||||
- `getExtendedTransferList`
|
||||
- `getExtendedTransferDetail`
|
||||
- `/ccdi/project/special-check/extended-query/purchase/list`
|
||||
- `/ccdi/project/special-check/extended-query/purchase/detail`
|
||||
- `/ccdi/project/special-check/extended-query/recruitment/list`
|
||||
- `/ccdi/project/special-check/extended-query/recruitment/detail`
|
||||
- `/ccdi/project/special-check/extended-query/transfer/list`
|
||||
- `/ccdi/project/special-check/extended-query/transfer/detail`
|
||||
- 所有列表与详情请求都必须携带 `projectId`
|
||||
- 采购查询参数名:`applicantName`
|
||||
- 采购查询参数名:`applyDateStart`、`applyDateEnd`
|
||||
- 招聘查询参数名:`interviewerName`
|
||||
- 3 个详情接口主键参数名分别锁定为:`purchaseId`、`recruitId`、`id`
|
||||
- 调动查询参数名:`staffName`
|
||||
- 调动查询参数名:`transferDateStart`、`transferDateEnd`
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-api.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
在 `projectSpecialCheck.js` 中新增 6 个方法。
|
||||
|
||||
实现要求:
|
||||
|
||||
- 统一使用 `@/utils/request`
|
||||
- 6 个方法都显式透传 `projectId`
|
||||
- 采购列表查询显式透传 `applicantName`
|
||||
- 招聘主题查询参数字段命名必须使用 `interviewerName`
|
||||
- 调动列表查询显式透传 `staffName`
|
||||
- 采购和调动主题透传日期区间起止字段
|
||||
- 不拆到新的 API 文件,继续归属专项核查域
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-api.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `PASS`
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/src/api/ccdi/projectSpecialCheck.js ruoyi-ui/tests/unit/special-check-extended-query-api.test.js
|
||||
git commit -m "补充专项核查拓展查询前端接口"
|
||||
```
|
||||
|
||||
### Task 2: 在专项核查页挂载拓展查询卡片主组件
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue`
|
||||
- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-layout.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-card-order.test.js`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增页面结构断言,锁定以下内容:
|
||||
|
||||
- `SpecialCheck.vue` 在图谱外链卡片下方新增“拓展查询”卡片
|
||||
- 页面顺序必须是“家庭资产负债 -> 图谱外链 -> 拓展查询”
|
||||
- 拓展查询卡片内部存在 3 个 Tab:采购记录、招聘记录、调动记录
|
||||
- 当 `projectId` 有效但家庭资产负债列表为空时,拓展查询卡片仍然可见
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-layout.test.js
|
||||
node tests/unit/special-check-extended-query-card-order.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
在 `SpecialCheck.vue` 中:
|
||||
|
||||
- 保持现有家庭资产负债区块和图谱占位卡片不变
|
||||
- 在图谱卡片后挂载 `ExtendedQuerySection`
|
||||
- 显式透传当前 `projectId`
|
||||
- 即使家庭资产负债列表为空,只要 `projectId` 有效也继续渲染拓展查询卡片
|
||||
- 拓展查询卡片必须放在当前家庭资产负债 `loaded / empty` 分支之外,或通过单独渲染分支挂载,不能继续依赖现有 `v-else` 门禁
|
||||
- 卡片标题、副标题沿用设计文档口径
|
||||
|
||||
在 `ExtendedQuerySection.vue` 中:
|
||||
|
||||
- 搭出卡片壳、Tab 区、列表占位区域
|
||||
- 明确定义 `projectId` 为必传 props
|
||||
- 不先堆复杂逻辑,优先把结构固定下来
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-layout.test.js
|
||||
node tests/unit/special-check-extended-query-card-order.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/ExtendedQuerySection.vue ruoyi-ui/tests/unit/special-check-extended-query-layout.test.js ruoyi-ui/tests/unit/special-check-extended-query-card-order.test.js
|
||||
git commit -m "挂载专项核查拓展查询卡片"
|
||||
```
|
||||
|
||||
### Task 3: 实现 3 个主题 Tab 的独立查询栏与列表状态
|
||||
|
||||
**Files:**
|
||||
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-tabs.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-filters.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-state-cache.test.js`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增主题交互断言,锁定:
|
||||
|
||||
- 采购 Tab 查询栏显示“申请人姓名 + 申请日期范围”
|
||||
- 招聘 Tab 查询栏只显示“面试官姓名”
|
||||
- 调动 Tab 查询栏显示“员工姓名 + 调动日期范围”
|
||||
- 切换 Tab 时,各主题保留自己的查询参数和分页状态
|
||||
- 首次切到某个 Tab 时才触发该 Tab 的首查
|
||||
- 列表查询失败时提示错误并清空当前主题列表
|
||||
- `projectId` 变化时清空三类主题的查询状态、列表状态和详情状态
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-tabs.test.js
|
||||
node tests/unit/special-check-extended-query-filters.test.js
|
||||
node tests/unit/special-check-extended-query-state-cache.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
在 `ExtendedQuerySection.vue` 中:
|
||||
|
||||
- 为 `purchase / recruitment / transfer` 维护独立状态对象
|
||||
- 统一封装 `handleTabChange / handleQuery / resetQuery / loadList`
|
||||
- 每次列表请求和详情请求都显式带上 `projectId`
|
||||
- 采购主题查询字段使用 `applicantName`
|
||||
- 招聘主题查询字段使用 `interviewerName`
|
||||
- 调动主题查询字段保留 `staffName`
|
||||
- 采购、调动日期范围在提交前拆成开始/结束字段
|
||||
- 列表空态、加载态和分页都绑定到当前激活主题
|
||||
- 当前主题列表查询失败时要弹出错误提示,并清空该主题的 `rows` 与 `total`
|
||||
- 监听 `projectId` 变化,清空 3 个主题的本地状态,并按新 `projectId` 触发当前激活 Tab 首查
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-tabs.test.js
|
||||
node tests/unit/special-check-extended-query-filters.test.js
|
||||
node tests/unit/special-check-extended-query-state-cache.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `PASS`
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue ruoyi-ui/tests/unit/special-check-extended-query-tabs.test.js ruoyi-ui/tests/unit/special-check-extended-query-filters.test.js ruoyi-ui/tests/unit/special-check-extended-query-state-cache.test.js
|
||||
git commit -m "实现专项核查拓展查询主题切换"
|
||||
```
|
||||
|
||||
### Task 4: 实现主题列表列与详情弹窗
|
||||
|
||||
**Files:**
|
||||
- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedPurchaseDetailDialog.vue`
|
||||
- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedRecruitmentDetailDialog.vue`
|
||||
- Create: `ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedTransferDetailDialog.vue`
|
||||
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-columns.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-detail-dialogs.test.js`
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
新增列表列与详情弹窗断言,锁定:
|
||||
|
||||
- 采购列表列:采购事项 ID、项目名称、标的物名称、申请人姓名、申请日期、操作
|
||||
- 招聘列表列:招聘项目编号、招聘项目名称、职位名称、面试官姓名摘要、录用情况、操作
|
||||
- 调动列表列:员工姓名、调动类型、调动前部门、调动后部门、调动日期、操作
|
||||
- 操作列统一文案为“查看详情”
|
||||
- 3 个主题都通过弹窗查看全部字段
|
||||
- 调动主题补齐详情弹窗,不再只有列表页
|
||||
- 详情弹窗存在打开与关闭的交互链路
|
||||
- 详情弹窗字段完整性与独立业务页展示结构保持一致
|
||||
- 详情查询失败时只提示错误,不污染当前主题列表或其它主题状态
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-columns.test.js
|
||||
node tests/unit/special-check-extended-query-detail-dialogs.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `FAIL`
|
||||
|
||||
- [ ] **Step 3: Write minimal implementation**
|
||||
|
||||
在 `ExtendedQuerySection.vue` 中:
|
||||
|
||||
- 按当前主题渲染对应表格列
|
||||
- 点击“查看详情”时调用当前主题详情接口
|
||||
- 详情数据按主题分流到对应弹窗
|
||||
|
||||
详情弹窗要求:
|
||||
|
||||
- 采购详情尽量复用 [index.vue](/Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui/src/views/ccdiPurchaseTransaction/index.vue) 的分组展示结构
|
||||
- 招聘详情尽量复用 [index.vue](/Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui/src/views/ccdiStaffRecruitment/index.vue) 的分组展示结构
|
||||
- 调动详情参照现有表单字段补齐“基本信息 / 调动前 / 调动后 / 审计信息”分组
|
||||
|
||||
- [ ] **Step 4: Run test to verify it passes**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-columns.test.js
|
||||
node tests/unit/special-check-extended-query-detail-dialogs.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `PASS`
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedPurchaseDetailDialog.vue ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedRecruitmentDetailDialog.vue ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedTransferDetailDialog.vue ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue ruoyi-ui/tests/unit/special-check-extended-query-columns.test.js ruoyi-ui/tests/unit/special-check-extended-query-detail-dialogs.test.js
|
||||
git commit -m "补充专项核查拓展查询详情弹窗"
|
||||
```
|
||||
|
||||
### Task 5: 完成前端回归验证并沉淀测试记录
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/tests/records/2026-03-24-special-check-extended-query-frontend-verification.md`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-api.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-layout.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-card-order.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-tabs.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-filters.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-state-cache.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-columns.test.js`
|
||||
- Test: `ruoyi-ui/tests/unit/special-check-extended-query-detail-dialogs.test.js`
|
||||
|
||||
- [ ] **Step 1: Run focused frontend tests**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/special-check-extended-query-api.test.js
|
||||
node tests/unit/special-check-extended-query-layout.test.js
|
||||
node tests/unit/special-check-extended-query-card-order.test.js
|
||||
node tests/unit/special-check-extended-query-tabs.test.js
|
||||
node tests/unit/special-check-extended-query-filters.test.js
|
||||
node tests/unit/special-check-extended-query-state-cache.test.js
|
||||
node tests/unit/special-check-extended-query-columns.test.js
|
||||
node tests/unit/special-check-extended-query-detail-dialogs.test.js
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- 所有新增静态/结构测试 `PASS`
|
||||
- 包含失败态下“提示错误 + 清空列表”的断言
|
||||
|
||||
- [ ] **Step 2: Run build verification**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
npm run build:prod
|
||||
```
|
||||
|
||||
Expected:
|
||||
|
||||
- `PASS`
|
||||
- 若仍有既有资源体积告警,在验证记录中注明“与本次改动无关”
|
||||
|
||||
- [ ] **Step 3: Write verification record**
|
||||
|
||||
在 `docs/tests/records/2026-03-24-special-check-extended-query-frontend-verification.md` 记录:
|
||||
|
||||
- 实际执行命令
|
||||
- 结果
|
||||
- 是否验证了 3 个 Tab 的差异化查询栏
|
||||
- 是否验证了图谱卡片下方新增拓展查询卡片
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add docs/tests/records/2026-03-24-special-check-extended-query-frontend-verification.md
|
||||
git commit -m "补充专项核查拓展查询前端验证记录"
|
||||
```
|
||||
Reference in New Issue
Block a user