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)