決裁後にフローイベントをリセットする

最終更新日: 2021年12月16日
R8 | R9

実行例

図1のワークフローは決裁済みのため、更新ボタンは非表示となっています。ここでオリジナルボタン「再申請」を用意しています。このボタンを押下するとフローイベントが消去されます。

図1 決裁済みワークフローに対して「再申請」ボタンを押下する

フローイベントが消去され、新規登録状態に戻ります。このとき、これまでのワークフローの承認記録を「申請状況履歴」という繰り返しコンテナにコピーするようにしています。

図2 フローイベントが消去された
図3 フローイベント内容が「申請状況履歴」にコピーされている

未申請となったため更新ボタンが押下できるようになります。ただし「申請状況履歴」は非表示(編集不可)としています。

図4 更新画面では申請状況履歴は非表示とする

定義方法

サンプル定義「物品購入伺い」のモデル定義を用意します。(このモデルの詳細は割愛します。)

図5 サンプルの物品購入伺いモデル

項目テンプレートとして用意されている「ワークフローイベント履歴コンテナ」を加えます。これは再申請処理時に、現在のフローイベントをコピーするための入れ物として用います。

図6 「ワークフローイベント履歴コンテナ」繰り返しコンテナを加える(1)
図7 「ワークフローイベント履歴コンテナ」繰り返しコンテナを加える(2)

ワークフローイベント履歴コンテナの詳細

「ワークフローイベント履歴コンテナ」繰り返しコンテナの初期表示数は0となっています。

図8 「ワークフローイベント履歴コンテナ」繰り返しコンテナの初期表示数

また、「ワークフローイベント履歴コンテナ」繰り返しコンテナは入力時に隠し項目となっています。これによって登録や更新画面では、これらの項目は表示されません。

図9 「ワークフローイベント履歴コンテナ」繰り返しコンテナは入力時、隠し項目となっている

「ワークフローイベント履歴コンテナ」繰り返しコンテナのID部である「ワークフローイベント履歴コンテナID」は表示時に隠し項目となっています。

図10 「ワークフローイベント履歴コンテナID」っは表示時に隠し項目となっている

「処理者(隠し項目)」はアカウントモデル(juser)と紐付いています。隠し項目とするため、入力タイプは「検索画面」となっています。(隠し項目の場合は「検索画面」とすることがもっともよい方法です。

図11 「処理者(隠し項目)」の設定

画面に表示する項目として「処理者」を別途、用意しています。参照連動を使ってアカウントモデル(juser)の「名前」が設定されています。この項目は表示専用であるため、データベースに保存されません。

図12 「処理者」の設定(1)参照連動
図13 「処理者」の設定(2)データベースに保存しない

「処理内容(隠し項目)」は、ワークフローのイベント情報が転記されるものです。ここは Wagby のワークフローエンジンが内部で扱う "Start" や "End" といった文字列が格納されます。画面に表示しないため、隠し項目となっています。

図14 「処理内容(隠し項目)」の設定

「処理内容」は、上記ワークフローのイベント情報から、"申請" や "決裁" といった表示用の文字列に変換するために関数 WF_EVENT を使います。この項目は計算で求まるため、データベースに保存しないようになっています。

図15 「処理内容」はWF_EVENT関数で求める

このモデルの詳細画面に、オリジナルボタンを用意します。ここではボタンのイベントを "Original1" としておきます。

図16 再申請を行うためのオリジナルボタンを用意する

再申請を行うスクリプト

オリジナルボタンのスクリプトは Designer ではなく、直接、ファイルを作成します。今回のサンプルはモデル名が kian で、イベント名を Original1 としたため、customize/webapp/WEB-INF/script/kian フォルダを用意し、ここに ShowKian_Original1.js というファイルを作成します。内容は次のとおりです。

var WorkFlowManager = Java.type("jp.jasminesoft.wagby.app.WorkFlowManager");
var EventHistoryClass = Java.type("jp.jasminesoft.wagby.model.kian.JfcWfEventHistory");
var Integer = Java.type("java.lang.Integer");
var Timestamp = Java.type("java.sql.Timestamp");
function process() {
  var modelId = "kian";
  var id = Integer.valueOf(p.request.getParameter("id"));
  print("再申請処理 modelId:["+modelId+"], id:["+id+"]");
  var wman = WorkFlowManager.getInstance(p);
  backupFlowEvent(modelId, id, wman, p);
  wman.resetFlowEvent(modelId, id, p);
  //wman.hardResetFlowEvent(modelId, id, p);フロー再申請を伴う @since R9.0.2
  return "redirect:showKian.do?id=" + id;
}
function backupFlowEvent(modelId, id, wman, p) {
  print("フローイベントバックアップ処理 modelId:["+modelId+"], id:["+id+"]");
  var workstateList = wman.getJfcworkstateList(modelId, id, p);
  if (!workstateList || workstateList.length == 0) {
    return;
  }
  var kianService = p.appctx.getBean("KianEntityService");
  var kian = kianService.findById(id, true);
  for (var i=0,l=workstateList.length; i<l; i++) {
    var workstate = workstateList[i];
    var eventHistory = new EventHistoryClass();
    eventHistory.jfcWfEhUsernameHidden = workstate.username;
    eventHistory.jfcWfEhEventHidden = workstate.event;
    if (workstate.event !== "End") {
      eventHistory.jfcWfEhComment = workstate.comment || "";
    }
    eventHistory.jfcWfEhDate = Timestamp.valueOf(workstate.insertDate);
    kian.addJfcWfEventHistory(eventHistory);
  }
  kianService.update(kian);
}
  • スクリプトで、Wagbyが提供するワークフロー操作クラスWorkFlowManagerが提供するメソッドresetFlowEventを呼び出すことで、このモデルの、この主キーに紐づくフローイベント(jfcworkstateモデル)を消去します。(正確には"新規登録"イベントだけを残し、それ以外を消去します。)
  • hardResetFlowEventメソッドを使うと、さらに申請フローの再選択が行えるようになります。(*1)9.0.2
  • フローイベントを消去する前に、現時点のフローイベントを起案モデルの「ワークフローイベント履歴コンテナ」繰り返しコンテナに転記します。このためにWorkFlowManagerクラスが提供するメソッドgetJfcworkstateListを使い、フローイベントを取得しています。
(*1) このAPIを使うと、再申請時は「申請状況」欄に申請フローの選択肢が用意され、選択できるようになります。例えば申請ノードがグループとなっているフロー参加者設定で、別のグループに移動となったユーザが再申請を行なったとき、前回申請を行なった申請フローが選択できないためエラーとなります。このような場合に hardResetFlowEvent を使うと、申請フローの再選択ができるため、エラーを回避できます。