仲の良い親子ワークフローを作る方法
親ワークフローから子ワークフローを起動、子ワークフローの状況で親ワークフローを進める方法を紹介します。

こんにちは、古久保です。

2018年6月より、クエステトラのウェブサイトがリニューアルされました。
より見やすく、より有用な情報をお届けして行きたいと思います。(ガンバルゾ!)

※製品サイトは、コチラ(https://questetra.com/ja/)

さて、皆様、親子関係はうまく行っていますか?
ワークフローも同じでございまして、ワークフローで良好な親子関係を築きたいという方がいらっしゃるようです。

  • 特定の業務案件(親案件)は、複数の子案件から構成される
  • 親案件と子案件は、非同期に進行していくものの、子案件達の状況が親案件の進行にも関係する。

という業務要件をちらほらお聞きします。
難しいですね。しかし、Questetra BPM Suite なら大丈夫です。
具体的なユースケースを元に、実現方法を説明して参ります。

目次
  • ユースケース
  • Questetra での実現
    • 実現概要
    • ワークフローアプリ定義
      • 子フローアプリの起動
      • 子フローの終了確認
  • あとがき

◆ユースケース

業務シナリオとしては、

  • 販売会社は、クライアントへパーツA/パーツB/パーツCで構成される物を販売する
  • 販売時には販売会社とクライアントと販売契約を結ぶ
  • 販売会社の社内ルールとして販売契約の社内承認は、全パーツ作成の契約が完了した後に行う

というものです。

◆Questetra での実現

◆◆実現概要

実現概要としては、以下となります。

  1. 販売契約書の社内承認をワークフロー(親フロー)で行う
  2. 販売契約書に関連する契約書の社内承認をワークフロー(子フロー)で行う
  3. 親フローで関連する契約を登録し、子フローアプリを自動で起動し、子フローを実行する
  4. 3.で起動した子フローが全て終了した時点で親フローの工程を進める

ポイントとしては、

  • 起動する子フロー数/内容は、案件によって違う
  • 起動された子フローが全て完了したかを確認する必要がある

になります。
上記の実現概要とポイントを満たした実現を行う必要があります。

◆◆ワークフローアプリ定義

◆◆◆子フローアプリの起動

テーブル型データにて入力された、関連契約情報を元に子フローアプリのメッセージ開始イベント(http)にアクセスすることで子フローアプリの起動を行っています。
起動部分は、スクリプトタスクで実現しています。

<子フローアプリのメッセージ開始イベント(http)インタフェース>

<子フローアプリ起動スクリプトタスク内容>


var parentNumber = engine.findDataByNumber("1");
var table = engine.findDataByNumber("0");
var childName = "";
var childNumber = "";
var uri = "https://****************.questetra.net/System/Event/MessageStart/22/0/start";
var keyValue = "*******************";

for (var i=0 ; i < table.size(); i++){
  childName = table.get(i,0);
  childNumber = table.get(i,1);
  try{
    var response = httpClient.begin()
      .queryParam("key",keyValue)
      .queryParam("data[0].input",parentNumber)
      .queryParam("data[1].input",childNumber)
      .queryParam("data[2].input",childName)
      .queryParam("data[4].input",processInstance.getProcessInstanceId())
      .get( uri );
    engine.log("StatusCode:" + response.getStatusCode() + ":" + response.getResponseAsString() + "\n");
    if( response.getStatusCode() != 200 ){
      engine.log("Exception:send error:" + response.getStatusCode() + "\n");
    }
  }catch(e){
    engine.log("exception:noSending\n");
  }
}
◆◆◆子フローの終了確認

子フローには、親フローのプロセス ID を連携していますので、Workflow API を用いて検索を掛け、全て終了しているかの確認を行います。
具体的には、 /API/OR/ProcessInstance/list を用い、検索をスクリプトタスクで行います。
検索を行う上で必要な criteria は、以下となります。

<関連子フローを検索する criteria>


<process-instance-criteria>
  <process-model-info-id>●●子フローのアプリID●●</process-model-info-id>
  <states><state>STARTED</state></states>
  <data>
    <decimal>
      <data-definition-number>●●親フローのプロセス ID を格納しているデータ項目番号●●</data-definition-number>
      <equals/>
      <value>●●親フローのプロセス ID ●●</value>
    </decimal>
  </data>
</process-instance-criteria>

<関連子フローを検索するスクリプトタスク内容>


var parentNumber = engine.findDataByNumber("1");
var uri = "https://*******************.questetra.net/API/OR/ProcessInstance/list";
var userName = "furukubo@questetra.com";
var appPass = "**************************";
var appId = "22";
var finished = false;
var selects = new java.util.ArrayList();

var criteria = "<process-instance-criteria><process-model-info-id>";
criteria += appId;
criteria += "</process-model-info-id>";
criteria += "<states><state>STARTED</state></states>";
criteria += "<data><decimal><data-definition-number>4</data-definition-number><equals/>"
criteria += "<value>" + processInstance.getProcessInstanceId() + "</value></decimal></data>";
criteria += "</process-instance-criteria>";

try{
  var response = httpClient.begin()
    .queryParam( "criteria", criteria )
    .basic(userName,appPass)
    .get( uri );
  engine.log(" uri:" + uri + "\n criteria:" + criteria + "\n");
  responseJson = response.getResponseAsString();
  engine.log("StatusCode:" + response.getStatusCode() + "\n");
  if( response.getStatusCode() == 200 ){
    var jsonObj = JSON.parse( responseJson );
    engine.log("count:" + jsonObj.count + "\n");
    if (jsonObj.count == 0){
      finished = true;
    }
  }else{
    engine.log("Exception:send error\n");
  }
}catch(e){
  engine.log("exception:noSending\n");
}
if (finished){
  selects.add("子契約全終了");
  engine.setDataByNumber("3",selects);
}

※ /API/OR/ProcessInstance/list へアクセスする際の Basic 認証は、子フローアプリの閲覧権限のあるユーザを指定してください。
Basic 認証のパスワードは、通常のログインパスワードとは別です。(アカウント設定より確認ください。)

◆あとがき

親子関係のあるワークフローの利用シーンは多くあると思います。
多くは1対1ですが、ユースケースのような不特定数の子フローアプリの起動はまれにあるのではないでしょうか?

  • システム開発プロジェクトにおけるサブプロジェウト
  • 複数の小企画から構成される企画

等など、様々考えられます。
上記の場合、子フローの進行状況は、親フローの進行条件に関係が出てくる可能性が高いと思います。

このような業務において今回ご紹介したサンプルフローは、参考になるのではないかでしょうか?

「スグに試してみたい!」という方は、ご連絡を頂ければ送付致します。

是非とも一度、チャレンジしてみてください。
不明な点は、遠慮なくご連絡ください。