Files
ccdi/docs/design/2026-03-24-special-check-extended-query-design.md

466 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 专项核查拓展查询卡片设计文档
**模块**: 项目详情 - 专项核查
**日期**: 2026-03-24
**状态**: 已确认
## 一、背景
当前项目详情页的专项核查页签已包含两块内容:
1. 员工家庭资产负债专项核查
2. 图谱外链展示占位卡片
其中图谱外链卡片当前仅作为后续接入外链图谱页面的预留入口,尚未承载真实业务查询能力。
本轮需求是在图谱外链卡片下方新增一张“拓展查询”卡片,用于查询项目范围内员工的采购、招聘、调动记录,并支持按主题 Tab 切换、按主题对应姓名字段和时间范围检索,以及按记录查看完整详情。
## 二、目标
本次设计目标如下:
1. 在专项核查页签中新增“拓展查询”卡片,位置固定在图谱外链卡片下方。
2. 通过 Tab 切换展示 3 类拓展查询主题:
- 采购记录
- 招聘记录
- 调动记录
3. 列表数据只查询当前专项核查同范围员工,不扩展到项目全部目标员工。
4. 查询栏按主题独立配置,不共享无关筛选项。
5. 列表展示必要字段,操作列提供“查看详情”按钮。
6. 点击“查看详情”后,通过弹窗展示该条记录全部字段。
## 三、范围
### 3.1 本次范围
- 新增专项核查页的拓展查询卡片
- 新增采购、招聘、调动 3 个主题的 Tab 切换
- 新增项目范围拓展查询列表接口
- 新增项目范围拓展查询详情接口
- 新增对应前端查询、分页、详情弹窗交互
- 补充前后端测试与验证记录
### 3.2 不在本次范围
- 不接入真实图谱外链地址
- 不改动现有员工家庭资产负债专项核查逻辑
- 不新开独立路由页面
- 不扩展到项目全部目标员工
- 不为招聘记录新增时间筛选字段
- 不新增导出、编辑、删除等操作
- 不引入缓存、异步预计算或额外结果表
## 四、已确认业务口径
本次设计确认以下口径,后续实施必须严格遵守:
1. “项目范围内员工”定义为当前专项核查同范围员工,即现有专项核查链路中已归并出来的员工集合。
2. 不按项目全部目标员工查询。
3. 查询卡片位置固定在“图谱外链展示”卡片下方。
4. 采用横向 Tab 切换主题,不使用竖向主题导航。
5. 每个主题使用独立查询栏,不共享查询表单。
6. 采购记录按“申请人姓名 + 申请日期范围”筛选。
7. 招聘记录按“面试官姓名”筛选,本次不增加时间筛选。
8. 调动记录按“员工姓名 + 调动日期范围”筛选。
9. 列表只展示必要字段,详情弹窗展示该条记录全部字段。
## 五、方案对比
### 5.1 方案 A图谱卡片下方新增独立拓展查询卡片
做法:
- 保留现有图谱卡片不变
- 在图谱卡片下方新增一张“拓展查询”卡片
- 卡片内部顶部使用横向 Tab 切换主题
优点:
- 完全符合“在图谱外链卡片下面添加拓展查询功能卡片”的原始需求
- 不影响现有图谱占位卡片结构
- 页面层级清晰,用户认知成本低
- 前端改造路径最短
缺点:
- 页面纵向高度会增加
### 5.2 方案 B图谱卡片与拓展查询合并为一个大卡片
做法:
- 图谱占位与拓展查询共用同一张卡片
问题:
- 与“在图谱外链卡片下面添加卡片”的需求不一致
- 图谱占位与实际查询职责混在一起,层次不清
### 5.3 方案 C独立拓展查询卡片但使用左侧竖向主题导航
做法:
- 与方案 A 一样新增独立卡片
- 但主题切换改为左侧竖向导航
问题:
- 用户已明确要求通过 Tab 页切换主题
- 与当前页面已有横向区块风格不一致
### 5.4 推荐方案
采用方案 A在图谱外链卡片下方新增独立拓展查询卡片卡片内部使用横向 Tab 切换采购、招聘、调动 3 个主题。
## 六、页面结构设计
专项核查页整体结构调整后如下:
1. 员工家庭资产负债专项核查卡片
2. 图谱外链展示卡片
3. 拓展查询卡片
其中前两张卡片不修改现有交互,仅在其下方追加第三张卡片。
拓展查询卡片的渲染条件独立于家庭资产负债列表数据:
- 只要当前 `projectId` 有效,就应展示拓展查询卡片
- 即使家庭资产负债列表为空,拓展查询卡片仍需可见并可使用
拓展查询卡片结构如下:
### 6.1 卡片头部
- 标题:拓展查询
- 副标题:查询专项核查同范围员工的采购、招聘、调动记录
### 6.2 Tab 区
- Tab 1采购记录
- Tab 2招聘记录
- Tab 3调动记录
### 6.3 主题查询区
每个 Tab 使用独立查询栏:
- 采购记录:
- 申请人姓名
- 申请日期范围
- 搜索
- 重置
- 招聘记录:
- 面试官姓名
- 搜索
- 重置
- 调动记录:
- 员工姓名
- 调动日期范围
- 搜索
- 重置
### 6.4 列表区
Tab 下方展示当前主题列表与分页。
切换 Tab 时:
- 不共用查询表单
- 不互相覆盖列表数据
- 各主题保留自己的查询条件与分页状态
- 首次进入某个 Tab 时再触发该 Tab 的首查
### 6.5 详情弹窗
操作列统一提供“查看详情”按钮。
点击后:
- 采购记录弹出采购详情弹窗
- 招聘记录弹出招聘详情弹窗
- 调动记录弹出调动详情弹窗
详情弹窗展示该条记录全部字段,不裁剪字段内容。
## 七、列表字段设计
### 7.1 采购记录列表字段
- 采购事项 ID
- 项目名称
- 标的物名称
- 申请人姓名
- 申请日期
- 操作
### 7.2 招聘记录列表字段
- 招聘项目编号
- 招聘项目名称
- 职位名称
- 面试官姓名摘要
- 录用情况
- 操作
其中面试官姓名摘要定义为:
- 优先展示 `面试官1姓名 / 面试官2姓名`
- 如某一个为空,则只展示存在的姓名
### 7.3 调动记录列表字段
- 员工姓名
- 调动类型
- 调动前部门
- 调动后部门
- 调动日期
- 操作
## 八、后端设计
### 8.1 接口归属
本次不直接复用信息采集模块现有 `/list` 接口,而是在专项核查域新增项目范围拓展查询接口,统一挂在:
- `CcdiProjectSpecialCheckController`
原因:
1. 现有信息采集模块接口仅面向各自主表查询,不包含“专项核查同范围员工”的限制。
2. 如果前端调用现有接口后自行过滤,会导致项目范围口径不稳定。
3. 在专项核查域统一收口,后续维护更清晰。
### 8.2 接口设计
建议新增 6 个接口:
- `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`
### 8.3 项目范围员工口径复用
项目范围员工统一复用当前专项核查 mapper 中的员工范围定义,即:
- `CcdiProjectSpecialCheckMapper.xml` 中的 `projectEmployeeScopeSql`
该范围已经与当前专项核查页保持一致,本轮不重新定义口径,不新增第二套项目员工范围逻辑。
### 8.4 列表查询设计
#### 采购记录
数据来源:
- `ccdi_purchase_transaction`
范围限制:
- 记录必须命中专项核查同范围员工
筛选条件:
- `projectId`
- `applicantName`
- `applyDateStart`
- `applyDateEnd`
员工姓名口径:
- 按采购记录的 `applicant_name` 检索
时间口径:
- 按采购记录的 `apply_date` 检索
#### 招聘记录
数据来源:
- `ccdi_staff_recruitment`
范围限制:
- 记录必须命中专项核查同范围员工
筛选条件:
- `projectId`
- `interviewerName`
员工姓名口径:
- 按招聘记录的 `interviewer_name_1``interviewer_name_2` 检索
- 同一条招聘记录若同时命中 `interviewer_name_1``interviewer_name_2`,列表结果必须按招聘记录主键去重
时间口径:
- 本次不提供招聘时间筛选
#### 调动记录
数据来源:
- `ccdi_staff_transfer`
- `ccdi_base_staff`
范围限制:
- 记录必须命中专项核查同范围员工
筛选条件:
- `projectId`
- `staffName`
- `transferDateStart`
- `transferDateEnd`
员工姓名口径:
- 按调动记录对应员工的 `staff_name` 检索
时间口径:
-`transfer_date` 检索
### 8.5 详情查询设计
详情接口按各自主键查询,并返回该条记录全部字段:
- 采购详情:按 `purchaseId`
- 招聘详情:按 `recruitId`
- 调动详情:按 `id`
详情查询仍需校验该记录属于当前专项核查同范围员工;不属于时返回业务错误,避免越权或口径漂移。
### 8.6 DTO / VO 设计
建议在 `ccdi-project` 模块下新增独立 DTO
- 采购拓展查询 DTO
- 招聘拓展查询 DTO
- 调动拓展查询 DTO
其中招聘主题查询字段命名统一使用 `interviewerName`,不再使用泛化的 `staffName`
采购主题查询字段命名统一使用 `applicantName`,不再使用泛化的 `staffName`
列表返回对象按主题独立定义轻量 VO仅保留列表必要字段。
详情返回可优先复用现有 VO 字段结构:
- `CcdiPurchaseTransactionVO`
- `CcdiStaffRecruitmentVO`
- `CcdiStaffTransferVO`
如直接复用存在耦合问题,再在 `ccdi-project` 下补充专项核查详情 VO但本轮优先选择最短路径实现。
## 九、前端设计
### 9.1 页面挂载位置
继续以:
- `ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue`
作为专项核查页签容器,不新增路由。
### 9.2 组件拆分
建议新增一张独立的拓展查询区块组件,例如:
- `ExtendedQuerySection.vue`
职责如下:
- 管理当前激活 Tab
- 管理各 Tab 的查询参数
- 驱动列表加载与分页
- 打开并关闭详情弹窗
详情展示建议按主题拆分为小组件或局部模板:
- 采购详情复用现有采购页的分组展示方式
- 招聘详情复用现有招聘页的分组展示方式
- 调动详情补齐与前两者一致的详情展示结构
### 9.3 状态管理
每个 Tab 独立维护以下状态:
- `query`
- `list`
- `loading`
- `pageNum`
- `pageSize`
- `total`
- `detailOpen`
- `detailLoading`
- `detailData`
原则如下:
1. 不共享查询表单
2. 不共享列表数据
3. 切换 Tab 时保留各自上次查询状态
4. 首次进入 Tab 时再请求列表
### 9.4 空态与异常
- 列表无数据时展示当前主题无数据空态
- 列表查询失败时提示错误信息,并清空当前主题列表
- 详情查询失败时只提示错误,不污染列表状态
- `projectId` 为空时沿用当前专项核查页已有空态逻辑
## 十、测试与验证设计
### 10.1 前端验证
补充以下验证:
1. 专项核查页新增拓展查询卡片结构断言
2. 卡片位于图谱外链卡片下方的结构断言
3. 3 个主题 Tab 的存在性断言
4. 不同 Tab 显示不同查询栏字段的断言
5. 操作列“查看详情”按钮存在性断言
6. 调动主题详情弹窗存在性断言
7. 前端构建验证
### 10.2 后端验证
补充以下验证:
1. 项目范围员工口径是否与 `projectEmployeeScopeSql` 一致
2. 采购列表按申请人姓名和申请日期范围过滤是否正确
3. 招聘列表按面试官姓名过滤是否正确
4. 调动列表按员工姓名和调动日期范围过滤是否正确
5. 详情接口是否能校验记录属于当前项目范围员工
6. 记录不属于当前项目范围员工时是否返回预期错误
### 10.3 联调验证
联调时重点验证:
1. Tab 切换后各自查询条件不会互相污染
2. 招聘主题不展示时间范围
3. 采购与调动主题展示时间范围
4. 详情弹窗字段完整性与原业务页一致
## 十一、实施约束
本轮实施需遵守以下要求:
1. 不新增兼容性分支或降级方案。
2. 不在需求外扩展更多主题。
3. 不新增导出、编辑、删除、批量操作。
4. 不改变现有图谱占位卡片行为。
5. 根据本设计文档产出两份实施计划:
- 后端实施计划放 `docs/plans/backend/`
- 前端实施计划放 `docs/plans/frontend/`
## 十二、结论
本次采用“图谱外链卡片下方新增独立拓展查询卡片”的方案,在专项核查页签内新增采购、招聘、调动 3 个主题查询能力。所有查询严格限制为当前专项核查同范围员工,采购与调动支持时间范围筛选,招聘仅支持面试官姓名筛选。前端不新增路由,后端在专项核查域新增统一接口,保持实现路径最短、页面职责清晰、业务口径稳定。