主题
组织架构管理 PRD
文档信息
| 项目 | 内容 |
|---|---|
| 产品名称 | PMForge - 组织架构管理 |
| 文档版本 | v2.0 |
| 创建日期 | 2026-09-13 |
| 最后更新 | 2026-09-24 |
| 文档状态 | 评审中 |
| 优先级 | P0 |
| 所属模块 | 系统管理 |
| 前端路由 | /system/dept(部门管理)、/system/post(岗位管理) |
一、功能概述
1.1 功能定位
组织架构管理是系统的"骨架搭建"模块——就像一家公司在 HR 系统中录入自己的组织架构图一样。它包含两部分:
- 部门管理:维护公司的部门树(公司 → 事业部 → 部门 → 小组),是一棵从上到下生长的"树"
- 岗位管理:维护公司里的岗位类型(产品经理、前端工程师、测试工程师),是一个扁平的"清单"
部门和岗位组合起来,就能精确描述一个员工在组织中的位置——"研发部-后端组"的"高级 Java 工程师"。
为什么部门和岗位要分开管理?因为部门是"你在哪个团队",岗位是"你做什么工作"。同一个人可以是"研发部"的"高级工程师",调岗时部门不变但岗位变了;部门合并时岗位不变但归属变了。两者独立管理才够灵活。
1.2 目标用户
| 用户类型 | 使用场景 | 核心诉求 |
|---|---|---|
| 超级管理员 | 管理整个组织架构,创建顶级部门、设置部门负责人 | 搭建和维护完整的组织架构 |
| 租户管理员 | 管理本租户内的组织架构,创建和维护部门与岗位 | 在自己租户内建立组织体系 |
| 部门管理者 | 查看本部门及子部门的人员结构、统计数据 | 了解团队人员构成 |
| 普通用户 | 在个人中心查看所属部门、岗位信息(只读) | 确认自己的组织归属 |
1.3 业务价值
| 价值维度 | 说明 |
|---|---|
| 🏢 组织可视化 | 树形结构清晰展示公司完整组织架构 |
| 👥 人员归属 | 每个用户都有明确的部门和岗位归属 |
| 📊 数据权限基础 | 数据权限的"本部门""本部门及子部门"依赖部门树 |
| 🔄 灵活调整 | 支持部门新增、合并、拆分、停用,适应企业发展 |
| 📈 统计分析 | 为部门级人员统计、组织分析提供数据基础 |
1.4 功能范围
| 功能分类 | 后台管理端 | 前台用户端 |
|---|---|---|
| 部门树形列表 | ✅ | ❌ |
| 部门新增/编辑/删除 | ✅ | ❌ |
| 部门状态管理 | ✅ | ❌ |
| 部门负责人设置 | ✅ | ❌ |
| 部门人员查看 | ✅ | ❌ |
| 部门统计 | ✅ | ❌ |
| 岗位分页列表 | ✅ | ❌ |
| 岗位新增/编辑/删除 | ✅ | ❌ |
| 岗位导出 | ✅ | ❌ |
| 个人中心展示 | ❌ | ✅ |
二、用户场景
2.1 用户角色
| 角色 | 描述 | 核心诉求 |
|---|---|---|
| 超级管理员 | 系统最高权限 | 管理整个组织架构,不受租户限制 |
| 租户管理员 | 租户内最高权限 | 在本租户内建立和维护组织架构 |
| 部门管理者 | 某部门的负责人 | 查看本部门及下级部门人员情况 |
| 普通用户 | 系统使用者 | 在表单中选择/查看部门、岗位信息 |
2.2 使用场景
场景1:新公司入驻——初始化组织架构
- 用户:租户管理员小王
- 场景:公司初次使用 PMForge → 小王进入组织架构 → 部门管理 → 创建顶级节点"PMForge 科技有限公司" → 在其下创建一级部门"研发中心""产品部""市场部""行政部" → 在"研发中心"下继续创建"前端组""后端组""测试组" → 为每个部门设置负责人
- 期望:通过树形结构清晰展示公司完整组织架构,快速搭建完成
- 异常处理:如果部门名称为空,提示"请输入部门名称";如果设置负责人时搜索不到目标用户,提示"未找到匹配用户"
场景2:组织架构调整——部门迁移
- 用户:租户管理员小王
- 场景:公司决定将"前端组"从"研发中心"调整到"产品部" → 小王编辑"前端组" → 将上级部门改为"产品部" → 保存 → 树形结构自动更新
- 期望:支持部门层级调整,调整后树形结构立即更新
- 异常处理:如果试图将上级部门设为自身或其子孙部门,系统提示"不能将部门设为自身或子部门的下级,会造成循环引用"
场景3:部门撤销——停用而非删除
- 用户:租户管理员小王
- 场景:公司撤销"创新业务部" → 但该部门的历史数据(项目、文档)还需要保留 → 小王选择"停用"该部门 → 停用后该部门在下拉选项中不再出现(新建用户时选不到它) → 但已有用户和历史数据中仍保留部门信息
- 期望:部门停用不影响已有用户数据,只在下拉选项中隐藏
- 异常处理:如果该部门下有子部门且子部门还在使用,系统提示"请先停用或迁移所有子部门"
场景4:新增岗位体系
- 用户:租户管理员小王
- 场景:公司岗位体系需要细化 → 小王进入岗位管理 → 批量新增"初级工程师""中级工程师""高级工程师""技术专家"等岗位 → 设置编码和排序 → 后续在用户管理中就可以为员工分配这些岗位
- 期望:快速新增岗位,用户管理时可选新岗位
场景5:部门经理查看团队
- 用户:研发部负责人老张
- 场景:老张需要了解团队人员构成 → 进入部门管理 → 点击"研发中心"节点 → 查看该部门及子部门下所有人员列表 → 看到前端组 5 人、后端组 8 人、测试组 3 人 → 了解各部门人员分布
- 期望:快速查看部门下所有成员及其岗位信息
场景6:年底岗位盘点
- 用户:行政主管陈姐
- 场景:年底需要整理岗位台账 → 陈姐进入岗位管理 → 筛选"启用"状态 → 点击"导出" → 下载 Excel → 包含所有岗位的名称、编码、排序、状态、备注
- 期望:导出的 Excel 字段完整、状态用中文显示
场景7:新员工入职选择部门岗位
- 用户:HR 小李
- 场景:新员工入职 → 小李在用户管理中创建用户 → 所属部门字段弹出树形下拉 → 选择"研发中心-后端组" → 岗位字段弹出下拉 → 选择"中级工程师" → 保存
- 期望:部门和岗位以下拉形式提供,选择方便快捷
2.3 用户故事
| 编号 | 用户故事 | 优先级 | 验收标准 |
|---|---|---|---|
| US-01 | 作为管理员,我希望以树形结构查看公司所有部门,以便了解组织架构全貌 | P0 | ① 部门以树形展示,支持展开/折叠 ② 每个节点显示名称、负责人、状态 ③ 500 个部门内渲染流畅 |
| US-02 | 作为管理员,我希望能创建和编辑部门信息,以便维护组织架构 | P0 | ① 支持选择上级部门 ② 不能将上级设为自身或子孙部门 ③ 保存后树形结构立即更新 |
| US-03 | 作为管理员,我希望能设置部门负责人,以便明确管理责任 | P0 | ① 从用户列表中搜索选择 ② 显示负责人姓名 |
| US-04 | 作为管理员,我希望能停用/启用部门,以便灵活管理组织变更 | P0 | ① 停用后下拉选项中隐藏 ② 已有用户数据不受影响 ③ 有子部门的不能直接停用 |
| US-05 | 作为管理员,我希望能删除不再使用的部门,以便保持架构整洁 | P0 | ① 有子部门时不能删除 ② 有关联用户时不能删除 ③ 删除前二次确认 |
| US-06 | 作为管理员,我希望创建/编辑用户时能从树形下拉中选择部门 | P0 | ① 下拉展示完整部门树 ② 只展示启用状态的部门 |
| US-07 | 作为管理员,我希望查看某部门下的所有人员列表 | P1 | ① 默认包含子部门人员 ② 可切换为"仅本部门" ③ 支持搜索和筛选 |
| US-08 | 作为管理员,我希望能以分页方式查看和管理岗位列表 | P0 | ① 分页展示 ② 支持按名称/编码/状态搜索 |
| US-09 | 作为管理员,我希望能创建/编辑/删除岗位 | P0 | ① 岗位编码全局唯一 ② 有关联用户时不能删除 |
| US-10 | 作为管理员,我希望能导出岗位数据 | P1 | ① 导出 Excel 字段完整 ② 状态翻译为中文 |
三、功能需求
3.1 后台管理端 - 部门管理
3.1.1 功能清单
| 功能 | 优先级 | 说明 |
|---|---|---|
| 部门树形列表 | P0 | 以树形结构展示所有部门,支持展开/折叠 |
| 搜索筛选 | P0 | 按部门名称、状态筛选 |
| 新增部门 | P0 | 创建部门节点,指定上级部门 |
| 编辑部门 | P0 | 修改部门名称、负责人、联系方式、排序、状态等 |
| 删除部门 | P0 | 删除单个部门,需校验子部门和人员 |
| 批量删除 | P1 | 批量选择并删除多个部门 |
| 状态切换 | P0 | 开启/停用部门 |
| 设置负责人 | P0 | 从用户列表中选择部门负责人 |
| 调整排序 | P0 | 通过排序字段控制同级部门的展示顺序 |
3.1.2 部门树形列表
页面描述:

- 页面采用全幅树形布局
- 顶部:搜索栏(部门名称输入框、状态下拉选择、查询/重置按钮)
- 主体:树形结构展示所有部门,每个节点显示部门名称、排序值、状态标签、负责人、操作按钮
- 操作列:编辑、新增子部门、删除
- 顶部工具栏:新增顶级部门、展开全部、折叠全部、批量删除
业务规则:
| 规则编号 | 规则描述 | 为什么这样设计 |
|---|---|---|
| R-01 | 默认按排序值升序排列,同 sort 值按创建时间升序 | 管理员可自定义展示顺序 |
| R-02 | 树的根节点 parentId 为 0 | 统一根节点标识 |
| R-03 | 支持按部门名称模糊搜索,搜索结果仍保持树形结构 | 搜索子部门时需要看到它的父级链路 |
| R-04 | 支持按状态筛选,筛选后仍保持树形结构 | 快速定位停用部门 |
| R-05 | 超级管理员可以看到所有部门 | 超管需要管理全系统 |
| R-06 | 租户管理员只能看到本租户内的部门 | 租户间数据隔离 |
| R-07 | 部门以树形全量返回(非分页) | 部门总量通常不大,树形展示更直观 |
| R-08 | 停用状态的部门在树中仍显示,但标记为"已停用"标签 | 让管理员知道这个部门还存在但已停用 |
| R-09 | 不展示已逻辑删除的部门 | 已删除的不应出现 |
数据字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 部门ID |
| name | String | 部门名称 |
| parentId | Long | 父部门ID(0 为顶级) |
| sort | Integer | 显示顺序 |
| leaderUserId | Long | 负责人的用户ID |
| leaderName | String | 负责人姓名(前端展示用,非直接存储) |
| phone | String | 联系电话 |
| String | 邮箱 | |
| status | Integer | 状态(0-开启 1-关闭) |
| createTime | DateTime | 创建时间 |
| children | List | 子部门列表(前端构建树形结构时使用) |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获取部门列表 | GET | /admin-api/system/dept/list | 获取部门树形列表(全量) | system:dept:query |
请求参数(查询条件):
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | String | 否 | 部门名称,模糊匹配 |
| status | Integer | 否 | 展示状态(0-开启 1-关闭) |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 部门编号 |
| name | String | 部门名称 |
| parentId | Long | 父部门ID |
| sort | Integer | 显示顺序 |
| leaderUserId | Long | 负责人用户ID |
| phone | String | 联系电话 |
| String | 邮箱 | |
| status | Integer | 状态 |
| createTime | DateTime | 创建时间 |
说明: 前端接收扁平列表后根据 parentId 自行构建为树形结构进行渲染。
3.1.3 获取部门精简信息列表
页面描述:
- 用于前端下拉选择器(如用户管理中的"所属部门"字段)
- 仅返回开启状态的部门
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获取部门精简列表 | GET | /admin-api/system/dept/simple-list | 获取开启状态的部门精简信息 | 无(登录即可) |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 部门编号 |
| name | String | 部门名称 |
| parentId | Long | 父部门ID |
说明: 前端接收扁平列表后根据 parentId 构建为树形下拉结构。仅返回状态为"开启"的部门。
3.1.4 获取部门详情
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获得部门信息 | GET | /admin-api/system/dept/get | 根据ID获取部门详情 | system:dept:query |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 是 | 部门编号 |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 部门编号 |
| name | String | 部门名称 |
| parentId | Long | 父部门ID |
| sort | Integer | 显示顺序 |
| leaderUserId | Long | 负责人用户ID |
| phone | String | 联系电话 |
| String | 邮箱 | |
| status | Integer | 状态 |
| createTime | DateTime | 创建时间 |
3.1.5 新增部门
页面描述:

- 弹窗或抽屉表单
- 支持选择上级部门(树形下拉选择器)
- 支持选择负责人(用户选择器)
- 点击"新增顶级部门"时 parentId 默认为 0
表单字段:
| 字段 | 控件类型 | 必填 | 校验规则 | 说明 |
|---|---|---|---|---|
| 上级部门 | 树形选择器 | 否 | - | 不选则为顶级部门(parentId=0) |
| 部门名称 | 输入框 | 是 | 不能为空,最长30字符 | 部门显示名称 |
| 显示排序 | 数字输入框 | 是 | 不能为空,正整数 | 控制同级部门展示顺序 |
| 负责人 | 用户选择器 | 否 | - | 从系统用户中搜索选择 |
| 联系电话 | 输入框 | 否 | 最长11字符 | 部门联系方式 |
| 邮箱 | 输入框 | 否 | 邮箱格式校验,最长50字符 | 部门邮箱 |
| 状态 | 单选/开关 | 是 | 必须为 0 或 1 | 0-开启 1-关闭 |
业务规则:
| 规则编号 | 规则描述 | 为什么这样设计 |
|---|---|---|
| R-01 | 部门名称在同级中不要求唯一 | 不同上级下可以有同名部门(如"研发部"在不同事业部下都存在) |
| R-02 | 上级部门必须为开启状态 | 不能把新部门挂到已停用的部门下面 |
| R-03 | 不能将上级部门设置为自身或其子孙部门(防止循环引用) | 循环引用会导致树形结构崩溃 |
| R-04 | 创建后 sort 默认为同级最大值 + 1(如前端未传) | 新部门默认排在最后 |
| R-05 | 负责人必须是系统中存在的用户 | 确保负责人可追溯 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 创建部门 | POST | /admin-api/system/dept/create | 创建新部门 | system:dept:create |
请求参数:
| 参数名 | 类型 | 必填 | 校验规则 | 说明 |
|---|---|---|---|---|
| name | String | 是 | 不能为空,最长30字符 | 部门名称 |
| parentId | Long | 否 | - | 父部门ID,不传或传0为顶级部门 |
| sort | Integer | 是 | 不能为空 | 显示排序 |
| leaderUserId | Long | 否 | - | 负责人用户ID |
| phone | String | 否 | 最长11字符 | 联系电话 |
| String | 否 | 邮箱格式,最长50字符 | 邮箱 | |
| status | Integer | 是 | 必须为 0 或 1 | 状态(0-开启 1-关闭) |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| data | Long | 新创建的部门ID |
3.1.6 编辑部门
页面描述:
- 弹窗或抽屉表单,预填现有数据
- 表单结构与新增一致
- 上级部门选择器中不可选择自身及其子孙部门
业务规则:
| 规则编号 | 规则描述 | 为什么这样设计 |
|---|---|---|
| R-01 | 上级部门不能设为自身,防止循环引用 | 自己不能是自己的上级 |
| R-02 | 上级部门不能设为自身的子孙部门,防止循环引用 | 否则树形结构变成环 |
| R-03 | 如果该部门存在子孙部门,不允许将其状态改为"关闭" | 父部门关闭了,子部门怎么办?需要先处理子部门 |
| R-04 | 修改负责人时,需清除该用户相关的部门缓存 | 确保数据一致性 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 更新部门 | PUT | /admin-api/system/dept/update | 更新部门信息 | system:dept:update |
请求参数:
| 参数名 | 类型 | 必填 | 校验规则 | 说明 |
|---|---|---|---|---|
| id | Long | 是 | 不能为空 | 部门编号 |
| name | String | 是 | 不能为空,最长30字符 | 部门名称 |
| parentId | Long | 否 | - | 父部门ID |
| sort | Integer | 是 | 不能为空 | 显示排序 |
| leaderUserId | Long | 否 | - | 负责人用户ID |
| phone | String | 否 | 最长11字符 | 联系电话 |
| String | 否 | 邮箱格式,最长50字符 | 邮箱 | |
| status | Integer | 是 | 必须为 0 或 1 | 状态(0-开启 1-关闭) |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| data | Boolean | true-成功 |
3.1.7 删除部门
业务规则:
| 规则编号 | 规则描述 | 为什么这样设计 |
|---|---|---|
| R-01 | 逻辑删除,不物理删除 | 保留历史数据用于审计 |
| R-02 | 该部门下不存在子部门才能删除 | 有子部门时删除会导致子部门"悬空" |
| R-03 | 该部门下不存在关联用户才能删除 | 有用户时删除会导致用户"无部门" |
| R-04 | 删除前需二次确认弹窗 | 防止误操作 |
| R-05 | 删除后,关联该部门的用户数据不受影响(用户的 deptId 保留) | 历史数据中仍能看到用户曾属于哪个部门 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 删除部门 | DELETE | /admin-api/system/dept/delete | 删除单个部门 | system:dept:delete |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 是 | 部门编号(Query 参数) |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| data | Boolean | true-成功 |
3.1.8 批量删除部门
业务规则:
| 规则编号 | 规则描述 |
|---|---|
| R-01 | 批量逻辑删除,校验规则同单个删除 |
| R-02 | 任一部门校验不通过则整体失败 |
| R-03 | 需二次确认弹窗:"确认删除选中的 N 个部门吗?" |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 批量删除部门 | DELETE | /admin-api/system/dept/delete-list | 批量删除部门 | system:dept:delete |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | Long[] | 是 | 部门编号列表(Query 参数,逗号分隔) |
3.1.9 部门人员查看
页面描述:
- 点击部门节点或"查看人员"按钮,弹出部门人员列表
- 列表展示该部门及其子部门下所有用户
- 显示用户基本信息:用户名、昵称、手机号、岗位、状态
业务规则:
| 规则编号 | 规则描述 |
|---|---|
| R-01 | 默认包含子部门下的人员(可切换为"仅本部门") |
| R-02 | 支持按用户名、手机号搜索 |
| R-03 | 支持按状态筛选 |
| R-04 | 分页展示,默认每页 10 条 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获取部门人员列表 | GET | /admin-api/system/user/page | 复用用户分页接口,传入 deptId | system:dept:query |
说明: 复用用户管理的分页查询接口,前端在部门管理页面中以弹窗或右侧面板形式展示。需后端支持 deptId 参数自动包含子部门。
3.1.10 部门统计
页面描述:
- 在部门树形列表页面或部门详情中展示统计信息
- 统计项包括:当前部门人数、子部门数量、总人数(含子部门)
业务规则:
| 规则编号 | 规则描述 |
|---|---|
| R-01 | 部门人数统计仅计算直接归属该部门的用户 |
| R-02 | 总人数统计包含所有子部门(递归)下的用户 |
| R-03 | 统计数据实时计算或通过缓存加速 |
| R-04 | 停用状态的部门仍参与统计 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获取部门统计 | GET | /admin-api/system/dept/statistics | 获取部门统计数据 | system:dept:query |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 否 | 部门编号,不传则返回所有部门统计 |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| deptId | Long | 部门编号 |
| deptName | String | 部门名称 |
| directUserCount | Integer | 直属用户数 |
| totalUserCount | Integer | 总用户数(含子部门) |
| childDeptCount | Integer | 直接子部门数 |
| totalDeptCount | Integer | 总子部门数(含递归) |
3.2 后台管理端 - 岗位管理
3.2.1 功能清单
| 功能 | 优先级 | 说明 |
|---|---|---|
| 岗位分页列表 | P0 | 分页展示岗位,支持搜索筛选 |
| 新增岗位 | P0 | 创建新岗位 |
| 编辑岗位 | P0 | 修改岗位信息 |
| 删除岗位 | P0 | 删除单个岗位 |
| 批量删除 | P1 | 批量删除多个岗位 |
| 岗位导出 | P1 | 导出岗位数据为 Excel |
| 岗位精简列表 | P0 | 下拉选择用,仅返回开启状态的岗位 |
3.2.2 岗位分页列表
页面描述:

业务规则:
| 规则编号 | 规则描述 |
|---|---|
| R-01 | 默认按创建时间倒序排列 |
| R-02 | 支持按岗位名称模糊搜索 |
| R-03 | 支持按岗位编码模糊搜索 |
| R-04 | 支持按状态筛选(开启/关闭) |
| R-05 | 分页展示,默认每页 10 条 |
数据字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 岗位编号 |
| name | String | 岗位名称 |
| code | String | 岗位编码 |
| sort | Integer | 显示排序 |
| status | Integer | 状态(0-开启 1-关闭) |
| remark | String | 备注 |
| createTime | DateTime | 创建时间 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获取岗位分页列表 | GET | /admin-api/system/post/page | 获取岗位分页列表 | system:post:query |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | String | 否 | 岗位名称,模糊匹配 |
| code | String | 否 | 岗位编码,模糊匹配 |
| status | Integer | 否 | 展示状态(0-开启 1-关闭) |
| pageNo | Integer | 是 | 页码 |
| pageSize | Integer | 是 | 每页条数 |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| list | Post[] | 岗位列表 |
| total | Long | 总记录数 |
3.2.3 获取岗位精简信息列表
页面描述:
- 用于前端下拉选择器(如用户管理中的"岗位"字段)
- 仅返回开启状态的岗位
- 按排序值升序排列
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 获取岗位精简列表 | GET | /admin-api/system/post/simple-list | 获取开启状态的岗位精简信息 | 无(登录即可) |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Long | 岗位编号 |
| name | String | 岗位名称 |
3.2.4 新增岗位
页面描述:

表单字段:
| 字段 | 控件类型 | 必填 | 校验规则 | 说明 |
|---|---|---|---|---|
| 岗位名称 | 输入框 | 是 | 不能为空,最长50字符 | 岗位显示名称 |
| 岗位编码 | 输入框 | 是 | 不能为空,最长64字符 | 岗位唯一标识编码 |
| 显示排序 | 数字输入框 | 是 | 不能为空,正整数 | 控制展示顺序 |
| 状态 | 单选/开关 | 否 | 必须为 0 或 1 | 0-开启 1-关闭 |
| 备注 | 文本域 | 否 | - | 岗位说明 |
业务规则:
| 规则编号 | 规则描述 | 为什么这样设计 |
|---|---|---|
| R-01 | 岗位编码全局唯一(不含已逻辑删除的数据) | 编码是程序内部引用的唯一标识,不能重复 |
| R-02 | 岗位名称不要求全局唯一 | 不同部门可以有同名岗位 |
| R-03 | 岗位编码创建后建议不可修改 | 避免与用户关联数据不一致 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 创建岗位 | POST | /admin-api/system/post/create | 创建新岗位 | system:post:create |
请求参数:
| 参数名 | 类型 | 必填 | 校验规则 | 说明 |
|---|---|---|---|---|
| name | String | 是 | 不能为空,最长50字符 | 岗位名称 |
| code | String | 是 | 不能为空,最长64字符 | 岗位编码 |
| sort | Integer | 是 | 不能为空 | 显示排序 |
| status | Integer | 否 | 必须为 0 或 1 | 状态(0-开启 1-关闭) |
| remark | String | 否 | - | 备注 |
返回结果:
| 字段名 | 类型 | 说明 |
|---|---|---|
| data | Long | 新创建的岗位ID |
3.2.5 编辑岗位
页面描述:
- 弹窗表单,预填现有数据
- 表单结构与新增一致
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 修改岗位 | PUT | /admin-api/system/post/update | 更新岗位信息 | system:post:update |
请求参数:
| 参数名 | 类型 | 必填 | 校验规则 | 说明 |
|---|---|---|---|---|
| id | Long | 是 | 不能为空 | 岗位编号 |
| name | String | 是 | 不能为空,最长50字符 | 岗位名称 |
| code | String | 是 | 不能为空,最长64字符 | 岗位编码 |
| sort | Integer | 是 | 不能为空 | 显示排序 |
| status | Integer | 否 | 必须为 0 或 1 | 状态 |
| remark | String | 否 | - | 备注 |
3.2.6 删除岗位
业务规则:
| 规则编号 | 规则描述 | 为什么这样设计 |
|---|---|---|
| R-01 | 逻辑删除 | 保留历史数据 |
| R-02 | 该岗位下有关联用户时拒绝删除 | 有用户时删除会导致用户"无岗位" |
| R-03 | 删除前需二次确认弹窗 | 防止误操作 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 删除岗位 | DELETE | /admin-api/system/post/delete | 删除单个岗位 | system:post:delete |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 是 | 岗位编号(Query 参数) |
3.2.7 批量删除岗位
业务规则:
| 规则编号 | 规则描述 |
|---|---|
| R-01 | 批量逻辑删除,校验规则同单个删除 |
| R-02 | 任一岗位校验不通过则整体失败 |
| R-03 | 需二次确认弹窗 |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 批量删除岗位 | DELETE | /admin-api/system/post/delete-list | 批量删除岗位 | system:post:delete |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | Long[] | 是 | 岗位编号列表(Query 参数,逗号分隔) |
3.2.8 岗位导出
页面描述:
- 导出当前筛选条件下的所有岗位数据为 Excel
- 导出字段:岗位序号、岗位名称、岗位编码、岗位排序、状态、创建时间
业务规则:
| 规则编号 | 规则描述 |
|---|---|
| R-01 | 导出格式为 xls |
| R-02 | 导出当前筛选条件下的所有数据(不分页) |
| R-03 | 状态字段使用字典翻译显示(如"开启"/"关闭") |
接口设计:
| 接口名称 | 请求方式 | 接口路径 | 说明 | 权限标识 |
|---|---|---|---|---|
| 导出岗位 | GET | /admin-api/system/post/export-excel | 导出岗位Excel | system:post:export |
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | String | 否 | 岗位名称,模糊匹配 |
| code | String | 否 | 岗位编码,模糊匹配 |
| status | Integer | 否 | 展示状态 |
返回结果: 文件下载流,文件名"岗位数据.xls"
3.3 前台用户端
本模块前台用户端无独立功能页面。部门和岗位信息在前台用户端的体现如下:
| 使用场景 | 说明 |
|---|---|
| 个人中心展示 | 显示用户所属部门名称、岗位名称(只读) |
| 注册/信息填写 | 提供部门和岗位的下拉选择(调用精简列表接口) |
四、非功能需求
4.1 性能要求
| 指标 | 要求 | 说明 |
|---|---|---|
| 部门树形列表查询响应时间 | < 500ms(建议 < 200ms) | 500 个部门内流畅渲染 |
| 部门精简列表查询响应时间 | < 200ms | 用于下拉选择,需要快速响应 |
| 部门创建/更新响应时间 | < 500ms | 包含循环引用校验 |
| 岗位分页列表查询响应时间 | < 300ms | 常规分页查询 |
| 岗位导出(1000条以内)响应时间 | < 5s | Excel 生成 |
| 部门子部门缓存查询 | < 50ms | 高频场景(如数据权限过滤) |
4.2 安全要求
| 要求 | 说明 | 实现方式 |
|---|---|---|
| 权限控制 | 部门管理需对应权限标识 | @PreAuthorize 注解 |
| 数据隔离 | 部门表支持多租户隔离 | tenant_id 字段 |
| 循环引用检测 | 部门编辑时必须校验 | 递归检查上级链路 |
| 删除保护 | 存在子部门或关联用户的部门不允许删除 | 删除前校验 |
| 操作日志 | 部门/岗位的增删改操作记录操作日志 | AOP 切面 |
4.3 兼容性要求
| 端 | 要求 |
|---|---|
| PC浏览器 | Chrome 80+、Firefox 75+、Safari 13+、Edge 80+ |
| 分辨率 | 最小支持 1280x720,推荐 1920x1080 |
4.4 可用性要求
| 要求 | 说明 |
|---|---|
| 树形结构渲染 | 部门数在 500 以内时,树形渲染应流畅无卡顿 |
| 缓存机制 | 子部门ID列表提供缓存能力,高频查询场景性能有保障 |
| 乐观锁/并发 | 部门/岗位编辑支持乐观锁,防止并发覆盖 |
五、数据设计
5.1 数据模型
部门表(system_dept)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 部门ID(主键) |
| name | VARCHAR(30) | NOT NULL | 部门名称 |
| parent_id | BIGINT | NOT NULL, DEFAULT 0 | 父部门ID(0 为顶级部门) |
| sort | INT | NOT NULL, DEFAULT 0 | 显示顺序 |
| leader_user_id | BIGINT | - | 负责人用户ID(关联 system_users.id) |
| phone | VARCHAR(11) | - | 联系电话 |
| VARCHAR(50) | - | 邮箱 | |
| status | TINYINT | NOT NULL, DEFAULT 0 | 状态(0-开启 1-关闭) |
| tenant_id | BIGINT | NOT NULL, DEFAULT 0 | 租户编号(多租户隔离) |
| creator | VARCHAR(64) | - | 创建者(用户ID) |
| create_time | DATETIME | NOT NULL | 创建时间 |
| updater | VARCHAR(64) | - | 更新者(用户ID) |
| update_time | DATETIME | NOT NULL | 最后更新时间 |
| deleted | BIT(1) | NOT NULL, DEFAULT 0 | 删除标记(0-未删除 1-已删除) |
索引设计:
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_parent_id | 普通索引 | parent_id | 按父部门查询子部门 |
| idx_tenant_id | 普通索引 | tenant_id | 租户隔离查询 |
岗位表(system_post)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGINT | PK, AUTO_INCREMENT | 岗位编号(主键) |
| name | VARCHAR(50) | NOT NULL | 岗位名称 |
| code | VARCHAR(64) | NOT NULL | 岗位编码 |
| sort | INT | NOT NULL, DEFAULT 0 | 显示顺序 |
| status | TINYINT | NOT NULL, DEFAULT 0 | 状态(0-开启 1-关闭) |
| remark | VARCHAR(255) | - | 备注 |
| creator | VARCHAR(64) | - | 创建者(用户ID) |
| create_time | DATETIME | NOT NULL | 创建时间 |
| updater | VARCHAR(64) | - | 更新者(用户ID) |
| update_time | DATETIME | NOT NULL | 最后更新时间 |
| deleted | BIT(1) | NOT NULL, DEFAULT 0 | 删除标记(0-未删除 1-已删除) |
索引设计:
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| uk_code | 唯一索引 | code | 岗位编码唯一 |
5.2 关联关系

5.3 数据字典
| 字典类型标识 | 字典类型名称 | 字典值 | 说明 |
|---|---|---|---|
| common_status | 通用状态 | 0-开启, 1-关闭 | 部门/岗位状态共用 |
六、跨模块联动
6.1 联动关系总览
| 关联模块 | 联动方式 | 联动说明 |
|---|---|---|
| 用户管理 | 用户归属部门 | 用户管理中创建/编辑用户时选择部门和岗位,部门精简列表和岗位精简列表被用户表单调用 |
| 角色权限 | 数据权限依赖 | 数据权限的"本部门""本部门及子部门"等选项依赖部门树结构进行数据过滤 |
| 租户管理 | 租户隔离 | 部门表有 tenant_id 字段,不同租户的部门数据完全隔离 |
| 日志审计 | 操作记录 | 部门/岗位的增删改操作记录到操作日志 |
| 数据字典 | 状态翻译 | 部门/岗位状态使用通用状态字典(common_status)进行翻译 |
6.2 关键联动流程
6.2.1 创建用户 → 选择部门岗位

6.2.2 数据权限 → 部门过滤

6.2.3 部门调整 → 影响范围

6.3 数据一致性要求
| 场景 | 一致性要求 |
|---|---|
| 删除部门 | 必须先清空关联用户或转移用户到其他部门 |
| 停用部门 | 该部门在下拉列表中隐藏,但已有用户数据不变 |
| 部门迁移 | 子部门跟随迁移,数据权限缓存需要刷新 |
| 岗位删除 | 必须先清空关联用户或转移用户到其他岗位 |
七、附录
7.1 名词解释
| 术语 | 解释 | 类比 |
|---|---|---|
| 部门树 | 部门之间通过 parentId 形成父子关系的层级结构,像一棵倒置的树 | 就像公司的组织架构图——CEO 下面是各 VP,VP 下面是各部门经理,经理下面是各小组长 |
| 岗位 | 公司中的职位类型,与部门独立管理 | 部门是"你在哪个团队",岗位是"你做什么工作"——同一个"工程师"岗位可以在不同部门 |
| 岗位编码 | 岗位的唯一业务标识,用于程序内部引用 | 就像员工的工号——名字可能重名,但工号是唯一的 |
| 逻辑删除 | 不物理删除数据,通过 deleted 标记字段标识已删除状态 | 就像把文件放进"回收站"——看不到了,但还能恢复 |
| 租户隔离 | SaaS 模式下不同租户的组织架构数据完全隔离 | 就像同一栋写字楼里不同公司的组织架构互不可见 |
| 精简列表 | 仅返回必要字段(ID、名称等)的列表,用于前端下拉选择器 | 就像通讯录的"快速拨号"——只显示名字和号码,不显示详细信息 |
| 排序值 | 控制同级节点展示顺序的数值,值越小越靠前 | 就像排队——号码越小越靠前 |
| 循环引用 | 部门的上级链路形成环(A 的上级是 B,B 的上级是 A) | 就像"鸡生蛋、蛋生鸡"的死循环——系统必须防止这种情况 |
| 负责人 | 部门的管理者,通过关联系统中的用户来指定 | 就像团队的"组长"——从团队成员中选一个人来负责 |
| 树形下拉 | 以树形结构展示的下拉选择器,用于选择有层级关系的数据 | 就像文件选择对话框——可以展开文件夹选择子目录 |
7.2 权限标识
| 权限标识 | 说明 | 所属菜单 |
|---|---|---|
| system:dept:query | 查询部门 | 系统管理 > 组织架构 > 部门管理 |
| system:dept:create | 创建部门 | 系统管理 > 组织架构 > 部门管理 |
| system:dept:update | 修改部门 | 系统管理 > 组织架构 > 部门管理 |
| system:dept:delete | 删除部门 | 系统管理 > 组织架构 > 部门管理 |
| system:post:query | 查询岗位 | 系统管理 > 组织架构 > 岗位管理 |
| system:post:create | 创建岗位 | 系统管理 > 组织架构 > 岗位管理 |
| system:post:update | 修改岗位 | 系统管理 > 组织架构 > 岗位管理 |
| system:post:delete | 删除岗位 | 系统管理 > 组织架构 > 岗位管理 |
| system:post:export | 导出岗位 | 系统管理 > 组织架构 > 岗位管理 |
7.3 接口汇总
| 序号 | 接口名称 | 请求方式 | 接口路径 | 权限标识 | 优先级 |
|---|---|---|---|---|---|
| 1 | 获取部门列表 | GET | /admin-api/system/dept/list | system:dept:query | P0 |
| 2 | 获取部门精简列表 | GET | /admin-api/system/dept/simple-list | 无 | P0 |
| 3 | 获得部门信息 | GET | /admin-api/system/dept/get | system:dept:query | P0 |
| 4 | 创建部门 | POST | /admin-api/system/dept/create | system:dept:create | P0 |
| 5 | 更新部门 | PUT | /admin-api/system/dept/update | system:dept:update | P0 |
| 6 | 删除部门 | DELETE | /admin-api/system/dept/delete | system:dept:delete | P0 |
| 7 | 批量删除部门 | DELETE | /admin-api/system/dept/delete-list | system:dept:delete | P1 |
| 8 | 获取部门统计 | GET | /admin-api/system/dept/statistics | system:dept:query | P2 |
| 9 | 获取岗位分页列表 | GET | /admin-api/system/post/page | system:post:query | P0 |
| 10 | 获取岗位精简列表 | GET | /admin-api/system/post/simple-list | 无 | P0 |
| 11 | 创建岗位 | POST | /admin-api/system/post/create | system:post:create | P0 |
| 12 | 修改岗位 | PUT | /admin-api/system/post/update | system:post:update | P0 |
| 13 | 删除岗位 | DELETE | /admin-api/system/post/delete | system:post:delete | P0 |
| 14 | 批量删除岗位 | DELETE | /admin-api/system/post/delete-list | system:post:delete | P1 |
| 15 | 导出岗位 | GET | /admin-api/system/post/export-excel | system:post:export | P1 |
7.4 变更记录
| 版本 | 日期 | 修改内容 | 修改人 |
|---|---|---|---|
| v1.0 | 2026-09-23 | 初始版本,包含部门管理和岗位管理完整功能设计 | PMForge Team |
| v2.0 | 2026-09-19 | 增强版:补充业务场景细节、验收标准、跨模块联动、名词解释、ASCII线框图 | PM Team |
本文档为组织架构管理模块PRD,如有问题请联系产品负责人。