`

帮助网友解决一个drools的问题

 
阅读更多

      看到网友提的一个问题:

   http://drools.group.iteye.com/group/topic/39063

 

      鄙人刚刚开始研究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"));  
    }

 单元测试结果如下:



 

 

  • 大小: 17.3 KB
  • 大小: 10 KB
分享到:
评论
7 楼 asialee 2013-11-27  
flyqantas 写道
   针对这个项目,我建议可以先做一下领域对象建模,因为使用规则引擎,最好能够统一规划好领域对象模型,这样再设计规则集就比较明确一些,后期也方便扩展!
  

是的,要领域建模,我们现在和第三方系统打交道的就是map,但是感觉map有很多限制,没有对象的灵活和可维护性高
6 楼 flyqantas 2013-11-27  
   针对这个项目,我建议可以先做一下领域对象建模,因为使用规则引擎,最好能够统一规划好领域对象模型,这样再设计规则集就比较明确一些,后期也方便扩展!
  
5 楼 asialee 2013-11-27  
没有明白你的含义,我感觉设计规则编辑器给业务任务用没有问题,但是如果基于产品总数来计算,也是可以写出规则的吧

abirdman 写道
受教了,感谢老师辛苦做出的示例,我是那个提出问题的人。您的例子里归类出商品的数量,然后用函数将总额计算出来,简洁明了。我这几天也刚学了些皮毛,现在在做一个规则设计器,由业务人员自己设计规则,(他们不会去学程序也不想去学)。考虑到设计器到drools之间转化的方便性,会保存成drl文件。为了思路简单点,我会尽量少的考虑函数,比如第2件半价,我直接在条件上取两个商品,把第2个商品的价钱乘上0.5,比如:

rule "第2件商品半价"
    when
        p1 : Commodity( code == "A")
        p2 : Commodity( code == "A")
    then
        p2.setPrice(p2.getPrice() * 0.5)
end

现在如果有10个商品(code=A),drools会生成排列,10×10=100个条件进入规则去判断。而我只想要它进去5次,不知有没有办法做到这一点。

我做的设计器界面图:


4 楼 abirdman 2013-11-27  
受教了,感谢老师辛苦做出的示例,我是那个提出问题的人。您的例子里归类出商品的数量,然后用函数将总额计算出来,简洁明了。我这几天也刚学了些皮毛,现在在做一个规则设计器,由业务人员自己设计规则,(他们不会去学程序也不想去学)。考虑到设计器到drools之间转化的方便性,会保存成drl文件。为了思路简单点,我会尽量少的考虑函数,比如第2件半价,我直接在条件上取两个商品,把第2个商品的价钱乘上0.5,比如:

rule "第2件商品半价"
    when
        p1 : Commodity( code == "A")
        p2 : Commodity( code == "A")
    then
        p2.setPrice(p2.getPrice() * 0.5)
end

现在如果有10个商品(code=A),drools会生成排列,10×10=100个条件进入规则去判断。而我只想要它进去5次,不知有没有办法做到这一点。

我做的设计器界面图:

3 楼 flyqantas 2013-11-26  
  恩,现在国内擅长应用DROOL的老师真是太少了,我是从2009年开始在项目中应用DrOOL的,其中经过了很多的波折,直到2013年才开始大规模的应用,当然好处也是显而易见的,一方面可以加快开发的进程,另外也方便维护。
  
   今天不经意看到您的方案, 看得出您在面向对象的分析和设计上的功力非常惊人,这个在国内是非常难得的。所以感觉非常幸运!
    希望老师能够把您前期DROOL项目的经验整理一下,这样可以帮助更多的后学提升规则引擎的应用能力。以后有机会能够向您多多请教!
  
2 楼 asialee 2013-11-26  
flyqantas 写道
真是牛人呀! 佩服!

牛人不敢当,谢谢夸奖
1 楼 flyqantas 2013-11-26  
真是牛人呀! 佩服!

相关推荐

    drools drools drools drools drools

    4. drools-examples:这可能是一个包含drools使用示例的目录,帮助开发者理解如何在实际项目中应用drools,涵盖了各种规则的创建、加载和执行。 drools 使用DRL(Drools Rule Language)作为规则定义的语言,它支持...

    drools入门(二)-----规则引擎Drools解决汽水问题

    通过以上内容,我们可以看到 Drools 如何帮助我们解决汽水问题,将复杂的业务逻辑转化为易于管理和维护的规则。这种分离业务逻辑和代码的方式提高了代码的可读性和可扩展性,使得业务规则的调整变得更加灵活,减少了...

    Drools

    Drools还提供了一个工作流引擎,名为JBRMS(JBoss Business Rule Management System),它能够管理规则的生命周期,包括创建、测试、部署和版本控制。这使得业务分析师和IT人员可以协同工作,共同管理业务规则,确保...

    DRools BRMS Rule创建问题?

    总之,Drools作为一个强大的BRMS,虽然在规则创建过程中可能会遇到各种问题,但通过深入学习DRL语法、理解Drools的工作机制和熟练使用相关工具,我们可以有效地解决这些问题,从而实现高效、灵活的业务规则管理。

    drools5.4 API 帮助文档

    drools5.4 API 帮助文档 CHM

    规则引擎Drools.NET移植版

    **规则引擎Drools.NET移植版** Drools是一款强大的业务规则管理系统,源自Java社区,以其灵活、高效和可扩展的特性而广受赞誉。...对于需要处理大量业务规则的.NET项目,Drools.NET无疑是一个值得考虑的解决方案。

    5.6drools基础包

    Drools是一个强大的规则引擎,它是Java平台上的开源框架,用于实现复杂的业务逻辑。这个"5.6drools基础包"包含了Drools的核心组件——drools-distribution-5.6.0.Final.zip和Drools的开发工具集——droolsjbpm-tools...

    Drools实例

    总之,Drools实例为我们提供了一个直观的学习平台,通过GOLF和EmployTest,我们可以掌握如何利用Drools解决实际问题,包括逻辑决策和自动化计算。这对于我们理解规则引擎的运作机制,以及在实际项目中应用Drools来...

    drools7.25中文文档+drools技术指南.zip

    Drools7.25是该系统的一个重要版本,提供了许多新特性和性能改进,使得开发者能够更高效地处理和执行业务规则。 在Drools7.25中文文档中,你可以找到以下关键知识点: 1. **Drools概述**:这部分将介绍Drools的...

    Drools 6.3 帮助文档

    个人整理的 Drools 最新版6.3 帮助文档,方便查阅,喜欢拿去

    drools flow分析报告

    Drools 是一个开源的规则引擎,主要用于决策管理和业务逻辑处理。它基于Java,遵循JBoss社区的开发,并被广泛应用于金融、保险、电信等行业。 **1. Drools 简介** Drools 提供了一个强大的规则引擎,支持声明式编程...

    Drools规则执行顺序

    标题 "Drools 规则执行顺序" 涉及的是一个业务规则引擎——Drools 的核心概念。Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景...

    Drools_规则引擎详解

    作为一个业务规则管理系统(BRMS),Drools 提供了一个基于规则的系统,用于定义、执行和管理业务规则。Drools 的主要功能是将业务规则与应用程序逻辑分离,使得规则可以独立于应用程序中,易于维护和更新。 ...

    Drools6.5 部署Drools Workbench和Kie Server笔记

    在本文中,我们将深入探讨如何部署Drools Workbench和Kie Server,这两个组件是Drools6.5——一个强大的规则引擎平台的关键部分。Drools Workbench提供了一个直观的用户界面,用于创建、测试和管理业务规则,而Kie ...

    drools安装与配置

    这可能是Drools的官方文档集合,包含了Drools的各个组件、API的详细信息,以及使用示例,是学习和解决问题的重要资源。 7. **Drools源码粗略研究.pdf** 通过研究Drools的源代码,可以理解其内部工作原理,这对于...

    Drools workbench文件及DEMO项目代码

    首先,"mydroolsWeb"可能是一个包含Drools工作台Web应用的项目。这个项目可能包含了前端UI组件以及与后端服务交互的逻辑,用于展示和编辑Drools规则。在该项目中,你可以学习到如何配置Drools工作台,如何创建规则流...

    Drools7.25中文文档.7z

    Drools是一个开源的业务规则管理系统,它基于Java平台,允许开发者轻松地在应用程序中实现复杂的业务规则。在本文档中,你将学习到如何安装和配置Drools Workbench以及KIE Server,这两个关键组件是Drools生态系统的...

    drools-demo.zip

    标题中的"drools-demo.zip"表明这是一个关于Drools规则引擎的示例项目,而描述中提到"规则引擎简单使用案例Drools+Springboot2.X",这说明这个压缩包包含了一个使用Drools规则引擎与Spring Boot 2.x集成的简单应用。...

Global site tag (gtag.js) - Google Analytics