您的位置:首页 > 其它

基于RulesEngine的业务规则实现

2016-03-11 10:51 357 查看
  规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。比较常见的业务规则引擎有Drools、VisualRules 和iLog。这里介绍另外一个C#开源工具RulesEngine。下面通过一个例子来他如何使用。

1 项目结构

在RulesEngine源代码中添加一个RulesEngineDemo的窗体应用程序,然后引用需要的类库,如下图所示:

using RulesEngine;
using RulesEngine.BooEvaluator;
public partial class Form1 : Form
{

DataGridView dgvOrder = null;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.dataGridView1.Rows.Add(new object[] {"return (订单.金额>200)",@"
订单.折扣=0.9;
订单.审批人=""admin"";
订单.折后金额=订单.金额*订单.折扣;
订单.备注 = ""规则引擎产生"";
return true;" });
this.dataGridView1.Rows.Add(new object[] {"return (订单.金额<=200 且 订单.金额>100)",@"
订单.折扣=0.8;
订单.折后金额=订单.金额*订单.折扣;
订单.备注 = ""规则引擎产生"";
return true;" });

this.dataGridView1.Rows.Add(new object[] {"return (订单.金额<=100 且 订单.金额>0)",@"
订单.折扣=1.0;
订单.折后金额=订单.金额*订单.折扣;
订单.备注 = ""规则引擎产生"";
return true;" });

}
//run
private void 保存SToolStripButton_Click(object sender, EventArgs e)
{

DslRuleTests test = new DslRuleTests();
test.Setup();

//test.EvaluateRules();

var order = test.EvaluateRules(this.dataGridView1, dgvOrder);
this.txtResults.Text = order.ToString();

}

private void toolStripButton1_Click(object sender, EventArgs e)
{
FrmOrder frm = new FrmOrder();

frm.ShowDialog();

dgvOrder = frm.dgvOrder;
}
}

public class DslRuleTests
{
private BooLangEvaluator evaluator;

private List<Emp> listEmp = new List<Emp>();

public void Setup()
{
var dslEngineStorage = new DslEngineStorage();

evaluator = new BooLangEvaluator(dslEngineStorage);

listEmp.Add(new Emp { id = "01", leader ="00" ,name="jack"});
listEmp.Add(new Emp { id = "01.01", leader = "01", name = "smith" });
listEmp.Add(new Emp { id = "01.01.01", leader = "01.01", name = "john" });

}
//审批处理
private void SP(Order o)
{

foreach (Emp emp in listEmp)
{
if (emp.id == o.maker)
{
o.wfprocess = emp.leader;
o.wfprocessname = getName(o.wfprocess);
}
}

}
//获取职工姓名
private string getName(string id)
{
foreach (Emp emp in listEmp)
{
if (emp.id == id)
{

return emp.name;
}
}
return "";
}
//求和
private void SumAmount(Order o)
{
var sum = o.ItemLists.AsQueryable().Sum(x => x.amount);
o.amount = sum;
}
//解析规则脚本
public Order EvaluateRules(DataGridView dgv,DataGridView dgvOrder)
{
Order order =new Order { memo = "", maker = "01.01", discount = 1, datetime = DateTime.Now };
order.ItemLists = new List<items>();
foreach (DataGridViewRow dr in dgvOrder.Rows)
{
if (dr.Cells[0].Value != null)
{
var item = new items
{
productid = dr.Cells[0].Value.ToString(),
productname = dr.Cells[1].Value.ToString(),
price = double.Parse(dr.Cells[2].Value.ToString()),
num = double.Parse(dr.Cells[3].Value.ToString()),
amount = double.Parse(dr.Cells[4].Value.ToString()),
discount = double.Parse(dr.Cells[5].Value.ToString()),
afteramount = double.Parse(dr.Cells[6].Value.ToString())

};

order.ItemLists.Add(item);
}
}

SumAmount(order);
SP(order);
string strDslStatement="";
string strDslActivity = "";
EvaluatorAccessPoint.DslConditionEvaluator = evaluator;

foreach (DataGridViewRow dr in dgv.Rows)
{

strDslStatement = dr.Cells[0].Value.ToString()
.Replace("订单", "this")
.Replace("金额", "amount")
.Replace("且", "and")
.Replace("或", "or");
strDslActivity = dr.Cells[1].Value.ToString()
.Replace("折扣", "discount")
.Replace("折后金额", "afteramount")
.Replace("金额", "amount")
.Replace("订单", "this")
.Replace("备注", "memo")
.Replace("审批人", "wfprocessname")
.Replace("且", "and")
.Replace("或", "or");

var conditionRule = new DslCondition { DslStatement = strDslStatement };

var rule = new ActivityRule(conditionRule, new DslActivity
{
DslStatement = strDslActivity
});

var result = rule.Evaluate(order);
if (result)
{
//break;
return order;

}

}
return null;

}

}


View Code
4 结果展示

运行代码,界面如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: