yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceExceptionController.java
@@ -77,9 +77,9 @@ return success(null); } HrmAttendanceExceptionRespVO respVO = BeanUtils.toBean(attendanceException, HrmAttendanceExceptionRespVO.class); // 填充员工和部门信息(userId 是员工ID) // 填充员工和部门信息(userId 是系统账号 ID,不是员工档案 ID) if (attendanceException.getUserId() != null) { HrmEmployeeDO employee = employeeService.getEmployee(attendanceException.getUserId()); HrmEmployeeDO employee = employeeService.getEmployeeByUserId(attendanceException.getUserId()); if (employee != null) { respVO.setUserName(employee.getName()); } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
@@ -164,9 +164,9 @@ return success(null); } HrmAttendanceRecordRespVO respVO = BeanUtils.toBean(attendanceRecord, HrmAttendanceRecordRespVO.class); // 填充员工和部门信息(userId 是员工ID) // 填充员工和部门信息(userId 是系统账号 ID,不是员工档案 ID) if (attendanceRecord.getUserId() != null) { HrmEmployeeDO employee = employeeService.getEmployee(attendanceRecord.getUserId()); HrmEmployeeDO employee = employeeService.getEmployeeByUserId(attendanceRecord.getUserId()); if (employee != null) { respVO.setUserName(employee.getName()); respVO.setPhone(employee.getPhone()); yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceSummaryController.java
@@ -105,8 +105,8 @@ return success(null); } HrmAttendanceSummaryRespVO respVO = BeanUtils.toBean(summary, HrmAttendanceSummaryRespVO.class); // 填充员工和部门信息 HrmEmployeeDO employee = employeeService.getEmployee(userId); // 填充员工和部门信息(userId 是系统账号 ID,不是员工档案 ID) HrmEmployeeDO employee = employeeService.getEmployeeByUserId(userId); if (employee != null) { respVO.setUserName(employee.getName()); } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/HrmEmployeeSocialSecurityController.java
@@ -193,7 +193,7 @@ */ private void fillEmployeeInfo(HrmEmployeeSocialSecurityRespVO respVO, Long userId) { // userId 是员工ID,通过员工表获取姓名和部门 HrmEmployeeDO employee = employeeService.getEmployee(userId); HrmEmployeeDO employee = employeeService.getEmployeeByUserId(userId); if (employee != null) { respVO.setUserName(employee.getName()); if (employee.getDeptId() != null) { yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/HrmSalaryCalculationController.java
@@ -90,16 +90,18 @@ * 填充员工和部门信息(userId 是员工ID) */ private void fillUserInfo(List<HrmSalaryCalculationRespVO> respList, List<HrmSalaryCalculationDO> calculationList) { // userId 是员工ID,批量获取员工信息 Set<Long> employeeIds = calculationList.stream() // 注意:核算记录的 userId 存的是「系统账号 ID」(system_users.id), // 不是员工档案主键(hrm_employee.id)。用 getEmployee 会永远查不到, // 导致列表里「员工姓名」一列全空。必须用 getEmployeeByUserId。 Set<Long> userIds = calculationList.stream() .map(HrmSalaryCalculationDO::getUserId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); for (Long employeeId : employeeIds) { HrmEmployeeDO employee = employeeService.getEmployee(employeeId); for (Long userId : userIds) { HrmEmployeeDO employee = employeeService.getEmployeeByUserId(userId); if (employee != null) { employeeMap.put(employeeId, employee); employeeMap.put(userId, employee); } } @@ -133,9 +135,11 @@ return success(null); } HrmSalaryCalculationRespVO respVO = BeanUtils.toBean(salaryCalculation, HrmSalaryCalculationRespVO.class); // 填充员工和部门信息(userId 是员工ID) // 填充员工和部门信息 // 注意:核算记录的 userId 存的是「系统账号 ID」(system_users.id), // 不是员工档案主键(hrm_employee.id),必须用 getEmployeeByUserId 查 if (salaryCalculation.getUserId() != null) { HrmEmployeeDO employee = employeeService.getEmployee(salaryCalculation.getUserId()); HrmEmployeeDO employee = employeeService.getEmployeeByUserId(salaryCalculation.getUserId()); if (employee != null) { respVO.setUserName(employee.getName()); } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/HrmSalaryPaymentController.java
@@ -140,15 +140,17 @@ */ private void fillUserInfo(List<HrmSalaryPaymentDetailRespVO> respList, List<HrmSalaryPaymentDetailDO> detailList) { // 批量获取员工信息 Set<Long> employeeIds = detailList.stream() // 注意:发放明细的 userId 存的是「系统账号 ID」(system_users.id), // 不是员工档案主键(hrm_employee.id),必须用 getEmployeeByUserId 查 Set<Long> userIds = detailList.stream() .map(HrmSalaryPaymentDetailDO::getUserId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); for (Long employeeId : employeeIds) { HrmEmployeeDO employee = employeeService.getEmployee(employeeId); for (Long userId : userIds) { HrmEmployeeDO employee = employeeService.getEmployeeByUserId(userId); if (employee != null) { employeeMap.put(employeeId, employee); employeeMap.put(userId, employee); } } // 批量获取部门信息 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
@@ -642,7 +642,24 @@ public void saveSalaryCalculationList(List<HrmSalaryCalculationDO> calculationList) { for (HrmSalaryCalculationDO calculation : calculationList) { if (calculation.getId() == null) { // 新增记录,生成核算单号 // 新增前先查重:同一员工(系统账号 ID)+ 同一周期 只允许存在一条记录。 // 前端「预览数据 → 保存核算」走的就是这里,不查重会重复插入。 List<HrmSalaryCalculationDO> existList = salaryCalculationMapper .selectListByUserIdAndPeriod(calculation.getUserId(), calculation.getPeriod()); if (CollUtil.isNotEmpty(existList)) { HrmSalaryCalculationDO existing = existList.get(0); // 已确认/已发放的记录不允许被覆盖,直接跳过 if (existing.getStatus() != null && existing.getStatus() != 0) { continue; } // 待确认的记录:覆盖重算结果,保留原单号 calculation.setId(existing.getId()); calculation.setNo(existing.getNo()); calculation.setStatus(0); salaryCalculationMapper.updateById(calculation); continue; } // 确实是新增,生成核算单号 String no = noRedisDAO.generateSalaryCalculationNo(); while (salaryCalculationMapper.selectByNo(no) != null) { no = noRedisDAO.generateSalaryCalculationNo();