编辑 | blame | 历史 | 原始文档

用户所在分公司信息获取功能说明

功能概述

在用户登录后的 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

核心逻辑

@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;
}

新增依赖注入

@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 修改

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. 页面使用分公司信息

接口返回示例

成功响应

{
  "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. 数据一致性

  • 分公司信息随用户登录获取
  • 如果部门调整,需要重新登录

使用示例

在页面中使用

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)
    }
  }
}

相关文档

版本历史

版本 日期 修改内容 修改人

| 1.0 | 2025-10-18 | 初始版本,实现分公司信息获取功能 | - |

总结

通过在 getInfo 接口中返回用户所在的分公司信息,实现了以下目标:

  1. 简化前端逻辑:不需要在每个页面单独查询部门信息
  2. 提升用户体验:自动填充归属机构,减少用户操作
  3. 统一数据源:所有页面使用相同的分公司信息
  4. 支持数据权限:基于分公司进行数据隔离
  5. 性能优化:避免重复查询,信息缓存在前端