結合処理で「多数決」承認機能を実現する

このCookBookでは、「多数決」承認機能を実現する方法について紹介しています。

完成イメージ

以下の完成サンプルをダウンロードしてご活用ください。

  • im_logicdesigner-data-149668
  • IM-LogicDesignerのインポート機能を利用してインポートしてください。
    「IM-LogicDesigner ユーザ操作ガイド」-「インポートを行う」

  • im_workflow-data-149668
  • zipファイルを任意のフォルダに展開し、IM-Workflowのインポート機能を利用してインポートしてください。
    「IM-Workflow 管理者操作ガイド」-「インポート/エクスポートを行う」

  • sample_program-data-149668
  • zipファイルを任意のフォルダに展開し、アプリケーションサーバの「コンテキストパス/WEB-INF/jssp/src」配下に配置してください。
     



    ・上の承認ノードから、'Yes'→'No'→'Yes'→'Yes'を選択。
    ⇒'Yes'ノード数が過半数となり、案件が終了。

    レシピ【承認ノード数が5個の場合】

    ※このレシピでは、'Yes'・'No'を選択する画面のノード数が5個のフローを作成します。サンプルでは、過半数を判定する母数として5を固定で設定するため、お客様の要件に応じて設定を変更してください。

    1. テーブルを作成してください。
    2. ロジックフローを作成してください。
    3. ワークフローを作成してください。
    4. 画面で選択した'Yes'・'No'をテーブルに登録する処理を作成してください。
       

    1. テーブルを作成してください。

    下記のコードを参考にしてテーブルを作成してください。

    create table cb149668
    (
    system_matter_id varchar(20) not null,
    node_id varchar(50) not null,
    select_yesno varchar(1) not null,
    primary key (node_id, system_matter_id)
    );

     

    2. ロジックフローを作成してください。

    最初に「定数設定」から定数を追加してください。

    ロジックフロー定義/定数設定

    定数ID 定数値
    APPROVAL_NUMBER 5
    FALSE false

    入力値・出力値
    入力値・出力値に関しては、下記を参照してください。
    「管理者操作ガイド」-「分岐開始・終了処理」
     

    集計する処理を"ロジックフロー定義編集/ユーザ定義追加/SQL定義新規作成"から追加してください。
    ➀:ユーザ定義/SQL定義編集
    ➁:ユーザ定義/JavaScript定義編集
    この2つを作成します。
    ➂:終了タスクのマッピング設定もしていきます。


     

    ➀にロジックフローがテーブルから案件単位で情報を取得する処理を作成してください。

    ➀の処理
    ユーザ定義共通設定
    《入力値》
    'string型':systemMatterld

    ・JSON入力

    {
      "systemMatterld": ""
    }

    《返却値》
    'object[]型':records
    ↳'string型':system_matter_id
    ↳'string型':select_yesno

    《SQL定義(クエリ)》

    SELECT
      system_matter_id,select_yesno
    FROM
      cb149668
    WHERE
      system_matter_id =/*systemMatterId*/'dummyId'

     

    マッピング設定
    入力:imwProcessCommon/systemMatterld -- 出力:systemMatterld

     

    ➁の処理は、以下の3つの処理を書き込みます。

    routeTransitionFlagに渡る値
    1、'Yes'数が50%以上になる ture
    2、'No'数が50%以上になる ture
    3、'Yes'・'No'数がどちらとも50%以下になる false

    ※「数が50%以上」=分岐終了に接続されているノード数を分母に、'Yes'ノード・'No'ノード数それぞれを分子にとった上での比率のこと。つまり「数が50%以上」だと、過半数とれているということになる。

    ➁の処理
    ユーザ定義共通設定
    《入力値》
    'object[]型':records
    ↳'string型':system_matter_id
    ↳'string型':select_yesno

    'integer型':approvalNumber

    ・JSON入力

    {
      "records": [
        {
          "system_matter_id": "",
          "select_yesno": ""
        }
      ],
      "approvalNumber": 0
    }

    《返却値》
    'boolean型':routeTransitionFlag

    ・JSON入力

    {
      "routeTransitionFlag": false
    }

    《スクリプト》

    function run(input) {
      var yes = 0;
      var no = 0;
    
      for(var i in input.records){
        if(input.records[i].select_yesno === '1'){
          yes = yes +1;
        }else if(input.records[i].select_yesno === '0'){
          no =  no +1;
        }
      }
    
      var y = yes/input.approvalNumber;
      var n = no/input.approvalNumber;
      var flag = y>0.5 || n>0.5;
    
      return{
        routeTransitionFlag:flag
      }
    }

     

    マッピング設定
    入力:定数/APPROVAL_NUMBER -- 出力:approvalNumber
    入力:im_cookbook_149668_user_majority_rule1/records -- 出力:records

     

    ➂で、終了タスクのマッピング設定をしてください。

    ➂の処理
    マッピング設定
    入力:定数/FALSE -- 出力:error
    入力:im_cookbook_149668_user1/routeTransitionFlag
    -- 出力:routeTransitionFlag

    作成したロジックフローを、ワークフローで利用できるようにしてください。
    「管理者操作ガイド」-「ロジックフローを利用する」

    3. ワークフローを作成してください。

    ユーザプログラム定義・ルート定義・フロー定義を新規作成してください。

    設定時のポイント
    ・ユーザプログラム定義
    ユーザプログラム定義編集/プラグイン種別 → 結合処理
    ユーザプログラム定義編集/プラグイン種類 → 【結合処理】LogicDesigner
    実行順番 → 1
    ・フロー定義
    バージョン/ルート詳細/分岐開始ノード編集 → 分岐開始方法:設定しない
    バージョン/ルート詳細/分岐終了ノード編集 → 分岐終了方法:ユーザプログラムで分岐終了する

    結合処理
    結合処理については、下記を参照してください。
    「管理者操作ガイド」-「コンテンツ定義を登録する」
     

    4. 画面で選択した'Yes'・'No'をテーブルに登録する処理を作成してください。

    画面に、対象ユーザが選択して多数決をとる'Yes'・'No'ボタンを作成してください。
    すでに製品メディアに保存されているサンプルプログラムを使用していきます。

    《承認画面》
    承認画面のhtmlファイルに、'Yes'・'No'ボタンを書き込んでください。
    (今回はラジオボタンを作成しています)

    <tr>
    <th><label class="imui-required">Application judgment</label></th>
    <td><input type="radio" name="evaluationCd" value="1" checked="checked">Yes
    <input type="radio" name="evaluationCd" value="0" checked="checked">No</td>
    </tr>

     

    《(承認ノードに設定する)アクション処理》
    次に、ユーザプログラム「アクション処理」にYes・Noを含む情報を渡してください。
    以下のコードを、承認ページのhtmlファイルに追加してください。

    sample\im_workflow\purchase\screen\approve.html

    <imart type="workflowOpenPageCsjs" />
    <script type="text/javascript">
    $(function(){
        $('#back').click(function(){
            $('#backForm').submit();
            return false;
        });
        $('#openPage').click(function(){
            //以下のコードを記載してください。
            $('#evaluation').val($('[name="evaluationCd"]:checked').val());
            workflowOpenPage('<imart type="string" value=$data.imwPageType />');
            return false;
        });
    });
    </script>
    </imart>

     

    sample\im_workflow\purchase\screen\approve.html

    <imart type="workflowOpenPage"
        name="workflowOpenPageForm"
        method="POST"
        target="_top"
        imwSystemMatterId=$data.imwSystemMatterId
        imwNodeId=$data.imwNodeId
        imwCallOriginalParams=$data.imwCallOriginalParams
         //以下を削除してください。
        imwNextScriptPath=$data.imwCallOriginalPagePath />
         //以下を記載してください。
        imwNextScriptPath=$data.imwCallOriginalPagePath>
        <input type="hidden" value="" name="evaluation" id="evaluation">
    </imart>

     

    最後は承認アクションのjsファイルに、データベースへ結果を入れる処理を入れてください。
    以下のコードを書き込みます。

    sample\im_workflow\purchase\action\ActionProcess.js

    
    // 承認
    function approve(parameter,userParameter) {
        Debug.print( "-----1 ActionProcess.js - approve -----" );
        Debug.console(parameter);
        Debug.console(userParameter);
        Debug.print( "----- ActionProcess.js - approve -----" );
        //以下のコードを記載します。
        new TenantDatabase().insert('cb149668', {
           system_matter_id : parameter.systemMatterId,
           select_yesno: userParameter.evaluation
        });
        var result = {
                      "resultFlag" : true,
                      "message"    : ""
                     };
        return result;
    }