1

私は Drools を初めて使用し、歯科保険アプリケーションのルールを設計しようとしています。システムは基本的に、これまでのサービスの履歴に基づいて、これから実行しようとしている手順が保険でカバーされない可能性があることをユーザーに知らせます。他のルールもあり、年齢に基づいている可能性がありますが、私はそれらを処理できます.

私の事実は次のとおりです。

  • 患者 - 患者情報のリスト。
  • サービス - 以前に実行されたサービス。(例: serviceCode=D1234、datePerformed=Date)
  • アラート - (alertName = "Xrays 2/12 Month Period")

患者が過去 12 か月間に 2 回以上 D1234 を実施した場合、最後の D1234 サービスの日付から 12 か月後までD1234は保険でカバーされない可能性があるという警告を追加するという規則が必要です。

状況をさらに複雑にしているのは、同じように制限されたコードのグループが存在する可能性があるという事実です。そのため、ルールにリストされているコードは、単一のコードではなくコードの配列である可能性がありますが、それでもルールを実行する必要があります。

実行されたすべてのサービスをフェッチするサービスを作成して、そのように実行することもできますが、すべての事実 (以前のサービスなど) を Drools に投入して、すべてを機能させる方がよいと思います。このようにして、アラートと以前のサービスを事実として患者ごとにルール プロセスを実行し、結果を警告のリストにすることができます。

上記で必要なルールの書き方を誰かが理解するのを手伝ってくれますか?

4

1 に答える 1

4

実行する必要があるさまざまなことの例をいくつか示します。それらを組み合わせて、アプリケーション内で機能するルールを作成するのはあなたに任せます。

警告 - 以下の例は実行していないため、バグやタイプミスがある可能性があります。

まず、次のコードは、作業メモリ内の各患者に対して実行されたすべてのサービスを収集します。

rule "Count patient services"
when
    $patient : Patient()
    $serviceList : ArrayList() from collect (
        Service(patientId == $patient.id)
    )
then
    System.out.println("Patient " + $patient.id 
        + " has received " + $serviceList.size() + " services.");
end

以下は、患者が特定のコードで 2 つ以上のサービスを受けた場合に一致します。

$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode == "D1234"
    )
)

以下は、患者がコードのリストに一致するサービスを 2 つ以上受けた場合に一致します。

$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode in ("D1234", "E5678")
    )
)

以下は、一致する最新のサービス日付を検索します。

accumulate (
    Service(
        patientId == $patient.id, 
        serviceCode in ("D1234", "E5678"),
        $datePerformed: datePerformed
    );
    $mostRecentDate: max($datePerformed)
)

同様に、日付やその他の属性に制約を追加できます。

コード グループを維持するための効果的なメカニズムは、グループ メンバーシップ ファクトを挿入することです。これは、スプレッドシートまたは Web デシジョン テーブルで簡単に行うことができます。または、データベースにクエリを実行して、API 経由で挿入することもできます。すなわち

insert( new ServiceGroup( "HighCostService", "D1234" ) );
insert( new ServiceGroup( "HighCostService", "D5678" ) );

次に、次のような制約を使用してマッチングを行うことができます。

$highCostServices : ArrayList() from accumulate (
        ServiceGroup( group == "HighCostService", $serviceCode ),
        init( ArrayList list = new ArrayList(); ),
        action( list.add($serviceCode); ),
        reverse( list.remove($serviceCode); ),
        result(list)
)
$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode in $highCostServices
    )
)

nb - アキュムレータは間違いやすいので、通常はいくつかの単体テストを配置します。上記のコードは、どこにも実行せずにここでフリーハンドで記述したため、修正しなくても動作する場合は幸運です。

詳細については、次のマニュアルを参照してください。

http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/

リストにある一致するアイテム:

4.8.3.3.10.10. 演算子 in および not in (複合値の制限)

一致したファクトのリストの収集:

4.8.3.7.3. 条件要素収集

コレクションの最大値、最小値、合計値などを計算するためのアキュムレータ:

4.8.3.7.4.1. CE の累積 (推奨される構文)

于 2013-10-23T11:47:38.020 に答える