package cn.iocoder.yudao.module.hrm.service.employee; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; 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.employee.vo.HrmEmployeeEducationSaveReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactSaveReqVO; 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.controller.admin.employee.vo.HrmEmployeeWorkHistorySaveReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO; import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEducationMapper; import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEmergencyContactMapper; import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper; import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeWorkHistoryMapper; import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; 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 cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; /** * 员工信息 Service 实现类 * * @author 芋道源码 */ @Service @Validated public class HrmEmployeeServiceImpl implements HrmEmployeeService { @Resource private HrmEmployeeMapper employeeMapper; @Resource private HrmEmployeeEducationMapper educationMapper; @Resource private HrmEmployeeWorkHistoryMapper workHistoryMapper; @Resource private HrmEmployeeEmergencyContactMapper emergencyContactMapper; @Resource private HrmNoRedisDAO noRedisDAO; @Resource private DeptApi deptApi; @Resource private PostApi postApi; @Resource private AdminUserApi adminUserApi; @Resource private RoleApi roleApi; @Override @Transactional(rollbackFor = Exception.class) public Long createEmployee(HrmEmployeeSaveReqVO createReqVO) { // 1. 校验部门 deptApi.validateDeptList(Collections.singleton(createReqVO.getDeptId())); // 2. 校验岗位 postApi.validPostList(Collections.singleton(createReqVO.getPostId())); // 3. 校验手机号是否已存在 if (employeeMapper.selectByPhone(createReqVO.getPhone()) != null) { throw exception(EMPLOYEE_PHONE_EXISTS); } // 4. 同步创建系统用户 AdminUserCreateReqDTO userCreateReqDTO = new AdminUserCreateReqDTO(); userCreateReqDTO.setUsername(createReqVO.getPhone()); userCreateReqDTO.setNickname(createReqVO.getName()); userCreateReqDTO.setDeptId(createReqVO.getDeptId()); userCreateReqDTO.setPostIds(Collections.singleton(createReqVO.getPostId())); userCreateReqDTO.setMobile(createReqVO.getPhone()); userCreateReqDTO.setPassword(createReqVO.getPhone()); userCreateReqDTO.setSex(createReqVO.getGender()); userCreateReqDTO.setEmail(createReqVO.getEmail()); userCreateReqDTO.setRemark(createReqVO.getRemark()); // 设置角色 if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) { userCreateReqDTO.setRoleIds(createReqVO.getRoleIds().stream().collect(Collectors.toSet())); } Long userId = adminUserApi.createUser(userCreateReqDTO); // 5. 生成员工编号 String employeeNo = generateUniqueEmployeeNo(); // 6. 插入员工记录 HrmEmployeeDO employee = BeanUtils.toBean(createReqVO, HrmEmployeeDO.class); employee.setEmployeeNo(employeeNo); employee.setUserId(userId); // 关联系统用户ID // roleIds 存储为 JSON if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) { employee.setRoleIds(JSONUtil.toJsonStr(createReqVO.getRoleIds())); } employeeMapper.insert(employee); Long employeeId = employee.getId(); // 7. 同步添加教育经历 if (CollUtil.isNotEmpty(createReqVO.getEducationList())) { createReqVO.getEducationList().forEach(educationVO -> { HrmEmployeeEducationDO education = BeanUtils.toBean(educationVO, HrmEmployeeEducationDO.class); education.setEmployeeId(employeeId); educationMapper.insert(education); }); } // 8. 同步添加工作经历 if (CollUtil.isNotEmpty(createReqVO.getWorkHistoryList())) { createReqVO.getWorkHistoryList().forEach(workHistoryVO -> { HrmEmployeeWorkHistoryDO workHistory = BeanUtils.toBean(workHistoryVO, HrmEmployeeWorkHistoryDO.class); workHistory.setEmployeeId(employeeId); workHistoryMapper.insert(workHistory); }); } // 9. 同步添加紧急联系人 if (CollUtil.isNotEmpty(createReqVO.getEmergencyContactList())) { createReqVO.getEmergencyContactList().forEach(emergencyContactVO -> { HrmEmployeeEmergencyContactDO emergencyContact = BeanUtils.toBean(emergencyContactVO, HrmEmployeeEmergencyContactDO.class); emergencyContact.setEmployeeId(employeeId); emergencyContactMapper.insert(emergencyContact); }); } return employeeId; } private String generateUniqueEmployeeNo() { String employeeNo = noRedisDAO.generateEmployeeNo(); if (employeeMapper.selectByEmployeeNo(employeeNo) != null) { return generateUniqueEmployeeNo(); } return employeeNo; } @Override public void updateEmployee(HrmEmployeeSaveReqVO updateReqVO) { // 校验存在 HrmEmployeeDO employee = validateEmployeeExists(updateReqVO.getId()); // 校验部门 deptApi.validateDeptList(Collections.singleton(updateReqVO.getDeptId())); // 校验岗位 postApi.validPostList(Collections.singleton(updateReqVO.getPostId())); // 校验手机号是否已存在(如果手机号有变更) if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone()) && employeeMapper.selectByPhone(updateReqVO.getPhone()) != null) { throw exception(EMPLOYEE_PHONE_EXISTS); } // 更新 HrmEmployeeDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeDO.class); // roleIds 存储为 JSON if (CollUtil.isNotEmpty(updateReqVO.getRoleIds())) { updateObj.setRoleIds(JSONUtil.toJsonStr(updateReqVO.getRoleIds())); } employeeMapper.updateById(updateObj); } @Override public void deleteEmployee(Long id) { // 校验存在 validateEmployeeExists(id); // 删除 employeeMapper.deleteById(id); } private HrmEmployeeDO validateEmployeeExists(Long id) { HrmEmployeeDO employee = employeeMapper.selectById(id); if (employee == null) { throw exception(EMPLOYEE_NOT_EXISTS); } return employee; } @Override public HrmEmployeeDO getEmployee(Long id) { return employeeMapper.selectById(id); } @Override public HrmEmployeeRespVO getEmployeeDetail(Long id) { HrmEmployeeDO employee = getEmployee(id); if (employee == null) { return null; } HrmEmployeeRespVO respVO = BeanUtils.toBean(employee, HrmEmployeeRespVO.class); // 解析 roleIds JSON if (StrUtil.isNotBlank(employee.getRoleIds())) { respVO.setRoleIds(JSONUtil.toList(employee.getRoleIds(), Long.class)); } // 填充部门名称 if (employee.getDeptId() != null) { DeptRespDTO dept = deptApi.getDept(employee.getDeptId()); if (dept != null) { respVO.setDeptName(dept.getName()); } } // 填充岗位名称 if (employee.getPostId() != null) { Map postMap = postApi.getPostMap(Collections.singleton(employee.getPostId())); PostRespDTO post = postMap.get(employee.getPostId()); if (post != null) { respVO.setPostName(post.getName()); } } // 填充角色名称 if (CollUtil.isNotEmpty(respVO.getRoleIds())) { List roles = roleApi.getRoleList(respVO.getRoleIds()); if (CollUtil.isNotEmpty(roles)) { respVO.setRoleNames(roles.stream().map(RoleRespDTO::getName).collect(Collectors.joining(","))); } } return respVO; } @Override public HrmEmployeeDO validateEmployee(Long id) { HrmEmployeeDO employee = employeeMapper.selectById(id); if (employee == null) { throw exception(EMPLOYEE_NOT_EXISTS); } return employee; } @Override public PageResult getEmployeePage(HrmEmployeePageReqVO pageReqVO) { return employeeMapper.selectPage(pageReqVO); } @Override public List getEmployeeList(Collection ids) { return employeeMapper.selectByIds(ids); } @Override public List getEmployeeSimpleList(Integer employeeStatus) { List list = employeeMapper.selectListByStatus(employeeStatus); // 填充部门名称 Set deptIds = list.stream() .map(HrmEmployeeDO::getDeptId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Map deptMap = deptApi.getDeptMap(deptIds); return list.stream().map(emp -> { HrmEmployeeSimpleRespVO vo = new HrmEmployeeSimpleRespVO(); vo.setId(emp.getId()); vo.setEmployeeNo(emp.getEmployeeNo()); vo.setName(emp.getName()); vo.setEmployeeStatus(emp.getEmployeeStatus()); if (emp.getDeptId() != null && deptMap.containsKey(emp.getDeptId())) { vo.setDeptName(deptMap.get(emp.getDeptId()).getName()); } return vo; }).collect(Collectors.toList()); } @Override public HrmEmployeeDO getEmployeeByUserId(Long userId) { return employeeMapper.selectByUserId(userId); } }