こんにちは。
今回は、intra-martに関する記事です。
- 縦配置・横配置ノード
- ノードとステータスの紐づけの要件があったら
- 利用する機能
- IM-BIS定義を作成し、ルート定義の設定とフォーム設定を行う
- フォーム共有で横配置・縦配置それぞれに共有し、「定義の反映」実行
- LogicDesignerのフロー定義を作成
- 上記LogicDesigner定義でデータソース定義を作成
- コンテンツ定義で、到達処理を設定
- サンプルデータの青柳さんでログインして、申請を実施
- 横配置ノードに到達し、到達処理が動く
縦配置・横配置ノード
横配置・縦配置ノードには、複数の処理対象者を設定することができます。 (横配置の場合は、必ず設定順に処理が流れ、縦配置の場合は設定した対象者が全て処理を完了した時点で次の処理に流れるということが実現できます。)
つまり、稟議書のワークフロー等、複数の承認者が必要な場合には必須となってくるノードかと思います。
ノードとステータスの紐づけの要件があったら
例えば、業務ワークフローにおいて、各ノードが終了する度に、ステータスを更新するような要件が発生したとします。
- 0: 未申請(申請前)
- 1: 申請OK(申請終了)
- 2: 複数承認OK(横配置終了)
- 3: 同期承認OK(縦配置終了)
- 4: 申請業務終了(案件終了)
その場合、ルート定義で設定したノードIDを元に、LogicDesigner内で分岐して、 対象のノードに到達した時点でDBにステータス更新を行えば良い・・・という感じに思ってしまうのですが・・・
横配置・縦配置それぞれが実際にワークフローとして動作する際には、 ルート定義で設定したノードIDではなく、動的に割り当てられたIDがセットされる仕様になっています。
そこで今回は、下記の機能を利用し、動的に割り当てられたノードIDから、ルート定義で設定したノードIDを取得する方法についてまとめます。
利用する機能
- IM-BIS
- IM-FormaDesigner
- IM-LogicDesigner
- ユーザ定義(スクリプト)
- IM-Workflow
- 到達処理
- データソース定義
IM-BIS定義を作成し、ルート定義の設定とフォーム設定を行う
ルート定義
横配置、縦配置の順にノードを配置し、それぞれのノードIDは「yoko_node」「tate_node」に設定しました。
フォーム設定
IM-BISからIM-FormaDesignerを開き、簡易的なフォームを配置します。
フォーム共有で横配置・縦配置それぞれに共有し、「定義の反映」実行
共有
- フォームを共有
貼り付け
- 横配置・縦配置にそれぞれフォームを貼付
定義の反映
- 忘れてはいけない、定義の反映を実行
LogicDesignerのフロー定義を作成
入出力設定
- 到達処理で、動的に割り当てられたノードIDを取得するため、暗黙的なパラメータをセットします
- 入力:システム案件IDとノードIDを設定
- 出力:メール送信可否フラグを設定(mailSendFlagはboolean)
到達処理で割当可能なパラメータについては、下記のintra-martのリンクをご参照ください。
5.4. 到達処理 — IM-Workflow プログラミングガイド 第16版 2016-08-01 intra-mart Accel Platform
定数設定
- 到達処理では、必ずメール送信可否フラグを返却する必要があるため、今回は定数でtrueを設定しておきます
ユーザ定義(JavaScript定義)を作成します
パラメータの設定
- 到達処理で受け取ったパラメータをJavaScript定義に渡すため、入力パラメータにシステム案件IDとノードIDを設定します
スクリプトの作成
- JavaScriptを記述します
- ロケールコードとシステム案件IDを利用し、未完了案件ノードを取得
- 未完了案件ノードから、ノード設定情報を取得
- 取得できた場合、ノード設定情報から、展開元のノードIDを取得
function run(input) { var systemMatterId = input.systemMatterId; var nodeId = input.nodeId; var actvMatterNode = new ActvMatterNode("ja", systemMatterId); var config = actvMatterNode.getExecNodeConfig(nodeId); if(config.resultFlag && config.data !== undefined) { var originalNodeId = config.data.expansionOriginalNodeId[0]; Debug.console("展開ノードID:" + nodeId + " 展開元ノードID:" +originalNodeId); } return {}; }
上記LogicDesigner定義でデータソース定義を作成
コンテンツ定義で、到達処理を設定
サンプルデータの青柳さんでログインして、申請を実施
(ロール:BIS担当者を付与していないと、申請時に権限エラーで落ちるので、注意しましょう)
横配置ノードに到達し、到達処理が動く
- ノードIDが取得できたことが確認 (e Builderのコンソールより)
これで、現在ノードIDの展開元が何なのかを知ることができました。
ただし、「動的承認ノード」でも到達処理が動いてしまうため、動的承認ノードが存在する場合は、 ルート定義のIDを用いて、別途分岐を行う必要があります。 (動的承認ノードの場合は、ルート定義のノードIDがそのまま渡されるため、分岐に利用できます)
function run(input) { var systemMatterId = input.systemMatterId; var nodeId = input.nodeId; var dynamicNodeList = ["douteki_node1", "douteki_node2"]; // 到達処理で渡されたノードIDが動的承認ノードのものではない場合、横配置・縦配置として展開元IDを取得 if(dynamicNodeList.indexOf(nodeId) < 0) { var actvMatterNode = new ActvMatterNode("ja", systemMatterId); var config = actvMatterNode.getExecNodeConfig(nodeId); if(config.resultFlag && config.data !== undefined) { var originalNodeId = config.data.expansionOriginalNodeId[0]; Debug.console("展開ノードID:" + nodeId + " 展開元ノードID:" +originalNodeId); } } else { // 動的承認ノードの処理 } return {}; }
以上で終わります。 皆様も素敵なintra-martライフを。