気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM等について、学んだことや備忘録をアウトプットとして残し、情報を必要としている誰かにとって「かゆいところに手が届く」ブログとなることを願いながら記事を書いています。

【intra-mart】横配置・縦配置ノードに展開されたノードIDから、展開元のノードIDを取得する方法

スポンサーリンク

こんにちは。

今回は、intra-martに関する記事です。

縦配置・横配置ノード

横配置・縦配置ノードには、複数の処理対象者を設定することができます。 (横配置の場合は、必ず設定順に処理が流れ、縦配置の場合は設定した対象者が全て処理を完了した時点で次の処理に流れるということが実現できます。)

つまり、稟議書のワークフロー等、複数の承認者が必要な場合には必須となってくるノードかと思います。

ノードとステータスの紐づけの要件があったら

例えば、業務ワークフローにおいて、各ノードが終了する度に、ステータスを更新するような要件が発生したとします。

  • 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」に設定しました。

f:id:rinne_grid2_1:20180520084741p:plain

f:id:rinne_grid2_1:20180520084800p:plain

フォーム設定

IM-BISからIM-FormaDesignerを開き、簡易的なフォームを配置します。

f:id:rinne_grid2_1:20180520085154p:plain

フォーム共有で横配置・縦配置それぞれに共有し、「定義の反映」実行

共有

  • フォームを共有

f:id:rinne_grid2_1:20180520085450p:plain

貼り付け

  • 横配置・縦配置にそれぞれフォームを貼付

f:id:rinne_grid2_1:20180520085638p:plain

定義の反映

  • 忘れてはいけない、定義の反映を実行

f:id:rinne_grid2_1:20180520085834p:plain

LogicDesignerのフロー定義を作成

入出力設定

  • 到達処理で、動的に割り当てられたノードIDを取得するため、暗黙的なパラメータをセットします
    • 入力:システム案件IDとノードIDを設定
    • 出力:メール送信可否フラグを設定(mailSendFlagはboolean)

f:id:rinne_grid2_1:20180520094556p:plain

到達処理で割当可能なパラメータについては、下記のintra-martのリンクをご参照ください。

5.4. 到達処理 — IM-Workflow プログラミングガイド   第16版 2016-08-01   intra-mart Accel Platform

定数設定

  • 到達処理では、必ずメール送信可否フラグを返却する必要があるため、今回は定数でtrueを設定しておきます

f:id:rinne_grid2_1:20180520090943p:plain

ユーザ定義(JavaScript定義)を作成します

f:id:rinne_grid2_1:20180520091156p:plain

パラメータの設定

  • 到達処理で受け取ったパラメータをJavaScript定義に渡すため、入力パラメータにシステム案件IDとノードIDを設定します

f:id:rinne_grid2_1:20180520092551p:plain

スクリプトの作成

  • 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定義でデータソース定義を作成

f:id:rinne_grid2_1:20180520093139p:plain

f:id:rinne_grid2_1:20180520093251p:plain

f:id:rinne_grid2_1:20180520093347p:plain

コンテンツ定義で、到達処理を設定

f:id:rinne_grid2_1:20180520093522p:plain

f:id:rinne_grid2_1:20180520093727p:plain

サンプルデータの青柳さんでログインして、申請を実施

(ロール:BIS担当者を付与していないと、申請時に権限エラーで落ちるので、注意しましょう)

f:id:rinne_grid2_1:20180520100757p:plain

f:id:rinne_grid2_1:20180520100909p:plain

横配置ノードに到達し、到達処理が動く

  • ノードIDが取得できたことが確認 (e Builderのコンソールより)

f:id:rinne_grid2_1:20180520101200p:plain

これで、現在ノード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ライフを。