Files
ccdi/docs/reports/implementation/2026-04-23-staff-recruitment-dual-sheet-import-implementation.md
2026-04-23 10:27:08 +08:00

85 lines
4.7 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.
# 招聘信息管理双 Sheet 导入实施记录
## 文档信息
- 保存路径:`docs/reports/implementation/2026-04-23-staff-recruitment-dual-sheet-import-implementation.md`
- 实施日期2026-04-23
- 关联范围:招聘信息管理前后端
## 本次修改内容
### 后端
1. 将招聘导入控制器收口为单一模板下载接口与单一导入入口:
- 模板改为 `招聘信息` + `历史工作经历` 双 Sheet
- 移除独立 `workImportTemplate``importWorkData` 入口。
2. 调整 `ICcdiStaffRecruitmentService``ICcdiStaffRecruitmentImportService` 签名,统一为双 Sheet 单任务提交。
3.`CcdiStaffRecruitmentServiceImpl` 中统一初始化 Redis 任务状态,任务总数按 `recruitmentList.size() + workList.size()` 统计。
4. 重写 `CcdiStaffRecruitmentImportServiceImpl` 导入编排:
- 主 Sheet 先校验并落库;
- 工作经历 Sheet 按 `recruitId` 分组校验;
- 工作经历既支持匹配“本次主 Sheet 成功数据”,也支持匹配数据库已有招聘主信息;
- 若数据库已存在该招聘记录的历史工作经历,则整组失败,不做覆盖。
5.`RecruitmentImportFailureVO` 补充 `sheetName``sheetRowNum` 字段,失败记录可直接定位到具体 Sheet 和 Excel 行号。
6. 新增/补充招聘导入回归测试:
- `CcdiStaffRecruitmentDualImportContractTest`
- `CcdiStaffRecruitmentImportServiceImplTest`
- `EasyExcelUtilTemplateTest`
### 前端
1. 招聘信息管理页工具栏只保留一个“导入”按钮,删除独立“导入工作经历”入口。
2. 上传弹窗文案统一为双 Sheet 模式,模板说明明确为“招聘信息 + 历史工作经历”。
3. 页面本地状态收口为单任务轮询:
- 只保存一个 `currentTaskId`
- 删除按导入类型分流的状态与提示文案。
4. 失败弹窗统一展示:
- `失败Sheet`
- `失败行号`
- `失败原因`
- 以及招聘编号/项目/岗位/候选人/工作单位等辅助字段。
5. 新增前端静态契约测试:
- `staff-recruitment-import-toolbar.test.js`
- `staff-recruitment-import-state.test.js`
- `staff-recruitment-import-failure-dialog.test.js`
## 影响范围
- 后端:招聘导入模板下载、导入提交、异步导入编排、失败记录返回。
- 前端:招聘信息管理页导入入口、上传弹窗、导入轮询、失败弹窗。
- 测试:招聘导入后端定向测试、前端静态契约测试、真实页面 Playwright 验证。
- 文档:新增本实施记录。
## 验证情况
1. 后端定向测试通过:
- 命令:
`mvn -pl ccdi-info-collection -am -Dtest=CcdiStaffRecruitmentDualImportContractTest,CcdiStaffRecruitmentImportServiceImplTest,EasyExcelUtilTemplateTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 结果7 个测试全部通过。
2. 后端编译通过:
- 命令:
`mvn -pl ccdi-info-collection,ruoyi-admin -am -DskipTests compile`
- 结果:`BUILD SUCCESS`
3. 前端静态契约测试通过:
- 命令:
`source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && node ruoyi-ui/tests/unit/staff-recruitment-import-toolbar.test.js && node ruoyi-ui/tests/unit/staff-recruitment-import-state.test.js && node ruoyi-ui/tests/unit/staff-recruitment-import-failure-dialog.test.js`
- 结果3 个脚本全部通过。
4. 前端生产构建通过:
- 命令:
`source ~/.nvm/nvm.sh && nvm use 14.21.3 >/dev/null && cd ruoyi-ui && npm run build:prod`
- 结果:构建成功,仅存在原有体积告警,无新增构建错误。
5. 真实页面 Playwright 验证通过:
- 从真实登录页进入 `/maintain/staffRecruitment`
- 在真实导入弹窗中下载双 Sheet 模板;
- 使用真实模板生成并上传 `只导招聘信息 Sheet` 样本,成功新增 `RC202604230901`
- 使用真实模板生成并上传 `只导历史工作经历 Sheet` 样本,`RC202604230901``0段` 变为 `1段`
- 使用真实模板生成并上传 `双 Sheet 同时导入` 样本,成功新增 `RC202604230902` 且直接显示 `1段`
- 再次上传 `RC202604230902` 的工作经历样本,页面出现失败按钮;
- 打开失败弹窗后,确认展示了 `失败Sheet / 失败行号 / 失败原因`,并看到错误文案:
`招聘记录编号[RC202604230902]已存在历史工作经历,不允许重复导入`
6. 测试数据与缓存清理完成:
- 通过后端删除接口清理 `RC202604230901``RC202604230902`
- 再次查询两条测试招聘名称,返回 `total=0`
- 浏览器侧 `localStorage.staff_recruitment_import_last_task` 已清空;
- 已关闭本轮 Playwright 浏览器、前端 `8080` dev server 和后端 `62318` 进程。