使用脚本图元
# 1 脚本图元介绍
在逻辑流编辑器中,为了满足各种业务需求,提供了脚本图元。脚本图元简化了数据处理流程,使得业务逻辑更加灵活。编写这些脚本的内容时,需要遵循一定的规则,这些规则与Groovy脚本的编写规则一致。
脚本在编写过程中可以直接获取逻辑流定义参数。用户无需额外配置或查找,只需输入参数名称,便能轻松获取并使用该参数。
# 2 脚本图元基础语法
# 2.1 定义变量
在Groovy中,变量可以使用def关键字定义,也可以省略def直接声明变量。例如:
def name = "John"
String name = "John"
# 2.2 控制流语句
Groovy支持if/else、switch、while、for等控制流语句。例如:
if (name == "John") {
//业务代码
} else {
//业务代码
}
# 2.3 集合操作
Groovy提供了丰富的集合操作,如使用[]运算符访问集合元素、使用size()方法获取集合大小、使用each方法遍历集合等。例如:
def list = [1, 2, 3, 4, 5]
list.each { println it }
# 2.4 闭包
闭包是Groovy中的一个重要特性,它是一个可调用的代码块。闭包可以作为参数传递给其他函数,也可以作为值返回。例如:
def add(a, b) { a + b }
def add_closure = { a -> add(a, 1) }
println add_closure(2) // 输出3
# 2.5 调用Java类和方法
由于Groovy基于JVM,因此可以直接调用Java类和方法。例如:
def javaClass = String.class
println javaClass.getName() // 输出"java.lang.String"
以上是Groovy脚本的一些基础语法,更多高级用法和特性可以参考Groovy官方文档。
# 3 使用服务变量
在逻辑流编辑器中,可以通过脚本图元对已定义的变量、输入参数和返回值进行操作。这些变量、参数和返回值都可以在脚本图元中被访问,进行读取或赋值。这种灵活性使得用户可以根据需要自由地调整脚本,从而满足不同的业务需求。
示例一:如何在脚本中使用服务变量?
1.参数定义
逻辑流属性设置中定义变量var1
与输入参数param
,数据类型为String
,定义返回值out
,数据类型为List
。
2.选择变量参数
脚本图元属性设置中,打开选择值弹窗,点击变量类型区域,选择已定义好的变量与参数。
3.脚本内容编写
为变量赋值,使用变量与输入参数,组装为一个新的List集合out1
并赋值给返回值参数out
。
4.执行调试
执行当前逻辑流,输入param
参数值,开启逻辑流断点调试,可以看到变量与输入参数值详情,返回值在脚本图元执行完毕后赋值成功。
# 4 使⽤JAVA API
# 4.1 调用AFCENTER SDK
基于Groovy的特性,可以在脚本图元中直接调用AFCENTER的SDK接口方法完成业务场景操作。
示例三:如何调用AFCNETER SDK接口?
这里使用场景以调用AFCENTER 应用模块的SDK接口为例,输入应用id查询应用详情。
1.参数定义
逻辑流属性设置中定义返回值out
,数据类型为应用SDO实体com.primeton.gocom.afcenter.model.app.Application
.
2.脚本内容编写
a.使用import
引入需要调用的JAVA类IAFCClient
、AFCClientFactory
、IApplicationAPI
;
import com.primeton.gocom.afcenter.sdk.IAFCClient;
import com.primeton.gocom.afcenter.sdk.AFCClientFactory;
import com.primeton.gocom.afcenter.sdk.api.IApplicationAPI;
b.调用AFCClientFactory
类中方法实例化接口类IAFCClient
;
IAFCClient afcClient = AFCClientFactory.getInstance().createAFCClient();
c.调用接口类IAFCClient
中方法获取IApplicationAPI
对象;
IApplicationAPI applicationAPI = afcClient.getApplicationAPI();
d.调用接口类IApplicationAPI
中方法获取应用信息并赋值给返回值。
context.out = applicationAPI.findApp("1");
3.执行调试
执行当前逻辑流,通过断点调试可以看出,返回值out
在执行完SDK调用后,获取到应用详情数据。
# 5 使⽤环境变量
在脚本图元中,可以获取环境变量参数值实现具体业务场景。
# 5.1 使⽤系统变量
示例四:如何获取系统变量中的变量值?
1.定义变量
逻辑流属性设置中定义变量sysVar
,数据类型为String
。
2.脚本内容编写
脚本中获取系统变量中变量afc-test3
的值,并赋值给变量sysVar
。
context.sysVar = context.systemVars.get("afc-test3");
3.执行调试
执行当前逻辑流,从断点调试中可以看出变量sysVar
成功获取到系统变量中afc-test3
的值。
# 5.2 使⽤应用系统变量
示例五:如何获取应用系统变量中的变量值?
1.定义变量
逻辑流属性设置中定义变量appVar
,数据类型为String
。
2.脚本内容编写
脚本中获取系统变量中变量BI_USE
的值,并赋值给变量appVar
。
context.appVar = context.appSystemVars.get("BI_USE");
3.执行调试
执行当前逻辑流,从断点调试中可以看出变量appVar
成功获取到应用系统变量中BI_USE
的值。
# 5.3 使⽤用户变量
示例六:如何获取MUO用户上下文中变量值?
1.定义变量
逻辑流属性设置中定义变量userId
,数据类型为String
。
2.脚本内容编写
脚本中获取当前登录用户变量中变量userId
的值,并赋值给变量userId
。
context.userId = userObject.getUserId();
也可以通过选择值弹窗中方法区域选择需要获取的用户变量。
3.执行调试
执行当前逻辑流,从断点调试中可以看出变量userId
成功获取到用户变量中userId
的值。
# 6 调试⽇志
在脚本图元中,支持实时代码调试功能,这使得开发者能够实时监控脚本运行时的变量值变化。在开发过程中,如果需要跟踪某个变量的值,可以使用内置的helper.echo(obj)
函数。这个函数会在调试时输出变量的当前值,帮助使用者更好地理解脚本的执行流程和变量的动态变化。通过这种方式,可以更加便捷地调试业务逻辑,确保脚本的正确性和稳定性。
示例七:如何使用调试输出变量值?
1.脚本内容编写
脚本内容中使用helper.echo()
,在脚本代码执行前后分别输出变量userId
。
helper.echo("开始执行!!!!userId = " + context.userId)
context.userId = userObject.getUserId();
helper.echo("执行结束!!!!userId = " + context.userId)
2.执行调试
执行当前逻辑流,从断点调试变量区中可以看出变量___echoMessage_invokePojo2
的值就是脚本中的做的变量值输出。
# 7 常⻅问题
# 7.1 操作java数组
在 Groovy脚本 中操作 Java 数组的方式与在 Java 中非常相似,因为 Groovy 是基于 Java 的,并且可以无缝地使用 Java 的类库。
# 7.1.1 java数组怎么转换为集合?
将数组转换为集合:
int[] numbers = new int[] {1, 2, 3, 4, 5}
Set<Integer> numberSet = new HashSet<>(numbers) // 将数组转换为集合
# 7.1.2 java集合怎么转换为数组?
将集合转换为数组:
Integer[] numberArray = numberSet.toArray(new Integer[0]) // 将集合转换为数组
# 7.1.3 Groovy中数组的引用的传递问题
示例八:如何解决数组引用传递问题?
1.参数定义
逻辑流属性配置中定义返回值arrays
,数据类型是String,勾选数组。
2.脚本内容编写
脚本内容中为arrays数组循环赋值,创建了一个新的变量arrays2,并将arrays赋值给它。修改arrays2数组的第二个元素值。
context.arrays = [];
for(int i=0;i<5;i++){
context.arrays[i] = i+"";
}
def arrays2 = context.arrays;
//修改数组arrays2第二个元素为字符串10
arrays2[2] = "10";
3.执行调试
执行当前逻辑流,从返回结果可以看出,原始数组arrays的第二个元素值也发生了变化。
4.分析解决
出现这个问题的原因是,在Java和Groovy中,当使用基本数据类型(如int、char、boolean等)时,它们是通过值传递的。然而,对于对象引用(如数组、字符串、自定义对象等),它们是通过引用传递的。因此,当你将一个数组的引用赋值给另一个变量时,这两个变量都指向同一个对象。
解决方案:使用clone()方法通过克隆arrays,可以确保使用一个独立的、与原始值完全相同的新对象。
def arrays2 = context.arrays.clone();
再次执行逻辑流,查看返回结果,原始数组arrays值并未发生变化。
# 7.2 访问sdo对象
# 7.2.1 如何从sdo对象内获取属性值?
在使用脚本图元的业务场景中,经常会从某个sdo对象中获取某个属性值进行相关业务操作,注意这里一定要使用sdo对象的get方法去获取属性值。如下:
def temp = context.model.get("type");
从sdo实体model中获取type属性值,不能使用context.model.type。
原因:当sdo实体字段是逻辑流内部关键字的时候,使用基础方式sdo实体.xxx
会取不到值。
# 7.2.2 map对象怎么转sdo实体?
示例九:如何把map对象转为sdo实体?
1.参数定义
逻辑流属性设置中定义输入参数param,数据类型为Map,返回值out,数据类型为sdo实体com.primeton.bfp.test.test.ServiceEntity
。
2.脚本内容编写
在脚本中为param赋值,使用JsonUtil将param转为json后,再转化为对应类型的sdo实体。(注:DataObjectType.createType(String entityName)方法的参数为entityName是需要转换的dataObject对象实体名称
)
import com.primeton.eos.eosservice.json.DataObjectType;
import com.eos.system.utility.JsonUtil;
context.param.put("id", "1");
context.param.put("code", "red");
context.param.put("name", "红色");
helper.echo(context.param)
String json = JsonUtil.toJson(context.param);
context.out = JsonUtil.toObject(json,DataObjectType.createType("com.primeton.bfp.test.test.ServiceEntity"));
或者使用内置方法helper.cast(Object obj, Class toClass)进行sdo实体转化。
context.out=helper.cast(context.param, context.out.class);
3.执行调试
执行当前逻辑流,通过断点调试可以看出,返回值out
赋值成功,说明参数param数据类型转化成功。