Skip to main content

参数

规则、函数都有输入参数和输出参数

输入参数

如果没有特别说明,所有参数默认使用java标准类型

输出参数

如果没有特别说明,所有参数默认使用java标准类型。

这里明确一下:规则的实体输出类型是List<Map>类型,每一行数据就是一个Map<字段名,字段值>

代码描述参数

使用代码模式描述规则、函数等接口的入参和出参的规范。使用代码的好处是书写时有语法提示,并且每个参数有属性文档说明。

public class MyRegisterPlug2 implements IRegisterPlugin {//总入口,一个构件只能有一个IRegisterPlugin的实现类
@Override
public IComponentProfileVo getComponentProfile() { //构件描述信息
return RegVds.getPlugin().getComponetProfile().setGroupId("com.yindangu.plugin").setCode("mydemo").build();
}
@Override
public List<IPluginProfileVo> getPluginProfile() { //信息
// 其中接口 IPluginProfileVo 对应不同的插件类型是有区别的
}
}

IPluginProfileVo目前主要有IFunctionProfileVo,IRuleProfileVo,IHttpCommandProfileVo等,在这里就不列出了,具体参考plugin-register.jar包,找IPluginProfileVo查看它的继承关系就可以看出已经实现的插件类型。

编辑器

插件输入参数可以定义指定的编辑器,目前后台支持3种编辑器

表达式编辑器

表达式编辑器,是最常用的编辑器,它可以输入常量方法、变量、函数等表达式,如果没有指定编辑器类型,系统默认使用表达式编辑器。如果参数是实体类型,就默认使用实体编辑器。

IEditorBuilder editorBuild2 = RegVds.getBuilder().getEditorBuilder();
IRuleBuilder.IRuleInputBuilder inputParamField = br.newInput()
.setCode(NumberUpperRolueEntity.INPUT_AGE)
.setName("转换列名")
.setType(VariableType.Char)
//表达式编辑器 可以省略
.setEditor(editorBuild2.setType(EditorType.Expression).build());

开发系统对应的效果

img

实体编辑器

插件入参需要实体作为参数时,就要使用实体编辑器。

下面例子定义实体参数,有3个实体字段,使用实体编辑器。

// 添加规则元信息(把指定列 数字转汉字)
IRuleBuilder br2 = RegVds.getPlugin().getRulePlugin();
//实体构造器
IEntityBuilder entryBuild = RegVds.getBuilder().getEntityProfileBuilder();
//编辑器构造器
IEditorBuilder editorBuild1 = RegVds.getBuilder().getEditorBuilder();

//参数构造器(定义实体编辑框、及实体字段)
IRuleBuilder.IRuleInputBuilder inputParamEntry =
br.newInput()
.setCode(NumberUpperRolueEntity.INPUT_USERLLIST)
.setName("用户列表")
.setType(VariableType.Entity)
.setEditor(editorBuild1.setType(EditorType.EntityField)
.build())
.addField(entryBuild.newField()
.setCode("age")
.setName("年龄")
.setType(VariableType.Integer)
.build())
.addField(entryBuild.newField()
.setCode("name")
.setName("性名")
.setType(VariableType.Char)
.build())
.addField(entryBuild.newField()
.setCode(NumberUpperRolueEntity.FD_CHINESE)
.setName("汉字大写")
.setType(VariableType.Char)
.build());

IPluginProfileVo p4 = br2.setCode(NumberUpperRolueEntity.D_Code)
.setName("把指定列 数字转汉字-entity")
.setDesc("把指定列 数字转汉字-实体")
.setAuthor("徐刚")
.addInput(inputParamEntry.build())

开发系统对应的效果

img

下拉选择编辑器

下拉选择编辑器,对于枚举类型,及指定值的参数。

例如参数“性别”定义描述,NumberUpperRolue.Sex.male,NumberUpperRolue.Sex.female就是枚举值

//定义编辑器,及选项
IEditorBuilder editBuild = RegVds.getBuilder().getEditorBuilder();
editBuild.setType(EditorType.Select)
.addOption(editBuild.newOption()
.setLabel("男")
.setValue(NumberUpperRolue.Sex.male.name())
.build())
.addOption(editBuild.newOption()
.setLabel("女")
.setValue(NumberUpperRolue.Sex.female.name())
.build());

//设置入参的编辑器
IRuleBuilder.IRuleInputBuilder inputParamSex =
br.newInput()
.setCode(NumberUpperRolue.INPUT_SEX)
.setName("性别")
.setType(VariableType.Char)
.setEditor(editBuild.build());

//设置插件入参
IPluginProfileVo p2 =
br.setCode(NumberUpperRolue.D_Code)
.setName("把指定数字值转汉字")
.setAuthor("徐刚")
.setDesc("把指定数字值转汉字desc")
.addInput(inputParamSex.build());

开发系统对应的效果

img

json格式描述参数

除了可以使用 IRegisterPlugin 描述输入输出参数定义外,还增加了json格式描述,增加一个manifest.json添加到jar的根目录。和前端的manifest.json是相同的,二开推荐前后分离,所以一个构件只能是前端构件或者后端构件

json比代码模式唯一的好处是可以全览所有接口的信息。json书写、结构定义、取值规则、约束规范都没有代码模式好。这里可以发挥一下程序员特质,可用代码实现IRegisterPlugin 然后输出json就可以查看参数全貌了。另外:如果json描述与IRegisterPlugin 接口共存时,json优先,同时IRegisterPlugin 相当于约束规范,每个插件类型都会定义IRegisterPlugin 接口,它会比文档更新更及时,API文档参考 com.yindangu.v3.plugin.vds.reg.api.builder 。并且每个节点的注解都有说明,比查看文档更直接。因为javadoc已经有全部的节点属性说明,本节说明就比较简略了。

建议下载 com.yindangu.v3.platform-plugin-register-x.x.x的javadoc.jar 和 sources.jar

这里写了一个IRegisterPlugin 转json的例子,供大家参考

public static void main(String[] args){
IRegisterPlugin r = new MyYdgFuncRegDemo(); // 开发者自己实现 IRegisterPlugin 接口,如果没有实现,就只能手工写了
File manifsetFs = new File(项目路径, "src/main/resources/manifest.json");//输出位置

ObjectMapper gson = new ObjectMapper();
//第一级(构件描述)
String json = gson.writeValueAsString(r.getComponentProfile());
HashMap m = gson.readValue(json, HashMap.class);

//第二级(插件描述)
m.put("plugins", r.getPluginProfile());
String manifest = gson.writeValueAsString(m);

FileOutputStream os = new FileOutputStream(manifsetFs);
os.write(manifest.getBytes(StandardCharsets.UTF_8));
os.close();
System.out.println("文件已输出:" + manifsetFs.getPath());
}

格式说明:

第一个级,构件描述:

{
"code":"my_ydg_func_plugin_demo", // 参考 IComponentProfileVo.java
"plugins":[ ],
"groupId":"ydg",// 参考 IComponentProfileVo.java
"componentScope":"server", // 说明是前端"client"或者后端"server"构件,取值参考ScopeType.java(IRegisterPlugin 转json时需要手工补这个属性,直接使用代码描述不需要这个属性)
"componentVersion":"1.0" // 为了与开发系统保持一直的属性(IComponentProfileVo.version,也兼容"version"属性,后台判断"version"为空时,就取"componentVersion"
}

第二级,插件入参、出参描述:

plugins是数组格式,每个构件里可以很多个插件,建议业务相近的插件放在一个构件里,这样有些相同的工具类、公共代码可以重用。plugin的每个类型的输入输出参数都不同的。例如function只有一个返回值,但是rule可以有多个返回值,所以没个Plugin的描述信息是不相同的。每个类型的插件json都可以通过 IRegisterPlugin 转json获得,只需要补充 plugin 的 type 属性,下面是一个完整的函数json描述

"plugins":[
{
"code":"my_ydg_func_demo",
"type":"function" ,// 需要手工补充 type属性,取值{Function|Rule}枚举
"name":"我的演示函数Demo",
"desc":"本函数用于演示后端函数的Demo",
"author":"ydg",
"example":null,
"deprecated":false,
"entry":"com.ydg.func.MyYdgFuncDemo",
"configPath":null,
"private":false,
"pagePath":null,
"inputs":[
{
"type":"Char",
"desc":"第一个字符串参数",
"required":true,
"index":null,
"typeRange":null,
"default":null
},
{
"type":"Number",
"desc":"第二个数值型参数",
"required":true,
"index":null,
"typeRange":null,
"default":null
},
{
"type":"Char",
"desc":"第三个字符型参数",
"required":true,
"index":null,
"typeRange":null,
"default":null
}
],
"output":{
"type":"Char",
"desc":"串联三个参数后返回",
"typeRange":null,
"designType":null,
"designTypeRange":null
}
}
]

manifest存放位置

和前端一样,存放在jar的根目录

img