From dc3336685e80c593a3654a6e53e3e1d1d13b2b50 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 06 五月 2026 15:30:13 +0800
Subject: [PATCH] fix(approve): 修复流程配置节点审批人为空时的异常处理

---
 src/main/java/com/ruoyi/framework/security/LoginUser.java                 |   96 ++++++++++++-------
 doc/20260506_用户AI功能字段前端联调说明.md                                            |   53 ++++++++++
 src/main/java/com/ruoyi/project/system/controller/SysLoginController.java |   39 +++++--
 src/main/resources/mapper/system/SysUserMapper.xml                        |    3 
 src/main/java/com/ruoyi/project/system/domain/SysUser.java                |   48 ++++++---
 doc/20260506_add_ai_enabled_to_sys_user.sql                               |    2 
 6 files changed, 175 insertions(+), 66 deletions(-)

diff --git a/doc/20260506_add_ai_enabled_to_sys_user.sql b/doc/20260506_add_ai_enabled_to_sys_user.sql
new file mode 100644
index 0000000..7e7ee9d
--- /dev/null
+++ b/doc/20260506_add_ai_enabled_to_sys_user.sql
@@ -0,0 +1,2 @@
+alter table sys_user
+    add ai_enabled tinyint(1) not null default 0 comment '鏄惁寮�閫欰I鍔熻兘锛�0鍚� 1鏄級';
diff --git "a/doc/20260506_\347\224\250\346\210\267AI\345\212\237\350\203\275\345\255\227\346\256\265\345\211\215\347\253\257\350\201\224\350\260\203\350\257\264\346\230\216.md" "b/doc/20260506_\347\224\250\346\210\267AI\345\212\237\350\203\275\345\255\227\346\256\265\345\211\215\347\253\257\350\201\224\350\260\203\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..bce48d5
--- /dev/null
+++ "b/doc/20260506_\347\224\250\346\210\267AI\345\212\237\350\203\275\345\255\227\346\256\265\345\211\215\347\253\257\350\201\224\350\260\203\350\257\264\346\230\216.md"
@@ -0,0 +1,53 @@
+# 鐢ㄦ埛 AI 鍔熻兘瀛楁鍓嶇鑱旇皟璇存槑
+
+## 鑳屾櫙
+
+鍚庣宸插湪鐢ㄦ埛琛ㄥ鍔犻殣钘忓瓧娈� `ai_enabled`锛岀敤浜庢爣璇嗙敤鎴锋槸鍚﹀紑閫� AI 鍔熻兘銆�  
+璇ュ瓧娈典笉寮�鏀剧粰鐢ㄦ埛璧勬枡缁存姢鎺ュ彛锛堜笉閫氳繃鐢ㄦ埛缂栬緫椤甸潰涓嬪彂/鍥炲啓锛夈��
+
+## 瀛楁瀹氫箟
+
+| 瀛楁 | 绫诲瀷 | 榛樿鍊� | 璇存槑 |
+| --- | --- | --- | --- |
+| ai_enabled | tinyint(1) | 0 | 鏄惁寮�閫� AI 鍔熻兘锛歚0`=鏈紑閫氾紝`1`=宸插紑閫� |
+
+## 鑱旇皟鎺ュ彛
+
+鐧诲綍鍚庤皟鐢細
+
+```http
+GET /getInfo
+```
+
+杩斿洖涓柊澧為《灞傚瓧娈� `aiEnabled`锛�
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "user": {
+    "userId": 1,
+    "userName": "admin"
+  },
+  "aiEnabled": 1,
+  "roles": [
+    "admin"
+  ],
+  "permissions": [
+    "*:*:*"
+  ]
+}
+```
+
+## 鍓嶇浣跨敤寤鸿
+
+1. 鐧诲綍鎴愬姛鍚庢寜鐜版湁娴佺▼璋冪敤 `/getInfo`銆�
+2. 浠庡搷搴旈《灞傝鍙� `aiEnabled`銆�
+3. 鍒ゅ畾閫昏緫寤鸿锛�
+   - `aiEnabled === 1`锛氬睍绀�/鏀惧紑 AI 鐩稿叧鍏ュ彛銆�
+   - 鍏朵粬鍊硷紙`0`銆乣null`銆乣undefined`锛夛細鎸夋湭寮�閫氬鐞嗐��
+
+## 缂撳瓨璇存槑
+
+- `aiEnabled` 宸叉斁鍏ョ櫥褰曠紦瀛樺璞★紙`LoginUser`锛夊苟闅� token 鐢熷懡鍛ㄦ湡绠$悊銆�
+- 缂撳瓨 key 鍓嶇紑锛歚login_tokens:`銆�
diff --git a/src/main/java/com/ruoyi/framework/security/LoginUser.java b/src/main/java/com/ruoyi/framework/security/LoginUser.java
index 168202f..330ae43 100644
--- a/src/main/java/com/ruoyi/framework/security/LoginUser.java
+++ b/src/main/java/com/ruoyi/framework/security/LoginUser.java
@@ -76,10 +76,15 @@
      */
     private Long tenantId;
 
-    /**
-     * 褰撳墠閮ㄩ棬id
-     */
+    /**
+     * 褰撳墠閮ㄩ棬id
+     */
     private Long currentDeptId;
+
+    /**
+     * 鏄惁寮�閫欰I鍔熻兘锛�0鍚� 1鏄級
+     */
+    private Integer aiEnabled;
 
     private String dataScope;
 
@@ -87,38 +92,42 @@
     {
     }
 
-    public LoginUser(SysUser user, Set<String> permissions)
-    {
-        this.user = user;
-        this.permissions = permissions;
-    }
+    public LoginUser(SysUser user, Set<String> permissions)
+    {
+        this.user = user;
+        this.permissions = permissions;
+        this.aiEnabled = user == null ? null : user.getAiEnabled();
+    }
 
-    public LoginUser(Long userId, Long [] deptId, SysUser user, Set<String> permissions)
-    {
-        this.userId = userId;
-        this.deptIds = deptId;
-        this.user = user;
-        this.permissions = permissions;
-    }
+    public LoginUser(Long userId, Long [] deptId, SysUser user, Set<String> permissions)
+    {
+        this.userId = userId;
+        this.deptIds = deptId;
+        this.user = user;
+        this.permissions = permissions;
+        this.aiEnabled = user == null ? null : user.getAiEnabled();
+    }
 
-    public LoginUser(Long userId, Long [] deptIds, SysUser user,Long tenantId, Set<String> permissions)
-    {
-        this.userId = userId;
-        this.deptIds = deptIds;
-        this.user = user;
-        this.permissions = permissions;
-        this.tenantId = tenantId;
-    }
+    public LoginUser(Long userId, Long [] deptIds, SysUser user,Long tenantId, Set<String> permissions)
+    {
+        this.userId = userId;
+        this.deptIds = deptIds;
+        this.user = user;
+        this.permissions = permissions;
+        this.tenantId = tenantId;
+        this.aiEnabled = user == null ? null : user.getAiEnabled();
+    }
 
-    public LoginUser(Long userId, Long [] deptIds, SysUser user,Long tenantId,Long currentDeptId, Set<String> permissions)
-    {
-        this.userId = userId;
-        this.deptIds = deptIds;
-        this.user = user;
-        this.permissions = permissions;
-        this.tenantId = tenantId;
-        this.currentDeptId = currentDeptId;
-    }
+    public LoginUser(Long userId, Long [] deptIds, SysUser user,Long tenantId,Long currentDeptId, Set<String> permissions)
+    {
+        this.userId = userId;
+        this.deptIds = deptIds;
+        this.user = user;
+        this.permissions = permissions;
+        this.tenantId = tenantId;
+        this.currentDeptId = currentDeptId;
+        this.aiEnabled = user == null ? null : user.getAiEnabled();
+    }
 
     public Long getUserId()
     {
@@ -289,10 +298,11 @@
         return user;
     }
 
-    public void setUser(SysUser user)
-    {
-        this.user = user;
-    }
+    public void setUser(SysUser user)
+    {
+        this.user = user;
+        this.aiEnabled = user == null ? null : user.getAiEnabled();
+    }
 
     @Override
     public Collection<? extends GrantedAuthority> getAuthorities()
@@ -320,6 +330,20 @@
         this.currentDeptId = currentDeptId;
     }
 
+    public Integer getAiEnabled() {
+        if (aiEnabled != null) {
+            return aiEnabled;
+        }
+        if (user != null && user.getAiEnabled() != null) {
+            return user.getAiEnabled();
+        }
+        return 0;
+    }
+
+    public void setAiEnabled(Integer aiEnabled) {
+        this.aiEnabled = aiEnabled;
+    }
+
     public String getDataScope() {
         return dataScope;
     }
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java b/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java
index ad9a8b3..e08c368 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java
@@ -12,9 +12,10 @@
 import com.ruoyi.project.system.domain.SysMenu;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
-import com.ruoyi.project.system.mapper.SysDeptMapper;
-import com.ruoyi.project.system.service.ISysMenuService;
-import com.ruoyi.project.system.service.ISysUserDeptService;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.service.ISysMenuService;
+import com.ruoyi.project.system.service.ISysUserDeptService;
+import com.ruoyi.project.system.service.ISysUserService;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.ObjectUtils;
@@ -40,10 +41,11 @@
 {
     private SysLoginService loginService;
     private ISysMenuService menuService;
-    private SysPermissionService permissionService;
-    private TokenService tokenService;
-    private ISysUserDeptService userDeptService;
-    private SysDeptMapper sysDeptMapper;
+    private SysPermissionService permissionService;
+    private TokenService tokenService;
+    private ISysUserDeptService userDeptService;
+    private ISysUserService userService;
+    private SysDeptMapper sysDeptMapper;
 
     /**
      * 鐧诲綍鏂规硶
@@ -71,7 +73,17 @@
     public AjaxResult getInfo()
     {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        SysUser user = loginUser.getUser();
+        SysUser user = userService.selectUserById(loginUser.getUserId());
+        if (user == null)
+        {
+            user = loginUser.getUser();
+        }
+        else
+        {
+            loginUser.setUser(user);
+            loginUser.setAiEnabled(user.getAiEnabled());
+            tokenService.setLoginUser(loginUser);
+        }
         // 鑾峰彇褰撳墠鐧诲綍鍏徃
         Long tenantId = loginUser.getTenantId();
         if(null != tenantId){
@@ -90,11 +102,12 @@
             loginUser.setPermissions(permissions);
             tokenService.refreshToken(loginUser);
         }
-        AjaxResult ajax = AjaxResult.success();
-        ajax.put("user", user);
-        ajax.put("roles", roles);
-        ajax.put("permissions", permissions);
-        return ajax;
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("user", user);
+        ajax.put("aiEnabled", loginUser.getAiEnabled());
+        ajax.put("roles", roles);
+        ajax.put("permissions", permissions);
+        return ajax;
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/project/system/domain/SysUser.java b/src/main/java/com/ruoyi/project/system/domain/SysUser.java
index d75fcc0..515210e 100644
--- a/src/main/java/com/ruoyi/project/system/domain/SysUser.java
+++ b/src/main/java/com/ruoyi/project/system/domain/SysUser.java
@@ -1,7 +1,8 @@
 package com.ruoyi.project.system.domain;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.ruoyi.common.xss.Xss;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.common.xss.Xss;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel.Type;
@@ -59,9 +60,13 @@
     @Excel(name = "璐﹀彿鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
     private String status;
 
-    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
-    private String delFlag;
-
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    /** 鏄惁寮�閫欰I鍔熻兘锛�0鍚� 1鏄級 */
+    @JsonIgnore
+    private Integer aiEnabled;
+
     /** 鏈�鍚庣櫥褰旾P */
     @Excel(name = "鏈�鍚庣櫥褰旾P", type = Type.EXPORT)
     private String loginIp;
@@ -250,15 +255,25 @@
         this.status = status;
     }
 
-    public String getDelFlag()
-    {
-        return delFlag;
-    }
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
 
-    public void setDelFlag(String delFlag)
-    {
-        this.delFlag = delFlag;
-    }
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Integer getAiEnabled()
+    {
+        return aiEnabled;
+    }
+
+    public void setAiEnabled(Integer aiEnabled)
+    {
+        this.aiEnabled = aiEnabled;
+    }
 
     public String getLoginIp()
     {
@@ -373,9 +388,10 @@
             .append("sex", getSex())
             .append("avatar", getAvatar())
             .append("password", getPassword())
-            .append("status", getStatus())
-            .append("delFlag", getDelFlag())
-            .append("loginIp", getLoginIp())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("aiEnabled", getAiEnabled())
+            .append("loginIp", getLoginIp())
             .append("loginDate", getLoginDate())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index e27a224..72da1a1 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -15,6 +15,7 @@
         <result property="password"     column="password"     />
         <result property="status"       column="status"       />
         <result property="delFlag"      column="del_flag"     />
+        <result property="aiEnabled"    column="ai_enabled"   />
         <result property="loginIp"      column="login_ip"     />
         <result property="loginDate"    column="login_date"   />
         <result property="createBy"     column="create_by"    />
@@ -48,7 +49,7 @@
     </resultMap>
 
 	<sql id="selectUserVo">
-        select u.user_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
+        select u.user_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.ai_enabled, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.tenant_id
         from sys_user u
 		    left join sys_user_role ur on u.user_id = ur.user_id

--
Gitblit v1.9.3