第537話:差し戻しの発生状況を可視化したい

2017年5月29日

ミス発生に伴う生産性ダウン

決裁者さんにとって「差し戻し処理」は、億劫(おっくう)です。

申請内容を読み『無言』でOKすれば良いハズ(3分)のところ、(無言でNGするワケにも行かず)、更に10分かけて『差し戻す理由』を書かなければなりません。しかもそれが「単純ミスや誤記の指摘」であり、それが一日に5件・10件も発生するとなれば、流石に気分も滅入ってしまうでしょう。

そして当然、帰宅する時刻も1時間・2時間と遅くなってしまいます。

システム改良で下げられるミス率

『日付』をまちがう、『金額』をまちがう、『顧客の名前』をまちがう。

申請者さん達も、好き好んで間違っている訳ではありません。基本的には(?)、「業務プロセス定義の工夫や改良」によってミス率を下げることを考えたいものです。(プロセスを憎んでヒトを憎まず!)
  • 入力画面の「注意書き」や「入力チェック」を改良する
  • 業務フローに同僚による「レビュー工程」を追加する

[申請系プロセスのベースフロー-スクリプト]



ミスやロスの数値化

「改善になっているのか???」

プロセスオーナーにとって、プロセス改善は、なかなか実感しづらいものです。

この例では、「差し戻し回数」が自動記録され、加えて「差し戻しによってロスした時間」も自動的に記録されるフローとなっています。つまり、申請の処理においては不必要なデータを、あえて個別の案件データとして記録する仕組みとなっています。

そしてその結果、たとえば「社内全体での差し戻しの発生回数」や「平均的な差し戻しロス時間」といった KPI が、いつでも簡単に確認(モニタリング)できるようになっています。(カイゼン活動の可視化)

具体的な設定方法

この例においては、自動工程『ロス計算』のプロパティとして、以下のようなサーバサイド JavaScript が設定されています。

▼スクリプト工程『ロス計算』の設定例 (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Data Retrieving ==
var loopCount = data.get( "q_loopCount" ) - 0; // Java to JavaScript Number
var lostTime  = data.get( "q_lostTime" ) - 0; // Java to JavaScript Number
var startTime = data.get("q_startTime"); 
var endTime   = data.get("q_endTime"); 
// com.questetra.bpms.util.AddableTimestamp

//// == 演算 / Calculating ==
loopCount = loopCount + 1;
var intervalMilliSec = endTime.getTime() - startTime.getTime();
var intervalHour = Math.ceil( intervalMilliSec / 10 / 3600 ) / 100;
lostTime = lostTime + intervalHour;

//// == ワークフローデータへの代入 / Data Updating ==
retVal.put( "q_loopCount", java.math.BigDecimal( loopCount ) );
retVal.put( "q_lostTime", java.math.BigDecimal( lostTime ) );


すなわち、申請がスクリプト工程に到達する度に、2つの時刻データの差分値(B-A)が、『累計ロス時間』(C)として記録される仕組みです。
  • A. [2.承認]で NG となった時刻
  • B. [1x.差戻対応]の入力を完了した時刻
  • C. 累計ロス時間(h)

なお、もし社内の様々な業務プロセスで同様の仕組みを設定したい場合、都度、サーバサイド JavaScript を書き込むのは面倒です。メンテナンス性においても問題があると言えるでしょう。
その様な場合は、パッケージ化した「サービス工程」をワークフロープラットフォームに登録しておくのが有効です。そうすれば各業務プロセス定義において、サーバサイド JavaScript を書きこむ必要が無くなります。
具体的には、以下のような「Addon-XML」を作成し登録します。

PS: ちなみに「計測すべき時間」は、業務によって、事業によって、会社によって、異なります。たとえば、[2.承認]で「最初に NG となった時刻」と「OK となった時刻」の差分をとるなど、他にも様々な計測方法が考えられるでしょう。その場合は、自動工程の配置場所や配置数は異なってきます。

▼Addon-XML によるパッケージ化(サービス工程化)の例
<?xml version="1.0" encoding="UTF-8"?><service-task-definition>
<label>Lost Time Calculator</label>

<configs>
  <config name="conf_DataIdA" required="true" form-type="SELECT" select-data-type="DATETIME">
    <label>A: Select DATETIME DATA for Start</label>
    <label locale="ja">A: 計測開始時刻が格納されている時刻型データを選択してください</label>
  </config>
  <config name="conf_DataIdB" required="true" form-type="SELECT" select-data-type="DATETIME">
    <label>B: Select DATETIME DATA for End</label>
    <label locale="ja">B: 計測完了時刻が格納されている時刻型データを選択してください</label>
  </config>
  <config name="conf_DataIdC" required="true" form-type="SELECT" select-data-type="DECIMAL">
    <label>C: Select NUMERIC DATA for Elapsed Time (h) (update)</label>
    <label locale="ja">C: 経過時間(h)が格納されている数値型データを選択してください(更新)</label>
  </config>
  <config name="conf_DataIdD" required="true" form-type="SELECT" select-data-type="DECIMAL">
    <label>D: Select NUMERIC DATA for Arrival Count (update)</label>
    <label locale="ja">D: 到達回数が格納されている数値型データを選択してください(更新)</label>
  </config>
</configs>

<script><![CDATA[
// Lost Time Calculator (ver. 20170523)
// (c) 2017, Questetra, Inc. (the MIT License)

//// == 自動工程コンフィグの参照 / Config Retrieving ==
var dataIdA = configs.get( "conf_DataIdA" );
var dataIdB = configs.get( "conf_DataIdB" );
var dataIdC = configs.get( "conf_DataIdC" );
var dataIdD = configs.get( "conf_DataIdD" );

//// == ワークフローデータの参照 / Data Retrieving ==
var loopCount = data.get( dataIdD ) - 0; // Java to JavaScript Number
var lostTime  = data.get( dataIdC ) - 0; // Java to JavaScript Number

var startTime = data.get( dataIdA ); 
var endTime   = data.get( dataIdB ); 
// com.questetra.bpms.util.AddableTimestamp

//// == 演算 / Calculating ==
loopCount = loopCount + 1;
var intervalMilliSec = endTime.getTime() - startTime.getTime();
var intervalHour = Math.ceil( intervalMilliSec / 10 / 3600 ) / 100;
lostTime = lostTime + intervalHour;

//// == ワークフローデータへの代入 / Data Updating ==
retVal.put( dataIdD, java.math.BigDecimal( loopCount ) );
retVal.put( dataIdC, java.math.BigDecimal( lostTime ) );
]]></script>


<icon>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABv0lEQVRYR+1XPU7DMBj1l0xpJcQFUBkZYe2Cx9bJ0CP0COUElBPAEXqEDo1ToQ6uxA5HgBuwVJ3qD32ortxUKc5PE4HIEiV+iV/e+75nB1jqEEKMAeA+fb+Ka0R8kFKO7XfBP4GfFCDZyshv21nIgjiOD2w6RkgIcU3jUso3OodhiAZ/cgI0udb6CgDOEPF5Pp+/10qg2+126GtbrdbFYrF4aUKBMbVZGIajOI6faidAE1KOaK0nJH8lBBBxLzjydgQA7J4vVIR5JzyG/50EEHGZ9VUAcEtjLpgtLv9acCyITI+7YCohIIRQUkpuFKmNQK/XuwSAjud5SmvNEfHDTjlSwGCs2N3DlFJACDFkjA3J863fEynlxFbAYKx62cOUImBLbvtdmwWGQBRFfDabqVprgDzPakOqCRpzwRS2oPEkdAkZF0xhBVxCxgVTigDn/DwIAp4kybTf7w/W67VSSn3aXUAFqrX+jmY6PM9bUsFWsiMiAu12WyHiKwDcrFYrnkFgV7BUoJUR2G4sRoyxR8bYXXq3c3ILKGZ9359uNpuBOaejOP1HZdb+SizIasVaktAlZFwwhbug8SD68wS+AAh8Lj/CJSvYAAAAAElFTkSuQmCC
</icon>

</service-task-definition>

[Addon-XMLダウンロード]

[申請系プロセスのベースフロー-スクリプト:「2.承認」画面]

<データ項目一覧画面>


[雛形ダウンロード (無料)]
<類似プロセス>
≪関連記事≫

[英文記事 (English Entry) ]

0 件のコメント :

コメントを投稿