記事
· 2023年6月1日 21m read

ワークフローコンポーネントを使ってみよう!~使用手順解説~

開発者の皆さん、こんにちは!

この記事では、システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプル でご紹介した内容を、お手元のIRIS、IRIS for Healthを利用して体験いただくための手順を解説します。

なお、ワークフローコンポーネントでどんなことができるのか?の概要説明については、ウェビナーをご参照ください。

A.事前準備

1) InterSystems IRIS または、IRIS for Healthのインストール環境をご用意ください。

まだインストール環境がない場合は、コミュニティエディション(コンテナ版かキット版)をご利用ください。

 

2)  サンプルのダウンロード

サンプル(https://github.com/Intersystems-jp/WorkFlow-DC)を git clone またはZipでダウンロードします。

ISJFoodsディレクトリ以下を使用します。

 

3) ネームスペース、データベースの用意(コミュニティエディションの場合は不要)

コミュニティエディションをご利用の場合は、インストール時用意されるUSERネームスペースをご利用いただけますので準備不要です。

製品版をインストールされている場合は、任意のネームスペース、データベースの作成をお願いします。

ネームスペース、データベースの作成について詳しくは、【はじめての InterSystems IRIS】セルフラーニングビデオ:基本その2:InterSystems IRIS で開発をはじめよう! をご参照ください。

 

4) サンプルのインポート

2)でダウンロードしたサンプルの中から、ISJFoodsディレクトリ以下のクラス定義を 3)で確認したネームスペースにインポートします。

(コミュニティエディションの場合はUSERをご利用ください)

インポート方法は、IDE(VSCode/スタジオ)または管理ポータルから行えます。4-1)~4-3) の中からお好みの方法を選択してインポートを行ってください。

IRIS接続時に使用するログインユーザは、SuperUserや_systemをご利用ください。

パスワードはインストール時に指定された文字列をご利用ください。インストール時にパスワードを指定されていない場合は、SYS(すべて大文字)をご利用ください。

4-1) VSCodeの場合

VSCodeでWorkFlow-DCディレクトリを開きます。IRISに接続後、ISJFoodsフォルダを右クリックし「Import and Compile」をクリックします。

VSCodeでIRISに接続する方法は、VSCode を使ってみよう! をご参照ください。

4-2) スタジオの場合

スタジオを起動し、接続先ネームスペースに切り替え、ISJFoods以下のサブディレクトリも含め、すべての *.clsをドラッグ&ドロップしてインポートします。

 

4-3) 管理ポータルの場合

管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp

※ポート番号はお使いの環境に合わせてご変更ください。

管理ポータル > [システムエクスプローラ] > [クラス] を開き、画面左側で使用するネームスペースを選択します(下図はUSERを選択しています)

インポートボタンをクリックし、「ディレクトリ」を指定してインポートを選択し、ダウンロードしたサンプルのISJFoodsディレクトリを指定します。

インポートボタンをクリックすると、以下の画面が表示されます。

「バックグラウンドタスクを参照するには・・・」のリンクをクリックすると、コンパイルが正常終了しているかどうか確認できます。

 

5) ワークフロータスク用データ作成(POPメッセージ候補の作成)

ワークフローユーザポータルで審査ができるように、POPメッセージ候補を登録するテーブルに予め4件データを登録します。

ISJFoods.UtilsクラスCreateData() メソッドを実行します。

WindowsにIRISをインストールされている場合は、タスクバー上のIRISランチャー  をクリックし、ターミナルを選択します。

Windows以外でお試しいただいてる場合は、iris session iris コマンドでIRISにログインしてください。

※ iris session インスタンス名 (インスタンス名=インストール時に指定した名称)

iris session iris

ログイン後、対象ネームスペースに移動します。

※コミュニティエディションを利用されている場合はUSERネームスペースを使用します。ログイン時のデフォルトネームスペースがUSERネームスペースのため、移動は不要です。

set $namespace="TEST"  //TESTネームスペースに移動する例

メソッドを実行します。

do ##class(ISJFoods.Utils).CreateData()

 

データの確認には、管理ポータルのSQLメニューを利用します。

管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp

[システムエクスプローラ] > [SQL] > ネームスペース選択 (例:USER)に移動し、「クエリ実行」タブに以下SELECT文を入力し「実行」ボタンをクリックします。

商品情報用テーブル​​​​

select * from ISJFoods_Tbl.Product

POPメッセージ候補テーブル

select * from ISJFoods_Tbl.POP

ビジネス・サービスで一定間隔にレコードを抽出するときに使用しているSELECT文は以下の通りです。

SELECT
Product->PID,Product->ProductName,POPID,Status,Message,TO_CHAR(StartDate,'YYYY-MM-DD') As StartDate, Period,RejectedReason, Done
FROM ISJFoods_Tbl.POP

暗黙結合(矢印構文)を使用しています。詳細はドキュメントをご参照ください。

 

6) テーブルへの接続に使用するDSNの設定

サンプルの中では、5)で用意したテーブルに対して、ODBC/JDBC接続を利用して定期的にSELECT文を実行します。

サンプルコードの設定では、DSN名「Test」で登録していますので、ODBC/JDBC接続用DSN名を環境にご用意ください。

 

ODBC接続の場合(Windowsの例)

ODBCデータソースアドミニストレーター(64bit)で「システムDSN」として作成します。

ドライバ名は「InterSystems IRIS ODBC35」を選択して、DSN名「Test」で作成します。​​​

IPアドレス、ポート、ネームスペース、ユーザ名、パスワード を接続対象IRISに合わせて記入します。

「テスト接続」ボタンをクリックし、接続が成功することを確認してから、OKボタンをクリックして画面を閉じてください。

 

JDBC接続の場合

※サポートしているバージョンについて最新はこちらのドキュメントをご参照ください。

管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp

[システム管理] > [構成] > [接続性] > [SQLゲートウェイ接続] > 新規接続作成 をクリックし、接続名に「Test」と設定します。

  • ドライバ名は com.intersystems.jdbc.IRISDriver
  • URLは、jdbc:IRIS://localhost:1972/USER (ポート番号、ネームスペース名は環境に合わせて変更してください)
  • クラスパスは、.:usr/irissys/dev/java/lib/1.8/intersystems-jdbc-3.7.1.jar (JARファイルは、IRISインストールディレクトリ/dev/java/lib/ 以下にあります)

※インストール環境のポート番号(上記設定では「スーパーサーバポート」)を確認する場合は管理ポータルの「概要」ページをご参照ください。

設定が完了したら「テスト接続」ボタンをクリックして接続を確認します。

成功したら「保存」ボタンをクリックして設定を保存します。

 

以上で事前準備は完了です!


 

B.ワークフローコンポーネントを使用するための設定

次はいよいよ、ワークフローコンポーネントを使用するための設定を行っていきます。以下の手順で進めていきます。

  1. ワークフロータスクを処理するユーザを作成する
  2. ワークフローロールを作成する
  3. ビジネス・オペレーションを追加する
  4. ビジネス・プロセスからワークフローオペレーションを呼び出す

3、4については、サンプルクラスのインポートで準備済ですが、コードを参照しながら流れをご確認いただきます。

 

1. ワークフロータスクを処理するユーザを作成する

ワークフロータスクを処理するユーザは、IRISのユーザポータルにログインする必要があるため、IRIS内ユーザとして登録が必要です。

この記事の中では、ワークフロータスクの処理だけが行えるユーザとして登録していきます。(管理ポータルにログインできないけれども、ワークフロータスクを処理するため、ユーザポータルにはアクセスできるユーザを作成していきます。)

IRIS内ユーザは、ロールを付与することで管理ポータル内メニューやデータベース、ターミナルへのアクセス許可を得ます。

ロールにはリソース(保護対象:データベース、接続経路であるサービス、ターミナル、スタジオ、管理ポータルメニューなど)に対する許可の組み合わせを登録できます。

ロールは自分で作成することも、インストール時用意される事前定義のロールを使用することもできます。​

手順は以下の通りです。

1-1) ユーザポータルだけにアクセスできるロールを作成する

1-2) ユーザを作成し、1-1)で作成したロールのメンバーに設定する。

1-3) 作成したユーザを「ワークフローユーザ」として設定する

 

1-1) ユーザポータルだけにアクセスできるロールを作成する

ロール名は任意に決定できますが、この手順では、WorkFlowSystemRole の名称で作成し、ユーザポータルのUSE許可を持つロールとして作成します。

管理ポータルを開きます。👉 http://localhost:52773/csp/sys/UtilHome.csp

[システム管理] > [セキュリティ] > [ロール] > [新規ロール作成]ボタンをクリックします。

「名前」に WorkFlowSystemRole を設定し、「保存」ボタンをクリックします。(一度名前を付けて保存した後、リソースに対する許可を設定します)

保存ボタンクリック後、リソースの追加が行えます。

追加ボタンをクリックし、表示される子画面の中から「%DeepSee_Portal」を選択し、OKボタンをクリックします。

デフォルトでUSE許可の「U」が設定されます。

これでロールの作成は完了です。

 

1-2) ユーザを作成し、1-1)で作成したロールのメンバーに設定する。

管理ポータル > [システム管理] > [セキュリティ] > [ユーザ] > [新規ユーザ作成] ボタンをクリックします。

サンプルコードでは、ユーザ:ManagerA に対してワークフロータスクを依頼するため、ManagerAは必須で作成してください。

「名前」に ManagerA を設定します。

「パスワード」と「パスワード(再入力)」に、お好みのパスワードを指定してください。

名前、パスワード、パスワード(再入力)の設定が完了したら「保存」ボタンをクリックします。

保存後、「ロール」タブが表示されます。

ロールタブに移動し、「利用可能」から作成したロール:WorkFlowSystemRole を選択し、「選択済み」に移します。

「付与する」ボタンをクリックすることで、ManagerAに WorkFlowSystemRole ロールが付与されます。 

同様の手順で、ユーザ:ManagerBを作成します。

WorkFlowSystemRoleのメンバにManagerAとManagerBが所属していれば、設定完了です。

 

1-3) 作成したユーザを「ワークフローユーザ」として設定する

作成したManagerA、ManagerBをワークフローユーザとして設定します。

管理ポータル > [Interoperability] > 使用するネームスペース選択 > [管理] > [ワークフロー] > [ユーザ]

※コミュニティエディションを利用している場合は、USERネームスペースを指定します。製品版を使用している場合は、用意したネームスペースを選択します。

画面右の「名前」のプルダウンから、ManagerAを選択します。「アクティブ?」のチェックボックスにチェックを入れ、保存ボタンをクリックします。

同様に、ManagerBも設定します。

2. ワークフローロールを作成する

1で作成したワークフローユーザをメンバに持つワークフローロールを作成します。

この名称は、ワークフロービジネス・オペレーションのコンポーネント登録名として利用する名前になります。サンプルコードでは「POP審査ワークフロー」としているので、この名称でワークフローロールを作成します。

管理ポータル > [Interoperability] > ネームスペース選択 > 管理 > ワークフロー > ワークフロー・ロール

※コミュニティエディションを利用している場合は、ネームスペースはUSERを選択してください。それ以外の環境はサンプルコードをインポートされたネームスペースを指定してください。

まずは、「名前」に「POP審査ワークフロー」を設定し「保存」ボタンをクリックします。

保存ボタンクリック後、ロール名が画面中央に表示されます。

画面中央のロール名をクリックし、画面右の「追加」ボタンから、ワークフローユーザを追加します。

ManagerAとManagerBをメンバとして設定します。

設定後の確認で、「ユーザ」ボタンをクリックすると、ワークフローロールのメンバが表示されます。

 

3. ビジネス・オペレーションを追加する

サンプルコードのインポートでプロダクションにオペレーションが追加されています。

どのように追加したか、プロダクション構成画面を参照しながら確認します。

管理ポータル > [Interoperability] > [構成する] > [プロダクション] に移動します。「開く」のボタンをクリックし、ISJFoods > Production を選択します。

開いた画面の「開始する」ボタンをクリックします。

開始中の画面が表示され、「完了しました」が表示されたことを確認しOKボタンをクリックすると、以下の表示に変わります。(〇の色が濃い緑色に変わります)

※もし、〇 の色が赤くなっている場合は、データベースへの接続に失敗していることなどが考えられます。お困りのことがありましたら、返信欄でお知らせください。

今回使用しているワークフロービジネス・オペレーションは、1つ前の手順で作成したワークフローロール名「POP審査ワークフロー」と一致させる規則があります。

「POP審査ワークフロー」の字の部分をクリックすると右画面に設定画面が表示されます。

ワークフロービジネス・オペレーションは予め用意されたクラス:EnsLib.WorkFlow.Operation を使用して登録されています。

(画面右の「設定」タブにある「情報を提供する設定」を展開すると「クラス名」に使用しているクラス名が表示されます)

これで、ワークフローロールのメンバにタスクを渡す準備が整いました。

後は、ビジネス・プロセスからワークフロービジネス・オペレーションを呼び出すだけとなりました。

 

4.ビジネス・プロセスからワークフローオペレーションを呼び出す

ワークフロービジネス・オペレーションを呼び出すビジネス・プロセスの定義を確認します。

開いているプロダクション構成画面にある「POP審査」がサンプルで使用しているビジネス・プロセスです。コードを開くには、「POP審査」の字の部分をクリックし、「設定」タブの「情報を提供する設定」を展開し、「クラス名」に欄の右横にある🔍のアイコンをクリックします。

ビジネス・プロセスエディタが開き、定義を確認できます。

「判断ワークフロー呼び出し」の箱(アクティビティ)がワークフロービジネス・オペレーションの呼び出しを設定しているアクティビティです。

アクティビティをクリックすると、画面右側に設定内容が表示されます。

画面右の設定欄で「ターゲット」に設定されているのは、呼び出し先となるワークフロービジネス・オペレーションの名称「POP審査ワークフロー」です。

「要求メッセージ・クラス」に設定されているのは、ワークフロービジネス・オペレーションに渡すメッセージクラスでEnsLib.Workflow.TaskRequestが設定されています。

その下の「要求アクション」には、ユーザが審査する際使用するユーザポータルに表示させるボタン表示名(callrequest.%Actionsの設定)や、件名(callrequest.%Subject)、依頼するユーザ名(callrequest.%UserName)が設定されていることが確認できます。

この後、ユーザからの指示が来るまで、「ワークフローの応答待機」のところでフローは待機します。

ユーザからの指示が来た場合、「応答アクション」にある応答メッセージでユーザが押したボタンの情報など、取得できます。

ユーザからの回答は、応答メッセージ:EnsLib.Workflow.TaskResponse に設定され、押したボタンの情報は callresponse.%Actionsで確認できます。

以上で、設定は完了です。

 


 

C.ワークフローユーザによるタスクの審査

次は、いよいよ、ワークフローユーザによるタスクの審査を行ってみます。以下の手順で確認していきましょう。

  1. 処理対象POPメッセージのトレースを開く
  2. ユーザポータルにログインし、ワークフロータスクを処理する
  3. タスク処理後のメッセージのトレースを確認する ​​​​

1. 処理対象POPメッセージのトレースを開く

管理ポータル > [Interoperability] > [構成する] > [プロダクション] に移動します。

ビジネス・サービス「POPメッセージSQL抽出」は、定期的にPOPメッセージ候補が格納されたテーブルに対してSELECT文を実施しています。

画面左下の「POPメッセージ抽出​​​​」の字の部分をクリックし、「設定」タブを参照します。

「Data」を展開し「クエリ」欄を確認します。POPメッセージ候補が格納されているテーブルの未処理(Done=0)のレコードを抽出するためのSELECT文が登録されています。

select StartDate,Period,Message,Product,POPID,Product,Product->PID As PID from ISJFoods_Tbl.POP
WHERE Done=0

また、「削除クエリ」欄では、以下UPDATE文が登録されています。

UPDATE ISJFoods_Tbl.POP
SET Done=1
WHERE POPID=?

「削除クエリ」は、「処理したレコードを処理対象から削除する」と考えていただくとわかりやすいと思います。

サンプルの設定では、SELECT対象テーブルのDoneカラムが0のレコードを処理対象とし、処理済レコードはDoneを1に変更することで、何度も同じレコードを処理対象としないように設定しています。

また、UPDATE文の条件となる値は、「キー・フィールド名」の指定したPOPIDの値を利用するように設定しています。

なお、このビジネス・サービスは EnsLib.SQL.Service.GenericService クラスを使用しています(IRISインストール時に用意されるクラスを利用しています)。このクラスを利用して登録したビジネス・サービスは、取得できたレコードをJSON文字としてメッセージに設定し、次のコンポーネントに送信します。(詳細はメッセージのトレースを参照すると確認できます)
​​​

ということで、メッセージを確認してみましょう。

画面左下の「POPメッセージ抽出​​​​」の字の部分をクリックします。画面向かって右側で「メッセージ」タブをクリックすると、4件のメッセージが送信されていることが確認できます。

ヘッダ列にある番号をクリックするとトレース画面が開きます。以下の画面は一番上にある(8)のメッセージを選択した状態です。

[1] の箱を選択し、右画面の「コンテンツ」タブを選択すると送信されているメッセージの情報を確認できます。

取得できたレコードがJSON文字として送信されていることが確認できます。

[2] の箱をクリックします。[2]は、ワークフロービジネス・オペレーションに送付している情報を確認できます。ワークフローを処理するユーザが使用するユーザポータルに表示させるボタン名などが指定されています。

図の設定ですと、ボタン名は 承認/却下/保留、サブジェクトに「商品ID:P001 新着POPメッセージ​​​​​」、メッセージとして「運動会のおかずにどうでしょう」という情報がユーザポータルに表示される予定です。

また、ManagerAに審査を依頼していることも確認できます。

この後、ユーザポータルを利用してManagerAがボタンを選択しタスクを処理します。ユーザが押したボタンの情報は、このトレースの続きの情報として確認できる予定です。

(この画面は、ワークフロータスクを処理した後にも参照しますので、消さずに残しておいてください。)
​​​​

2.ユーザポータルにログインし、ワークフロータスクを処理する

ManagerAでユーザポータルにログインします。

※管理ポータルの表示に利用しているブラウザではない別の種類のブラウザで開くことをお勧めします。(ManagerAはユーザポータルしかアクセスできないユーザであるため、管理ポータルを表示するために毎回ログインが必要となります。別の種類のブラウザを利用することで、セッションが別管理となるためいちいちログインしなおす必要がありません)

USERネームスペースを利用している場合は、以下URLでアクセスできます(ポート番号はアクセスされる環境に合わせてご変更ください)。

http://localhost:52773/csp/user/_DeepSee.UserPortal.Home.zen

TESTネームスペース利用されている場合は、

http://localhost:52773/csp/test/_DeepSee.UserPortal.Home.zen

IRIS for Healthで任意のネームスペースを作成された場合は(例:TEST)

http://localhost:52773/csp/healthshare/test/_DeepSee.UserPortal.Home.zen

アクセスできない場合は、管理ポータルを開き http://localhost:52773/csp/sys/UtilHome.csp、一旦SuperUserか_SYSTEMでログインします。

管理ポータル > [Analytics] > ネームスペース選択 > [ユーザポータル] に移動後、ログアウトします。

ManagerAでログイン後、「ワークフロー受信箱」を選択します。

メッセージのトレースで確認した情報を探し、一覧の中から選択します。

画面下にタスク詳細が表示されます。メッセージに設定していたボタン名が表示されていることを確認できます(右3つのボタン)。また、サブジェクトとメッセージにもトレースで確認した情報が表示されていることが確認できます。

では、承認ボタンを押してみましょう。(ボタンクリック後、一覧から情報が消えます)

 

3. タスク処理後のメッセージのトレースを確認する

1で確認していたメッセージのトレース画面をリロードしてみましょう。

ユーザが押したボタンの情報が [3]の箱をクリックすると確認できます。

また、次の処理に進んでいることも確認できます。

 

ここまでの流れを通して、ワークフローコンポーネントを利用することで自動的に流れる処理の途中にユーザからの指示待ちの動作を入れたり、ユーザからの回答内容に合わせて処理を変えていくなど、自動的な流れとユーザの動作を統合させることができることを確認できました。

サンプルコードの流れでは、ユーザの押したボタンに合わせ、POPメッセージが承認されたか、却下されたか、ステータスを更新する処理だけで終了していますが、この後、POP登録者用Teamsチャネルに通知を出すおまけの動作も含めています。

お試しいただく場合は、システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプルPOPメッセージ審査完了通知(Teams)をご利用いただく場合をご参照ください。

 


 

続いて、未処理のタスクを他のユーザにアサインする方法をご紹介します。

別ユーザへのアサインは、管理ポータルを利用しますので、スーパーバイザーとしてのユーザを用意する必要がありますが、この記事の中ではSuperUserまたは_SYSTEMユーザを利用して試してみます。

SuperUserまたは_Systemでログインした管理ポータルを利用して、以下メニューにアクセスします。

管理ポータル > [Interoperability] > [管理] > [ワークフロー] > [ワークフロー・タスク]

ManagerAにアサインされているタスクを、ManagerBに変更してみます。

タスクの一覧が表示されるので、ステータスが「Assigned」の行を選択し、「タスクの割り当て」ボタンをクリックします。

表示される子画面の「ユーザ名」のプルダウンから、ManagerBを選択し、OKボタンをクリックします。


ユーザポータルをManagerBでログインしなおし、1件だけタスクが表示されることを確認してください。

ユーザポータルは、管理ポータル > [Analytics] > [ユーザポータル] で遷移できます。一旦ログアウトし、ManagerBでログインしなおしてください。

ManagerBの画面にタスクが1件表示されることが確認できます。

これで、担当者が急なお休みに入ってしまっても担当者の切り替えができるので安心です。


 

最後に、ユーザポータルの表示についてですが、標準のポータルはこれ以上の加工ができません。

ユーザが処理する際、補足的な情報をもっと表示させたりお好みのデザインのWebアプリに埋め込みたい!などのご要望もあるかと思います。

そんな時には、開発者コミュニティのサンプル公開サイトであるOpen Echange に公開されている「ワークフローREST API」が最適です!

次の記事では、ワークフローREST API の使い方をご紹介する予定です。

サンプルWebアプリは、1つ前の記事システム連携の自動的な流れの中にユーザからの指示を介入できる「ワークフローコンポーネント」のサンプル でご紹介しています。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください