クラウド型 ワークフロー

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

アドオンXML/選択肢XML情報を用いて、検索ワードにマッチするユーザ群からランダムで指名する方法を紹介致します。

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

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

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

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

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

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

を紹介します。(ドンドン例えがわからなくなりますネ)

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

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

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

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

翻訳者指名のルールを「翻訳チーム内でランダムに翻訳者を指名する」としていましたが、翻訳できる言語(原文の言語、翻訳後の言語)が人それぞれで違う場合があります。
例えば「『(原文)日本語→(翻訳)フランス語』はできるけど、『(原文)日本語→(翻訳)英語』は、できない」という人もいると思います。

単純にランダムに指定するだけだと、
指定する人からすると「日本語→フランス語翻訳できるの誰やっけ?」「次誰に頼むと公平になるや?」とか悩みます。
指定される人からすると「指定されたけど、日本語→フランス語翻訳できひんねん」とか困ります。

そう、ロボット君、無能です。役立たずです。廊下に立ってなさいです。

翻訳者指名のルールをまとめると

* 指定された「原文言語→翻訳言語」ができる集団の中からランダムに翻訳者を指名する

ということになります。
そこで、ロボット君へのインプットとしては、「翻訳チーム」ではなく、

* 指定された翻訳言語パターン(原文言語→翻訳言語)
* 対象ユーザの対応可能翻訳言語パターン情報

とすることでロボット君は適した翻訳者を指名することができます。

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

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

◆◆ロボット君の仕様

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

1.指定された翻訳言語パターンが可能な人と人数を把握
2.1.の人数内(-1した数地)のランダムな数値を生成
3.1.で取得した人を2.で生成した数字番目の人をユーザ型のデータに格納

となります。
今回もアドオン XML で実装するのですが、前段として以下のことが必要となります。

* 指定翻訳言語パターンを指定できるようにする
* 指定翻訳言語パターンを検索できるようなユーザ情報リストを用意する

ことが必要となります。
「指定翻訳言語パターンを検索できるようなユーザ情報リスト」は、メンテナンス性も考えて選択肢 XML を使用するのが良いでしょう。

実現する設定例としては、

<「1.翻訳依頼」工程で「翻訳種別」を指定できるようにデータ項目追加>

<指定翻訳言語パターンを検索できるようなユーザ情報リスト(選択肢 XML)>

<items>
  <item value="furukubo0@questetra.com" display="日本語→英語|:|英語→日本語|:|日本語→フランス語|:|日本語→中文|:|日本語→スペイン語|:|日本語→ポルトガル語" />
  <item value="furukubo1@questetra.com" display="日本語→フランス語|:|英語→日本語" />
  <item value="furukubo2@questetra.com" display="日本語→英語|:|日本語→フランス語|:|英語→日本語" />
  <item value="furukubo3@questetra.com" display="日本語→中文|:|日本語→スペイン語|:|英語→日本語" />
</items>

※「値」は、Questetra ユーザのメールアドレス
※「表示ラベル」は、「値」のユーザの対応可能「翻訳種別」の翻訳パターン
(複数ある場合は、「|:|」で区切りとします。)

◆◆ロボット君の実装

今回も他のアプリでも利用できそうな気がしますのでアドオン XML で実装してみます。

<パッケージ設定内容>
* 指名ユーザを格納するユーザ型データ
* 指名対象ユーザ群の属性情報を格納する選択肢 XML マスタ名
* 属性情報のマッチングワード(選択肢型データ)

上記をアドオン 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_DebugPrint" required="false" form-type="SELECT" select-data-type="STRING_TEXTAREA">
    <label>デバッグ用データ表示(指定が無い場合、非表示)</label>
  </config>
</configs>


<script><![CDATA[
// (ランダム+マスタ検索)による指名用スクリプト(ver. 20170804)
// (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 debugPrintNum = configs.get("conf_DebugPrint");

//// == ワークフローデータの参照,定義 / Data Retrieving, Data Define ==
// 検索用選択肢 XML のリストを取得
var matchingWord_QUserList = itemDao.findAll(matchingWord_QUserMasterName,true);
var matchingWord = null;
if (targetMatchingWordNum != ""){
	matchingWord = data.get(targetMatchingWordNum).get(0).getValue();
}
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] = i;
			j++;
		}
	// 「マッチングワード」が未指定の場合、選択肢 XML の内容を全てセット
	}else{
		matchingList[j] = i;
		j++;
	}
}
// 対象のリストからランダムに1つ抽出
targetNum = matchingList[Math.floor(Math.random() * matchingList.length)];

for (var i=0; i < matchingList.length; i++){
	debug += "matchingList[" + i + "]:" + matchingList[i] + "\n";
}
debug += "matchingList.length:" + matchingList.length + "\n";
debug += "targetNum:" + targetNum + "\n";

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

//// == ワークフローデータへの代入 / Data Updating ==
retVal.put(targetQUserNum,quserDao.findByEmail(matchingWord_QUserList.get(targetNum).getValue()));
]]></script>

<icon>(割愛)</icon>

</service-task-definition>

データ項目「翻訳種別」(マッチングワード)で指定された翻訳パターンを選択肢 XML 「traslationSkillList」の”表示ラベル”から検索し、リストを作成します。
リストからランダム抽出し、”値”(メールアドレス)をユーザ型データ項目「指名ユーザ」にセットする動作を行います。
動作例を示しますと、

<「1.翻訳依頼」工程>
* 「契約種別」を”日本語→英語”を選択<「2R.翻訳者指名」工程>
1.選択肢 XML 「traslationSkillList」の”display”要素の値から”日本語→英語”を検索
2.”value” 要素の値、”furukubo0@questetra.com”,”furukubo2@questetra.com”が抽出
3.ランダム選択で”value” 要素の値、”furukubo2@questetra.com”が選択
4.”furukubo2@questetra.com”を元にユーザ型データ項目「翻訳者」にセット

となります。

◆あとがき

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

汎用的に利用できることを考えられます。
今回の例では、『「翻訳パターンのスキル」に自動的に絞って指名する』ものですが、他にも

* 「得意とする IT 知識」で案件担当を割り振る
* 「よく知っている商品知識」で購入担当を割り振る
* 「つながりの強い企業」で営業担当を割り振る
* 「よく知っている業界知識」で営業担当を割り振る

等が考えられます。
上記のような担当の割り振りの存在する業務プロセスであれば、選択肢 XML を用意すればアドオン XML「(ランダム+マスタ検索)による指名サービス」はそのまま使用することができます。

また、より汎用的な利用も考慮して、

* 「マッチングキーワード」が未指定の場合、「マッチングワードユーザ対応マスタ名」の選択肢 XML 全てのユーザを対象にして指名ユーザを選択できる。

ように実装しています。

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

判断情報として、選択肢 XML 機能を使用しております。合わせてマニュアルをご参照頂ければと思います。

複数の業務プロセス定義から参照される選択肢XMLを登録する
データ項目定義における選択肢型データは、 “候補リスト” を設定する必要があるデータ項目です。もし、[システム管理権限] をもつユーザが当該リストをシステム登録しておけば、各アプリから参照設定できる様になります。モデリングの効率化や、候補リストの一元管理を実現できます。

http://www.questetra.com/ja/tour/m3/m319/

2017-08-22

Masato Furukubo の紹介

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

あわせて読みたい
50.Questetra Tips の前の記事 ロボット君がランダムに翻訳者を指名してくれる方法(1)
50.Questetra Tips の次の記事 Questetra でマスタデータを管理するいくつかの方法
Masato Furukubo の他の記事 入力画面でデータ項目名を多言語対応させる方法

アーカイブ

 RSS