From 17ce55a3b038ed61d332bb54916de4fa55ba19c6 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期二, 27 十月 2026 09:10:23 +0800
Subject: [PATCH] fix: 修复导出表头缺失、权限码不一致及生产链路断点
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java | 201 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 199 insertions(+), 2 deletions(-)
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
index 58632cf..0e6ffcc 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
@@ -3,10 +3,17 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.hrm.enums.HrmEmploymentTypeEnum;
+import cn.iocoder.yudao.module.mes.api.cal.MesCalTeamApi;
+import cn.iocoder.yudao.module.mes.api.cal.dto.MesCalTeamRespDTO;
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.HrmEmployeeImportExcelVO;
+import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeImportReqVO;
+import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeImportRespVO;
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;
@@ -21,6 +28,7 @@
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.infra.api.config.ConfigApi;
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;
@@ -30,12 +38,16 @@
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.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -43,12 +55,13 @@
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
/**
* 鍛樺伐淇℃伅 Service 瀹炵幇绫�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@Service
@Validated
@@ -72,6 +85,18 @@
private AdminUserApi adminUserApi;
@Resource
private RoleApi roleApi;
+ @Resource
+ private MesCalTeamApi mesCalTeamApi;
+ @Resource
+ private ConfigApi configApi;
+
+ /**
+ * 鐢ㄦ埛鍒濆瀵嗙爜鐨勭郴缁熷弬鏁伴厤缃」
+ */
+ private static final String USER_INIT_PASSWORD_KEY = "system.user.init-password";
+ @Resource
+ @Lazy // 鑷敞鍏ラ渶寤惰繜鍔犺浇锛屽惁鍒� bean 琚唬鐞嗗寘瑁呭悗娉ㄥ叆鍘熷鐗堟湰瀵艰嚧鍚姩澶辫触
+ private HrmEmployeeService self;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -91,7 +116,8 @@
userCreateReqDTO.setDeptId(createReqVO.getDeptId());
userCreateReqDTO.setPostIds(Collections.singleton(createReqVO.getPostId()));
userCreateReqDTO.setMobile(createReqVO.getPhone());
- userCreateReqDTO.setPassword(createReqVO.getPhone());
+ // 鍒濆瀵嗙爜锛氫紭鍏堢敤瀵煎叆/鏂板鏃舵寚瀹氱殑瀵嗙爜锛屽惁鍒欒鍙栫郴缁熷弬鏁帮紱涓よ�呴兘娌℃湁鍒欐姤閿�
+ userCreateReqDTO.setPassword(resolveInitialPassword(createReqVO.getPassword()));
userCreateReqDTO.setSex(createReqVO.getGender());
userCreateReqDTO.setEmail(createReqVO.getEmail());
userCreateReqDTO.setRemark(createReqVO.getRemark());
@@ -169,6 +195,11 @@
}
employeeMapper.updateById(updateObj);
Long employeeId = updateReqVO.getId();
+
+ // 鍚屾绯荤粺鐢ㄦ埛瀵嗙爜锛氫粎褰撴樉寮忓~鍐欎簡瀵嗙爜鏃舵墠鏇存柊锛屾湭濉啓淇濇寔鍘熷瘑鐮佷笉鍙�
+ if (StrUtil.isNotBlank(updateReqVO.getPassword()) && employee.getUserId() != null) {
+ adminUserApi.updateUserPassword(employee.getUserId(), updateReqVO.getPassword());
+ }
// 鍚屾鏁欒偛缁忓巻
syncEducationList(employeeId, updateReqVO.getEducations());
@@ -273,6 +304,17 @@
respVO.setRoleNames(roles.stream().map(RoleRespDTO::getName).collect(Collectors.joining(",")));
}
}
+ // 濉厖鐢ㄥ伐鎬ц川鍚嶇О
+ if (employee.getEmploymentType() != null) {
+ respVO.setEmploymentTypeName(HrmEmploymentTypeEnum.getNameByType(employee.getEmploymentType()));
+ }
+ // 濉厖鎵�灞炵彮缁勫悕绉�
+ if (employee.getTeamId() != null) {
+ List<MesCalTeamRespDTO> teams = mesCalTeamApi.getTeamList(Collections.singleton(employee.getTeamId()));
+ if (CollUtil.isNotEmpty(teams)) {
+ respVO.setTeamName(teams.get(0).getName());
+ }
+ }
return respVO;
}
@@ -322,4 +364,159 @@
return employeeMapper.selectByUserId(userId);
}
+ @Override
+ public HrmEmployeeDO getEmployeeByName(String name) {
+ return employeeMapper.selectByName(name);
+ }
+
+ @Override
+ public List<HrmEmployeeDO> getEmployeeListByName(String name) {
+ return employeeMapper.selectListByName(name);
+ }
+
+ @Override
+ public HrmEmployeeImportRespVO importEmployeeList(List<HrmEmployeeImportExcelVO> importEmployees,
+ HrmEmployeeImportReqVO importReqVO) {
+ // 1. 鏍¢獙闈炵┖
+ importEmployees = filterList(importEmployees, item -> Objects.nonNull(item.getName()));
+ if (CollUtil.isEmpty(importEmployees)) {
+ throw exception(EMPLOYEE_IMPORT_LIST_IS_EMPTY);
+ }
+ // 2. 棰勫姞杞介儴闂�/宀椾綅/瑙掕壊 鍚嶇О -> 瀹炰綋 鏄犲皠
+ Map<String, DeptRespDTO> deptMap = deptApi.getDeptList().stream()
+ .collect(Collectors.toMap(DeptRespDTO::getName, dept -> dept, (v1, v2) -> v1));
+ Map<String, PostRespDTO> postMap = postApi.getPostList().stream()
+ .collect(Collectors.toMap(PostRespDTO::getName, post -> post, (v1, v2) -> v1));
+ Map<String, RoleRespDTO> roleMap = roleApi.getRoleList().stream()
+ .collect(Collectors.toMap(RoleRespDTO::getName, role -> role, (v1, v2) -> v1));
+ // 3. 閫愭潯澶勭悊
+ HrmEmployeeImportRespVO respVO = HrmEmployeeImportRespVO.builder()
+ .createNames(new ArrayList<>())
+ .updateNames(new ArrayList<>())
+ .failureNames(new LinkedHashMap<>())
+ .build();
+ for (HrmEmployeeImportExcelVO importEmployee : importEmployees) {
+ String name = importEmployee.getName();
+ try {
+ // 3.1 鍚嶇О杞� ID
+ Long deptId = parseDeptId(importEmployee.getDeptName(), deptMap);
+ Long postId = parsePostId(importEmployee.getPostName(), postMap);
+ Set<Long> roleIds = parseRoleIds(importEmployee.getRoleNames(), roleMap);
+ // 3.2 鏋勫缓淇濆瓨璇锋眰
+ HrmEmployeeSaveReqVO saveReqVO = buildImportSaveReqVO(importEmployee, deptId, postId, roleIds);
+ // 3.3 鍒ゆ柇瀛樺湪鎬э細鎸夋墜鏈哄彿
+ HrmEmployeeDO existEmployee = employeeMapper.selectByPhone(importEmployee.getPhone());
+ if (existEmployee == null) {
+ self.createEmployee(saveReqVO);
+ respVO.getCreateNames().add(name);
+ } else {
+ if (!Boolean.TRUE.equals(importReqVO.getUpdateSupport())) {
+ respVO.getFailureNames().put(name, EMPLOYEE_PHONE_EXISTS.getMsg());
+ continue;
+ }
+ saveReqVO.setId(existEmployee.getId());
+ self.updateEmployee(saveReqVO);
+ respVO.getUpdateNames().add(name);
+ }
+ } catch (ServiceException ex) {
+ respVO.getFailureNames().put(name, ex.getMessage());
+ } catch (Exception ex) {
+ respVO.getFailureNames().put(name, ex.getMessage());
+ }
+ }
+ return respVO;
+ }
+
+ /**
+ * 瑙f瀽鍛樺伐鍒濆瀵嗙爜锛�
+ * 1. 瀵煎叆/鏂板鏃舵樉寮忔寚瀹氫簡瀵嗙爜锛屼紭鍏堜娇鐢紱
+ * 2. 鏈寚瀹氬垯璇诲彇绯荤粺鍙傛暟 {@code system.user.init-password}锛�
+ * 3. 涓よ�呴兘娌℃湁鏃舵槑纭姤閿欙紝閬垮厤鎮勬倓鐢ㄦ墜鏈哄彿绛夊急鍙d护鍏滃簳銆�
+ */
+ private String resolveInitialPassword(String specifiedPassword) {
+ if (StrUtil.isNotBlank(specifiedPassword)) {
+ return specifiedPassword;
+ }
+ String initPassword = configApi.getConfigValueByKey(USER_INIT_PASSWORD_KEY);
+ if (StrUtil.isBlank(initPassword)) {
+ throw exception(EMPLOYEE_INIT_PASSWORD_NOT_CONFIGURED);
+ }
+ return initPassword;
+ }
+
+ private HrmEmployeeSaveReqVO buildImportSaveReqVO(HrmEmployeeImportExcelVO importEmployee,
+ Long deptId, Long postId, Set<Long> roleIds) {
+ if (StrUtil.isBlank(importEmployee.getName())) {
+ throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "鍛樺伐濮撳悕");
+ }
+ if (StrUtil.isBlank(importEmployee.getPhone())) {
+ throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "鎵嬫満鍙�");
+ }
+ if (importEmployee.getHireDate() == null) {
+ throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "鍏ヨ亴鏃ユ湡");
+ }
+ HrmEmployeeSaveReqVO reqVO = new HrmEmployeeSaveReqVO();
+ reqVO.setName(importEmployee.getName());
+ reqVO.setGender(importEmployee.getGender() != null ? importEmployee.getGender() : 1); // 榛樿鐢�
+ reqVO.setPhone(importEmployee.getPhone());
+ reqVO.setPassword(importEmployee.getPassword());
+ reqVO.setDeptId(deptId);
+ reqVO.setPostId(postId);
+ reqVO.setRoleIds(CollUtil.isEmpty(roleIds) ? null : new ArrayList<>(roleIds));
+ reqVO.setHireDate(importEmployee.getHireDate());
+ reqVO.setEmployeeStatus(importEmployee.getEmployeeStatus() != null
+ ? importEmployee.getEmployeeStatus() : 1); // 榛樿鍦ㄨ亴
+ reqVO.setEmail(importEmployee.getEmail());
+ reqVO.setBirthday(importEmployee.getBirthday());
+ reqVO.setIdCard(importEmployee.getIdCard());
+ reqVO.setNation(importEmployee.getNation());
+ reqVO.setMarriageStatus(importEmployee.getMarriageStatus());
+ reqVO.setAge(importEmployee.getAge());
+ reqVO.setEducation(importEmployee.getEducation());
+ reqVO.setPoliticalStatus(importEmployee.getPoliticalStatus());
+ reqVO.setRemark(importEmployee.getRemark());
+ return reqVO;
+ }
+
+ private Long parseDeptId(String deptName, Map<String, DeptRespDTO> deptMap) {
+ if (StrUtil.isBlank(deptName)) {
+ throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "閮ㄩ棬鍚嶇О");
+ }
+ DeptRespDTO dept = deptMap.get(deptName.trim());
+ if (dept == null) {
+ throw exception(EMPLOYEE_DEPT_NAME_NOT_EXISTS, deptName.trim());
+ }
+ return dept.getId();
+ }
+
+ private Long parsePostId(String postName, Map<String, PostRespDTO> postMap) {
+ if (StrUtil.isBlank(postName)) {
+ throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "宀椾綅鍚嶇О");
+ }
+ PostRespDTO post = postMap.get(postName.trim());
+ if (post == null) {
+ throw exception(EMPLOYEE_POST_NAME_NOT_EXISTS, postName.trim());
+ }
+ return post.getId();
+ }
+
+ private Set<Long> parseRoleIds(String roleNames, Map<String, RoleRespDTO> roleMap) {
+ if (StrUtil.isBlank(roleNames)) {
+ return Collections.emptySet();
+ }
+ Set<Long> roleIds = new LinkedHashSet<>();
+ for (String roleName : roleNames.split("[,锛宂")) {
+ String trimmed = roleName.trim();
+ if (StrUtil.isBlank(trimmed)) {
+ continue;
+ }
+ RoleRespDTO role = roleMap.get(trimmed);
+ if (role == null) {
+ throw exception(EMPLOYEE_ROLE_NAME_NOT_EXISTS, trimmed);
+ }
+ roleIds.add(role.getId());
+ }
+ return roleIds;
+ }
+
}
\ No newline at end of file
--
Gitblit v1.9.3