# 系统变量SPI扩展文档

# 一、版本依赖及组件拓扑图

版本要求: 需要依赖boot-starter-formula 5.6.30及其以上版本, 如果SPI扩展系统变量需要所有服务通用,也需要保证udc、bpm等服务至少依赖boot-starter-formula 5.6.30及其以上版本。

# 二、配置和实现方式

# 2.1 nacos配置

seeyon:
  spi:
    enable: true
    spi-plugins:
      - oss:com.seeyon,your-spi-project,1.0.1
      - maven:com.seeyon,your-spi-project,1.0.1

上述配置可以添加到nacos中public下,这样SPI扩展实现可以对所有服务生效

如果不想对所有服务生效,可以配置到指定服务下,选择指定服务的DataID进行配置即可

spi-plugins有两种配置方式,oss或maven配置方式。取决于spi扩展工程打包后是上传到Maven仓库还是oss对象存储中。只需选择其中一种方式即可。配置格式为: groupId,artifactId,version

# 2.2 系统变量接口实现

系统变量的扩展需要实现SystemVariableSPIService接口, 并在SPI扩展工程的resources/META-INFO/spring.factories文件中配置接口实现,如下图所示:

# 使用限制

1.方法必须是public的,可以是静态方法,也可以是实例方法

2.方法必须添加@SPISystemVariable注解修饰

3.方法返回值类型只支持基本类型和基本类型集合,不支持复杂DTO对象

4.系统变量方法不支持参数


SPISystemVariable注解属性描述:

属性名 描述 用法
type 系统变量类型 目前系统变量只支持日期、组织模型两种类型
description 系统变量描述 可以直接写描述,也可以写国际化词条,但是需要在后台管理中设置对应词条信息
relationEntity 关联实体fullName 如果返回值是关联实体比如人员ID、机构ID等数据,需要在relationEntity中写明对应关联实体的fullName, 比如下面demo中获取人员ID,relationEntity需要标明: com.seeyon.organization.domain.core.entity.OrgMember
sort 排序 SPI扩展的系统变量默认都是排在预制系统变量后面,这里是指所有SPI系统变量中的排序(按sort从小到大顺序)。
hidden 是否隐藏 如果某些扩展的SPI系统变量后续不想让用户选择了,但是直接去掉又会影响在途数据,可以隐藏掉。

以下是一个扩展系统变量Demo:

public class DemoSPISystemVariableService implements SystemVariableSPIService {


    @SPISystemVariable(
        type = SPISystemVariableType.ORGANIZATION ,
        description = "SPI登录人id系统变量静态",
        relationEntity = "com.seeyon.organization.domain.core.entity.OrgMember")
    public static Long getCustomLoginUserId(){
        //演示: 静态方法扩展系统变量
        Long userId = Apps.getRequestContext().getUserId();;
        return userId;
    }

    @SPISystemVariable(
        type = SPISystemVariableType.ORGANIZATION ,
        description = "SPI登录人id系统变量实例方法",
        relationEntity = "com.seeyon.organization.domain.core.entity.OrgMember")
    public Long getCustomLoginUserIdInstance(){
        //演示 1.实例方法注册系统变量  2.在SPI系统变量方法中获取平台组件中bean,也可以获取其他SPI实现类
        ExpressionService expressionService = Apps.getApplicationContext().getBean(ExpressionService.class);
        return (Long)expressionService.getSystemVariableResultByName("currentUserId");
    }


    @SPISystemVariable(
        type = SPISystemVariableType.ORGANIZATION ,
        description = "SPI登录人id系统变量实例方法2",
        relationEntity = "com.seeyon.organization.domain.core.entity.OrgMember")
    public Long getCustomLoginUserIdInstance2(){
        //演示 1.实例方法注册系统变量  2.获取请求上下文信息
        return Apps.getRequestContext().getUserId();
    }

}

编撰人:gongzn