tuqin
2 天以前 ffec90c897e9bd78e88b9fa590a5dd75d26b82c8
分支
用户 tuqin <tuqin@local>
星期五, 十一月 6, 2026 11:38 +0800
提交者 tuqin <tuqin@local>
星期五, 十一月 6, 2026 11:38 +0800
提交ffec90c897e9bd78e88b9fa590a5dd75d26b82c8
目录 7bda5e385eeb3e732b9f77802ea8a44612e1cf3e 目录 | zip | gz
上一版本 3427c23b5e1e321ac44802b4c30c0c4e08231ec0 查看 | 对比
fix(hrm): 修复员工导入失败(日期格式 + 部门/岗位/角色不存在)

问题:蓝羽纸业导入员工表格时整体失败,前端只看到 500「系统异常」,
48 条数据一条都进不去。

根因(三层叠加,前一层挡住后一层):
1. 入职日期格式不兼容(致命,导致整个接口 500)
客户表格填的是「2026.3.30」(点分隔文本),
FastExcel 内置 LocalDateStringConverter 只认 yyyy-MM-dd,
抛 ExcelDataConvertException: can not find date format for:2026.3.30,
ExcelUtils.read() 直接异常,业务逻辑根本没执行,且是整批失败。

2. 部门不存在
表格填「综合车间」,系统里只有造纸车间/制浆车间/加工车间/包装车间,
而 deptId 在 HrmEmployeeSaveReqVO 上是 @NotNull(部门不能为空)。

3. 岗位/角色不存在
表格填「车间员工」,系统里只有造纸操作工/包装工/劳务工等;
表格「用户角色」列填的是「综合管理部」(其实是部门名,误填到角色列)。

改动:
1. 新增 FlexibleLocalDateConverter(excel framework)
兼容 yyyy-M-d / yyyy.M.d / yyyy/M/d / yyyy年M月d日 / yyyyMMdd / 带时间,
数字单元格按 Excel 日期序列号(基准 1899-12-30)解析;
解析不了时置空而不是抛异常,交给业务侧按「必填」规则逐条提示,
避免一条脏数据拖垮整批导入。
HrmEmployeeImportExcelVO 的 hireDate / birthday 挂上该转换器。

2. DeptApi/PostApi 新增 getOrCreateDeptByName / getOrCreatePostByName
按名称找不到时自动补建(部门挂到根部门下,岗位 code 用时间戳生成),
保证客户表格里新出现的部门/岗位不会阻塞导入。

3. HrmEmployeeServiceImpl 的 parseDeptId / parsePostIds 改用 getOrCreate;
parseRoleIds 改为「角色不存在则跳过 + 打警告」,
因为角色对员工导入是可选项,不该因为一列误填就整条失败。

验证(蓝羽 mom-lyzy 实测):
- 原表格 48 条数据,成功导入 47 条,1 条因手机号重复被正常拦截
- 自动创建部门「综合车间」(id=136)、岗位「车间员工」(id=42)
- 入职日期 2026.3.30 → 2026-03-30
- 出生日期 31990(Excel 序列号)→ 1987-08-01
- 性别/员工状态通过字典正常映射(男=1、在职=1)
已添加1个文件
已修改6个文件
227 ■■■■■ 文件已修改
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/convert/FlexibleLocalDateConverter.java 113 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeImportExcelVO.java 5 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java 32 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApi.java 12 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptApiImpl.java 30 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApi.java 10 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/dept/PostApiImpl.java 25 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史