跳到主要内容

规则引擎

易对接使用规则引擎完成报销单(付款单,借款单等)到财务凭证的转换,以下是规则引擎的使用说明:

规则引擎是基于Java语言开发的,假设用户已经具备基础的Java语言知识

简单示例

规则示例:

rule:01;header.type=='报销单'&&item.typeName=='办公用品'
:vitem.accountCode='6602.01/';citem.accountCode='1002.01'

这个规则实现了一个简单的报销单到凭证的转换需求:

如果单据是报销单,费用类型为办公用品,则设置凭证借方科目代码为6602.01,贷方科目代码为1002.01

通过这个简单示例,可以对规则引擎的使用方法有初步了解:

  1. 使用"rule:"开始规则定义
  2. 之后是优先级定义(数值越小,优先级越高)
  3. ";"到":"之间是条件部分,说明规则执行需要满足的条件
  4. ":"之后部分是规则内容,描述执行的详细内容
  5. header,item,vitem,citem是规则执行时由外部环境提供的数据对象

规则介绍

条件

以下是常用的运算符:

符号作用举例
==判断是否相等header.type=="报销单"
>,<,>=,<=数值大小判断item.amount>10000
&&并且关系,两个条件必须同时满足header.type=="报销单"&&item.amount>10000
||或者关系,两个条件满足其中一个即可header.type=="报销单"||header.type=="付款单"

规则内容

  1. 更新数据
vitem.accountCode='1002'
  1. 多条语句使用";''间隔
  2. 访问对象属性

规则引擎中有一个上下文对象item,类型定义如下:

public class BillItem implements Cloneable {

private String typeName;

public String getTypeName() {
return this.typeName;
}

public void setTypeName(String typeName) {
this.typeName = typeName;
}

}

在规则语句中访问属性:

vitem.originAccountName=item.typeName
  1. 访问对象方法

在规则语句中,可以调用上下文对象的方法,例如:

vitem.originAccountName=item.typeName.substring(0,4)

item.typeName的类型是Java中的String,可以调用String的方法substring(取字符号串的部分内容)

  1. 规则优先级

规则执行时,如果有多条规则同时满足执行条件,按照以下方式执行:

  • 优先级高的先执行,低优先级的后执行
  • 优先级相同,条件相同的多条规则,只执行第一条

完整例子

以下是为一个实际客户设计的规则脚本示例(不涉及客户敏感信息):

#单据部门”输送机“修改为”输送机输送链条G“
rule:010;(item.deptName=='输送机')
:item.deptName='输送机输送链条G'
#表单上的名称如果为raulHua,财务系统的名称为蔡
rule:070;(item.employeeName=='raulHua')
:vitem.personName='蔡';citem.personName='蔡'
#表单上的名称如果为GunYuanDeLiFangTi,财务系统的名称为圆
rule:070;(item.employeeName=='GunYuanDeLiFangTi')
:vitem.personName='圆';citem.personName='圆'
#定义借方摘要
rule:180;(vitem.summary==null && vitem.credit=='0')
:vitem.summary=item.aux14+'~'+item.aux13+'/'+vitem.personName+'/'+item.aux12+'/'+item.summary
#定义贷方摘要
rule:181;(citem.summary==null && citem.debit=='0')
:citem.summary=citem.personName+'报销'+header.type
#根据不同的支付方式,定义不同的贷方科目
rule:091;(citem.accountName==null && citem.debit=='0' && item.aux15=='个人支付银行')
:citem.accountName='银行-人民币活期';citem.custom15='银付'
rule:091;(citem.accountName==null && citem.debit=='0' && item.aux15=='公司预定机票')
:citem.accountName='其他应付款/应付月结费/应付机票款';citem.custom15='转账'
rule:091;(citem.accountName==null && citem.debit=='0' && item.aux15=='公司商务卡(火车,机票,酒店)')
:citem.accountName='其他应付款/应付月结费/建行商务卡/差旅费';citem.custom15='转账'
rule:091;(citem.accountName==null && citem.debit=='0' && item.aux15=='公司商务卡(餐费,礼品)')
:citem.accountName='其他应付款/应付月结费/建行商务卡/餐费';citem.custom15='转账'
#定义制单人
rule:182;(vheader.maker!=empty)
:vheader.maker='会计'