2017-03-20 4 views
0

は私のOrderクラスは処理方法排除ルールエンジンのリスト項目のオブジェクトの以前の値は?私はリストここ</p> <p>のすべての要素に火災ルールによだれたい

package com.sample; 

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

public class Order { 

    public static final int ORDER_AMOUNT_LIMIT = 10; 
    public static final int DEFAULT_VALUE=0; 

    public int id ; 
    public String name; 
    public OrderItem item; 
    public String code; 
    public List<String> message=new ArrayList<String>(); 

    public void addmessage(String m) { 
     message.add(m); 
    } 




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

    public List<OrderItem> orderItems = new ArrayList<OrderItem>(); 

    public OrderItem getItem() { 
     return item; 
    } 
    public void setItem(OrderItem item) { 
     this.item = item; 
    } 
    Order(int id,String name){ 
     this.id = id; 
     this.name = name; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    public void addOrderItem(OrderItem item) { 
     orderItems.add(item); 
} 

} 

OrderItem.java

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; 
    } 



} 

ためであります.drl

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 

DroolTest.java

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 

あなたはその後、条件は一度だけで実行されて見ることができるようにDroolsのが正常に動作している11> 10をチェックして、 値を0に設定したがDroolsのは、2番目のリスト項目を処理するとき、今の和が0 + 7> 10を返しますとき なぜならました偽ですが、2番目のリストで条件を実行したい場合 11 + 7 = 19が10より大きいため の両方の条件を実行する方法はありますか? オブジェクトの元の値を作業メモリから取得する方法はありますか?

答えて

0

制限を超える注文の各アイテムに対してルールが適用されるように、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 
関連する問題

 関連する問題