0
내가 여기 침하 규칙 엔진의 목록 항목에서 이전 값을 처리하는 방법은 무엇입니까?
목록
의 모든 요소에 화재 규칙에 침 원하는 것은 내 주문 클래스
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이 아닌 7을 반환합니다. 따라서 0을 초과하면 0이됩니다. 0 7> 10 거짓이지만 두 번째 목록에서 조건을 실행하려면 11 + 7 = 19가 10보다 커야합니다. 다음 두 가지 항목 모두에서 조건을 발생시키는 방법이 있습니까? 작업 메모리가 아닌 객체의 원래 값 을 얻는 방법이 있습니까?