Drools 如何在drool规则引擎中处理列表项中对象的上一个值?

Drools 如何在drool规则引擎中处理列表项中对象的上一个值?,drools,rule,business-rules,Drools,Rule,Business Rules,我想在列表中的所有元素中都使用Drool to fire规则 这是我的订单 DroolTest.java 输出 如您所见,then条件只执行一次,因为 当流口水时,检查11>10,这工作正常,并将值设置为 0但当drools处理第二个列表项时,现在总和将返回0+7> 10这是错误的,但我想在第二个列表中激活条件 因为11+7=19大于10,有没有办法开火 那么这两个列表项的条件是什么?我们有没有办法拿到那张票 对象的原始值不是来自工作记忆 您添加了一个模式OrderItem,以便规则将为超过限制

我想在列表中的所有元素中都使用Drool to fire规则

这是我的订单

DroolTest.java

输出

如您所见,then条件只执行一次,因为 当流口水时,检查11>10,这工作正常,并将值设置为 0但当drools处理第二个列表项时,现在总和将返回0+7> 10这是错误的,但我想在第二个列表中激活条件 因为11+7=19大于10,有没有办法开火 那么这两个列表项的条件是什么?我们有没有办法拿到那张票 对象的原始值不是来自工作记忆


您添加了一个模式OrderItem,以便规则将为超过限制的订单的每个项目激发

rule "order"
when
  $order: Order( $code: code )
  accumulate( OrderItem( order == $order, $price: price,
                         code == $code );
              $total: sum( $price );
              $total > Order.ORDER_AMOUNT_LIMIT )
  $item: OrderItem( order == $order, $price: price, code == $code )
then
   System.out.println( $item ); // an order item of a "big" order

end
package com.sample;

import java.util.ArrayList;
import java.util.List;

public class OrderItem {

    public static final int TEMP_PRICE = 0; 

    public Order order;
    public int price;
    public String code;
    public List<String> message=new ArrayList();

    public  void addMessage(String msg){
        message.add(msg);
    }


    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    OrderItem(Order order,int price){
        this.order = order;
        this.price = price;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }



}
 package com.sample
import com.sample.Order;

rule "order"
when
    $order : Order()
     $total : Double() from accumulate( OrderItem( order == $order, $price : price,code == $order.code,),
                              sum( $price ) )


   eval($total>Order.ORDER_AMOUNT_LIMIT)
then
   System.out.println($total);
   $order.orderItems.get(0).price=0;

   System.out.println("price is "+ $order.orderItems.get(0).getPrice());
end
public class DroolsTest {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-rules");


            Order order =  new Order(1,"bob");
            order.setCode("test1");

            OrderItem item1 =  new OrderItem(order, 11);
            item1.setCode("test1");
            OrderItem item2 =  new OrderItem(order, 7);
            item2.setCode("test1");

            order.addOrderItem(item1);
            order.addOrderItem( item2 );


            kSession.insert(order);
            kSession.insert(item1);

            kSession.fireAllRules();


            kSession.insert(item2);
            kSession.fireAllRules();            

        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

}
11.0
price is 0
rule "order"
when
  $order: Order( $code: code )
  accumulate( OrderItem( order == $order, $price: price,
                         code == $code );
              $total: sum( $price );
              $total > Order.ORDER_AMOUNT_LIMIT )
  $item: OrderItem( order == $order, $price: price, code == $code )
then
   System.out.println( $item ); // an order item of a "big" order

end