Drools JBOSS规则嵌套IF

Pan*_*wal 1 drools business-rules

我是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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人能给我一个暗示/想法如何去做,我真的很感激?

编辑:

嗨,

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

  1. 我正在插入(列表UserDetailVo)到drools会话.
  2. Object(UserDetailVo)包含(List of UserInfoVo).每个都UserInfoVo包含一个代码.

现在我想迭代(List of UserInfoVo)和update(letterId)到every(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
Run Code Online (Sandbox Code Playgroud)

案例2:当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
Run Code Online (Sandbox Code Playgroud)

情况3:当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
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我是否在规则结束时进行修改/更新.它进入了一个无限循环.如果我删除修改/更新,在案例3中虽然列表大小如果大于0仍然触发规则.

小智 6

"else"的概念并不真正直接转换为声明性语言.相反,您必须明确定义"else"在数据方面的真正含义,并根据该条件编写规则(或规则).例如,请考虑以下条件:

If Order Total >= 1000
  Discount = 15%
Else If Order Total >= 500
  Discount = 10%
Else If Order Total >= 250
  Discount = 5%
Else
  Discount = 0%
Run Code Online (Sandbox Code Playgroud)

对这些条件的规则的自然首次尝试可能是:

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...
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于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
Run Code Online (Sandbox Code Playgroud)

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

我一直专注于一个简单的例子,而不是你的具体用例,以展示写一个模仿"其他"的条件的概念.我仍然不确定我是否完全理解您的用例,但希望我已经回答了您问题的关键概念部分.