基本介绍
源码插件通过services.Org()消费组织能力。组织能力是可选框架能力,官方提供方插件标识为linapro-org-core。当提供方不可用时,服务返回安全降级结果,调用方应通过Available()或Status()判断是否展示组织相关功能。
动态插件可声明service: org调用已发布的只读组织方法。
能力阶段:运行期
类型支持:源码插件、动态插件
能力设计
SPI模式
Org能力采用SPI模式,具体组织逻辑由提供方插件实现。提供方通过orgcap.Provide(pluginID, factory)注册,宿主首次使用组织能力时才构造提供方,并传入ProviderEnv,其中包含插件ID、源码插件专属TenantFilter和用户视图能力。
提供方边界
orgcap.Provider包含组织插件需要实现的完整能力,包括部门视图、岗位视图、部门范围过滤、用户组织归属写入和工作台视图。普通Org()只暴露读取型消费面;涉及gdb.Model的数据范围、用户归属写入和工作台适配接口都留在宿主内部或提供方边界。
安全降级
能力可选,调用方必须处理组织能力不可用时的空结果或不可用状态。提供方是延迟构造的,宿主只在能力被使用时构造提供方,避免启动阶段强依赖可选插件。
接口定义
源码插件接口
| 方法 | 说明 |
|---|---|
Available | 判断组织能力是否有可用提供方 |
Status | 返回能力状态、活跃提供方和冲突原因 |
ListUserDeptAssignments | 批量读取用户部门归属视图 |
GetUserDeptInfo | 读取单个用户部门标识和名称 |
GetUserDeptName | 读取单个用户部门名称 |
GetUserDeptIDs | 读取单个用户部门标识集合 |
GetUserPostIDs | 读取单个用户岗位标识集合 |
动态插件接口
| 动态方法 | 说明 |
|---|---|
capability.available | 判断组织能力是否有可用提供方 |
capability.status | 返回能力状态和活跃提供方 |
users.dept_assignments.list | 批量读取用户部门归属视图 |
users.dept_info.get | 读取单个用户部门标识和名称 |
users.dept_name.get | 读取单个用户部门名称 |
users.dept_ids.get | 读取单个用户部门标识集合 |
users.post_ids.get | 读取单个用户岗位标识集合 |
能力使用
源码插件使用
源码插件通过services.Org()读取组织视图:
// 检查组织能力是否可用
if !services.Org().Available(ctx) {
// 降级处理
return
}
// 读取用户部门信息
deptInfo, err := services.Org().GetUserDeptInfo(ctx, userID)
// 批量读取用户部门归属
result, err := services.Org().ListUserDeptAssignments(ctx, userIDs)
// 读取用户岗位
postIDs, err := services.Org().GetUserPostIDs(ctx, userID)
动态插件使用
动态插件在plugin.yaml中声明org服务和授权方法:
hostServices:
- service: org
methods:
- capability.available
- users.dept_name.get
- users.post_ids.get
org是none资源类型,不声明paths、tables、keys或resources。在动态插件侧使用:
orgSvc := pluginbridge.Default().Org()
// 检查组织能力是否可用
available := orgSvc.Available(ctx)
// 读取用户部门名称
deptName, err := orgSvc.GetUserDeptName(ctx, userID)
设计约束
- 普通消费面只读。 插件不能通过
Org()维护部门、岗位或用户组织归属。 - 数据范围不对普通插件暴露。 组织数据范围需要数据库查询构建器,属于宿主内部
ScopeService。 - 能力可选。 调用方必须处理组织能力不可用时的空结果或不可用状态。
- 提供方是延迟构造。 宿主只在能力被使用时构造提供方,避免启动阶段强依赖可选插件。