【问题标题】:Working with consecutive events in drools在流口水中处理连续事件
【发布时间】:2018-01-09 20:45:39
【问题描述】:

我需要有关以下规则的帮助:

连续多次存款的账户,并在 4 小时后立即多次提取,其总和等于使用不同 ATM 在同一家银行存入的相同金额。 (最后一次存款和第一次提取之间没有中间操作)

我有 Operation 类:Account, Amount, Operation, ATM, Timestamp。

我有这个规则:

declare Operation 
 @role(event) 
 @timestamp(Timestamp) 
end 

rule 
when 
 $op1:Operation($acc:Account,$b:Bank,$amount:Amount,Operation‌​=="CREDIT",$atm:ATM) 
 not Operation(Account == $acc,ATM != $atm, Bank == $b, this before $op1) accumulate($op2:Operation(Account == $acc,ATM != $atm, Bank == $b,Operation=="CREDIT",$amount1:Amount);$c:count($op2),$d:su‌​m($amount1);$c>=4,$d‌​>=300) 
then 
 System.out.println( "Account: " + $acc + " amount " + ($amount + $d) + " operations " + $c+ " in different banks"); 
end

前面的规则返回在同一家银行的不同ATM上进行4次以上操作的账户的存款总和,我的疑问是如何考虑它们是连续的,并且在4小时后比较前一个与从该帐户提取的总和相加。

【问题讨论】:

  • 到目前为止你尝试了什么? - 或者:我在哪里可以找到你的招标?
  • 不要在 cmets 中发布代码,这很难读。 - 您可以编辑您的问题。
  • 我认为只要有n个存款没有提取就必须通过为某个帐户设置一个监视器来处理这个问题。然后,将考虑监视器的状态来处理其他事件。让我们将规则编辑到问题中。
  • 我用规则编辑了问题。当您说“这必须通过为某个帐户设置监视器来处理......”时,我不明白。拜托,你能详细解释一下吗?

标签: drools drools-fusion


【解决方案1】:

如果触发此规则,

rule "set up Monitor"
when
  $op1: Operation( $a:account, $b:bank, $amt1:amount, operation‌​=="CREDIT", $atm1: atm )
  $op2: Operation( account==$a, bank==$b, $amt2:amount, operation‌​=="CREDIT", atm!= $atm1 )
  not Operation(account == $acc, atm != $atm1, bank == $b,
                this before $op2, this after $op1 )
  not Monitor( bank == $bank, account == $acc )
then
  insert( new Monitor( $bank, $acc, $amt1 + $amt2, "CREDIT" );
end

您已插入监视器。监视器有明显的字段和状态字段,设置为“CREDIT”。

rule "add deposit"
when
  $op1: Operation( $a:account, $b:bank, $amt1:amount, operation‌​=="CREDIT", $atm1: atm )
  $mon: Monitor( account==$a, bank==$b, $bal: balance, state == "CREDIT" )
then
  // another deposit
  modify( $op1 ){ setAmount( $bal + $amt1 ) }
end

通过此事件,状态变为退出。

rule "state changes to withdrawal"
when
  $op1: Operation( $a:account, $b:bank, $amt1: amount, operation‌​=="WITHDRAW", $atm1: atm )
  $mon: Monitor( account==$a, bank==$b, $bal: balance, state == "CREDIT" )
then
  // switch to withdraw
  modify( $op1 ){ setAmount( $bal + $amt1 ),
                  setState( "WITHDRAW" ) }
end

这里开始变得一团糟。我们需要检查此(第一次)提款是否兑现了所有存款 (balance == $amt1),或者只是减少了余额或提款超过了之前的存款序列。

我从这里退出,但我想我已经证明这不可能用单一规则来完成。

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多