package cn.iocoder.yudao.module.hrm.controller.admin.employee; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeePageReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSaveReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSimpleRespVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.PostApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO; import cn.iocoder.yudao.module.system.api.permission.RoleApi; import cn.iocoder.yudao.module.system.api.permission.dto.RoleRespDTO; 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.servlet.http.HttpServletResponse; 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.io.IOException; import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - HRM 员工") @RestController @RequestMapping("/hrm/employee") @Validated public class HrmEmployeeController { @Resource private HrmEmployeeService employeeService; @Resource private DeptApi deptApi; @Resource private PostApi postApi; @Resource private RoleApi roleApi; @PostMapping("/create") @Operation(summary = "创建员工") @PreAuthorize("@ss.hasPermission('hrm:employee:create')") public CommonResult createEmployee(@Valid @RequestBody HrmEmployeeSaveReqVO createReqVO) { return success(employeeService.createEmployee(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新员工") @PreAuthorize("@ss.hasPermission('hrm:employee:update')") public CommonResult updateEmployee(@Valid @RequestBody HrmEmployeeSaveReqVO updateReqVO) { employeeService.updateEmployee(updateReqVO); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除员工") @Parameter(name = "id", description = "员工ID", required = true) @PreAuthorize("@ss.hasPermission('hrm:employee:delete')") public CommonResult deleteEmployee(@RequestParam("id") Long id) { employeeService.deleteEmployee(id); return success(true); } @GetMapping("/get") @Operation(summary = "获得员工详情") @Parameter(name = "id", description = "员工ID", required = true) @PreAuthorize("@ss.hasPermission('hrm:employee:query')") public CommonResult getEmployee(@RequestParam("id") Long id) { return success(employeeService.getEmployeeDetail(id)); } @GetMapping("/page") @Operation(summary = "获得员工分页") @PreAuthorize("@ss.hasPermission('hrm:employee:query')") public CommonResult> getEmployeePage(@Valid HrmEmployeePageReqVO pageReqVO) { PageResult pageResult = employeeService.getEmployeePage(pageReqVO); // 转换为 VO List list = BeanUtils.toBean(pageResult.getList(), HrmEmployeeRespVO.class); // 填充部门、岗位、角色名称 if (CollUtil.isNotEmpty(list)) { fillEmployeeInfo(list, pageResult.getList()); } return success(new PageResult<>(list, pageResult.getTotal())); } /** * 填充员工信息(部门、岗位、角色名称) */ private void fillEmployeeInfo(List respList, List employeeList) { // 1. 批量获取部门信息 Set deptIds = employeeList.stream() .map(HrmEmployeeDO::getDeptId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); // 2. 批量获取岗位信息 Set postIds = employeeList.stream() .map(HrmEmployeeDO::getPostId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map postMap = CollUtil.isEmpty(postIds) ? Collections.emptyMap() : postApi.getPostMap(postIds); // 3. 收集所有角色ID Set allRoleIds = new HashSet<>(); for (HrmEmployeeDO employee : employeeList) { if (StrUtil.isNotBlank(employee.getRoleIds())) { List roleIds = JSONUtil.toList(employee.getRoleIds(), Long.class); allRoleIds.addAll(roleIds); } } Map roleMap = CollUtil.isEmpty(allRoleIds) ? Collections.emptyMap() : roleApi.getRoleList(allRoleIds).stream() .collect(Collectors.toMap(RoleRespDTO::getId, r -> r)); // 4. 填充信息 for (int i = 0; i < respList.size(); i++) { HrmEmployeeRespVO respVO = respList.get(i); HrmEmployeeDO employee = employeeList.get(i); // 填充部门名称 if (employee.getDeptId() != null && deptMap.containsKey(employee.getDeptId())) { respVO.setDeptName(deptMap.get(employee.getDeptId()).getName()); } // 填充岗位名称 if (employee.getPostId() != null && postMap.containsKey(employee.getPostId())) { respVO.setPostName(postMap.get(employee.getPostId()).getName()); } // 解析 roleIds 并填充角色名称 if (StrUtil.isNotBlank(employee.getRoleIds())) { List roleIds = JSONUtil.toList(employee.getRoleIds(), Long.class); respVO.setRoleIds(roleIds); if (CollUtil.isNotEmpty(roleIds)) { List roleNames = roleIds.stream() .filter(roleMap::containsKey) .map(id -> roleMap.get(id).getName()) .collect(Collectors.toList()); respVO.setRoleNames(String.join(",", roleNames)); } } } } @GetMapping("/simple-list") @Operation(summary = "获得员工精简列表", description = "用于下拉选择") public CommonResult> getEmployeeSimpleList( @RequestParam(value = "employeeStatus", required = false) Integer employeeStatus) { return success(employeeService.getEmployeeSimpleList(employeeStatus)); } @GetMapping("/export-excel") @Operation(summary = "导出员工 Excel") @PreAuthorize("@ss.hasPermission('hrm:employee:export')") @ApiAccessLog(operateType = EXPORT) public void exportEmployeeExcel(@Valid HrmEmployeePageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); PageResult pageResult = employeeService.getEmployeePage(pageReqVO); List employeeList = pageResult.getList(); // 转换为 VO List list = BeanUtils.toBean(employeeList, HrmEmployeeRespVO.class); // 填充部门、岗位、角色名称 if (CollUtil.isNotEmpty(list)) { fillEmployeeInfo(list, employeeList); } ExcelUtils.write(response, "员工信息.xls", "数据", HrmEmployeeRespVO.class, list); } }