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

149 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 业务系统岗位与 GBS 角色关联说明
## 1. 背景与包含关系
安全评价业务系统运行在 **GBS 底座**之上,权限能力形成包含关系:
- GBS 负责统一身份、菜单/功能权限与角色控制,权限边界更大;
- 业务系统维护自身的组织机构(部门、岗位、人员);
- 业务系统不能绕过 GBS 自行做底座级功能授权,因此通过 **岗位 ↔ GBS 角色** 关联,在岗位变更时同步更新人员在 GBS 侧的角色。
```mermaid
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全量
```sql
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仅补 ID`docs/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 角色且有人员,则同步人员角色 |
分配入参 `OrgPositionAssignGbsRoleCmd``id`、`gbsRoleId`、`gbsRoleCode`、`gbsRoleName`(可选,空则尝试按 code 反查名称)。
## 5. 业务流程
### 5.1 分配角色
```mermaid
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 编辑岗位时同步
```mermaid
flowchart TD
A[POST /modify 编辑岗位] --> B[保存岗位基本信息]
B --> C{岗位是否已关联 gbs_role_code?}
C -->|否| Z[结束]
C -->|是| D{岗位下是否有人员?}
D -->|否| Z
D -->|是| E[依次 updateUserRole]
E --> Z
```
### 5.4 人员新增时角色
```mermaid
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 硬编码角色使用约定
```mermaid
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` |