Thursday, June 19, 2014

Activiti BPM Platformことはじめ4(レポートを追加してみよう)

こんにちは。おおたにです。

今回はActiviti BPM Platformのレポート機能について紹介します。Activitiは簡易的なレポーティング機能を備えており、シンプルなレポートであればActivitiのみで完結して出力することができます。以下では新しいレポートを作成してみたいと思います。なお、Activitiのインストール、利用方法については以下の記事を参考にしてください。

Activiti BPM Platformことはじめ(インストール方法とか)
Activiti BPM Platformことはじめ2(Activiti Explorerの使い方とか)
Activiti BPM Platformことはじめ3(Activiti Modelerの使い方)


レポートの仕組み


Activitiにおけるレポートの実体はプロセスです。具体的には、レポートのデータを生成するスクリプトを実行するプロセスということになります。レポートを実行すると、プロセス開始時のフォームでパラメータを入力し、それを受けてスクリプトが実行されて結果が出力されます。


カスタムレポートを追加してみよう


というわけで、早速カスタムレポートを追加してみましょう。レポート定義=プロセス定義なので、Activiti ModelerやEclipse Designer(Eclipseのプラグインですね)などで定義を作成してActivitiにデプロイするという流れになります。ここでは、ユーザごとのワークフロー開始数を表示するレポートを作ってみたいと思います。なお、今回はActiviti 5.15.1を使っています。

1. 新規モデルを追加する

Activiti Explorerにユーザkermitでログインし、「Processes」->「Model workspace」に移動して「New Model」をクリックします。Nameに「Sample Model」と入力し、「Activiti Modeler」を選択して「Craete
」をクリックします。



2. レポート定義(プロセス定義)を作成する

自動的にActiviti Modelerの画面に遷移するので、まずはプロセスの属性を設定します。ここで重要なのは、Target namespaceをactiviti-reportとすることです。Activitiはこの属性を見てレポート用のプロセス定義であることを識別します。
  • Name : Sample Report
  • Target namespace : activiti-report


続いて、Start event、Script task、End eventを以下のように接続、設定します。
  • Start event
    • Id : start
    • Name : start
    • Form properties : 後述
  • Script task
    • Id : createReport
    • Name : createReport
    • Script format : js
    • Script : 後述
  • End event
    • Id : end
    • Name : end


Start eventのForm properties属性については、Start eventの属性設定欄のForm propertiesをクリックし、以下の内容を入力して「Ok」をクリックします。Start eventのフォーム設定は、一般的にはワークフロー開始時の情報入力のために使われますが、レポートにおいてはレポート出力に必要なパラメータを指定するために使われます。
  • Id : chartType
  • Name : Chart Name
  • Type : enum
  • Required : Yes
  • 選択肢
    • Id : pieChart, Name : Pie chart
    • Id : barChart, Name : Bar chart



Script taskのScriptも同様に属性設定欄のScriptをクリックし、以下のスクリプトを入力して「Ok」をクリックします。

importPackage(java.sql);
importPackage(java.lang);
importPackage(org.activiti.explorer.reporting);

var reportData = new ReportData();
var dataset = reportData.newDataset(); 
dataset.type = execution.getVariable("chartType");
dataset.description = "Test Report ";

var result = ReportingUtil.executeSelectSqlQuery("SELECT START_USER_ID_, count(ID_) FROM ACT_HI_PROCINST where START_USER_ID_ is not null group by START_USER_ID_");
while (result.next()) {
    dataset.add(result.getString(1), result.getLong(2)); 
}
execution.setVariable("reportData", reportData.toBytes());



最後に、画面左上のSaveアイコンをクリックし、表示された保存ダイアログで「Save」をクリックします。保存が完了したら画面右上の×をクリックしてActiviti Modelerを終了します。

コードについて補足すると、実行変数reportDataにReportData型のオブジェクトを格納することで、このオブジェクトを使ったレポート表示が行われます。また、ReportingUtil#executeSelectSqlQuery()を使うとDBに対して直接クエリを発行することができるので、レポート内容の取得によく利用されます。

3. レポート定義をデプロイする

自動的にActiviti Explorerの「Processes」->「Model workspace」に戻るので、先ほど作ったSample Modelを選択して画面右上の「Deploy」を実行します。



デプロイに成功すると、「Reports」->「Generate reports」に「Sample Report」が表示されるようになります。



動作確認してみよう


では、動作確認してみましょう。Chart typeを選択して「Generate report」をクリックすると、指定した形式でユーザ毎のプロセス数が表示されるはずです。



どうでしょうか。単純なレポートであれば比較的簡単に作成できることがお分かり頂けたかと思います。皆さんも是非カスタムレポートにチャレンジしてみてください。なお、今回はActiviti Modelerを使いましたが、このツールの制約により定義できないような項目がある場合にはEclipse Designerを利用するとよいかと思います。

No comments: