网友使用过程中的一个drools的复杂问题
2015-07-22 16:06
344 查看
鄙人刚刚开始研究Drools,但看了些例子,仍然不知道怎么处理下面的业务:
超市打折促销,某种商品(按照类别code)促销规则:
1.在指定日期区间内(比如1月1日-1月3日),
2.买第1件按原价,第2件则价格打6折。第3件原价,第4件打6折... ...
现在顾客推着购物车来消费,里面有很多种商品,其中上面促销的那种有5件,结果应该是3件原价,两件要打折。
哪位大大提供个思路,怎么用drools来给顾客的购物票算总额。
由于之前使用的是excel规则表,我也使用excel规则表。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.DecisionTableConfiguration;
import org.drools.builder.DecisionTableInputType;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatelessKnowledgeSession;
public class KATestBase {
public void testExcel(String fileName, Map<String, Object> params)
throws Exception {
System.out.println("---------------begin------------------------");
DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory
.newDecisionTableConfiguration();
dtableconfiguration.setInputType(DecisionTableInputType.XLS);
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
File file = new File("E:\\workspace\\epct\\rule\\src\\test\\resources\\"
+ fileName);
InputStream is = new FileInputStream(file);
//InputStream is = new ClassPathResource(fileName).getInputStream();
kbuilder.add(ResourceFactory.newInputStreamResource(is,"UTF-8"),
ResourceType.DTABLE);
if (kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(pkgs);
StatelessKnowledgeSession ksession = kbase
.newStatelessKnowledgeSession();
ksession.execute(Arrays.asList(new Object[] {params}));
System.out.println("---------------end------------------------");
}
}
测试的子类如下:
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class DroolsTest extends KATestBase{
private KADest param;
private String extected;
public DroolsTest(KADest param,String extected) {
this.param = param;
this.extected = extected;
}
public static class KADest {
private String orderTime;
private String orderTotal;
public KADest(String orderTime, String orderTotal) {
this.orderTime = orderTime;
this.orderTotal = orderTotal;
}
public Map<String,Object> getParams(){
Map<String,Object> params = new HashMap<String,Object>();
params.put("orderTime", orderTime);
params.put("orderTotal", orderTotal);
params.put("discountTotal", 0);
return params;
}
}
@Parameters
public static Collection<?> contructData(){
return Arrays.asList(new Object[][]{
{new KADest("2013-01-02 12:30:31","6"),"3"},
{new KADest("2013-01-02 12:30:31","1"),"0"},
{new KADest("2013-01-02 12:30:31","2"),"1"},
{new KADest("2013-01-01 12:30:31","2"),"1"},
{new KADest("2013-01-01 12:30:31","2"),"1"},
{new KADest("2013-01-01 12:30:31","2"),"1"},
{new KADest("2013-01-04 12:30:31","2"),"0"},
{new KADest("2013-01-04 12:30:31","2"),"0"},
{new KADest("2013-01-04 12:30:31","2"),"0"},
});
}
@Test
public void testKaDest() throws Exception{
Map<String,Object> params = new HashMap<String,Object>();
params.putAll(param.getParams());
System.out.println(params);
super.testExcel("ka/drools.xls", params);
System.out.println(params);
Assert.assertEquals(extected, "" +params.get("discountTotal"));
}
超市打折促销,某种商品(按照类别code)促销规则:
1.在指定日期区间内(比如1月1日-1月3日),
2.买第1件按原价,第2件则价格打6折。第3件原价,第4件打6折... ...
现在顾客推着购物车来消费,里面有很多种商品,其中上面促销的那种有5件,结果应该是3件原价,两件要打折。
哪位大大提供个思路,怎么用drools来给顾客的购物票算总额。
由于之前使用的是excel规则表,我也使用excel规则表。
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.DecisionTableConfiguration;
import org.drools.builder.DecisionTableInputType;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatelessKnowledgeSession;
public class KATestBase {
public void testExcel(String fileName, Map<String, Object> params)
throws Exception {
System.out.println("---------------begin------------------------");
DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory
.newDecisionTableConfiguration();
dtableconfiguration.setInputType(DecisionTableInputType.XLS);
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
File file = new File("E:\\workspace\\epct\\rule\\src\\test\\resources\\"
+ fileName);
InputStream is = new FileInputStream(file);
//InputStream is = new ClassPathResource(fileName).getInputStream();
kbuilder.add(ResourceFactory.newInputStreamResource(is,"UTF-8"),
ResourceType.DTABLE);
if (kbuilder.hasErrors()) {
System.out.println(kbuilder.getErrors().toString());
}
Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(pkgs);
StatelessKnowledgeSession ksession = kbase
.newStatelessKnowledgeSession();
ksession.execute(Arrays.asList(new Object[] {params}));
System.out.println("---------------end------------------------");
}
}
测试的子类如下:
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class DroolsTest extends KATestBase{
private KADest param;
private String extected;
public DroolsTest(KADest param,String extected) {
this.param = param;
this.extected = extected;
}
public static class KADest {
private String orderTime;
private String orderTotal;
public KADest(String orderTime, String orderTotal) {
this.orderTime = orderTime;
this.orderTotal = orderTotal;
}
public Map<String,Object> getParams(){
Map<String,Object> params = new HashMap<String,Object>();
params.put("orderTime", orderTime);
params.put("orderTotal", orderTotal);
params.put("discountTotal", 0);
return params;
}
}
@Parameters
public static Collection<?> contructData(){
return Arrays.asList(new Object[][]{
{new KADest("2013-01-02 12:30:31","6"),"3"},
{new KADest("2013-01-02 12:30:31","1"),"0"},
{new KADest("2013-01-02 12:30:31","2"),"1"},
{new KADest("2013-01-01 12:30:31","2"),"1"},
{new KADest("2013-01-01 12:30:31","2"),"1"},
{new KADest("2013-01-01 12:30:31","2"),"1"},
{new KADest("2013-01-04 12:30:31","2"),"0"},
{new KADest("2013-01-04 12:30:31","2"),"0"},
{new KADest("2013-01-04 12:30:31","2"),"0"},
});
}
@Test
public void testKaDest() throws Exception{
Map<String,Object> params = new HashMap<String,Object>();
params.putAll(param.getParams());
System.out.println(params);
super.testExcel("ka/drools.xls", params);
System.out.println(params);
Assert.assertEquals(extected, "" +params.get("discountTotal"));
}
相关文章推荐
- oracle 分区
- C函数与汇编函数之间参数及返回值传递方法
- KEYCODE列表
- .Net图片处理函数
- Hadoop 新 MapReduce 框架 Yarn 详解
- jquery 元素绑定on事件
- Heavy Transportation---poj1797
- ThemeManager主题切换(2)
- asp:Repeater中实现隔行换色
- 中国象棋游戏Chess(2) - 走棋
- Spring之五 事务管理
- Laravel5中生成指定文件的说明文档
- 中国象棋游戏Chess(2) - 走棋
- Hadoop YARN配置参数剖析(1)—RM与NM相关参数
- 生产排程甘特图应用及绘制步骤
- hdu 5288 OO’s Sequence(2015多校第一场第1题)枚举因子
- 【C++】多态性(函数重载与虚函数)
- MySQL存储过程
- iOS设计模式——Category
- Fragment与Activity通信