docs/hrm_employee_import.md
@@ -10,7 +10,7 @@ ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å ¥ 1. **ä¸è½½æ¨¡æ¿** -> å端è°ç¨ `GET /hrm/employee/import-template` ä¸è½½ Excel 模æ¿ï¼æ¨¡æ¿å å«ç¤ºä¾è¡ä¾åèã 2. **填忍¡æ¿** -> ç¨æ·ææ¨¡æ¿å¡«åå工信æ¯ï¼å ¶ä¸"é¨é¨åç§°/å²ä½åç§°/ç¨æ·è§è²"ä¸åå¡«**åç§°**ï¼ç¨æ·è§è²å¤ä¸ªç¨ä¸æéå·åéï¼ï¼ç±å端èªå¨è½¬æ¢ä¸º IDã 2. **填忍¡æ¿** -> ç¨æ·ææ¨¡æ¿å¡«åå工信æ¯ï¼å ¶ä¸"é¨é¨åç§°/å²ä½åç§°/ç¨æ·è§è²"ä¸åå¡«**åç§°**ï¼å²ä½åç§°ãç¨æ·è§è²å¤ä¸ªç¨ä¸ææè±æéå·åéï¼ï¼ç±å端èªå¨è½¬æ¢ä¸º IDã 3. **ä¸ä¼ å¯¼å ¥** -> å端è°ç¨ `POST /hrm/employee/import`ï¼multipart 表åï¼file + updateSupportï¼ä¸ä¼ æä»¶ã 4. **å±ç¤ºç»æ** -> å端è¿åå¯¼å ¥ç»æï¼å建æååå / æ´æ°æååå / 失败ååååå ï¼ï¼åç«¯éæ¡å±ç¤ºã @@ -30,6 +30,7 @@ - æ§å«ï¼å¡«"ç·"/"女"ï¼åå ¸ `hrm_gender`ï¼å¼ 1/2ï¼ - åå·¥ç¶æï¼å¡«"å¨è"/"è¯ç¨"/"离è"ï¼åå ¸ `hrm_employee_status`ï¼å¼ 1/2/3ï¼ - å²ä½åç§°ï¼å¡«å²ä½åç§°ï¼**æ¯æå¤ä¸ª**ï¼å¤ä¸ªç¨è±æéå·ï¼`,`ï¼æä¸æéå·ï¼`ï¼`ï¼åéï¼å¦"é¨é¨ç»ç,项ç®ç»ç"ï¼ - ç¨æ·è§è²ï¼å¡«è§è²åç§°ï¼å¤ä¸ªç¨**䏿éå·**åéï¼å¦"æ®é管çå,æ®éåå·¥"ï¼ ### å¯¼å ¥åå·¥ @@ -75,7 +76,7 @@ | æ§å« | 模æ¿å | å¿ å¡«ï¼é»è®¤ç· | | ææºå· | 模æ¿å | å¿ å¡«ï¼å°ä½ä¸ºç³»ç»ç»å½è´¦å· | | é¨é¨åç§° | 模æ¿å | å¿ å¡«ï¼å¡«åç§°ï¼å端转 ID | | å²ä½åç§° | 模æ¿å | å¿ å¡«ï¼å¡«åç§°ï¼å端转 ID | | å²ä½åç§° | 模æ¿å | å¿ å¡«ï¼å¡«åç§°ï¼æ¯æå¤ä¸ªï¼ç¨éå·åéï¼ï¼å端转 ID | | ç¨æ·è§è² | 模æ¿å | éå¡«ï¼å¡«åç§°ï¼å¤ä¸ªç¨ä¸æéå·åé | | å ¥èæ¥æ | 模æ¿å | å¿ å¡«ï¼æ ¼å¼ YYYY-MM-DD | | åå·¥ç¶æ | 模æ¿å | å¿ å¡«ï¼é»è®¤å¨è | docs/hrm_employee_post_multiselect.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ # åå·¥å°è´¦å²ä½å¤é - å端èè°æ¹æ¡ ## èæ¯ 人åèµæº > å工管çï¼åå·¥å°è´¦ï¼ç"å²ä½"ç±åéæ¹ä¸º**å¤é**ï¼ä¸ç³»ç»"ç¨æ·ç®¡ç"çå¤å²ä½è½åä¿æä¸è´ãåå¨ä¸éç¨ JSON æ°ç»ï¼`post_ids` åï¼ï¼å"è§è²"åæ®µçæ¢ææ¨¡å¼ã ## æ¶åé¡µé¢ - 人åèµæº > å工管ç å表页ï¼`src/views/hrm/employee/index.vue`ï¼ - åå·¥æ°å¢/ç¼è¾è¡¨åï¼`src/views/hrm/employee/modules/form.vue`ã`data.ts`ï¼ - å工详æ ï¼`src/views/hrm/employee/modules/detail.vue`ï¼ - åå·¥å¯¼å ¥å¼¹çªï¼å«ä¸è½½æ¨¡æ¿ãä¸ä¼ æä»¶ï¼ - åå·¥å¯¼åº Excel ## API åæ´è¯´æ | æ¹æ³ | è·¯å¾ | åæ´ | |------|------|------| | POST | `/hrm/employee/create` | 请æ±å段 `postId` â `postIds`ï¼æ°ç»ï¼ | | PUT | `/hrm/employee/update` | 请æ±å段 `postId` â `postIds`ï¼æ°ç»ï¼ | | GET | `/hrm/employee/get` | ååºå段 `postId/postName` â `postIds/postNames` | | GET | `/hrm/employee/page` | ååºå段 `postId/postName` â `postIds/postNames` | | GET | `/hrm/employee/export-excel` | "å²ä½åç§°"忝æå¤å¼ï¼éå·æ¼æ¥ï¼ | | GET | `/hrm/employee/import-template` | "å²ä½åç§°"åç¤ºä¾æ¹ä¸ºå¤å²ä½ | | POST | `/hrm/employee/import` | "å²ä½åç§°"忝æå¡«åå¤ä¸ªå²ä½å | ### 1. æ°å¢åå·¥ `POST /hrm/employee/create` **请æ±åæ°ï¼åæ®µåæ´ï¼ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | postIds | List\<Long\> | æ¯ | å²ä½IDæ°ç»ï¼è³å°ä¸ä¸ªï¼å `postId` åå¼å段已移é¤ï¼ | ```json { "name": "å¼ ä¸", "phone": "13800138000", "deptId": 103, "postIds": [2, 4], "roleIds": [1], "hireDate": "2026-08-01", "employeeStatus": 1, "gender": 1 } ``` ### 2. æ´æ°åå·¥ `PUT /hrm/employee/update` å createï¼è¯·æ±ä½ä¸ç `postIds` 为åå·¥æç»çå²ä½éåï¼å ¨éè¦çï¼éå¢éï¼ã ### 3. å工详æ / å页 `GET /hrm/employee/get`ã`GET /hrm/employee/page` **ååºåæ®µåæ´ï¼** | åæ®µ | ç±»å | 说æ | |------|------|------| | postIds | List\<Long\> | å²ä½IDæ°ç»ï¼å `postId` 已移é¤ï¼ | | postNames | String | å²ä½åç§°ï¼å¤ä¸ªç¨è±æéå·æ¼æ¥ï¼å¦"é¨é¨ç»ç,项ç®ç»ç"ï¼å `postName` 已移é¤ï¼ | ```json { "code": 0, "data": { "id": 6, "name": "å¼ ä¸", "deptName": "ç åé¨", "postIds": [2, 4], "postNames": "é¨é¨ç»ç,项ç®ç»ç", "roleNames": "æ®é管çå" } } ``` ### 4. å¯¼åº Excel `GET /hrm/employee/export-excel` - "å²ä½åç§°"åå±ç¤ºå¤ä¸ªå²ä½åï¼è±æéå·æ¼æ¥ï¼ä¸å页è¿åç `postNames` ä¸è´ï¼ã ### 5. å¯¼å ¥æ¨¡æ¿ / å¯¼å ¥ `GET /hrm/employee/import-template`ã`POST /hrm/employee/import` - 模æ¿"å²ä½åç§°"åç±å个å²ä½åæ¹ä¸ºæ¯æ**å¤ä¸ªå²ä½å**ï¼å¤ä¸ªç¨**è±æéå·ï¼`,`ï¼æä¸æéå·ï¼`ï¼`ï¼**åéã - 模æ¿ç¤ºä¾è¡ï¼`é¨é¨ç»ç,项ç®ç»ç`ã - ä»»ä¸å²ä½åä¸åå¨ï¼è¯¥è¡å¯¼å ¥å¤±è´¥ï¼åå "å²ä½ãxxãä¸åå¨"ã - å²ä½åç§°åä¸å 许为空ï¼å²ä½å¿ å¡«ï¼ã ## åæ®µå±ç¤ºè§å | åæ®µ | å±ç¤ºä½ç½® | 说æ | |------|----------|------| | postIds | 表åï¼æ°å¢/ç¼è¾ï¼ã详æ | 表åå²ä½æ¹ä¸ºå¤é䏿æ¡ï¼ç¼è¾åæ¾å¾éå¤ä¸ª | | postNames | å表ã详æ ãå¯¼åº | å±ç¤ºä¸ºéå·æ¼æ¥çå¤ä¸ªå²ä½å | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | 表åä¿å | `postIds` å¿ å¡«ï¼è³å°ä¸ä¸ªå²ä½ | | ç¼è¾ä¿å | `postIds` å ¨éè¦ç该åå·¥å²ä½ | | å¯¼å ¥ | "å²ä½åç§°"åå¤ä¸ªåç§°ç¨éå·åéï¼ä»»ä¸ä¸åå¨åæ´è¡å¤±è´¥ | | å·²ææ°æ® | åéåå·¥çåå²ä½æ°æ®å·²è¿ç§»ä¸º `postIds`ï¼èæ°æ®ä¸ä¸¢å¤± | ## 注æäºé¡¹ - **å端éåæ¥ä¿®æ¹**ï¼æ°å¢/ç¼è¾è¡¨åçå²ä½å段ä»åéæ¹ä¸ºå¤éä¸æï¼æäº¤åæ®µåä» `postId` æ¹ä¸º `postIds`ï¼å表/详æ å±ç¤ºåæ®µä» `postName` æ¹ä¸º `postNames`ã - **ç¼è¾åå·¥æ¶åæ¥æ´æ°**å ³èç³»ç»ç»å½ç¨æ·ï¼ç¨æ·ç®¡ç页ï¼çå²ä½/é¨é¨/æµç§°/è§è²/é®ç®±/夿³¨ï¼ä¸¤è¾¹ä¿æä¸è´ã - å²ä½ä¸ææ°æ®ä»ä»ç³»ç»å²ä½æ¥å£è·åï¼ä¸ä¹åä¸è´ï¼ã - å²ä½åç§°è§£æä¸ºç²¾ç¡®å¹é ï¼ä¸æ¯ææ¨¡ç³ã sql/mysql/hrm_employee_post_multi.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ -- ============================================= -- HRM å工表ï¼å²ä½å¤éæ¹é SQL -- 1. æ·»å post_ids åæ®µï¼JSON æ ¼å¼ï¼ä¸ role_ids å卿¹å¼ä¸è´ï¼ -- 2. è¿ç§»å·²æ post_id æ°æ®å° post_ids -- 3. ä¿ç post_id åæ®µï¼å ¼å®¹æ§èæ¬/å¤é¨å¼ç¨ï¼å·²åºå¼ä¸ååå ¥ï¼ -- ============================================= -- 1. æ·»å å²ä½IDåè¡¨åæ®µï¼JSONæ ¼å¼åå¨ï¼ ALTER TABLE `hrm_employee` ADD COLUMN `post_ids` varchar(500) DEFAULT NULL COMMENT 'å²ä½IDå表ï¼JSONæ ¼å¼ï¼' AFTER `post_id`; -- 2. è¿ç§»å·²æ post_id æ°æ®å° post_ids UPDATE `hrm_employee` SET `post_ids` = CONCAT('[', `post_id`, ']') WHERE `post_id` IS NOT NULL AND (`post_ids` IS NULL OR `post_ids` = ''); -- æ§è¡å®ææç¤º SELECT 'HRM å工表å²ä½å¤éæ¹é 宿ï¼' AS result; sql/mysql/hrm_employee_post_multiselect_deploy.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ -- ============================================= -- HRM åå·¥å°è´¦å²ä½å¤é - æ°æ®åºåæ´æ±æ»èæ¬ -- éç¨ï¼test / prod çéè¦æå·¥æ§è¡çç¯å¢ -- å å«ï¼ -- 1. hrm_employee 表æ°å¢å²ä½IDå表(post_ids)åï¼å¹¶è¿ç§»æ§ post_id æ°æ® -- 2. hrm_salary_structure 表æ°å¢ä¼æ¯æ¥/æ³å®è忥å çå·¥èµåçåï¼ä¿®å¤åå·¥ç¼è¾é¡µèªé ¬ç»æä¸ææ¥éï¼ -- 注æï¼MySQL 8 ç ALTER TABLE ADD COLUMN 䏿¯æ IF NOT EXISTSï¼ -- è¥æåå·²åå¨ï¼å¯¹åº ALTER è¯å¥ä¼æ¥"Duplicate column"ï¼å¿½ç¥è¯¥æ¡å³å¯ç»§ç»ã -- ============================================= -- ---------- 1. hrm_employeeï¼æ°å¢å²ä½IDå表(JSON)ï¼å¹¶è¿ç§»æ§ post_id ---------- ALTER TABLE `hrm_employee` ADD COLUMN `post_ids` varchar(500) DEFAULT NULL COMMENT 'å²ä½IDå表ï¼JSONæ ¼å¼ï¼' AFTER `post_id`; UPDATE `hrm_employee` SET `post_ids` = CONCAT('[', `post_id`, ']') WHERE `post_id` IS NOT NULL AND (`post_ids` IS NULL OR `post_ids` = ''); -- ---------- 2. hrm_salary_structureï¼æ°å¢ä¼æ¯æ¥/æ³å®è忥å çåç ---------- ALTER TABLE `hrm_salary_structure` ADD COLUMN `rest_day_overtime_pay_ratio` decimal(4,2) DEFAULT 2.00 COMMENT '伿¯æ¥å çå·¥èµåç' AFTER `overtime_pay_ratio`; ALTER TABLE `hrm_salary_structure` ADD COLUMN `legal_holiday_overtime_pay_ratio` decimal(4,2) DEFAULT 3.00 COMMENT 'æ³å®è忥å çå·¥èµåç' AFTER `rest_day_overtime_pay_ratio`; -- ---------- 宿æç¤º ---------- SELECT 'HRM åå·¥å°è´¦å²ä½å¤éæ°æ®åºåæ´å®æï¼' AS result; yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/HrmEmployeeController.java
@@ -115,10 +115,12 @@ Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); // 2. æ¹éè·åå²ä½ä¿¡æ¯ Set<Long> postIds = employeeList.stream() .map(HrmEmployeeDO::getPostId) .filter(Objects::nonNull) .collect(Collectors.toSet()); Set<Long> postIds = new HashSet<>(); for (HrmEmployeeDO employee : employeeList) { if (StrUtil.isNotBlank(employee.getPostIds())) { postIds.addAll(JSONUtil.toList(employee.getPostIds(), Long.class)); } } Map<Long, PostRespDTO> postMap = CollUtil.isEmpty(postIds) ? Collections.emptyMap() : postApi.getPostMap(postIds); // 3. æ¶éææè§è²ID @@ -143,9 +145,16 @@ respVO.setDeptName(deptMap.get(employee.getDeptId()).getName()); } // å¡«å å²ä½åç§° if (employee.getPostId() != null && postMap.containsKey(employee.getPostId())) { respVO.setPostName(postMap.get(employee.getPostId()).getName()); // å¡«å å²ä½ä¿¡æ¯ if (StrUtil.isNotBlank(employee.getPostIds())) { List<Long> employeePostIds = JSONUtil.toList(employee.getPostIds(), Long.class); respVO.setPostIds(employeePostIds); if (CollUtil.isNotEmpty(employeePostIds)) { respVO.setPostNames(employeePostIds.stream() .filter(postMap::containsKey) .map(id -> postMap.get(id).getName()) .collect(Collectors.joining(","))); } } // è§£æ roleIds å¹¶å¡«å è§è²åç§° @@ -195,7 +204,7 @@ // è¾åºç¤ºä¾æ°æ®ï¼æ¹ä¾¿ä½¿ç¨è åè List<HrmEmployeeImportExcelVO> list = Arrays.asList( HrmEmployeeImportExcelVO.builder().name("å¼ ä¸").gender(1).phone("13800138000") .deptName("ç åé¨").postName("é¨é¨ç»ç").roleNames("æ®é管çå") .deptName("ç åé¨").postName("é¨é¨ç»ç,项ç®ç»ç").roleNames("æ®é管çå") .hireDate(LocalDate.of(2020, 3, 1)).employeeStatus(1) .idCard("320102199001150011").birthday(LocalDate.of(1990, 1, 15)) .nation("æ±æ").marriageStatus("å·²å©").age(36).education("æ¬ç§").politicalStatus("ä¸å ±å å") yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeRespVO.java
@@ -32,12 +32,12 @@ @ExcelProperty("é¨é¨åç§°") private String deptName; @Schema(description = "å²ä½ID") private Long postId; @Schema(description = "å²ä½IDå表") private List<Long> postIds; @Schema(description = "å²ä½åç§°") @Schema(description = "å²ä½åç§°å表") @ExcelProperty("å²ä½åç§°") private String postName; private String postNames; @Schema(description = "åå·¥å§å") @ExcelProperty("åå·¥å§å") yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeSaveReqVO.java
@@ -23,9 +23,9 @@ @NotNull(message = "é¨é¨ä¸è½ä¸ºç©º") private Long deptId; @Schema(description = "å²ä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "å²ä½ä¸è½ä¸ºç©º") private Long postId; @Schema(description = "å²ä½IDå表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2]") @NotEmpty(message = "å²ä½ä¸è½ä¸ºç©º") private List<Long> postIds; @Schema(description = "åå·¥å§å", requiredMode = Schema.RequiredMode.REQUIRED, example = "å¼ ä¸") @NotEmpty(message = "åå·¥å§åä¸è½ä¸ºç©º") yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/employee/HrmEmployeeDO.java
@@ -45,11 +45,11 @@ private Long deptId; /** * å²ä½ID * å²ä½IDå表 * * å ³è PostDO#getId() * å ³è PostDO#getId()ï¼JSON æ ¼å¼åå¨ */ private Long postId; private String postIds; /** * åå·¥ç¼å· yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmOvertimeApplicationServiceImpl.java
@@ -2,6 +2,8 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; 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.bpm.api.task.BpmProcessInstanceApi; @@ -255,9 +257,17 @@ resp.setEmployeeName(employee.getName()); resp.setEmployeeNo(employee.getEmployeeNo()); resp.setDeptId(employee.getDeptId()); DeptRespDTO dept = employee.getDeptId() == null ? null : deptApi.getDept(employee.getDeptId()); PostRespDTO post = employee.getPostId() == null ? null : postApi.getPostMap(Collections.singleton(employee.getPostId())).get(employee.getPostId()); resp.setDeptName(dept == null ? null : dept.getName()); resp.setPostName(post == null ? null : post.getName()); // å²ä½å¤éï¼è§£æ postIds JSONï¼æ¼æ¥å²ä½åç§° if (StrUtil.isNotBlank(employee.getPostIds())) { List<Long> postIds = JSONUtil.toList(employee.getPostIds(), Long.class); if (CollUtil.isNotEmpty(postIds)) { Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds); resp.setPostName(postIds.stream() .filter(postMap::containsKey) .map(id -> postMap.get(id).getName()) .collect(Collectors.joining(","))); } } } } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
@@ -33,6 +33,7 @@ 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 cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -91,7 +92,7 @@ // 1. æ ¡éªé¨é¨ deptApi.validateDeptList(Collections.singleton(createReqVO.getDeptId())); // 2. æ ¡éªå²ä½ postApi.validPostList(Collections.singleton(createReqVO.getPostId())); postApi.validPostList(createReqVO.getPostIds()); // 3. æ ¡éªææºå·æ¯å¦å·²åå¨ if (employeeMapper.selectByPhone(createReqVO.getPhone()) != null) { throw exception(EMPLOYEE_PHONE_EXISTS); @@ -101,7 +102,7 @@ userCreateReqDTO.setUsername(createReqVO.getPhone()); userCreateReqDTO.setNickname(createReqVO.getName()); userCreateReqDTO.setDeptId(createReqVO.getDeptId()); userCreateReqDTO.setPostIds(Collections.singleton(createReqVO.getPostId())); userCreateReqDTO.setPostIds(new LinkedHashSet<>(createReqVO.getPostIds())); userCreateReqDTO.setMobile(createReqVO.getPhone()); userCreateReqDTO.setPassword(createReqVO.getPhone()); userCreateReqDTO.setSex(createReqVO.getGender()); @@ -121,6 +122,10 @@ // roleIds åå¨ä¸º JSON if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) { employee.setRoleIds(JSONUtil.toJsonStr(createReqVO.getRoleIds())); } // postIds åå¨ä¸º JSON if (CollUtil.isNotEmpty(createReqVO.getPostIds())) { employee.setPostIds(JSONUtil.toJsonStr(createReqVO.getPostIds())); } employeeMapper.insert(employee); Long employeeId = employee.getId(); @@ -167,7 +172,7 @@ // æ ¡éªé¨é¨ deptApi.validateDeptList(Collections.singleton(updateReqVO.getDeptId())); // æ ¡éªå²ä½ postApi.validPostList(Collections.singleton(updateReqVO.getPostId())); postApi.validPostList(updateReqVO.getPostIds()); // æ ¡éªææºå·æ¯å¦å·²åå¨ï¼å¦æææºå·æåæ´ï¼ if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone()) && employeeMapper.selectByPhone(updateReqVO.getPhone()) != null) { @@ -179,7 +184,24 @@ if (CollUtil.isNotEmpty(updateReqVO.getRoleIds())) { updateObj.setRoleIds(JSONUtil.toJsonStr(updateReqVO.getRoleIds())); } // postIds åå¨ä¸º JSON if (CollUtil.isNotEmpty(updateReqVO.getPostIds())) { updateObj.setPostIds(JSONUtil.toJsonStr(updateReqVO.getPostIds())); } employeeMapper.updateById(updateObj); // åæ¥æ´æ°å ³èç³»ç»ç¨æ·ï¼å²ä½/é¨é¨/æµç§°/è§è²/é®ç®±/夿³¨ï¼ï¼ä¿æä¸ç¨æ·ç®¡çä¸è´ if (employee.getUserId() != null) { AdminUserUpdateReqDTO userUpdateReqDTO = new AdminUserUpdateReqDTO(); userUpdateReqDTO.setId(employee.getUserId()); userUpdateReqDTO.setNickname(updateReqVO.getName()); userUpdateReqDTO.setDeptId(updateReqVO.getDeptId()); userUpdateReqDTO.setPostIds(new LinkedHashSet<>(updateReqVO.getPostIds())); userUpdateReqDTO.setRoleIds(CollUtil.isEmpty(updateReqVO.getRoleIds()) ? null : new LinkedHashSet<>(updateReqVO.getRoleIds())); userUpdateReqDTO.setEmail(updateReqVO.getEmail()); userUpdateReqDTO.setRemark(updateReqVO.getRemark()); adminUserApi.updateUser(userUpdateReqDTO); } Long employeeId = updateReqVO.getId(); // 忥æè²ç»å @@ -270,12 +292,16 @@ 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 (StrUtil.isNotBlank(employee.getPostIds())) { List<Long> postIds = JSONUtil.toList(employee.getPostIds(), Long.class); respVO.setPostIds(postIds); if (CollUtil.isNotEmpty(postIds)) { Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds); respVO.setPostNames(postIds.stream() .filter(postMap::containsKey) .map(postId -> postMap.get(postId).getName()) .collect(Collectors.joining(","))); } } // å¡«å è§è²åç§° @@ -370,10 +396,10 @@ try { // 3.1 å称转 ID Long deptId = parseDeptId(importEmployee.getDeptName(), deptMap); Long postId = parsePostId(importEmployee.getPostName(), postMap); Set<Long> postIds = parsePostIds(importEmployee.getPostName(), postMap); Set<Long> roleIds = parseRoleIds(importEmployee.getRoleNames(), roleMap); // 3.2 æå»ºä¿åè¯·æ± HrmEmployeeSaveReqVO saveReqVO = buildImportSaveReqVO(importEmployee, deptId, postId, roleIds); HrmEmployeeSaveReqVO saveReqVO = buildImportSaveReqVO(importEmployee, deptId, postIds, roleIds); // 3.3 夿å卿§ï¼æææºå· HrmEmployeeDO existEmployee = employeeMapper.selectByPhone(importEmployee.getPhone()); if (existEmployee == null) { @@ -398,7 +424,7 @@ } private HrmEmployeeSaveReqVO buildImportSaveReqVO(HrmEmployeeImportExcelVO importEmployee, Long deptId, Long postId, Set<Long> roleIds) { Long deptId, Set<Long> postIds, Set<Long> roleIds) { if (StrUtil.isBlank(importEmployee.getName())) { throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "åå·¥å§å"); } @@ -413,7 +439,7 @@ reqVO.setGender(importEmployee.getGender() != null ? importEmployee.getGender() : 1); // é»è®¤ç· reqVO.setPhone(importEmployee.getPhone()); reqVO.setDeptId(deptId); reqVO.setPostId(postId); reqVO.setPostIds(CollUtil.isEmpty(postIds) ? null : new ArrayList<>(postIds)); reqVO.setRoleIds(CollUtil.isEmpty(roleIds) ? null : new ArrayList<>(roleIds)); reqVO.setHireDate(importEmployee.getHireDate()); reqVO.setEmployeeStatus(importEmployee.getEmployeeStatus() != null @@ -441,15 +467,26 @@ return dept.getId(); } private Long parsePostId(String postName, Map<String, PostRespDTO> postMap) { if (StrUtil.isBlank(postName)) { private Set<Long> parsePostIds(String postNames, Map<String, PostRespDTO> postMap) { if (StrUtil.isBlank(postNames)) { throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "å²ä½åç§°"); } PostRespDTO post = postMap.get(postName.trim()); if (post == null) { throw exception(EMPLOYEE_POST_NAME_NOT_EXISTS, postName.trim()); Set<Long> postIds = new LinkedHashSet<>(); for (String postName : postNames.split("[,ï¼]")) { String trimmed = postName.trim(); if (StrUtil.isBlank(trimmed)) { continue; } PostRespDTO post = postMap.get(trimmed); if (post == null) { throw exception(EMPLOYEE_POST_NAME_NOT_EXISTS, trimmed); } postIds.add(post.getId()); } return post.getId(); if (CollUtil.isEmpty(postIds)) { throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "å²ä½åç§°"); } return postIds; } private Set<Long> parseRoleIds(String roleNames, Map<String, RoleRespDTO> roleMap) { yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
@@ -3,6 +3,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO; import java.util.Collection; import java.util.Collections; @@ -25,6 +26,13 @@ Long createUser(AdminUserCreateReqDTO createReqDTO); /** * æ´æ°ç¨æ·ï¼ä¾å ¶ä»æ¨¡ååæ¥æ´æ°ç³»ç»ç¨æ·é¨åä¿¡æ¯ï¼å¦å²ä½/é¨é¨/æµç§°çï¼ * * @param updateReqDTO ç¨æ·æ´æ°ä¿¡æ¯ */ void updateUser(AdminUserUpdateReqDTO updateReqDTO); /** * éè¿ç¨æ· ID æ¥è¯¢ç¨æ· * * @param id ç¨æ·ID yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; @@ -53,6 +54,19 @@ } @Override public void updateUser(AdminUserUpdateReqDTO updateReqDTO) { UserSaveReqVO updateReqVO = new UserSaveReqVO(); updateReqVO.setId(updateReqDTO.getId()); updateReqVO.setNickname(updateReqDTO.getNickname()); updateReqVO.setDeptId(updateReqDTO.getDeptId()); updateReqVO.setPostIds(updateReqDTO.getPostIds()); updateReqVO.setRoleIds(updateReqDTO.getRoleIds()); updateReqVO.setEmail(updateReqDTO.getEmail()); updateReqVO.setRemark(updateReqDTO.getRemark()); userService.updateUser(updateReqVO); } @Override @DataPermission(enable = false) // å¿½ç¥æ°æ®æéï¼é¿å å ä¸ºè¿æ»¤ï¼å¯¼è´æ æ³æ¥è¯¢ç¨æ·ã类似ï¼https://github.com/YunaiV/ruoyi-vue-pro/issues/1051 public AdminUserRespDTO getUser(Long id) { AdminUserDO user = userService.getUser(id); yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserUpdateReqDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package cn.iocoder.yudao.module.system.api.user.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; import java.util.Set; /** * Admin ç¨æ·æ´æ° Request DTO * * ä¾å ¶ä»æ¨¡ååæ¥æ´æ°ç³»ç»ç¨æ·çé¨åä¿¡æ¯ï¼å¦ HRM åå·¥ç¼è¾æ¶åæ¥å²ä½/é¨é¨çï¼ */ @Schema(description = "管çåå° - ç¨æ·æ´æ° Request DTO") @Data public class AdminUserUpdateReqDTO { @Schema(description = "ç¨æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "ç¨æ·ç¼å·ä¸è½ä¸ºç©º") private Long id; @Schema(description = "ç¨æ·æµç§°", example = "å¼ ä¸") private String nickname; @Schema(description = "é¨é¨ç¼å·", example = "1") private Long deptId; @Schema(description = "å²ä½ç¼å·æ°ç»", example = "[1, 2]") private Set<Long> postIds; @Schema(description = "è§è²ç¼å·æ°ç»", example = "[1, 2]") private Set<Long> roleIds; @Schema(description = "ç¨æ·é®ç®±", example = "zhangsan@example.com") private String email; @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") private String remark; }