imports插件
导入功能的整个过程为先将excel文件上传到服务器,之后再读取服务器上的excel文件,最后将读取到的数据通过add插件插入到数据库中,先看一个导入的json用例
{
"actions": [
{
"name": "test_import",
"imports": {
"excel": {
"uploads":{
"aPath":"D:/response.xlsx"
},
"sheets": [
{
"head": 3,
"start": 5,
"action":{
"name":"asddsa",
"add": {
"class":"test.business.po.bao.ZsImport",
"uuid": ["id"],
"required":["id"]
}
}
},{
"head": 2,
"start": 4,
"action":{
"name":"qweewq",
"add": {
"class":"ZsImport2"
}
}
}
]
}
}
}
]
}
- aPath:所要导入的excel文件在服务器上的绝对路径
- rPath:所要导入的excel文件在服务器上的相对路径
- action:非数组类型,可以通过这个属性来调用action插件,导入时只能选择add插件
- headLine:sheet中表头的行号,别名"head",行号对应excel的行号,默认为第1行,模板中需要在此行处配置列名称
- dataLine:表示数据开始从哪一行进行加载,别名为start,默认为headLine+1
- fieldMappings:列的名称与java字段名称的映射关系,别名为"imports","key"为sheet表格上表头"headLine"那一行的列的名称,允许多个"key"映射同一个java字段。value属性是列名所映射的java字段的名称。默认使用实体类java字段上的imports注解的值作为"key",value属性则包括带类名称前缀和不带类名称前缀的java字段名。例子:@JSRuleCrudField(imports= {"name","another name"})
提示:test.business.po.bao.ZsImport是类的全限定名,只有在"locations"属性路径下存在多个相同的类名时才允许使用类全限定名,否则只能使用直接类名
shunt插件
shunt插件是一个非常重要的插件,它可以将所有的action插件通过一定的逻辑判断串联起来,可以将它理解为if else语句,通过判断来决定最终执行哪些actions指令,这意味着通过这种方式可以实现一个复杂的递归指令,下面看一个例子
{
"actions": [
{
"name": "test_get",
"get": {
"relation": {
"classes":["ZsTestPO"]
},
"groupShow":true,
"fields":["name","salary","currentDate"],
"condition":{
"where":{
"eq":{"ZsTestPO.name":["mmm"]}
}
}
}
},{
"name":"test_shunt",
"shunt":{
"ifAnd":true,
"if":{
"name":"test_get",
"path":"/data/2/ZsTestPO/salary",
"value":300,
"asserts":["testAsserts"],
"usual":[{
"in":[null,true,300.0]
},{
"name":"test_get",
"path":"/data/0/current_date",
"lt":"2023-08-20 00:00:00","ge":"2023-08-03 00:00:00"
}],
"br":[{
"usual":[{
"le":300,"in":[300.1]
}],
"br":[{
"usual":[{
"name":"test_get",
"path":"/data/1/ZsTestPO/salary",
"le":1100,"in":["zxc",{"name":"test_get","path":"/data/0/ZsTestPO/salary"}]
}]
}]
}]
},
"then":[
{
"name": "shunt_then",
"get": {
"relation": {
"classes":["ZsTestPO"]
},
"fields":["name"]
}
}
],"else":[
{
"name":"shunt_else",
"get": {
"relation": {
"classes":["ZsTestPO"]
},
"fields":["name"]
}
}
]
}
}
]
}
上面的例子看起来非常的复杂,接下来我们逐一进行分解说明
由于shunt插件是对前面action插件执行后的结果进行判断,因此在执行shunt插件之前应该至少有一个action已经执行成功并产生结果。JSRuleAssert对象对应的if判断中有如下几个属性
- ifAnd:表示第一层的与或逻辑为and还是or
- name:表示从哪一个action的结果中取值
- path:jackson node path,用于从结果集中取指定的值,如果node是一个数组,那么可以通过/加数字来指定某一条结果的值,如nodeA/1/nodeB
- value:没有获取到值时的默认值,此外无论是通过name,path还是value取得的值类型只能为String,int,Double,Long,Boolean,null
- asserts:自定义断言器,数组的值为spring bean的名称,多个断言器之间的与或关系取决于ifAnd以及br属性
- usual:框架内置的基本判断功能,它包含in,ni,gt,ge,lt,le,判断时需要注意值的类型,例如从name和path中取到的value值为double类型,那么只有当in的数组中存在300.0时才会为true,300则为false。当字符串的格式为框架定义的时间格式时则会用时间来进行判断,取不到数值时可以用null来进行判断。此外usual对象中还提供了name,path,value属性,它表示将采用这些属性获取到的值作为判断条件而非父属性获取到的值,否则将采用父属性的值作为判断条件。最后,多个usual对象之间的与或关系取决于ifAnd以及br属性。
- br:表示bracket,它与get插件中的判断条件逻辑相同,如果ifAnd为true,则第一层的与或逻辑为and,使用br属性可对判断条件进行包裹,此时这些被包裹的条件将进入到第二层,此时与或逻辑发生反转,条件与条件之间的与或关系全部为or,以此类推,可实现复杂的判断。
提示:usual对象内部的in,ni,gt,ge,lt,le属性可以是一个map类型,在map中依然可以声明name,path,value属性,表示使用当前属性来重新获取比较值
注意:当通过name和path属性没有取到值的时候则不会覆盖默认的value值,因此value为300是Integer类型而非数据库返回的double类型