From f52a9a4ef0ef574aff88acf28b49d58f5c733cfb Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 30 九月 2026 12:18:25 +0800
Subject: [PATCH] 修改权限控制

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImpl.java |   58 ++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImpl.java
index ee2495f..28eb07a 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImpl.java
@@ -431,7 +431,7 @@
         if (old == null) {
             return AjaxResult.error("公司不存在");
         }
-        // 编辑时账号只读(前端禁用),此处兼容外部调用方传入账号的场景:唯一性校验(排除自身)
+        // 编辑支持修改登录账号:公司表唯一性校验(排除自身)
         if (StringUtils.hasText(company.getAccount())) {
             if (accountExists(company.getAccount(), company.getId())) {
                 return AjaxResult.error("登录账号不能重复");
@@ -439,17 +439,36 @@
         }
         String account = StringUtils.hasText(company.getAccount()) ? company.getAccount() : old.getAccount();
         if (StringUtils.hasText(account)) {
-            syncCompanyUserOnEdit(company, account);
+            String error = syncCompanyUserOnEdit(company, old.getAccount(), account);
+            if (error != null) {
+                return AjaxResult.error(error);
+            }
         }
         updateById(company);
         return AjaxResult.success();
     }
 
     /**
-     * 编辑公司时同步登录账号:存在则仅更新账号资料(不修改密码),不存在则补建
+     * 编辑公司时同步登录账号:按旧账号定位用户后更新为新账号(支持改账号);
+     * 密码有值时重置(留空不修改);用户不存在则按新账号补建
+     *
+     * @return 冲突等业务错误信息,null 表示成功
      */
-    private void syncCompanyUserOnEdit(TGroupCompany company, String account) {
-        R<SysUser> userR = sysUserClient.queryUserByUserName(account);
+    private String syncCompanyUserOnEdit(TGroupCompany company, String oldAccount, String newAccount) {
+        // 账号变更时校验新账号未被其他用户占用(updateSysUser 无唯一性校验,需在此前置拦截)
+        if (StringUtils.hasText(oldAccount) && !newAccount.equals(oldAccount)) {
+            R<SysUser> occupantR = sysUserClient.queryUserByUserName(newAccount);
+            SysUser occupant = occupantR == null ? null : occupantR.getData();
+            if (occupant != null) {
+                R<SysUser> ownerR = sysUserClient.queryUserByUserName(oldAccount);
+                SysUser owner = ownerR == null ? null : ownerR.getData();
+                if (owner == null || !occupant.getUserId().equals(owner.getUserId())) {
+                    return "登录账号不能重复";
+                }
+            }
+        }
+        // 按旧账号定位既有用户(账号未变时与新账号一致),避免改名后误走补建导致双账号
+        R<SysUser> userR = sysUserClient.queryUserByUserName(StringUtils.hasText(oldAccount) ? oldAccount : newAccount);
         SysUser user = userR == null ? null : userR.getData();
         if (user == null) {
             if (!StringUtils.hasText(company.getPassword())) {
@@ -457,7 +476,7 @@
             }
             Long roleId = resolveCompanyRoleId();
             SysUser newUser = new SysUser();
-            newUser.setUserName(account);
+            newUser.setUserName(newAccount);
             newUser.setNickName(company.getName());
             newUser.setPhonenumber(company.getContactPhone());
             newUser.setPassword(company.getPassword());
@@ -467,22 +486,33 @@
             newUser.setRoleType(COMPANY_ROLE_TYPE);
             newUser.setObjectId(company.getId());
             newUser.setPassWordUpdate(new Date());
-            R<Long> r = sysUserClient.addSysUser(newUser);
-            if (r == null || 200 != r.getCode()) {
-                throw new RuntimeException(r == null ? "创建登录账号失败" : r.getMsg());
+            R<Long> addR = sysUserClient.addSysUser(newUser);
+            if (addR == null || 200 != addR.getCode()) {
+                throw new RuntimeException(addR == null ? "创建登录账号失败" : addR.getMsg());
             }
-            return;
+            return null;
         }
         // 远程查询返回的密码字段可能是哈希或脱敏值,显式清空避免再次写回
         user.setPassword(null);
         user.setPassWordUpdate(null);
-        user.setUserName(account);
+        user.setUserName(newAccount);
         user.setNickName(company.getName());
         user.setPhonenumber(company.getContactPhone());
-        R<Boolean> r = sysUserClient.updateSysUser(user);
-        if (r == null || 200 != r.getCode()) {
-            throw new RuntimeException(r == null ? "更新登录账号失败" : r.getMsg());
+        R<Boolean> updateR = sysUserClient.updateSysUser(user);
+        if (updateR == null || 200 != updateR.getCode()) {
+            throw new RuntimeException(updateR == null ? "更新登录账号失败" : updateR.getMsg());
         }
+        // 密码有值时重置(前端已 HMAC-MD5,由 system 侧 BCrypt 落库,与新增链路一致)
+        if (StringUtils.hasText(company.getPassword())) {
+            SysUser pwdUser = new SysUser();
+            pwdUser.setUserId(user.getUserId());
+            pwdUser.setPassword(company.getPassword());
+            R pwdR = sysUserClient.resetPassword(pwdUser);
+            if (pwdR == null || 200 != pwdR.getCode()) {
+                throw new RuntimeException(pwdR == null ? "重置登录密码失败" : pwdR.getMsg());
+            }
+        }
+        return null;
     }
 
     @Override

--
Gitblit v1.7.1