クラウド型 ワークフロー

ロボット君がランダムに翻訳者を指名してくれる方法(3)

Questetra モニタリング API 実行をアドオン XML にパッケージング。翻訳作業負荷の低い担当者を優先に指名する方法を紹介致します。

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

「業務の自動化」が話題ですね。(またまたまたまた同じ入りです。)
宣言通り、シリーズでお送りしております。(今回、最終回!?)

前回、「ロボット君がランダムに翻訳者を指名してくれる方法(2)」にて

* 「よく痒(かゆ)くなる所を教えておいたら、お肌の状態を見て、ええ感じで背中を流してくる」ロボット君

を紹介しましたが、今回は、

* 「よく痒(かゆ)くなる所を教えておいたら、お肌の状態を見て、もっとええ感じで背中を流してくる」ロボット君

を紹介します。(ええ、ネタ切れです)
しかも、今回はランダムではありません。
タイトルとの一致性はなくなっちゃいました。(堪忍え)

◆どこをどのようにロボット君に手伝ってもらう?

手伝ってもらうところは、変わりません。(「2.翻訳者指名」工程)

<翻訳フロー:ロボット君使用>

※元記事:「第538話:日本語100文字の翻訳に必要な時間を分析したい」

前回、「ロボット君がランダムに翻訳者を指名してくれる方法(2)」では

<指名ルール>
* 指定された「原文言語→翻訳言語」ができる集団の中からランダムに翻訳者を指名する
<ロボット君へのインプット>
* 対象ユーザの対応可能翻訳言語パターン情報

としていました。

しかし、

「ランダムに指定してはるらしいけど、めっちゃ仕事が溜まっていてようやらん」

などという声が出てきました。
怖いです。緑のロボット君も青くなります。

無慈悲にランダムに指定しているので翻訳対象者の負荷状況は、関係ありません。
作業割当数の平均化はできてはいても、業務の流れが滞る可能性が有ります。

そこで、「指名ルール」と「ロボット君へのインプット」を変更して対応することができそうです。

<指名ルール>
* 指定された「原文言語→翻訳言語」ができる集団の中から翻訳者を指名する
* 対象ユーザの当月「3.翻訳作業」処理中工程数が少ない人を優先に指名する
<ロボット君へのインプット>
* 対象ユーザの対応可能翻訳言語パターン情報
* 対象ユーザの当月「3.翻訳作業」処理中工程数

とすることで、作業割当数がランダム指定より平均化されていきます。

上記ルールの作業をロボット君にお願いしましょう。

◆ロボット君をアドオン XML(自動処理パッケージ)で実装

◆◆ロボット君の仕様

ロボット君の動きとしては、

1.指定された翻訳言語パターンが可能な人と人数を把握
2.1.の対象者の当月「3.翻訳作業」処理中工程数を取得
3.対象者で処理中工程数が最も少ない人を指名

となります。

2.1.の対象者の当月「3.翻訳作業」処理中工程数を取得

は、Questetra の「ソフト開発API: ワークフローAPIs->モニタリングAPI」 を使用することで実現できます。

ソフト開発API: ワークフローAPIs
ワークフローAPIs を活用すれば、「割当タスク(マイタスク)を処理するAndroidアプリケーション」や「過去の業務データ(プロセスデータ)を集計する基幹連携ツール」等を簡単に開発する事が可能です。APIからアプリケーションに伝送される業務データは、アプリケーション利用者がアクセス権限をもつデータに限定されます

http://www.questetra.com/ja/tour/tour/reference/apis-workflow/

モニタリング API の中でも「タスク処理履歴を検索する /API/OR/Workitem/list」を使うと良いです。
API を実行する際の検索条件(Criteria)は、「XML: Criteria for Workitem Search」を使用し、設定します。(英文でわかりにくいですね。スミマセン)

2.1.の対象者の当月「3.翻訳作業」処理中工程数を取得

に合う検索条件(Criteria)の XML としては、

<workitem-criteria>
  <process-model-info-id>
    ●●検索対象のプロセスモデルID●●
  </process-model-info-id>
  <states>
    <state>STARTED</state>
  </states>
  <node-number>●●「3.翻訳作業」のノードID●●</node-number>
  <workitem-allocated-quser-id>●●検索対象ユーザのID●●</workitem-allocated-quser-id>
</workitem-criteria>

となります。

◆◆ロボット君の実装

今回もアドオン XML で実装してみます。

<パッケージ設定内容>
* 指名ユーザを格納するユーザ型データ
* 指名対象ユーザ群の属性情報を格納する選択肢 XML マスタ名
* 属性情報のマッチングワード(選択肢型データ)
* カウント調査対象プロセスモデルID
* カウント調査対象工程(「3.翻訳作業」)ノードID
* API 実行ユーザメールアドレス
* API 実行ユーザパスワード
* アプリケーションルート URL

上記をアドオン XML の設定とし、前述の「ロボット君の仕様」の動作を実装します。

<「(作業負荷状況+マスタ検索)による指名サービス」アドオンXML のコード>

<?xml version="1.0" encoding="UTF-8"?><service-task-definition>

<label>(作業負荷状況+マスタ検索)による指名サービス</label>

<configs>
  <config name="conf_TargetQUser" required="true" form-type="SELECT" select-data-type="QUSER">
    <label>指名ユーザ</label>
  </config>
   <config name="conf_MatchingWord_QUserMasterName" required="true" form-type="TEXTFIELD">
    <label>マッチングワードとユーザ対応マスタ名</label>
  </config>
  <config name="conf_MatchingWord" required="false" form-type="SELECT" select-data-type="SELECT_SINGLE">
    <label>マッチングワード</label>
  </config>
   <config name="conf_Research_Count_MId" required="true" form-type="TEXTFIELD">
    <label>カウント調査対象プロセスモデルID</label>
  </config>
   <config name="conf_Research_Count_NodeId" required="true" form-type="TEXTFIELD">
    <label>カウント調査対象工程ノードID</label>
  </config>
  <config name="conf_API_User_MailAddress" required="true" form-type="TEXTFIELD">
    <label>API実行ユーザメールアドレス</label>
  </config>
  <config name="conf_API_User_Password" required="true" form-type="TEXTFIELD">
    <label>API実行ユーザパスワード</label>
  </config>
  <config name="conf_ApplicationRootURL" required="true" form-type="TEXTFIELD">
    <label>アプリケーションルートURL</label>
  </config>
  <config name="conf_DebugPrint" required="false" form-type="SELECT" select-data-type="STRING_TEXTAREA">
    <label>デバッグ用データ表示(指定が無い場合、非表示)</label>
  </config>
</configs>


<script><![CDATA[
// (作業負荷状況+マスタ検索)による指名用スクリプト(ver. 20170911)
// (c) 2017, Questetra, Inc. (the MIT License)

//// == 工程コンフィグの参照 / Config Retrieving ==
var targetQUserNum = configs.get("conf_TargetQUser");
var matchingWord_QUserMasterName = configs.get("conf_MatchingWord_QUserMasterName");
var targetMatchingWordNum = configs.get("conf_MatchingWord");
var processModelInfoId = configs.get("conf_Research_Count_MId");
var nodeId = configs.get("conf_Research_Count_NodeId");
var userName = configs.get("conf_API_User_MailAddress");
var apiPass = configs.get("conf_API_User_Password");
var applicationRootURL = configs.get("conf_ApplicationRootURL");
var debugPrintNum = configs.get("conf_DebugPrint");

//// == ワークフローデータの参照,定義 / Data Retrieving, Data Define ==
// 検索用選択肢 XML のリストを取得
var matchingWord_QUserList = itemDao.findAll(matchingWord_QUserMasterName,true);
var matchingWord = null;
if (targetMatchingWordNum != ""){
	matchingWord = engine.findDataByNumber(targetMatchingWordNum).get(0).getValue();
}
// matchingList [n][0] 選択肢XML の要素番号
// matchingList [n][1] 今月の案件処理件数
var matchingList = new Array();
var targetQuserList;
var targetNum;
var debug = "";

//// == 演算 / Calculating ==
var j = 0;
for (var i=0; i < matchingWord_QUserList.size(); i++){
	if (matchingWord != null){
		// リストからマッチングワードに一致する要素群を取得
		if (matchingWord_QUserList.get(i).getDisplay().indexOf(matchingWord) != -1){
			matchingList[j] = new Array();
			matchingList[j][0] = i;
			matchingList[j][1] = getRequestCount((quserDao.findByEmail(matchingWord_QUserList.get(i).getValue())).getId());
			j++;
		}
	// 「マッチングワード」が未指定の場合、選択肢 XML の内容を全てセット
	}else{
		matchingList[j] = new Array();
		matchingList[j][0] = i;
		matchingList[j][1] = getRequestCount((quserDao.findByEmail(matchingWord_QUserList.get(i).getValue())).getId());
		j++;
	}
}
// 対象のリストから最も割当処理が少ない要素番号をセット
var tmpId = 0;
for (var i = 0; i < matchingList.length; i++){
	debug += "matchingList[" + i + "]:" + matchingList[i][0] + ":" + matchingList[i][1] + "\n";
	if (matchingList[tmpId][1] > matchingList[i][1]){
		tmpId = i;
	}
}
targetNum = matchingList[tmpId][0];
debug += "matchingList.length:" + matchingList.length + "\n";
debug += "targetNum:" + targetNum + "\n";

// for Debug
if (debugPrintNum != ""){
    engine.setDataByNumber(debugPrintNum,debug);
}

//// == ワークフローデータへの代入 / Data Updating ==
engine.setDataByNumber(targetQUserNum,quserDao.findByEmail(matchingWord_QUserList.get(targetNum).getValue()));

//// ==今月のアプリ処理履歴 API より指定アプリの開始件数を取得する==
//// パラメータ:quserId:検索対象のユーザID
//// 戻り値: API レスポンス中の count 要素の値
////        API にてエラーとなった場合は、ゼロを返す。
function getRequestCount(quserId){
    try{
        var formatter = new java.text.SimpleDateFormat("yyyy-MM");
        var thisMonth = formatter.format(processInstance.getProcessInstanceStartDatetime());
        var uri = applicationRootURL + "/API/OR/Workitem/list";
        var criteria = "<workitem-criteria><process-model-info-id>";
        criteria += processModelInfoId;
        criteria += "</process-model-info-id>";
        criteria += "<states><state>STARTED</state></states>";
        criteria += "<node-number>" + nodeId + "</node-number>";
        criteria += "<workitem-allocated-quser-id>" + quserId + "</workitem-allocated-quser-id>";
        criteria += "</workitem-criteria>";
        var response = httpClient.begin()
          .queryParam( "limit", "1000" )
          .queryParam( "criteria", criteria )
          .basic(userName,apiPass)
          .get( uri );
        responseJson = response.getResponseAsString();
        if( response.getStatusCode() == 200 ){
            var jsonObj = JSON.parse( responseJson );
            debug += "quserId:" + quserId + ":recordCount:" + jsonObj.count + "\n";
            return jsonObj.count;
        }else{
            return 0;
        }
    }catch(e){
        return 0;
    }
}
]]></script>


<icon>
(■■割愛■■)
</icon>

</service-task-definition>

◆あとがき

いかがでしょうか?前回より、さらにかしこいロボット君になったのではないでしょうか?

* (Questetra)API を実行をパッケージ化し、自動処理として使用する。

これが今回のポイントであります。
今回は、Questetra で利用できる API でありますが、様々なサービスの API の利用が考えられます。(“API の仕様が合えば” でありますが、一般的な仕様と思います)
「プロセスモデラー アドオン」サイトにて様々なシステムとの連携パッケージを用意しています。
是非とも、お試し下さい。

プロセスモデラー アドオン
業務プロセスを定義する「モデリング機能」は、(a) モデリングアイコンの追加、(b) 選択肢候補のマスター化、(c) PDF生成工程の有効化、の3つの観点で機能強化することが可能です。以下のアドオンをインポートすれば、より高度な業務プロセスを、より効率良く定義できるようになります。オリジナルのアドオンファイルを自作することも可能です。

http://www.questetra.com/ja/addon/#tax-term-browser-api-orchestration-ja

不明点や「試してみたいのでアプリのアーカイブが欲しい」等がありましたら遠慮なくご連絡ください。

2017-10-11

Masato Furukubo の紹介

Questetra, Inc. Sales Department
Masato Furukubo の投稿をすべて表示

あわせて読みたい
50.Questetra Tips の前の記事 Questetra でマスタデータを管理するいくつかの方法
Masato Furukubo の他の記事 失敗しない!選択肢 XML 更新作業とは?

アーカイブ

 RSS