サポート > リポジトリ > ワークフロー > [応用] ワークフロー差し戻し後の再申請処理で、一度承認した人をスキップして承認待ちの方へ進める スクリプト

ワークフロー差し戻し後の再申請処理で、一度承認した人をスキップして承認待ちの方へ進める方法を説明します。8.3.0

例として "順次・順次・順次フロー" で説明します。申請者を "higa", 承認者を "miyagi", 決裁者を "kinjo" とします。

図1 サンプルのワークフロー定義

"higa" が申請し、"miyagi" が承認しましたが、決裁者である "kinjo" が差し戻しを行いました。(このワークフローは差し戻し時には申請者へ戻す、としています。)

図2 決裁者による差し戻しが発生

申請者 "higa" が諸条件を変更し、再び申請処理を行います。

図3 再申請処理

先ほど承認済みであった "miyagi" は自動承認されます。再び決裁者 "kinjo" まで進みます。

また、このタイミングで "miyagi" には自動承認を行なったというメールが送信されています。

図4 "miyagi" は自動承認され、決裁者 "kinjo" へ進む

アカウント "miyagi" でログオンし、このデータを確認します。自動承認であるため、ワークフロー「承認」ボタンは表示されません。

図5 自動承認のため、承認ボタンは表示されない

アカウント "kinjo" でログオンし、このデータを確認します。決裁待ちであることがわかります。

図6 "kinjo" の決裁待ち

juserモデルへのメールアドレス項目の追加

ワークフロー処理でメール送信を行うため、juserモデルへメールアドレス項目を追加します。

図7 メールアドレス項目の追加

物品購入伺いモデルを用意する

上の例で示した物品購入伺いモデルを用意します。

図8 物品購入伺いモデルの定義 (1)
図9 物品購入伺いモデルの定義 (2)

「フロー状態」項目はワークフロー関数 FLOWSTATUS を適用します。データベースには保存しない項目としてください。

図10 フロー状態項目

「次のメールアドレス」項目はワークフロー関数 WF_NEXT_USERID_MAIL を適用します。データベースには保存しない項目としてください。

WF_NEXT_USERID_MAIL("juser","userid","mailaddress")
図11 次のメールアドレス項目

フローイベントスクリプトを用意する

このワークフローでは、申請ノードでの申請イベント時に、スクリプトを実行するようにします。スクリプトで自動承認処理を記述します。

図12 フローイベントスクリプトの設定 (1)
図13 フローイベントスクリプトの設定 (2)

フローイベントスクリプト (1)

設定したフローイベントスクリプトの例を示します。

var applicantUserId = wman.getApplicantUserId(modelname, modelpkey, p);
//print("applicantUserId:["+applicantUserId+"]");
var WorkFlowMail = Java.type("jp.jasminesoft.wagby.app.WorkFlowMail");
var MyWorkFlowMail = Java.extend(WorkFlowMail, {
    replaceMapItem: function(replaceMap, mailAddress) {
        replaceMap['${kian_p.nextuseridmail}'] = mailAddress;
        //replaceMap['${kian_p.applicant}'] = applicantUserId;
    }
});
wman.skipToBackEventLayerId(modelname, modelpkey, p, new MyWorkFlowMail(
    modelname,
    modelpkey,
    "kianReapplyMailTemplate",
    "juser",
    "userid",
    "mailaddress",
    p
));
  • 暗黙変数 wman はフローイベントスクリプトで利用できます。実体は Wagby が提供するWorkFlowManagerオブジェクトです。
  • 暗黙変数 modelname と modelpkey もフローイベントスクリプトで利用できます。それぞれ対象モデルIDと、主キーになります。
  • 変数 applicantUserId に対象データに関する申請者のユーザID (例: "higa") をセットします。
  • Wagbyが提供するWorkFlowMailクラスを利用してメール送信の設定を行います。このソースコードは wagbydesigner/webapps/wagbydesigner/WEB-INF/env/work/template_javasrc/jp/jasminesoft/wagby/app/WorkFlowMail.java に用意されています。(パッケージ名を変更している場合は、パッケージ部 jp/jasminesoft/wagby を適切に読み替えてください。)
  • このスクリプトで、スクリプトWorkFlowMail クラスが提供する replaceMapItem メソッドをオーバーライドします。(元のクラスでは、このメソッドは空で実装されています。)第一引数 replaceMap には、メールテンプレートで上書きされるプレースホルダが含まれています。第二引数にはメールアドレスが渡されるようになっています。開発者は replaceMap 内の「送信先メールアドレス」に相当する値に、第二引数のメールアドレスを再設定するコードを用意してください。
  • 上のスクリプトではコメントとしていますが、変数 applicantUserId も利用できるため、プレースホルダに申請者のユーザIDをセットすることもできます。(メール文中にこのプレースホルダを埋め込んでおくと、申請者のユーザIDに置換されます。)
  • 自動承認処理は wman(実体は WorkFlowManager オブジェクト)の skipToBackEventLayerId メソッドを呼び出すことで実現します。第一引数 modelname, 第二引数 modelpkey, 第三引数 p までは固定です。第四引数は上で replaceMapItem メソッドをオーバーライドした MyWorkFlowMail クラスからオブジェクトを生成して渡します。この第四引数がない形でメソッドを呼び出すこともできます。この場合は自動承認処理のみ行い、スキップされた承認者へのメール送信は行われません。
  • 第四引数 MyWorkFlowMail オブジェクトを渡す場合、コンストラクタに7つの引数を指定します。最初の二つである modelname と modelpkey は固定です。第三引数は(開発者が事前に用意する)メールテンプレートのIDを指定します。このメールテンプレートで自動承認メールの文面を用意してください。第四引数はメールアドレスが格納されているモデルID、第五引数はそのモデルにある、ユーザIDを示す項目ID、第六引数はそのモデルにある、メールアドレスを示す項目IDです。これらはワークフロー関数 WF_APPLICANT_MAIL と同じ形式です。第七引数には p を指定してください。

フローイベントスクリプト (2)

上のフローイベントスクリプトでは、送信するメールのテンプレートは常に固定でした。

次に示すサンプルでは、ワークフローデータの申請状況を取得し、データが2件以上ある場合は「再申請」と判断するようにしています。再申請についての詳細は "ワークフロー決裁後に、フローイベントをリセットして再申請させる" をお読みください。

ここでは再申請の場合は "kianReapplyMailTemplate" のメールテンプレートが利用され、新規の申請の場合は "kianApplyMailTemplate" が利用されるようにしています。

var WorkFlowMail = Java.type("jp.jasminesoft.wagby.app.WorkFlowMail");
var MyWorkFlowMail = Java.extend(WorkFlowMail, {
  replaceMapItem: function(replaceMap, mailAddress) {
      replaceMap['${kian_p.nextuseridmail}'] = mailAddress;
  }
});
var workstateList = wman.getJfcworkstateList(modelname, modelpkey, p);
if (workstateList && workstateList.length > 2) {
  mailTemplateId = "kianReapplyMailTemplate";
  wman.skipToBackEventLayerId(modelname, modelpkey, p, new MyWorkFlowMail(
      modelname,
      modelpkey,
      "kianReapplyMailTemplate",
      "juser",
      "userid",
      "mailaddress",
      p
  ));
} else {
  var myWorkFlowMail = new MyWorkFlowMail(
      modelname,
      modelpkey,
      "kianApplyMailTemplate",
      "juser",
      "userid",
      "mailaddress",
      p
  );
  myWorkFlowMail.send();
}

フローイベントスクリプト (3) コメントの設定8.3.1

WorkFlowManagerのskipToBackEventLayerId関数の第三引数にコメント文を指定できるようにしました。自動承認時に、指定したコメント文が付与されます。(10行目の第三引数が、これになります。)

var WorkFlowMail = Java.type("jp.jasminesoft.wagby.app.WorkFlowMail");
var MyWorkFlowMail = Java.extend(WorkFlowMail, {
  replaceMapItem: function(replaceMap, mailAddress) {
      replaceMap['${kian_p.nextuseridmail}'] = mailAddress;
  }
});
var workstateList = wman.getJfcworkstateList(modelname, modelpkey, p);
if (workstateList && workstateList.length > 2) {
  mailTemplateId = "kianReapplyMailTemplate";
  wman.skipToBackEventLayerId(modelname, modelpkey, "自動承認されました", p, new MyWorkFlowMail(
      modelname,
      modelpkey,
      "kianReapplyMailTemplate",
      "juser",
      "userid",
      "mailaddress",
      p
  ));
} else {
  var myWorkFlowMail = new MyWorkFlowMail(
      modelname,
      modelpkey,
      "kianApplyMailTemplate",
      "juser",
      "userid",
      "mailaddress",
      p
  );
  myWorkFlowMail.send();
}