# OA用户ID字段支持说明
## 需求背景
为了与OA系统进行用户数据同步和关联,需要在系统中支持OA_UserID字段:
1. 用户登录成功后,在用户信息中加载OA_UserID
2. 在后台创建用户时,可以输入并保存OA_UserID
3. 在后台修改用户时,可以修改OA_UserID
## 实现方案
### 一、后端实现
#### 1. 实体类(已完成)
**文件**: `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java`
SysUser实体类已包含oaUserId字段:
```java
/** SQL Server中的OA用户ID */
private Integer oaUserId;
public Integer getOaUserId() {
return oaUserId;
}
public void setOaUserId(Integer oaUserId) {
this.oaUserId = oaUserId;
}
```
#### 2. Mapper配置(已完成)
**文件**: `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml`
**ResultMap映射:**
```xml
```
**查询SQL包含oaUserId:**
```xml
select u.user_id, u.dept_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.oa_user_id, u.create_by, u.create_time, u.remark,
from sys_user u
```
**插入操作:**
```xml
insert into sys_user(
oa_user_id,
)values(
#{oaUserId},
)
```
**更新操作:**
```xml
update sys_user
oa_user_id = #{oaUserId},
where user_id = #{userId}
```
#### 3. 登录接口扩展
**文件**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java`
在`getInfo()`方法中返回oaUserId:
```java
@GetMapping("getInfo")
public AjaxResult getInfo()
{
LoginUser loginUser = SecurityUtils.getLoginUser();
SysUser user = loginUser.getUser();
// ... 其他代码
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
ajax.put("branchCompanyId", branchCompanyId);
ajax.put("branchCompanyName", branchCompanyName);
ajax.put("oaUserId", user.getOaUserId()); // 新增:返回OA用户ID
return ajax;
}
```
### 二、前端实现
#### 1. 后台管理页面(Vue)
**文件**: `ruoyi-ui/src/views/system/user/index.vue`
##### 列表显示
在用户列表中显示OA用户ID列:
```html
{{ scope.row.oaUserId }}
-
```
##### 表单编辑
在新增/修改用户对话框中添加OA用户ID输入框:
```html
```
**注意**:
- `type="number"` 确保只能输入数字
- 移除了 `:disabled="true"` 属性,允许编辑
- 在创建和修改时都可以输入OA用户ID
##### 表单初始化
在`reset()`方法中包含oaUserId:
```javascript
reset() {
this.form = {
userId: undefined,
deptId: undefined,
userName: undefined,
nickName: undefined,
oaUserId: undefined, // 初始化OA用户ID
password: undefined,
phonenumber: undefined,
email: undefined,
sex: undefined,
status: "0",
remark: undefined,
postIds: [],
roleIds: []
};
this.resetForm("form");
}
```
##### 列信息配置
添加OA用户ID列到columns配置:
```javascript
columns: [
{ key: 0, label: `用户编号`, visible: true },
{ key: 1, label: `OA用户ID`, visible: true }, // 新增列
{ key: 2, label: `用户名称`, visible: true },
{ key: 3, label: `用户昵称`, visible: true },
{ key: 4, label: `部门`, visible: true },
{ key: 5, label: `手机号码`, visible: true },
{ key: 6, label: `状态`, visible: true },
{ key: 7, label: `创建时间`, visible: true }
]
```
#### 2. 移动端(UniApp)
**文件**: `app/store/modules/user.js`
##### 常量定义
**文件**: `app/utils/constant.js`
添加oaUserId常量:
```javascript
const constant = {
userId: 'vuex_userId',
avatar: 'vuex_avatar',
name: 'vuex_name',
roles: 'vuex_roles',
permissions: 'vuex_permissions',
deptId: 'vuex_deptId',
branchCompanyId: 'vuex_branchCompanyId',
branchCompanyName: 'vuex_branchCompanyName',
oaUserId: 'vuex_oaUserId' // 新增
}
```
##### State定义
在store中添加oaUserId状态:
```javascript
state: {
token: getToken(),
userId: storage.get(constant.userId),
name: storage.get(constant.name),
avatar: storage.get(constant.avatar),
roles: storage.get(constant.roles),
permissions: storage.get(constant.permissions),
deptId: storage.get(constant.deptId),
branchCompanyId: storage.get(constant.branchCompanyId),
branchCompanyName: storage.get(constant.branchCompanyName),
oaUserId: storage.get(constant.oaUserId) // 新增
}
```
##### Mutation定义
添加SET_OA_USER_ID mutation:
```javascript
mutations: {
// ... 其他mutations
SET_OA_USER_ID: (state, oaUserId) => {
state.oaUserId = oaUserId
storage.set(constant.oaUserId, oaUserId)
}
}
```
##### Action实现
在GetInfo action中保存oaUserId:
```javascript
GetInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo().then(res => {
const user = res.user
// ... 其他代码
commit('SET_USER_ID', userId)
commit('SET_NAME', username)
commit('SET_AVATAR', avatar)
commit('SET_DEPT_ID', deptId)
commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId)
commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName)
commit('SET_OA_USER_ID', res.oaUserId) // 新增:保存OA用户ID
resolve(res)
}).catch(error => {
reject(error)
})
})
}
```
### 三、数据流程
#### 1. 用户登录流程
```
用户登录
↓
调用 /login 接口
↓
返回 token
↓
调用 /getInfo 接口
↓
返回用户信息(包含oaUserId)
↓
保存到 Vuex store
↓
存储到 localStorage
↓
在应用中使用 this.$store.state.user.oaUserId 访问
```
#### 2. 创建用户流程
```
点击"新增"按钮
↓
打开对话框
↓
填写用户信息(包括OA用户ID)
↓
点击"确定"提交
↓
调用 addUser() 接口
↓
后端保存到数据库(oa_user_id字段)
↓
返回成功
↓
刷新用户列表
```
#### 3. 修改用户流程
```
点击"修改"按钮
↓
加载用户信息(包含OA用户ID)
↓
修改OA用户ID
↓
点击"确定"提交
↓
调用 updateUser() 接口
↓
后端更新数据库(oa_user_id字段)
↓
返回成功
↓
刷新用户列表
```
### 四、数据库字段
**表名**: `sys_user`
**字段**: `oa_user_id`
- **类型**: `INT`
- **可空**: `YES`
- **默认值**: `NULL`
- **说明**: 存储OA系统中的用户ID,用于与外部OA系统进行用户数据关联
SQL创建语句(已存在):
```sql
ALTER TABLE sys_user ADD COLUMN oa_user_id INT NULL COMMENT 'OA系统用户ID';
```
### 五、使用示例
#### 1. 后台管理
1. **查看用户列表**
- 在用户管理页面,可以看到"OA用户ID"列
- 如果用户有OA用户ID,会显示数字
- 如果没有,显示"-"
2. **创建用户**
- 点击"新增"按钮
- 在表单中填写"OA用户ID"(可选)
- 点击"确定"保存
3. **修改用户**
- 点击用户的"修改"按钮
- 可以修改"OA用户ID"
- 点击"确定"保存
#### 2. 移动端
在移动端应用中访问OA用户ID:
```javascript
// 在组件中
export default {
computed: {
...mapState({
oaUserId: state => state.user.oaUserId
})
},
mounted() {
console.log('当前用户的OA用户ID:', this.oaUserId)
}
}
```
### 六、测试建议
#### 功能测试
1. **登录测试**
- 使用已有OA用户ID的账号登录
- 检查登录后是否能正确获取OA用户ID
- 在开发者工具中查看localStorage中是否保存了oaUserId
2. **创建用户测试**
- 创建新用户时填写OA用户ID
- 保存后查看数据库中是否正确保存
- 在用户列表中查看是否正确显示
3. **修改用户测试**
- 修改已有用户的OA用户ID
- 保存后查看数据库中是否正确更新
- 在用户列表中查看是否正确显示
4. **空值测试**
- 创建用户时不填写OA用户ID
- 确认系统能正常保存(oaUserId为NULL)
- 在列表中显示为"-"
#### 数据一致性测试
1. 检查新增用户后,oaUserId是否正确保存
2. 检查修改用户后,oaUserId是否正确更新
3. 检查登录后,oaUserId是否正确从数据库加载
4. 检查移动端和PC端的oaUserId是否一致
### 七、相关文件
#### 后端文件
- `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java` - 用户实体类
- `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml` - 用户Mapper配置
- `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java` - 登录控制器
#### 前端文件(PC端)
- `ruoyi-ui/src/views/system/user/index.vue` - 用户管理页面
#### 前端文件(移动端)
- `app/utils/constant.js` - 常量定义
- `app/store/modules/user.js` - 用户状态管理
#### 数据库
- `sys_user` 表 - `oa_user_id` 字段
### 八、注意事项
1. **数据类型**:OA用户ID使用Integer类型,对应数据库的INT类型
2. **可空性**:字段允许为NULL,用户可以不绑定OA账号
3. **唯一性**:目前没有唯一性约束,如需要可添加UNIQUE索引
4. **安全性**:OA用户ID不应该暴露给普通用户,仅在后台管理系统中可见
5. **同步逻辑**:如果实现了OA数据同步功能,需要确保oaUserId的一致性
### 九、后续扩展建议
1. **添加唯一性约束**
```sql
ALTER TABLE sys_user ADD UNIQUE INDEX idx_oa_user_id (oa_user_id);
```
2. **添加OA用户ID验证**
- 在后台添加验证规则,确保OA用户ID的有效性
- 检查OA用户ID是否已被其他用户使用
3. **OA系统集成**
- 实现与OA系统的单点登录(SSO)
- 通过OA用户ID自动同步用户信息
4. **数据同步功能**
- 定时从OA系统同步用户数据
- 根据OA用户ID更新本地用户信息
### 十、版本历史
- **v1.0** (2025-10-19): 初始版本,支持OA用户ID的显示、创建和修改
- 后端getInfo接口返回oaUserId
- 前端store保存oaUserId
- 后台管理支持编辑oaUserId
- 移动端支持访问oaUserId