safety-eval-service/docs/gbs/岗位与GBS角色关联说明.md

5.3 KiB
Raw Blame History

业务系统岗位与 GBS 角色关联说明

1. 背景与包含关系

安全评价业务系统运行在 GBS 底座之上,权限能力形成包含关系:

  • GBS 负责统一身份、菜单/功能权限与角色控制,权限边界更大;
  • 业务系统维护自身的组织机构(部门、岗位、人员);
  • 业务系统不能绕过 GBS 自行做底座级功能授权,因此通过 岗位 ↔ GBS 角色 关联,在岗位变更时同步更新人员在 GBS 侧的角色。
flowchart TB
  subgraph GBS["GBS 底座(权限超集)"]
    GBS_AUTH[身份认证]
    GBS_ROLE[角色权限]
    GBS_MENU[功能/菜单授权]
  end

  subgraph BIZ["安全评价业务系统(子集)"]
    DEPT[部门]
    POST[岗位]
    PERSON[人员]
    POST -->|关联| GBS_ROLE_REF[gbs_role_code / gbs_role_name]
    PERSON -->|隶属| POST
  end

  BIZ -->|运行于| GBS
  PERSON -->|同步角色| GBS_ROLE
  POST_GBS_LINK[岗位-角色关联] --> POST
  POST_GBS_LINK --> GBS_ROLE_REF

2. 硬性约束

  1. 存在硬编码角色权限的业务逻辑时,必须先在 GBS 创建对应角色,再在本系统 GbsRoleEnum 中登记;业务代码只从枚举取值,禁止散落硬编码角色码字符串。
  2. 业务系统通过岗位与 GBS 角色关联;当岗位重新分配 GBS 角色、岗位编辑且已有 GBS 角色关联且岗位下存在人员、或人员岗位发生变更且新岗位已关联 GBS 角色时,触发对人员 GBS 角色的更新(覆盖式 updateUserRole)。
  3. GBS UserFacade 当前无批量改角色接口,实现上优先探测批量能力;若无则 依次 调用 gbsUserFacadeClient.updateUserRole(封装为 updateUserRolesSequentially)。

3. 数据模型

org_position 新增字段:

字段 类型 说明
gbs_role_id bigint 关联 GBS 角色ID
gbs_role_code varchar(64) 关联 GBS 角色编码
gbs_role_name varchar(100) 关联 GBS 角色名称(展示用)

MySQL全量

ALTER TABLE `org_position`
  ADD COLUMN `gbs_role_id` bigint DEFAULT NULL COMMENT '关联GBS角色ID' AFTER `duty_desc`,
  ADD COLUMN `gbs_role_code` varchar(64) DEFAULT NULL COMMENT '关联GBS角色编码' AFTER `gbs_role_id`,
  ADD COLUMN `gbs_role_name` varchar(100) DEFAULT NULL COMMENT '关联GBS角色名称' AFTER `gbs_role_code`;

若此前已加过 code/name仅补 IDdocs/db/alter-org-position-gbs-role-id.sql

人员与岗位关系:org_personnel.post_id = org_position.id;人员主键与 GBS 用户 id 一致(创建人员时写入 GBS

4. 接口

方法 路径 说明
POST /safetyEval/org-position/assign-gbs-role 为岗位分配 GBS 角色,并同步岗位下人员
GET /safetyEval/org-position/gbs-roles 拉取 GBS 角色列表(下拉)
POST /safetyEval/org-position/modify 原编辑接口;若岗位已有 GBS 角色且有人员,则同步人员角色

分配入参 OrgPositionAssignGbsRoleCmdidgbsRoleIdgbsRoleCodegbsRoleName(可选,空则尝试按 code 反查名称)。

5. 业务流程

5.1 分配角色

sequenceDiagram
  participant UI as 部门岗位页
  participant API as OrgPositionController
  participant EXE as OrgPositionExecutor
  participant DB as org_position / org_personnel
  participant GBS as GbsUserFacadeClient

  UI->>API: POST /assign-gbs-role
  API->>EXE: assignGbsRole(cmd)
  EXE->>DB: 更新岗位 gbs_role_*
  EXE->>DB: listByPostId(positionId)
  alt 岗位下存在人员
    loop 每人(无批量接口)
      EXE->>GBS: updateUserRole(roleCodes=[code])
    end
  end
  EXE-->>UI: 岗位 CO含角色

5.2 编辑岗位时同步

flowchart TD
  A[POST /modify 编辑岗位] --> B[保存岗位基本信息]
  B --> C{岗位是否已关联 gbs_role_code?}
  C -->|否| Z[结束]
  C -->|是| D{岗位下是否有人员?}
  D -->|否| Z
  D -->|是| E[依次 updateUserRole]
  E --> Z

5.4 人员新增时角色

flowchart TD
  A[新增人员] --> B{是否选择岗位?}
  B -->|否| D[创建 GBS 用户:默认 auth.roleId.org]
  B -->|是| C{岗位是否有 gbs_role_id / gbs_role_code?}
  C -->|是| E[创建 GBS 用户:同时传入 roleId + roleCode]
  C -->|否| D

5.3 硬编码角色使用约定

flowchart LR
  NEED[业务需要固定角色判断] --> CREATE[先在 GBS 创建角色]
  CREATE --> ENUM[登记到 GbsRoleEnum]
  ENUM --> CODE[业务从枚举 getCode/getName]
  CODE --> LOGIC[开展业务逻辑]

6. 前端使用流程

路径:/safetyEval/container/EnterpriseInfo/DepartmentPosition

  1. 选择左侧部门查看岗位列表含「GBS角色」列
  2. 行操作点击「分配角色」。
  3. 弹窗从 /gbs-roles 加载下拉,选择后提交 /assign-gbs-role
  4. 若该岗位已有人员,后端依次更新其 GBS 角色后返回成功。

7. 关键代码索引

层级 位置
枚举 client/enums/GbsRoleEnum
API OrgPositionApi#assignGbsRole / #listGbsRoles
执行 OrgPositionExecutor
GBS 用户 GbsUserFacadeClient#updateUserRole / #updateUserRolesSequentially
GBS 角色 GbsRoleFacadeClient#listRoles
前端 DepartmentPosition + api/orgPosition