package cn.iocoder.yudao.module.hrm.controller.admin.salary; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSalaryPageReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSalaryRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSalarySaveReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSalaryDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryStructureDO; import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; import cn.iocoder.yudao.module.hrm.service.salary.HrmEmployeeSalaryService; import cn.iocoder.yudao.module.hrm.service.salary.HrmSalaryStructureService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.*; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - HRM 员工薪酬档案") @RestController @RequestMapping("/hrm/employee-salary") @Validated public class HrmEmployeeSalaryController { @Resource private HrmEmployeeSalaryService employeeSalaryService; @Resource private HrmEmployeeService employeeService; @Resource private HrmSalaryStructureService structureService; @PostMapping("/create") @Operation(summary = "创建员工薪酬档案") @PreAuthorize("@ss.hasPermission('hrm:salary:create')") public CommonResult createEmployeeSalary(@Valid @RequestBody HrmEmployeeSalarySaveReqVO createReqVO) { HrmEmployeeSalaryDO salary = BeanUtils.toBean(createReqVO, HrmEmployeeSalaryDO.class); return success(employeeSalaryService.createEmployeeSalary(salary)); } @PutMapping("/update") @Operation(summary = "更新员工薪酬档案") @PreAuthorize("@ss.hasPermission('hrm:salary:update')") public CommonResult updateEmployeeSalary(@Valid @RequestBody HrmEmployeeSalarySaveReqVO updateReqVO) { HrmEmployeeSalaryDO salary = BeanUtils.toBean(updateReqVO, HrmEmployeeSalaryDO.class); employeeSalaryService.updateEmployeeSalary(salary); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除员工薪酬档案") @Parameter(name = "id", description = "档案ID", required = true) @PreAuthorize("@ss.hasPermission('hrm:salary:delete')") public CommonResult deleteEmployeeSalary(@RequestParam("id") Long id) { employeeSalaryService.deleteEmployeeSalary(id); return success(true); } @GetMapping("/get") @Operation(summary = "获取员工薪酬档案") @Parameter(name = "id", description = "档案ID", required = true) @PreAuthorize("@ss.hasPermission('hrm:salary:query')") public CommonResult getEmployeeSalary(@RequestParam("id") Long id) { HrmEmployeeSalaryDO salary = employeeSalaryService.getEmployeeSalary(id); if (salary == null) { return success(null); } HrmEmployeeSalaryRespVO respVO = BeanUtils.toBean(salary, HrmEmployeeSalaryRespVO.class); fillEmployeeInfo(respVO, salary.getUserId()); fillStructureInfo(respVO, salary.getSalaryStructureId()); return success(respVO); } @GetMapping("/page") @Operation(summary = "获取员工薪酬档案分页") @PreAuthorize("@ss.hasPermission('hrm:salary:query')") public CommonResult> getEmployeeSalaryPage( @Valid HrmEmployeeSalaryPageReqVO pageReqVO) { PageResult pageResult = employeeSalaryService.getEmployeeSalaryPage(pageReqVO); List recordList = pageResult.getList(); if (CollUtil.isEmpty(recordList)) { return success(new PageResult<>(Collections.emptyList(), pageResult.getTotal())); } // 批量获取员工信息 Set employeeIds = new HashSet<>(); Set structureIds = new HashSet<>(); for (HrmEmployeeSalaryDO record : recordList) { if (record.getUserId() != null) { employeeIds.add(record.getUserId()); } if (record.getSalaryStructureId() != null) { structureIds.add(record.getSalaryStructureId()); } } Map employeeMap = new HashMap<>(); for (Long employeeId : employeeIds) { HrmEmployeeDO employee = employeeService.getEmployee(employeeId); if (employee != null) { employeeMap.put(employeeId, employee); } } Map structureMap = new HashMap<>(); for (Long structureId : structureIds) { HrmSalaryStructureDO structure = structureService.getStructure(structureId); if (structure != null) { structureMap.put(structureId, structure); } } List list = recordList.stream() .map(salary -> { HrmEmployeeSalaryRespVO respVO = BeanUtils.toBean(salary, HrmEmployeeSalaryRespVO.class); HrmEmployeeDO employee = employeeMap.get(salary.getUserId()); if (employee != null) { respVO.setEmployeeNo(employee.getEmployeeNo()); respVO.setEmployeeName(employee.getName()); } if (salary.getSalaryStructureId() != null) { HrmSalaryStructureDO structure = structureMap.get(salary.getSalaryStructureId()); if (structure != null) { respVO.setSalaryStructureName(structure.getName()); } } return respVO; }) .toList(); return success(new PageResult<>(list, pageResult.getTotal())); } @GetMapping("/list-by-user") @Operation(summary = "获取员工薪酬档案历史列表") @Parameter(name = "userId", description = "员工ID", required = true) @PreAuthorize("@ss.hasPermission('hrm:salary:query')") public CommonResult> getEmployeeSalaryList( @RequestParam("userId") Long userId) { List list = employeeSalaryService.getEmployeeSalaryList(userId); return success(list.stream() .map(salary -> { HrmEmployeeSalaryRespVO respVO = BeanUtils.toBean(salary, HrmEmployeeSalaryRespVO.class); fillEmployeeInfo(respVO, salary.getUserId()); fillStructureInfo(respVO, salary.getSalaryStructureId()); return respVO; }) .toList()); } @GetMapping("/get-latest") @Operation(summary = "获取员工最新生效的薪酬档案") @Parameter(name = "userId", description = "员工ID", required = true) @PreAuthorize("@ss.hasPermission('hrm:salary:query')") public CommonResult getLatestEmployeeSalary( @RequestParam("userId") Long userId) { HrmEmployeeSalaryDO salary = employeeSalaryService.getLatestEmployeeSalary(userId); if (salary == null) { return success(null); } HrmEmployeeSalaryRespVO respVO = BeanUtils.toBean(salary, HrmEmployeeSalaryRespVO.class); fillEmployeeInfo(respVO, salary.getUserId()); fillStructureInfo(respVO, salary.getSalaryStructureId()); return success(respVO); } private void fillEmployeeInfo(HrmEmployeeSalaryRespVO respVO, Long userId) { HrmEmployeeDO employee = employeeService.getEmployee(userId); if (employee != null) { respVO.setEmployeeNo(employee.getEmployeeNo()); respVO.setEmployeeName(employee.getName()); } } private void fillStructureInfo(HrmEmployeeSalaryRespVO respVO, Long structureId) { if (structureId != null) { HrmSalaryStructureDO structure = structureService.getStructure(structureId); if (structure != null) { respVO.setSalaryStructureName(structure.getName()); } } } }