決裁後にフローイベントをリセットする
最終更新日: 2021年12月14日
R8 | R9
図1のワークフローは決裁済みのため、更新ボタンは非表示となっています。ここでオリジナルボタン「再申請」を用意しています。このボタンを押下するとフローイベントが消去されます。
フローイベントが消去され、新規登録状態に戻ります。このとき、これまでのワークフローの承認記録を「申請状況履歴」という繰り返しコンテナにコピーするようにしています。
未申請となったため更新ボタンが押下できるようになります。ただし「申請状況履歴」は非表示(編集不可)としています。
サンプル定義「物品購入伺い」のモデル定義を用意します。(このモデルの詳細は割愛します。)
項目テンプレートとして用意されている「ワークフローイベント履歴コンテナ」を加えます。これは再申請処理時に、現在のフローイベントをコピーするための入れ物として用います。
「ワークフローイベント履歴コンテナ」繰り返しコンテナの初期表示数は0となっています。
また、「ワークフローイベント履歴コンテナ」繰り返しコンテナは入力時に隠し項目となっています。これによって登録や更新画面では、これらの項目は表示されません。
「ワークフローイベント履歴コンテナ」繰り返しコンテナのID部である「ワークフローイベント履歴コンテナID」は表示時に隠し項目となっています。
「処理者(隠し項目)」はアカウントモデル(juser)と紐付いています。隠し項目とするため、入力タイプは「検索画面」となっています。(隠し項目の場合は「検索画面」とすることがもっともよい方法です。)
画面に表示する項目として「処理者」を別途、用意しています。参照連動を使ってアカウントモデル(juser)の「名前」が設定されています。この項目は表示専用であるため、データベースに保存されません。
「処理内容(隠し項目)」は、ワークフローのイベント情報が転記されるものです。ここは Wagby のワークフローエンジンが内部で扱う "Start" や "End" といった文字列が格納されます。画面に表示しないため、隠し項目となっています。
「処理内容」は、上記ワークフローのイベント情報から、"申請" や "決裁" といった表示用の文字列に変換するために関数 WF_EVENT を使います。この項目は計算で求まるため、データベースに保存しないようになっています。
このモデルの詳細画面に、オリジナルボタンを用意します。ボタンのイベントを "Original1" とします。
オリジナルボタンのスクリプトは 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);
}
WorkFlowManager
が提供するメソッドresetFlowEvent
を呼び出すことで、このモデルの、この主キーに紐づくフローイベント(jfcworkstateモデル)を消去します。(正確には"新規登録"イベントだけを残し、それ以外を消去します。)hardResetFlowEvent
メソッドを使うと、さらに申請フローの再選択が行えるようになります。(*1)9.0.2WorkFlowManager
クラスが提供するメソッドgetJfcworkstateList
を使い、フローイベントを取得しています。