一、设计目标
1. 满足多变业务需求:动态修改 ==> 动态脚本
2. 满足复杂逻辑计算:不仅要支持简单表达式,还是支持多语句循环判断、预定义函数等需求 ==> 完整脚本语言(groovy、javascript、python等),而非表达式(mvel、aviator、fel、expr4J等)
3. 快速计算获得结果:最好支持脚本预编译(groovy)
4. 语言语法简单易学:类动态语言处理,属性可以直接访问(groovy,javascript,python),列表支持声明式处理等(groovy3,javascript,python)
5. 多个变量同时计算:一次性计算好某个场景下的多变量结果返回
6. 多个场景同时支持:作为通用计算引擎,支持多场景
二、计算流程
1. 请求数据:{},json对象,内部包括json数组和json对象的多层嵌套
2. 预定义函数:指定场景下很多变量计算公共使用的函数,比如账单工具中的datediff,比如人行工具中的最近几期 L24(X),L60(X)
3. 预处理【可选】:字典值映射等
4. 数据加工:
- 属性访问:req.xxx.yyy.zzz 多层次数据可以直接用.访问
- 列表统计:req.xxx.nnn 得到数组后可以采用声明式处理 :过滤、映射、排序等中间操作,sum、count、max、min等归约操作 (_StreamAPI.java )
- 特殊场景:比如从某个条件A开始循环累计到某个条件B得到某个值,然后以这个值作为区分点进行进一步操作。for循环break后多行脚本处理
5. 结果输出:{},json对象,(code、msg、data)其中data为json对象,内部包含每个变量的计算结果值
三、接口分析
1. 设置变量:可以自定义某个场景下的多个变量计算公式,同时支持设置这个场景下的预处理脚本(包含预定义函数及数据预处理)
2. 查看变量:设置完毕后,可以查看验证下场景下的变量,及多个变量同时计算的封装整体脚本内容
3. 评估脚本:给出数据,得到结果
四、部署方式
1. SDK提供:gav引入后即可直接使用
2. 独立服务:计算压力比较大时进行动态扩展