全栈低码设计开源框架 json-script-rule 分流器shunt

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类型
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九天流云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值