
親子ワークフローを作成する方法は、2023年5月に公開された次の新しい記事も参照ください。

こんにちは、古久保です。
2018年6月より、クエステトラのウェブサイトがリニューアルされました。
より見やすく、より有用な情報をお届けして行きたいと思います。(ガンバルゾ!)
※製品サイトは、コチラ(https://questetra.com/ja/)
さて、皆様、親子関係はうまく行っていますか?
ワークフローも同じでして、ワークフローで良好な親子関係を築きたいという方がいらっしゃるようです。
- 特定の業務案件(親案件)は、複数の子案件から構成される
- 親案件と子案件は、非同期に進行していくものの、子案件達の状況が親案件の進行にも関係する。
という業務要件をちらほらお聞きします。
一般的には難しいですね。しかし、Questetra BPM Suite なら大丈夫です。
具体的なユースケースを元に、実現方法を説明していきます。
- ユースケース
- Questetra での実現
- 実現概要
- ワークフローアプリ定義
- 子フローアプリの起動
- 子フローの終了確認
- あとがき
◆ユースケース
業務シナリオとしては、
- 販売会社は、クライアントへパーツA/パーツB/パーツCで構成される物を販売する
- 販売時には、販売会社はクライアントと販売契約を結ぶ
- 販売会社の社内ルールとして販売契約の社内承認は、全パーツ作成の契約が完了した後に行う
というものです。

◆Questetra での実現
◆◆実現概要
実現概要としては、以下となります。
- 販売契約書の社内承認をワークフロー(親フロー)で行う
- 販売契約書に関連する契約書の社内承認をワークフロー(子フロー)で行う
- 親フローで関連する契約を登録し、子フローアプリを自動で起動し、子フローを実行する
- 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ですが、ユースケースのような不特定数の子フローアプリの起動は、まれにあるのではないでしょうか?
- システム開発プロジェクトにおけるサブプロジェウト
- 複数の小企画から構成される企画
等など、様々考えられます。
上記の場合、子フローの進行状況は、親フローの進行条件と関係する可能性が高いと思います。
このような業務において今回ご紹介したサンプルフローは、参考になるのではないでしょうか?
「スグに試してみたい!」という方は、ご連絡を頂ければ送付致します。
是非とも一度、チャレンジしてみてください。
不明な点は、遠慮なくご連絡ください。