0

我是 Drools(6.3 版)的新手,我在想出特定规则时遇到了一些麻烦。我有一个名为 Steps 的类,只有一个简单的字段double steps;。每个步骤事件都代表自上一个事件以来所采取的步骤,我有一个工作规则,即当你在最后一小时内不做 50 步时,你需要开始运动:

declare Steps
    @role(event)
end

rule "STEPS RULE"
when
    $totalSteps : Number( doubleValue < 50 ) from accumulate(
        Steps( stepsCount : steps ) over window:time( 1h ) from entry-point     
    "entrySteps", sum( stepsCount ) )

then
    System.out.println("STEPS RULE: get moving!");
end

现在,每个事件都是自上一个事件以来所采取的步骤,我希望它们代表累积步骤。因此,如果一个事件有 50 个步骤,而你走了 20 个步骤,那么我希望下一个事件有 70 个步骤。问题是我怎样才能改变我的规则,让它仍然有效?

4

1 回答 1

1

对于计步器,您将需要另一个类,与您的事件类 Steps 不同。更新计步器的规则很简单。

rule "create pedometer"
when
    Steps( $s: steps )
    not Pedometer()
then
    insert( new Pedometer( $s ) );
end

rule "update pedometer"
no-loop
when
    Steps( $s: steps )
    $p: Pedometer( $r: readout )
then
    modify( $p ){
        setReadout( $r + $s )
    }
end

编辑如果 Steps 已经包含累积值,则它有点复杂,因为您需要计算窗口中第一个和最后一个计步器读数之间的差异。

rule "ACC STEPS RULE"
when
    accumulate( Steps( $s : steps )
                over window:time( 1h ) from entry-point "entrySteps"; 
        $fst: min( $s ), $lst: max( $s );
        $lst - $fst < 50 )
then
    System.out.println("STEPS RULE: get moving!");
end

每小时至少应该有一个读数或检测这种情况的其他规则。

于 2016-02-29T20:59:00.693 回答