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<Long, PostRespDTO> 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<RoleRespDTO> 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<HrmEmployeeDO> getEmployeePage(HrmEmployeePageReqVO pageReqVO) {
|
return employeeMapper.selectPage(pageReqVO);
|
}
|
|
@Override
|
public List<HrmEmployeeDO> getEmployeeList(Collection<Long> ids) {
|
return employeeMapper.selectByIds(ids);
|
}
|
|
@Override
|
public List<HrmEmployeeSimpleRespVO> getEmployeeSimpleList(Integer employeeStatus) {
|
List<HrmEmployeeDO> list = employeeMapper.selectListByStatus(employeeStatus);
|
// 填充部门名称
|
Set<Long> deptIds = list.stream()
|
.map(HrmEmployeeDO::getDeptId)
|
.filter(Objects::nonNull)
|
.collect(Collectors.toSet());
|
Map<Long, DeptRespDTO> 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);
|
}
|
|
}
|