# 用户所在分公司信息获取功能说明 ## 功能概述 在用户登录后的 `getInfo` 接口中返回用户所在的分公司ID和名称,使得在创建任务等场景中可以默认显示和使用分公司信息。 ## 业务需求 ### 使用场景 1. **创建任务**:归属机构字段默认显示当前用户所在的分公司 2. **数据过滤**:基于分公司进行数据权限控制 3. **统计分析**:按分公司维度进行数据统计 ### 分公司判断规则 - **直接属于分公司**:用户的 `dept_id` 对应的部门 `parent_id = 100` - **属于子部门**:通过部门的 `ancestors` 字段解析出分公司ID ## 技术实现 ### 1. 后端实现 #### 修改文件 **文件**:`ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java` #### 核心逻辑 ```java @GetMapping("getInfo") public AjaxResult getInfo() { LoginUser loginUser = SecurityUtils.getLoginUser(); SysUser user = loginUser.getUser(); // 获取用户所在的分公司信息 Long branchCompanyId = null; String branchCompanyName = null; if (user.getDeptId() != null) { SysDept dept = deptService.selectDeptById(user.getDeptId()); if (dept != null) { // 判断当前部门是否就是分公司(parent_id = 100) if (dept.getParentId() != null && dept.getParentId() == 100) { branchCompanyId = dept.getDeptId(); branchCompanyName = dept.getDeptName(); } else if (dept.getAncestors() != null && !dept.getAncestors().isEmpty()) { // 从 ancestors 解析分公司ID // ancestors 格式:"0,100,分公司ID,子部门ID" String[] ancestorIds = dept.getAncestors().split(","); for (int i = 0; i < ancestorIds.length; i++) { if ("100".equals(ancestorIds[i]) && i + 1 < ancestorIds.length) { Long companyId = Long.parseLong(ancestorIds[i + 1]); SysDept branchCompany = deptService.selectDeptById(companyId); if (branchCompany != null) { branchCompanyId = branchCompany.getDeptId(); branchCompanyName = branchCompany.getDeptName(); } break; } } } } } // 返回分公司信息 ajax.put("branchCompanyId", branchCompanyId); ajax.put("branchCompanyName", branchCompanyName); return ajax; } ``` #### 新增依赖注入 ```java @Autowired private ISysDeptService deptService; ``` ### 2. 前端实现 #### 修改文件列表 1. `app/utils/constant.js` - 添加常量定义 2. `app/store/modules/user.js` - 保存分公司信息到Vuex 3. `app/pages/task/create-emergency.vue` - 使用分公司信息 #### constant.js 修改 ```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' // 新增 } ``` #### user.js (Vuex) 修改 **State 添加**: ```javascript state: { branchCompanyId: storage.get(constant.branchCompanyId), branchCompanyName: storage.get(constant.branchCompanyName) }, ``` **Mutations 添加**: ```javascript SET_BRANCH_COMPANY_ID: (state, branchCompanyId) => { state.branchCompanyId = branchCompanyId storage.set(constant.branchCompanyId, branchCompanyId) }, SET_BRANCH_COMPANY_NAME: (state, branchCompanyName) => { state.branchCompanyName = branchCompanyName storage.set(constant.branchCompanyName, branchCompanyName) } ``` **GetInfo Action 修改**: ```javascript GetInfo({ commit, state }) { return new Promise((resolve, reject) => { getInfo().then(res => { commit('SET_BRANCH_COMPANY_ID', res.branchCompanyId) commit('SET_BRANCH_COMPANY_NAME', res.branchCompanyName) resolve(res) }) }) } ``` #### create-emergency.vue 使用 **Computed 修改**: ```javascript computed: { ...mapState({ currentUser: state => ({ branchCompanyId: state.user.branchCompanyId, branchCompanyName: state.user.branchCompanyName }) }) }, ``` **onLoad 设置默认值**: ```javascript onLoad(options) { this.getAvailableVehicles() this.initSelectedStaff() this.loadDeptStaff() // 设置默认归属机构 if (this.currentUser.branchCompanyName) { this.selectedOrganization = this.currentUser.branchCompanyName } } ``` ## 数据流程 ``` 1. 用户登录 ↓ 2. 前端调用 getInfo 接口 ↓ 3. 后端获取用户部门信息 ↓ 4. 判断部门类型 ├─ parent_id = 100 → 直接是分公司 └─ 其他 → 从 ancestors 解析分公司ID ↓ 5. 查询分公司详细信息 ↓ 6. 返回分公司ID和名称 ↓ 7. 前端保存到 Vuex Store ↓ 8. 页面使用分公司信息 ``` ## 接口返回示例 ### 成功响应 ```json { "code": 200, "msg": "操作成功", "user": { "userId": 100, "deptId": 201, "userName": "zhangsan", "nickName": "张三", ... }, "roles": ["driver"], "permissions": ["*:*:*"], "branchCompanyId": 101, "branchCompanyName": "广州分公司" } ``` ### 无分公司情况 如果用户不属于任何分公司,返回: ```json { "branchCompanyId": null, "branchCompanyName": null } ``` ## 测试场景 ### 场景1:用户直接属于分公司 **数据准备**: ```sql -- 用户部门 dept_id = 101, parent_id = 100, dept_name = '广州分公司' ``` **预期结果**: ```javascript branchCompanyId: 101 branchCompanyName: '广州分公司' ``` ### 场景2:用户属于子部门 **数据准备**: ```sql -- 用户部门 dept_id = 201, parent_id = 101, ancestors = '0,100,101' -- 分公司 dept_id = 101, parent_id = 100, dept_name = '广州分公司' ``` **预期结果**: ```javascript branchCompanyId: 101 branchCompanyName: '广州分公司' ``` ### 场景3:用户没有部门 **数据准备**: ```javascript user.deptId = null ``` **预期结果**: ```javascript branchCompanyId: null branchCompanyName: null ``` ## 注意事项 ### 1. ancestors 字段格式 - 标准格式:`"0,100,分公司ID,子部门ID"` - 分公司:`"0,100"` - 子部门:`"0,100,101,201"` ### 2. 异常处理 - 部门ID为空:返回 null - ancestors 解析失败:返回 null - 分公司不存在:返回 null ### 3. 性能考虑 - getInfo 接口在登录时调用一次 - 分公司信息缓存在前端 Vuex Store - 避免重复查询 ### 4. 数据一致性 - 分公司信息随用户登录获取 - 如果部门调整,需要重新登录 ## 使用示例 ### 在页面中使用 ```javascript export default { computed: { ...mapState({ currentUser: state => ({ branchCompanyId: state.user.branchCompanyId, branchCompanyName: state.user.branchCompanyName }) }) }, onLoad() { // 设置默认归属机构 if (this.currentUser.branchCompanyName) { this.form.organization = this.currentUser.branchCompanyName } // 使用分公司ID查询数据 if (this.currentUser.branchCompanyId) { this.loadDataByBranch(this.currentUser.branchCompanyId) } } } ``` ## 相关文档 - [任务人员选择分公司用户功能说明.md](./任务人员选择分公司用户功能说明.md) - [车辆管理部门过滤说明.md](./车辆管理部门过滤说明.md) ## 版本历史 | 版本 | 日期 | 修改内容 | 修改人 | |------|------|---------|--------| | 1.0 | 2025-10-18 | 初始版本,实现分公司信息获取功能 | - | ## 总结 通过在 `getInfo` 接口中返回用户所在的分公司信息,实现了以下目标: 1. ✅ **简化前端逻辑**:不需要在每个页面单独查询部门信息 2. ✅ **提升用户体验**:自动填充归属机构,减少用户操作 3. ✅ **统一数据源**:所有页面使用相同的分公司信息 4. ✅ **支持数据权限**:基于分公司进行数据隔离 5. ✅ **性能优化**:避免重复查询,信息缓存在前端