From e3fcc27bfdb23999a2ce1bcf718cd98062cdd870 Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期一, 02 十一月 2026 09:29:37 +0800
Subject: [PATCH] fix(system): 用户导入部门改为按名称填写,修复照模板导入必然失败
---
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java | 130 +++++++++++++++++++++++++++++++++++++------
1 files changed, 111 insertions(+), 19 deletions(-)
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
index 84e3bb6..22491c5 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
@@ -25,11 +25,14 @@
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper;
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
+import cn.iocoder.yudao.module.system.mq.producer.user.AdminUserProducer;
+import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.dept.PostService;
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
import cn.iocoder.yudao.module.system.service.permission.PermissionService;
import cn.iocoder.yudao.module.system.service.tenant.TenantService;
+import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
import com.google.common.annotations.VisibleForTesting;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.impl.DiffParseFunction;
@@ -54,7 +57,7 @@
/**
* 鍚庡彴鐢ㄦ埛 Service 瀹炵幇绫�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@Service("adminUserService")
@Slf4j
@@ -88,6 +91,9 @@
@Resource
private ConfigApi configApi;
+ @Resource
+ private AdminUserProducer adminUserProducer;
+
@Override
@Transactional(rollbackFor = Exception.class)
@LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}",
@@ -112,6 +118,10 @@
if (CollectionUtil.isNotEmpty(user.getPostIds())) {
userPostMapper.insertBatch(convertList(user.getPostIds(),
postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId)));
+ }
+ // 2.3 鍒嗛厤鐢ㄦ埛瑙掕壊
+ if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) {
+ permissionService.assignUserRole(user.getId(), createReqVO.getRoleIds());
}
// 3. 璁板綍鎿嶄綔鏃ュ織涓婁笅鏂�
@@ -158,6 +168,8 @@
userMapper.updateById(updateObj);
// 2.2 鏇存柊宀椾綅
updateUserPost(updateReqVO, updateObj);
+ // 2.3 鏄电О / 澶村儚鍙樺寲鏃讹紝鍙戦�佹秷鎭緵涓嬫父璁㈤槄锛堝 IM 妯″潡鎺� FRIEND_INFO_UPDATED锛�
+ publishUserProfileUpdatedIfChanged(oldUser, updateReqVO.getNickname(), updateReqVO.getAvatar());
// 3. 璁板綍鎿嶄綔鏃ュ織涓婁笅鏂�
LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldUser, UserSaveReqVO.class));
@@ -188,12 +200,30 @@
@Override
public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) {
- // 鏍¢獙姝g‘鎬�
- validateUserExists(id);
+ // 1. 鏍¢獙姝g‘鎬�
+ AdminUserDO oldUser = validateUserExists(id);
validateEmailUnique(id, reqVO.getEmail());
validateMobileUnique(id, reqVO.getMobile());
- // 鎵ц鏇存柊
+
+ // 2. 鎵ц鏇存柊
userMapper.updateById(BeanUtils.toBean(reqVO, AdminUserDO.class).setId(id));
+
+ // 3. 鏄电О / 澶村儚鍙樺寲鏃讹紝鍙戦�佹秷鎭緵涓嬫父璁㈤槄锛堝 IM 妯″潡鎺� FRIEND_INFO_UPDATED锛�
+ publishUserProfileUpdatedIfChanged(oldUser, reqVO.getNickname(), reqVO.getAvatar());
+ }
+
+ /**
+ * 浠呭綋 nickname 鎴� avatar 璺熸棫鍊间笉涓�鑷存椂锛屽彂閫� AdminUserProfileUpdateMessage
+ */
+ private void publishUserProfileUpdatedIfChanged(AdminUserDO oldUser, String newNickname, String newAvatar) {
+ boolean nicknameChanged = newNickname != null && !ObjUtil.equal(oldUser.getNickname(), newNickname);
+ boolean avatarChanged = newAvatar != null && !ObjUtil.equal(oldUser.getAvatar(), newAvatar);
+ if (!nicknameChanged && !avatarChanged) {
+ return;
+ }
+ adminUserProducer.sendUserProfileUpdateMessage(oldUser.getId(),
+ nicknameChanged ? newNickname : null,
+ avatarChanged ? newAvatar : null);
}
@Override
@@ -329,6 +359,11 @@
}
return userMapper.selectByIds(ids);
}
+
+ public List<AdminUserDO> getUserListAll() {
+ return userMapper.selectList();
+ }
+
@Override
public void validateUserList(Collection<Long> ids) {
@@ -473,6 +508,8 @@
}
@Override
+ @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_IMPORT_SUB_TYPE, bizNo = "0",
+ success = SYSTEM_USER_IMPORT_SUCCESS)
@Transactional(rollbackFor = Exception.class) // 娣诲姞浜嬪姟锛屽紓甯稿垯鍥炴粴鎵�鏈夊鍏�
public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
// 1.1 鍙傛暟鏍¢獙
@@ -484,6 +521,12 @@
if (StrUtil.isEmpty(initPassword)) {
throw exception(USER_IMPORT_INIT_PASSWORD);
}
+ // 1.3 棰勫姞杞介儴闂細鍚嶇О -> 閮ㄩ棬锛岀紪鍙� -> 閮ㄩ棬锛屼緵涓ょ鍐欐硶瑙f瀽
+ List<DeptDO> allDepts = deptService.getDeptList(new DeptListReqVO());
+ Map<String, DeptDO> deptByName = new HashMap<>(allDepts.size());
+ for (DeptDO dept : allDepts) {
+ deptByName.put(dept.getName().trim(), dept);
+ }
// 2. 閬嶅巻锛岄�愪釜鍒涘缓 or 鏇存柊
UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
@@ -491,42 +534,86 @@
AtomicInteger index = new AtomicInteger(1);
importUsers.forEach(importUser -> {
int currentIndex = index.getAndIncrement();
- // 2.1.1 鏍¢獙瀛楁鏄惁绗﹀悎瑕佹眰
- try {
- ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword));
- } catch (ConstraintViolationException ex) {
- String key = StrUtil.blankToDefault(importUser.getUsername(), "绗� " + currentIndex + " 琛�");
- respVO.getFailureUsernames().put(key, ex.getMessage());
+ // 鐢ㄤ簬鎶ラ敊鐨勫畾浣� key锛氫紭鍏堢櫥褰曞悕锛屽惁鍒欍�岀 N 琛屻��
+ String rowKey = StrUtil.blankToDefault(importUser.getUsername(), "绗� " + currentIndex + " 琛�");
+
+ // 2.1 瑙f瀽閮ㄩ棬锛氫紭鍏堟寜鍚嶇О锛屽吋瀹瑰巻鍙叉ā鏉垮~鐨勯儴闂ㄧ紪鍙�
+ DeptDO dept = resolveImportDept(importUser.getDeptName(), deptByName);
+ if (dept == null && StrUtil.isNotBlank(importUser.getDeptName())) {
+ respVO.getFailureUsernames().put(rowKey,
+ "閮ㄩ棬銆�" + importUser.getDeptName().trim() + "銆嶄笉瀛樺湪锛岃濉啓閮ㄩ棬绠$悊涓殑瀹屾暣閮ㄩ棬鍚嶇О");
return;
}
- // 2.1.2 鏍¢獙锛屽垽鏂槸鍚︽湁涓嶇鍚堢殑鍘熷洜
+ Long deptId = dept != null ? dept.getId() : null;
+ importUser.setDeptName(dept != null ? dept.getName() : importUser.getDeptName());
+
+ // 2.2 鏍¢獙瀛楁鏄惁绗﹀悎瑕佹眰
try {
- validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
- importUser.getDeptId(), null);
+ ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class)
+ .setPassword(initPassword).setDeptId(deptId));
+ } catch (ConstraintViolationException ex) {
+ respVO.getFailureUsernames().put(rowKey, ex.getMessage());
+ return;
+ }
+ // 2.3 鏍¢獙涓氬姟绾︽潫锛堟墜鏈哄彿/閭/閮ㄩ棬鏄惁瀛樺湪锛�
+ try {
+ validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), deptId, null);
} catch (ServiceException ex) {
- respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
+ respVO.getFailureUsernames().put(rowKey, ex.getMessage());
return;
}
- // 2.2.1 鍒ゆ柇濡傛灉涓嶅瓨鍦紝鍦ㄨ繘琛屾彃鍏�
+ // 2.4 鍒ゆ柇濡傛灉涓嶅瓨鍦紝鍦ㄨ繘琛屾彃鍏�
AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername());
if (existUser == null) {
- userMapper.insert(BeanUtils.toBean(importUser, AdminUserDO.class)
- .setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>())); // 璁剧疆榛樿瀵嗙爜鍙婄┖宀椾綅缂栧彿鏁扮粍
+ AdminUserDO newUser = BeanUtils.toBean(importUser, AdminUserDO.class);
+ newUser.setDeptId(deptId);
+ newUser.setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>()); // 榛樿瀵嗙爜鍙婄┖宀椾綅
+ userMapper.insert(newUser);
respVO.getCreateUsernames().add(importUser.getUsername());
return;
}
- // 2.2.2 濡傛灉瀛樺湪锛屽垽鏂槸鍚﹀厑璁告洿鏂�
+ // 2.5 濡傛灉瀛樺湪锛屽垽鏂槸鍚﹀厑璁告洿鏂�
if (!isUpdateSupport) {
- respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg());
+ respVO.getFailureUsernames().put(rowKey, USER_USERNAME_EXISTS.getMsg());
return;
}
AdminUserDO updateUser = BeanUtils.toBean(importUser, AdminUserDO.class);
updateUser.setId(existUser.getId());
+ updateUser.setDeptId(deptId);
userMapper.updateById(updateUser);
respVO.getUpdateUsernames().add(importUser.getUsername());
});
+ // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+ OperateLogUtils.putImportSummary(respVO.getCreateUsernames(), respVO.getUpdateUsernames(),
+ respVO.getFailureUsernames());
return respVO;
+ }
+
+ /**
+ * 瑙f瀽瀵煎叆琛岄噷鐨勯儴闂�
+ *
+ * 浼樺厛鎸夐儴闂ㄥ悕绉扮簿纭尮閰嶏紱鑻ュ~鍐欑殑鏄函鏁板瓧锛屽啀鎸夐儴闂ㄧ紪鍙峰尮閰嶏紙鍏煎鍘嗗彶妯℃澘锛夈��
+ *
+ * @param raw 瀵煎叆濉啓鐨勯儴闂ㄦ枃鏈�
+ * @param byName 閮ㄩ棬鍚嶇О -> 閮ㄩ棬
+ * @param byId 閮ㄩ棬缂栧彿 -> 閮ㄩ棬
+ * @return 鍖归厤鍒扮殑閮ㄩ棬锛屾湭濉啓杩斿洖 null锛屽~浜嗕絾鍖归厤涓嶅埌涔熻繑鍥� null
+ */
+ /**
+ * 瑙f瀽瀵煎叆琛岄噷鐨勯儴闂ㄥ悕绉�
+ *
+ * 鍙寜閮ㄩ棬鍚嶇О绮剧‘鍖归厤锛堜笉鍐嶅吋瀹规暟瀛楃紪鍙凤紝閬垮厤浣跨敤鑰呭~閿欏垪瀵艰嚧闈欓粯閿欓厤锛夈��
+ *
+ * @param raw 瀵煎叆濉啓鐨勯儴闂ㄥ悕绉�
+ * @param byName 閮ㄩ棬鍚嶇О -> 閮ㄩ棬
+ * @return 鍖归厤鍒扮殑閮ㄩ棬锛涙湭濉啓鎴栧尮閰嶄笉鍒拌繑鍥� null
+ */
+ private DeptDO resolveImportDept(String raw, Map<String, DeptDO> byName) {
+ if (StrUtil.isBlank(raw)) {
+ return null;
+ }
+ return byName.get(raw.trim());
}
@Override
@@ -535,6 +622,11 @@
}
@Override
+ public List<AdminUserDO> getDeptUsers(Collection<Long> deptIds) {
+ return userMapper.selectListByDeptIds(deptIds);
+ }
+
+ @Override
public boolean isPasswordMatch(String rawPassword, String encodedPassword) {
return passwordEncoder.matches(rawPassword, encodedPassword);
}
--
Gitblit v1.9.3