InterSystems IRIS Workflow Engine によるタスクのフロー - 構成
前回の記事では、一般的な概念と、InterSystems IRIS に統合されたタスクエンジンを使用して解決する問題を紹介しました。今回の記事では、相互運用性プロダクションを構成してソリューションを提供する方法を確認します。
Workflow Engine の構成
First we are going to define the roles of the tasks that we are going to manage, in our example we are going to define two types:
- AutomaticBloodPressureRole: ユーザーの介入が不要な自動タスクを作成します。
- ManualBloodPressureRole: ユーザーが手動で検証する必要のあるタスクを作成します。
.png)
後で様々な患者から HL7 メッセージを受信するたびにロールをユーザーに割り当てるため、ここでは割り当てる必要はありません。
また、IRIS ユーザーを Workflow に追加する必要もありません。これはプロダクションからコードで実行します。
プロダクションのセットアップ
この例では、アドホックで作成した「WORKFLOW」というネームスペース内にプロダクションを作成します。 このプロダクションに、必要とするビジネスコンポーネントを含めます。
.png)
最も単純なコンポーネントから説明し始めましょう。
ビジネスサービス
- HL7_File_IN: 医療装置からのメッセージの受信をシミュレーションする特定のサーバーパスから HL7 ファイルを収集します。
ビジネスオペレーション
- AutomaticBloodPressureRole: クラス EnsLib.Workflow.Operation のコンポーネント。Workflow で生成するために使用する、定義済みのロールの 1 つの名前を使用します。ユーザーとの直接的な対話を伴わないタスクです。
- ManualBloodPressureRole: 前のビジネスオペレーションに似ていますが、この場合、生成するタスクには、それらをクローンするための直接的なユーザーの介入が必要です。
では、情報のフロー、およびサイクルに関連するタスクの作成と管理を管理するビジネスプロセスを詳しく見てみましょう。
Workflow.BP.BloodPressurePlan
このビジネスプロセスは BPL タイプで、患者のケアに関わるタスクの作成と、患者と血圧レベルに関連する情報を送信する医療装置からのレスポンスの取得を行います。
プロセスの開始:
.png)
この部分のフローは以下を行います。
- ユーザーのチェック: 受信した ADT^A08 メッセージのユーザーをチェックします。存在する場合はフローを続行し、存在しない場合は IRIS にユーザーを作成して、ワークフローに定義されたロールに割り当てます。 ユーザーをロールに割り当てるには、以下のコマンドを実行します。
/// Workflow user creationset sc = ##class(EnsLib.Workflow.UserDefinition).CreateUser(username) /// Assigning Workflow user to the roleset sc = ##class(EnsLib.Workflow.RoleDefinition).AddUserToRole(role, username) - 自動タスクの取得: このフローでは、自動タスクと手動タスクの両方を管理するため、受信した患者のユーザーに保留中の自動タスクがないかをチェックする必要があります。 保留中の自動タスクがある場合は、ノーマルレベルを超える値を持つ前の測定値があることを意味するため、重要です。 このチェックは、すべての作成されたタスクが保存されている TaskResponse テーブルで直接行います。クエリは以下のとおりです。
&sql(SELECTIDINTO :taskId FROM EnsLib_Workflow.TaskResponse WHERE TaskStatus_AssignedTo = :username AND TaskStatus_IsComplete = 0AND %RoleName = :role) - OBX 数の取得: HL7 メッセージから OBX セグメントの数を取得します。
- OBX 値の確認: OBX セグメントを確認し、血圧に関連するデータのみを抽出します。
- 保留中のタスクの有無: 2 番目のポイントで述べたように、保留中のタスクがあるかどうかを確認します。
1 回目の血圧測定:
この部分のフローでは、定義された最大血圧レベルを超える 1 回目の測定によって生成されていないメッセージを処理します。
.png)
- 血圧の確認: 血圧レベルが既定の制限を超えていないかをチェックします。超えていない場合は、プロセスは他の作業を行わずに終了します。 超えている場合は、櫃湯尾なタスクを作成する必要があります。
- 手動タスクの作成: 血圧が定義された安全レベルを超過している場合は、患者に状況を報告し、2 回目の測定が必要であることを示す手動タスクを作成する必要があります。 このアクティビティの構成を確認しましょう。
- ビジネスオペレーション ManualBloodPressureRole を呼び出します。これにより、EnsLib.Workflow.TaskRequest タイプのメッセージを渡してタスクが生成されます。
- callrequest.%Actions に患者が実行できるアクションをカンマ区切りで定義します。ここでは、"Accept" アクションのみを定義しています。
- 患者に示すメッセージを callrequest.%Message に構成します。
- callrequest.%UserName でユーザー名を定義することで、作成したタスクに患者を割り当てます。
- 最後に、callequest.%Subject に題名またはタイトルを指定し、callrequest.%Priority に優先度(1~3)を指定します。
- 自動タスクの作成: 前のアクティビティの構成に似ていますが、ここではビジネスオペレーション AutomaticBloodPressureRole に送信します。 このタスクは、患者の 2 回目の血圧測定を待機するタスクで、保留中のタスクの有無のアクティビティで false を取得することによって、その患者に対してプロダクションで受信した新しいメッセージが新しいタスクを生成しないようにするタスクです。
- タスクの待機: このアクティビティは、タスクと手動操作が完了するまで、つまり、患者が ManualBloodPressureRole で作成されたアラームを閉じて IRIS プロダクションが医療装置から 2 回目のメッセージを受け取るまでタスクフローを停止します。
- 警告の有無のチェック: 前の保留中のタスクがクローズされたら、このアクティビティに進みます。 この時点では、自動タスクのクローズにおいて、構成された最大血圧値を超えるレベルの新しい測定を受信(タスクは警告アクションによってクローズされます)したかどうかを確認します。 測定値が最大値未満である場合、このプロセスは終了します。 測定値が最大値を超える場合は、次のアクティビティに進みます。
- 医師の警告タスク: 患者に割り当てられた医師に対し、患者が危険な状態にある可能性があることを報告する手動タスクが作成されます。
- 患者の警告タスク: 患者に対し、医師が状況が報告されたことを示す新しい手動タスクが作成されます。
2 回目の血圧測定:
この部分のフローは、前に作成された自動タスクが完了しなかった場合にのみ実行されます。
.png)
- 血圧のチェック: もう一度、血圧値が制限を超えるかどうかについて受信したメッセージを検証します。
- 通常タスクの終了: レベルが最大値を超えていない場合、タスクがインスタンス化する EnsLib.Workflow.TaskResponse クラスが提供する CompleteTask メソッドで保留中のタスクをクローズします。 使用されるパラメーターは対応処置を示しますが、この場合、FalseAlarm 値を渡して語法であることを示します。必要に応じて他の内容を定義することも可能です。
- 警告タスクの終了: 前の場合と同じですが、この場合に Workflow エンジンに渡すアクションは Warning であり、前の「警告の有無のチェック」アクティビティでチェックされる値です。
以下のダイアグラムで確認できるように(文字通りではありませんが、仕組みを把握することはできます)、タスクフローは 2 つの「スレッド」または「プロセス」で機能するようになっています。
.png)
最初のスレッド/プロセスは、2 回目の測定を待機する必要がある場合に備えてオープン状態のままとなり、2 回目の測定を受信したときに最初のオープンスレッドの再開を引き起こす、つまり定義されたタスクフローを終了するのは、2 つ目のスレッド/プロセスです。
まとめ
ご覧のように、BPL でタスクを構成するのは非常に単純です。それほど複雑な作業を行わずに、自動タスクと手動タスクをシミュレーションできます。 次の記事がこのシリーズの最後となりますが、ユーザーが外部アプリケーションからタスクを操作する方法を確認しましょう。
お読みいただきありがとうございました!