4

我是 Jboss Rule 的新手。我已经浏览了文档,但我找不到开始为以下代码示例编写规则的方法。

For each User code in the list 
{
    If User code = ‘11’ 
    {
        If User code ‘17’ present in the group 
        {
            Add letter id 1
        }
        Else If User code ‘18’ present in the group 
        {
            Add letter id 2
        }
    }
    Else 
    {
        Add letter id 3 which is the letter need to be sent for code 11
    }
}

编辑:

到目前为止,这是我可以为上面讨论的用户案例开发的。

  1. 我正在将 (List of UserDetailVo) 插入到 drools 会话中。
  2. 对象 ( UserDetailVo) 包含 (List of UserInfoVo)。每个都UserInfoVo包含一个代码。

现在我想迭代 (List of UserInfoVo) 并将 ( letterId) 更新到每个 ( UserDetailVo),就像我在下面尝试做的那样。

Case1 : 当 codeList 有 110,121

rule "USER LETTER GROUPING 110,121" 
salience 300
no-loop true

    when
        userDetailVo : UserDetailVo ()
        UserInfoVo(code=="110") from userDetailVo.codeList
        UserInfoVo(code=="121") from userDetailVo.codeList
    then
        userDetailVo.addLetterId(1);
        //modify(trrDetailRequestVo)
end
    

Case2 : 当 codeList 有 110,127

rule "USER LETTER GROUPING 110,127" 
        salience 300
        no-loop true
    
            when
                userDetailVo : UserDetailVo ()
                UserInfoVo(code=="110") from userDetailVo.codeList
                UserInfoVo(code=="127") from userDetailVo.codeList
            then
                userDetailVo.addLetterId(2);
                //modify(trrDetailRequestVo)
        end

Case3 : 当 codeList 只有 110

rule "USER LETTER GROUPING 110" 
    salience 300
    no-loop true
    
        when
            userDetailVo : UserDetailVo (this.letterID.size() == 0) // Checking size of the list
            UserInfoVo(code=="110") from userDetailVo.codeList
        then
            userDetailVo.addLetterId(3);
            //modify(trrDetailRequestVo)
    end

我面临的问题是如果我在规则结束时用户修改/更新。它进入一个无限循环。如果我删除修改/更新,如果列表大小大于 0,则在情况 3 中仍然会触发规则。

4

2 回答 2

9

“else”的概念并没有真正直接转化为声明性语言。相反,您必须根据数据明确定义“其他”的真正含义,并根据该条件编写规则(或规则)。例如,考虑以下条件:

If Order Total >= 1000
  Discount = 15%
Else If Order Total >= 500
  Discount = 10%
Else If Order Total >= 250
  Discount = 5%
Else
  Discount = 0%

对这些条件的规则进行自然的第一次尝试可能是:

rule "15% discount"
  when
    $o : Order( total >= 1000 )
  then
    modify($o) { setDiscount(.15); }
end

rule "10% discount"
  when
    $o : Order( total >= 500 )
  then
    modify($o) { setDiscount(.10); }
end

etc...

这种方法的问题是 10% 和 15% 规则都将匹配一个总数为 1200 的订单。这是因为 "else if" 的 "else" 部分固有地包括订单总数不大于1000. 所以我们这样写我们的规则:

rule "15% discount"
  when
    $o : Order( total >= 1000, discount == null )
  then
    modify($o) { setDiscount(.15); }
end

rule "10% discount"
  when
    $o : Order( total >= 500, total < 1000, discount == null )
  then
    modify($o) { setDiscount(.10); }
end

rule "5% discount"
  when
    $o : Order( total >= 250, total < 500, discount == null )
  then
    modify($o) { setDiscount(.05); }
end

rule "no discount"
  when
    $o : Order( total < 250, discount == null )
  then
    modify($o) { setDiscount(0); }
end

(您会注意到我还添加了一个discount == null条件。这是为了防止规则在订单事实更新时重新激活。)

我一直专注于一个简单的示例而不是您的特定用例来演示编写条件以模仿“else”的概念。我仍然不确定我是否完全理解您的用例,但希望我已经回答了您问题的关键概念部分。

于 2012-03-20T13:09:46.117 回答
0

您可以实现嵌套 ifs,如下所示:

rule "nested if else"
when 
o: Order(total >= 1000)
then
o.setDiscount("15%");
if(o.total>=500)
o.setDiscount("10%");
else if(o.total>=250)
o.setDiscount("5%");
else
o.setDiscount("0%");
end

您可以在 then 下编写任何 java 代码,例如 - 循环、迭代、声明等。

于 2019-12-19T14:49:21.917 回答