README.md 6.9 KB

xbc-cm

介绍

表达式计算引擎、公式管理、公式计算、公式计算结果管理
可用于需要经常、快速变动的业务计算,比如手续费计算、服务费计算、规则计算等。

软件架构

由三部分构成

  1. 表达式计算引擎
    src/engine/java
    此部分可以单独做成jar,提供表达式计算功能
  2. 公式管理
    src/main/java 下面的 xbc.formula.fmlmgr
    此部分用于管理公式配置
  3. 公式计算与结果管理
    src/main/java 下面的 xbc.formula.calcmgr
    此部分用于公式计算以及计算结果管理

安装教程

  1. 安装java环境: jdk1.8
  2. 下载工程,导入eclipse。推荐使用 Eclipse IDE for Java Developers, Version: 2020-12
  3. 通过运行table目录下的table_dml.txt里面的SQL语句,创建工程运行所需的数据库表以及初始化番号管理表数据

使用说明

  1. 启动springboot主程序: CalculateManagerApplication
  2. 通过运行table目录下的reset_ddl.txt里面的SQL语句,创建示例用的公式(有点类似于个人所得税计算的相关公式)
  3. 用http的客户端工具(如postman),使用如下参数,调用接口: /calculatemanager/calculate
    {"productId":1,"bizType":"geshui","paramMap":{"jibenjixiao":9700,"jibengongzi":12300,"jianzhishouru":3240,"zashui":100,"caipiaoshouru":-200},"saveResult":true}
    公式计算结果将会写入到 calc_result 表,计算过程中用到的指标以及子公式的结果将会写入到 calc_indicator_result 表。
    上述接口会返回计算结果id。
  4. 用http的客户端工具(如postman),使用如下参数(calcResultId=结算结果id),调用接口: /calculatemanager/desc
    此接口会返回公式运算过程的描述信息。
  5. 可以通过往 fml_formula 表里面配置公式,往 fml_formula_indicator 表里面配置指标,然后再往 calc_formula 表里面配置在什么产品什么业务类型使用该公式,实现自己的公式使用。

公式与指标

  1. 公式
    用于计算某项业务数据的表达式,比如用于计算【工资】的一种表达式:
    基本工资 + 绩效工资 + 其它收入
    在xbc-cm中,公式用 xbc.formula.engine.fml.vo.XbcFmlFormulaVo 进行描述
  2. 指标
    参与公式计算的变量。比如,上面的工资公式里面,下面三个变量都是指标:
    基本工资,绩效工资,其它收入
    在xbc-cm中,指标用 xbc.formula.engine.fml.vo.XbcFmlFormulaIndicatorVo 进行描述
  3. 指标类型
    在 XbcFmlFormulaIndicatorVo 里面,定义了指标的五种类型:
    1)SPECIFIED_TYPE
    指定值类型。表示在公式计算时,直接使用指标对象的【specifiedVal】值,作为指标值进行运算。
    计算引擎会试图将该值转换为BigDecimal类型,如果转换失败,则使用String进行计算。
    2)SCRIPT_TYPE
    脚本类型。表示在公式计算时,这个指标需要运行一段脚本程序得到指标值。目前的版本还未实现。
    3)FORMULA_TYPE
    公式类型。表示在公式计算时,这个指标自身也是一个公式,公式存放在【formulaVo】里面。需要先对该公式进行计算,计算的结果作为这个指标的值,参与主公式的计算。
    4)PARAM_TYPE
    参数类型。表示在公式计算时,这个指标是外部传入的一个参数。
    计算引擎会以指标的【specifiedVal】值为key在 XbcFmlCalculator.calculte 的 【Object... formulaParams】参数里面的Map类型参数里面查找,如果没有Map类型的参数,
    则以指标的【specifiedVal】值为字段名,在formulaParams的数据对象里面查找。找到后,则将找到的值作为指标值,参与公式计算。
    5)FUNC_TYPE
    函数类型。表示指标本身是一个自定义函数,系统会先运行该自定义函数,并将结果作为指标值,进行公式计算。
  4. 公式与指标的关系
    为了减少配置、便于使用,fml_formula与fml_formula_indicator之间没有通过主键进行关联,而是解析公式后,通过指标的名称进行关联。
    查找指标时,如果在fml_formula_indicator中没有找到,则会认为指标是可能一个公式,到fml_formula中查找。
    公式与指标的关系建立是通过 xbc.formula.fmlmgr.logic.impl.FormulaLogicImpl.getFormulaByCode 完成的。
    例如:
    公示表配置:
key_id formula_name formula_code formula_value
1001 工资 gongzi 基本工资 + 绩效工资 + 其它收入
1002 其它收入 qitashouru 兼职收入 * 0.8 + 彩票收入 * 0.5
1003 绩效工资 jixiaogongzi 基本绩效 + 其它收入

指标表配置:
|key_id|indicator_type|indicator_name|indicator_code|specified_val| |-|-|-|-|-| |3001|4|基本工资|jibengongzi|jibengongzi| |3002|4|基本绩效|jibenjixiao|jibenjixiao| |3003|4|兼职收入|jianzhishouru|jianzhishouru| |3004|4|彩票收入|caipiaoshouru|caipiaoshouru|

这两个表完成了 工资 = 基本工资 + 绩效工资 + 其它收入 的配置,其中
1)基本工资是一个参数类指标,所以,直接配置在了fml_formula_indicator里面。
2)绩效工资是一个公式,绩效工资 = 基本绩效 + 其它收入。

其中,基本绩效是一个参数类指标,直接配置在了fml_formula_indicator里面。  
其它收入是一个公式。  

3)其它收入是一个公式,其它收入 = 兼职收入 * 0.8 + 彩票收入 * 0.5。

其中,兼职收入是一个参数类指标,直接配置在了fml_formula_indicator里面。  
彩票收入是一个参数类指标,直接配置在了fml_formula_indicator里面。  

【注意】当公式带有子公式时,在保存结果数据时,会以子公式的key_id为指标的keyid生成一个指标,写入到指标运算结果表里面。所以,进行公式和指标配置时,两个表的key_id尽量不要有重复。

  1. 层差表达式
    在实际的业务中,有时候会遇到按照某个指标落在不同的区间里面取不同值的运算。针对这种运算,表达式计算引擎提供了一种层差表达式。
    层差表达式的基本语法是: 指标 {区间1 : 取值表达式1, 区间2 : 取值表达式2, ..., 区间n : 取值表达式n}
    区间可以采用数学上常用的开闭区间来表示,也可以采用比较符号来表示。
    取值表达式,就是普通的表达式。
    例如:
    工资 {
    <= 5000 : 0,
    (5000, 8000] : (工资 - 5000) * 0.03,
    (8000, 17000] : 90 + (工资 - 8000) * 0.1,
    (17000, 30000] : 990 + (工资 - 17000) * 0.2,
    (30000, 40000] : 3590 + (工资 - 30000) * 0.25,
    (40000, 60000] : 6090 + (工资 - 40000) * 0.3,
    (60000, 85000] : 12090 + (工资 - 60000) * 0.35,
    > 850000 : 20840 + (工资 - 85000) * 0.45
    }
    这个层差表达式,根据工资在不同的范围内,按照不同的公式来计算个人所得税。

参与贡献

特技