iPLAssのワークフロー機能を利用し、さまざまな要件に対応するフローを作成可能です。 ここでは準備編、基本編、実践編に分け、ワークフローの作成方法を説明していきます。
-
準備編
ワークフローの概要およびiPLAssでのワークフローを簡単に説明していきます。 -
基本編
各イベントの動作および設定方法について、簡単なワークフローを作成しながら説明していきます。 -
実践編
基本編で説明した内容を利用し、より現実的なワークフローの作成を行います。
1. 前提条件
本チュートリアルは以下を前提条件としています。 チュートリアルを進めるにあたり、以下のいずれかを実施し、Webアプリケーションが動作する環境を準備してください。
-
本チュートリアルは、Enterprise Editionでのみ実施可能です。
オープンソース版の環境をEnterprise Editionにアップグレードする場合は、Enterprise Editionへのアップグレードを参照してください。
Dockerの場合、Enterprise Edition版のDockerイメージを利用してください。
-
User Admin(デフォルトの管理者ユーザー)でGEM画面を操作する場合は、「メニューの変更」から「DEFAULT」のメニューに切り替えて操作してください。本チュートリアルでは、メニュー等の権限設定については割愛しています。
2. 準備編
2.1. ワークフロー概要
ワークフローとは業務上の一連の処理手続きのことを指します。
例えば、『社員が休暇を申請し、上司がそれを承認し、社員は上司の承認を確認して休暇を取る』
といった流れも単純ですがワークフローとなります。
この流れを図にすると下記のようになります。
iPLAssのワークフローは、「ワークフローアイテム(以降、Itemと記載)」というオブジェクトで構成されています。
Itemは、Activity(Task)
Event
Gateway
Flow
Variable
という5つのカテゴリに分類されます。
各カテゴリの簡単な説明は下表の通りです。
カテゴリ | 説明 |
---|---|
Activity(Task) |
処理(タスク)を定義するItemのカテゴリです。 上図の「休暇申請」や「上司承認」の部分にあたります。 |
Event |
処理のきっかけや終了を定義するItemのカテゴリです。 上図の「完了」の部分にあたります。 |
Gateway |
フローの分岐、または結合を定義するItemのカテゴリです。 |
Flow |
処理順序を定義するItemのカテゴリです。上図の矢印にあたる部分です。 |
Variable |
フロー内で共有する変数を定義するItemのカテゴリです。 |
各カテゴリには、それぞれ数種類のItemが存在します。Itemの詳細については、後述の各Itemの説明を参照してください。
2.2. 各Itemの説明
Activity(Task)
iPLAssのコマンドを呼び出すことができるタスクです。 ワークフロー内でロジカルな処理を行いたい場合に利用します。
設定したユーザーに対してタスクを割り当て、回答結果で処理を振り分けるタスクです。 ユーザーAを割り当て、結果に承認、差し戻しをセットすることで、本処理に到達した際に、ユーザーAが承認、もしくは差し戻しを実行することで後続処理を進める等の利用が可能です。
後述するVariableItemを指定し、対象Entityの更新を行えます。
MailTemplateを指定し、メール送信するタスクです。
定義済みのWorkflowをSubProcessとして呼び出すことが可能です。 なお、本チュートリアルでは扱いません。
Event
ワークフローが起動した際に一番初めに実行されるイベントです。 このイベントが起動することでワークフローの状態が「ACTIVE」となります。 ワークフローには必ず1つだけ定義する必要があります。
ワークフローを終了させる為のイベントです。 Workflowの状態(ステータス)は「COMPLETED」になります。
ワークフロー履歴への出力用イベントです。 特にこのイベントによる処理は実行されず、続けて後続のフローに遷移します。
タイマー機能をもつイベントです。 後続イベントの実行日時や実行遅延時間を指定することができます。
ワークフローをキャンセルさせる為のイベントです。 EndEventとの違いは完了後のステータスとなります。 Terminateが実行されるとWorkflowの状態(ステータス)は「CANCELED」になります。
Gateway
分岐処理で利用します。 後続の全てのSequenceFlowを実行します。
分岐処理で利用します。 後続のいずれかのSequenceFlowを実行します。 なお、本チュートリアルでは扱いません。
結合処理で利用します。 前段の処理のいずれかが到達した時点で後続処理を実施します。 前段の処理が到達するたびに実行されます。
結合処理で利用します。 前段の処理がすべて完了した時点で後続処理を実施します。
Flow
Activity(Task)、Event、Gatewayの各Itemを結び付ける為に利用します。 SequenceFlowで結んだ順番に処理が実行されます。 遷移元のItemの設定次第で、条件を加え、分岐処理が可能になります。
Variable
Workflow内で参照するオブジェクトを格納することができます。 Entityからワークフローを起動する場合、この変数を利用することで登録したEntityデータをワークフロー内で利用することができます。 また、Entityからワークフローを起動する際の、プロセス実行中のメッセージや、ボタンの表示可否を有効にする場合、この変数の設定が必須となります。
2.3. 操作方法
AdminConsoleでWorkflowを作成する上で必要な操作となります。
これら操作を踏まえ、基本編をはじめて下さい。
また、その他MetaDataの基本操作についてはチュートリアル(ベーシック)をご確認ください。
Workflowの作成
AdminConsoleを開き、他MetaData同様、Workflowで右クリックし、「Workflowを作成する」をクリックします。
作成するWorkflowの名前をName項目に設定し、 Save
ボタンをクリックします。
Workflowの編集
作成したWorkflowをダブルクリックすると空のWorkflow設定画面が表示されます。
右上の赤枠のアイコンをクリックすると、水色のグリッド線が非表示となります。 もう一度クリックすると再表示されます。
画面左ペインからItemをドラッグ&ドロップしてWorkflowを組み立てていきます。 配置した各ItemをSequenceFlowで接続していきます。 SequenceFlowは接続対象Item付近にドラッグすることで吸着します。
対象Itemをクリックし選択状態にします。 選択したItemの設定項目が画面右側に表示されます。 右上の「×」アイコンをクリックすることで対象Itemの削除が行えます。 対象Itemを右クリックすることでも削除が可能です。
SequenceFlowを右クリックすると「Itemを削除する」以外に「Point数を変更する」が選択可能です。 3Pointにすると、SequenceFlowを折り曲げることが可能です。
タスク一覧
ユーザーに割り当てられたタスク一覧をGEMのTop画面に表示するためのパーツが用意されています。 基本編、実践編ともに、ワークフロー終了やタスクの実行履歴を確認するにあたり、タスク一覧を利用します。 下記の手順に従い、タスク一覧を表示可能な状態にしておいてください。
デフォルトではタスク一覧は表示されません。 AdminConsoleのTopView設定を行う必要があります。
-
TopViewの設定
AdminConsoleのTopViewにはあらかじめ「DEFAULT」というデータが登録されています。ダブルクリックすると下記画面が表示されます。 画面右側のItemsにある「Workflow」フォルダの中の「UserTask List」をMainAreaにドラッグ&ドロップして下さい。 「UserTask List」が追加された状態になります。
-
UserTask Listの設定
UserTask Listの設定画面は下図のようになっています。 今回はUserTaskViewの設定をします。 パーツの設定画面を開き、「UserTaskView Setting」をクリックします。デフォルトだと表示項目が全てチェックされていない状態です。 今回はワークフロー履歴や担当割り当て状況等ワークフローの機能を確認したいので、全てチェックをいれてください。
最後に「OK」をクリックし、Topview自体の
Save
ボタンをクリックし保存することで設定が完了します。 -
表示確認
トップ画面にタスク一覧が表示されます。
3. 基本編
基本編ではワークフローの機能を単純な処理を例に説明していきます。
3.1. 単純な承認
ここでは主にUserTaskの利用方法について説明します。 あるユーザーがデータを登録し、そのデータを確認して承認がほしい場合のフローを考えてみます。
事前準備
以下を参考に、ワークフローの承認を行うユーザを用意してください。
項目名 | 設定値 |
---|---|
ユーザID |
authorizer@workflow |
姓 |
承認者 |
メールアドレス |
|
所属グループ |
GemUser |
アカウントポリシー |
標準 |
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow001 |
displayName |
BasicWorkflow001 |
description |
単純な承認 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
VariableItem
項目名 設定値 name
variableItem1
displayName
VariableItem1
※nameの値をEntityViewのワークフロー起動時の変数に設定することで、対象EntityのデータをWorkflowで利用可能となります。
-
StartEvent
項目名 設定値 name
startEvent1
displayName
StartEvent1
historyLogging
true
-
EndEvent
項目名 設定値 name
endEvent1
displayName
EndEvent1
historyLogging
true
-
UserTask
項目名 設定値 name
userTask1
displayName
UserTask1
historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
assignRuleを設定します。 assignRuleでは、誰がこのUserTaskを処理するかを設定します。項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
taskResultStatusを設定します。 taskResultStatusを設定することで、承認、否認による処理の分岐が可能になります。 今回は承認だけとなります。項目名 設定値 name
ok
displayName
承認
今回は分岐させる必要がないので、ok(承認)のみ設定します。 下図の通り、ここで設定した値がワークフロー起動後の画面でボタンとして表示されます。 「Primary」にチェックを入れると、ボタンが強調表示になります。
-
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
次項からはWorkflowを実際に利用する為の準備となります。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity001」というEntityを作成してください。
-
DetailFormViewの設定
作成した「basic.BasicWorkflowEntity001」を右クリックして「DetailLayout」を開き、標準ロード
ボタンをクリックします。
詳細画面の歯車アイコンをクリックすると「DetailFormView Setting」の設定画面が表示されるので、 画面下部にあるワークフロー設定に以下を設定し、作成したWorkflowを追加した後、保存
ボタンをクリックして保存してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow001
ワークフロー変数名
variableItem1
ボタン表示名
単純承認ワークフロー起動
プロセス実行中のメッセージ
単純承認ワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
Workflowの利用
管理者アカウントでログインし、GEMのEntity登録画面から「BasicWorkflowEntity001」の検索画面を開き、 新規作成
ボタンを押して任意のデータを登録してください。
登録したEntityデータの詳細画面を開くと、単純承認ワークフロー起動
というボタンが表示されています。
このボタンはEntityViewで設定したボタン名となっています。
このボタンをクリックすることでワークフローが起動します。
ワークフローの起動方法は、①プログラムからの起動、②GEM画面からの起動の2パターンがあります。詳細は、利用方法を参照してください。 本チュートリアルでのワークフロー起動方法は、便宜上、一部手順を除いてGEM画面からの起動パターン(先の手順でDetailFormViewに設定したワークフロー設定の機能)を使用しています。 |
ワークフローの開始メッセージと同時に、EntityViewで設定したプロセス実行中のメッセージが表示されます。
ユーザーID: authorizer@workflow でログインし、 トップ画面のタスク一覧を確認すると、WorkflowのassignRuleに基づいて割り当てがなされた状態になっています。
割り当てられたUserTaskを操作し、承認処理をしてみます。
タスク一覧にある「編集」リンクをクリックします。
下図が表示されます。
必要に応じてコメントを記入し、 承認
ボタンをクリックしてください。
この 承認
ボタンはWorkflowのtaskResultStatusで設定した値となります。
承認が完了すると、この画面がリロードされます。 各項目を確認してみましょう。承認処理が完了していることが分かります。
以上が単純な承認のWorkflowとなります。
3.2. 差し戻し
ここではUserTaskの結果を利用した分岐処理を説明します。 いわゆる差し戻しについての説明となります。 あるユーザーがデータを登録した上で、申請を行います。 承認者はデータを確認し、問題なければ承認、問題があれば差し戻しを実行します。
事前準備
以下を参考に、ワークフローの申請を行うユーザーを用意してください。
項目名 | 設定値 |
---|---|
ユーザーID |
user001@workflow |
姓 |
ユーザー001 |
メールアドレス |
|
所属グループ |
GemUser |
アカウントポリシー |
標準 |
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow002 |
displayName |
BasicWorkflow002 |
description |
差し戻し |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
StartEvent
項目名 設定値 historyLogging
true
-
EndEvent
項目名 設定値 historyLogging
true
-
UserTask1
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
user001@workflow
-
taskResultStatus
項目名 設定値 name
post
displayName
申請
-
-
UserTask2
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名
設定値
タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
今回は承認
ボタンと差し戻し
ボタンが必要なのでそれぞれ登録します。項目名 設定値 name
ok
displayName
承認
項目名 設定値 name
ng
displayName
差し戻し
正しく設定されていると下図のような状態になります。
-
-
SequenceFlow(UserTask2 → EndEvent1)
承認の場合のフローになります。
項目名 設定値 nodeResultStatus
ok
-
SequenceFlow(UserTask2 → UserTask1)
差し戻しの場合のフローになります。
項目名 設定値 nodeResultStatus
ng
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity002」というEntityを作成してください。 -
DetailFormViewの設定
「basic.BasicWorkflowEntity002」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow002
ワークフロー変数名
variableItem1
ボタン表示名
差し戻しワークフロー起動
プロセス実行中のメッセージ
差し戻しワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
Workflowの利用
管理者アカウントでログインし単純な承認と同様にワークフローを起動してください。
単純な承認と同様にワークフローを確認してください。
ユーザーID: user001@workflow でログインしなおし、タスク処理の編集画面を表示してください。
申請可能となっていますので、 申請
ボタンをクリックします。
申請が終ったらユーザーID: authorizer@workflow でログインしなおしてください。 タスク一覧に先ほど申請されたタスクの承認依頼がきています。 編集リンクをクリックし、承認または差し戻しを行います。
今回は 承認
と 差し戻し
の2つのボタンが表示されています。
タスク対象データを確認し、承認可能かどうかデータを確認するような利用法が想定されます。
ここで「差し戻し」をクリックします。
差し戻しが終わったらユーザーID: user001@workflow でログインしなおし、タスク一覧に先ほど差し戻されたタスクがあることを確認します。 編集リンクをクリックし、再度申請を行います。
再申請が終ったらユーザーID: authorizer@workflow でログインしなおしてください。 タスク一覧に先ほど申請されたタスクの承認依頼がきています。 編集リンクをクリックし、今度は承認してみましょう。
承認後ワークフロー履歴を確認すると下図のようになっていると思います。 処理結果が差し戻しになり、再申請が行われた後承認されたことが確認出来ます。
以上が差し戻しのWorkflowとなります。
3.3. 承認と同時にメール送信
ここでは主にメール送信方法について説明します。 あるユーザーがデータを登録した上で、申請を行います。同時に確認してほしいユーザーへメールを送信します。
事前準備
「basic/SimpleWorkflow003」というMailTemplateを準備しておいてください。 件名、メッセージ等は任意の文字列を入力してください。
ローカルでメールの確認がしたい場合のみ「mtp-service-config.xml」の設定が必要になります。 下記の通りMailServiceのlistenerを有効にしてください。
<!-- ■ for develop only (additional="true) ■ -->
<!-- 送信メールをデバッグ出力する場合、以下を有効にしてください。 -->
<!--
<property name="listener" class="org.iplass.mtp.mail.listeners.LoggingSendMailListener" additional="true"/> (1)
-->
1 | コメント化を解除します。ただし、開発環境での利用に留めてください。 |
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow003 |
displayName |
BasicWorkflow003 |
description |
メール送信 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
UserTask1
項目名 設定値 assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名 設定値 name
ok
displayName
申請と送信
-
-
MailTask1
項目名 設定値 mailTemplateName
basic/SimpleWorkflow003
to
項目名 設定値 定義形式
STRING
to取得ロジック
-
to
送信先を設定します。 本チュートリアルでは実際に送信はせず、ログでの確認となるため、「test@test.jp」と設定します。
-
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity003」というEntityを作成してください。 -
DetailFormViewの設定
「basic.BasicWorkflowEntity003」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow003
ワークフロー変数名
variableItem1
ボタン表示名
メール送信ワークフロー起動
プロセス実行中のメッセージ
メール送信ワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
Workflowの利用
管理者アカウントでログインし単純な承認と同様にワークフローを起動してください。
単純な承認と同様にワークフローを確認してください。
申請と送信
ボタンをクリックします。
ワークフローは完了状態になり、メールが送信されます。
ローカル環境ではEclipseのコンソールにメール内容がログ出力されます。
11:32:33.257 [http-nio-8080-exec-1] DEBUG 38 63312 CompositeCommand o.i.m.m.l.LoggingSendMailListener - From:test@contract.dentsusoken.com ReplyTo:test@contract.dentsusoken.com To:(1)test@test.jp; Cc:(0) Bcc:(0) Subject:メール送信サンプル FileName: PlainMessage:メール送信サンプル HtmlMessage:
以上がメール送信処理を含むWorkflowとなります。
3.4. 承認と同時にEntity操作を実施
ここでは主にEntity操作方法について説明します。 あるユーザーがデータを登録した上で、申請を行います。 同時にEntityデータの更新を行います。
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow004 |
displayName |
BasicWorkflow004 |
description |
Entity操作 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
UserTask1
項目名 設定値 assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名 設定値 name
ok
displayName
承認して更新
-
-
UpdateEntityTask1
項目名 設定値 variableName
variableItem1
updateRule
項目名 設定値 タイプ
Property
プロパティ名
description
更新値
更新ワークフローサンプル
-
updateRule
本ワークフローが実行され、正常に完了した際には対象データのdescriptionが更新値にて更新されています。
-
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity004」というEntityを作成してください。 -
DetailFormViewの設定
「basic.BasicWorkflowEntity004」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow004
ワークフロー変数名
variableItem1
ボタン表示名
Entity操作ワークフロー起動
プロセス実行中のメッセージ
Entity操作ワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
3.5. 承認と同時にカスタムロジック処理を実施
ここでは主にカスタムロジックを利用する方法について説明します。 あるユーザーがデータを登録した上で、申請を行います。 同時にカスタムロジックの実行を行います。
事前準備
「basic/BasicWorkflowCommand005」というCommandを準備しておいてください。
コマンドの作成はAdminConsole画面で「Command」を選択し、右クリックメニューから「コマンドを作成する」を選択します。 下記の通りCommandを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflowCommand005 |
displayName |
BasicWorkflowCommand005 |
type |
Script |
作成したCommandを開き、 Edit
ボタンから下記の内容を設定後、 Save
ボタンをクリックして保存してください。
import org.iplass.mtp.ManagerLocator;
import org.iplass.mtp.entity.Entity;
import org.iplass.mtp.entity.EntityManager;
import org.iplass.mtp.entity.GenericEntity;
EntityManager em = ManagerLocator.manager(EntityManager.class);
Entity e = new GenericEntity("basic.BasicWorkflowEntity005");
e.setName("create by CustomLogic");
em.insert(e);
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow005 |
displayName |
BasicWorkflow005 |
description |
カスタムロジック処理 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
UserTask1
項目名 設定値 assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名 設定値 name
ok
displayName
承認してカスタム処理
-
-
CommandTask1
項目名 設定値 commandConfig
basic/BasicWorkflowCommand005
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity005」というEntityを作成してください。 -
DetailFormViewの設定
「basic.BasicWorkflowEntity005」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow005
ワークフロー変数名
variableItem1
ボタン表示名
カスタムロジック処理ワークフロー起動
プロセス実行中のメッセージ
カスタムロジック処理ワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWokflowを利用してみましょう。
3.6. スプリット
ここでは主にGateway(Split)の利用方法について説明します。 あるユーザーがデータを登録すると同時にメール送信と、そのデータの申請タスクが起動します。 申請タスクが実行されると終了します。
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow006 |
displayName |
BasicWorkflow006 |
description |
スプリット |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
StartEvent
項目名 設定値 historyLogging
true
-
EndEvent
項目名 設定値 historyLogging
true
-
SplitParallelGateway
項目名 設定値 historyLogging
true
-
JoinSyncGateway
項目名 設定値 historyLogging
true
-
IntermediateEvent1
項目名 設定値 historyLogging
true
-
IntermediateEvent2
項目名 設定値 historyLogging
true
-
UserTask1
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名 設定値 name
post
displayName
申請
-
-
MailTask1
項目名 設定値 historyLogging
true
mailTemplateName
basic/SimpleWorkflow003
to
項目名 設定値 定義形式
STRING
to取得ロジック
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity006」というEntityを作成してください。 -
DetailFormViewの設定
「basic.BasicWorkflowEntity006」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow006
ワークフロー変数名
variableItem1
ボタン表示名
スプリットワークフロー起動
プロセス実行中のメッセージ
スプリットワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
3.7. タイマー
ここでは主にTimerの利用方法について説明します。 あるユーザーがデータを登録し、そのデータに対して確認が実施された数分後にメールが送信されます。
事前準備
mtp-service-config.xmlに設定が必要になります。
下記の通りuseQueueをtrueにして下さい。
設定変更を行った際はTomcatサーバの再起動が必要になります。
<!-- AsyncTask queue and counter setting -->
<service>
<interface>org.iplass.mtp.impl.async.rdb.RdbQueueService</interface>
<!-- if use async rdb service set to true -->
<property name="useQueue" value="true" />
</service>
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
basic/BasicWorkflow007 |
displayName |
BasicWorkflow007 |
description |
タイマー |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
StartEvent
項目名 設定値 historyLogging
true
-
EndEvent
項目名 設定値 historyLogging
true
-
UserTask1
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名
設定値
name
post
displayName
申請3分後にメール
-
-
IntermediateTimerEvent1
項目名 設定値 historyLogging
true
timer
項目名 設定値 Timer Type
Delay
Timer Unit
Minuites
Delay Expression
"3"
-
MailTask1
項目名 設定値 historyLogging
true
mailTemplateName
basic/SimpleWorkflow003
to
項目名 設定値 定義形式
STRING
to取得ロジック
以上でWorkflowの設定は完了です。 Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを利用するための準備となります。
-
Entityの作成
「basic.BasicWorkflowEntity007」というEntityを作成してください。 -
DetailFormViewの設定
「basic.BasicWorkflowEntity007」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
basic/BasicWorkflow007
ワークフロー変数名
variableItem1
ボタン表示名
タイマーワークフロー起動
プロセス実行中のメッセージ
タイマーワークフロー実行中です。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
4. 実践編
実践編ではワークフローの複数の機能を組み合わせて複雑な処理を組み立てていきます。
4.1. 問合せ管理
問合せがあった場合に、対応及び、上長の対応確認を実施するフローを実現します。 簡単な流れは以下のようになります。
事前準備
「practice.PracticeWorkflowEntity001」というEntityを作成してください。
-
Properties
作成したEntityを開き、Propertiesタブから以下のプロパティを追加してください。
Name | Display Name | Type | その他 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
inquiryNo |
お問合せ番号 |
AutoNumber |
|
||||||||||
familyName |
姓 |
String |
|||||||||||
firstName |
名 |
String |
|||||||||||
familyNameKana |
セイ |
String |
|||||||||||
firstNameKana |
メイ |
String |
|||||||||||
メール |
String |
||||||||||||
content |
内容 |
LongText |
|||||||||||
kind |
種別 |
Select |
LocalValueに以下の値を追加します。
|
||||||||||
inquiryStatus |
問合せステータス |
Select |
LocalValueに以下の値を追加します。
|
-
EventListeners
EventListenersタブから、以下の設定を追加してください。
Type | Script | Events |
---|---|---|
Script |
下記を参照 |
afterInsert |
import java.util.LinkedHashMap;
import java.util.Map;
import org.iplass.mtp.workflow.WorkflowManager;
def wm = manager(WorkflowManager.class);
Map<String, Object> parameters = new LinkedHashMap<String, Object>();
parameters.put("variableItem1", entity);
wm.startProcess("practice/PracticeWorkflow001", parameters);
以上でEntityの設定は完了です。 Save
ボタンをクリックして保存してください。
この設定により、Entityへのデータ登録後に自動的にWorkflowが起動するようになります。
以下のユーザーを用意してください。 作成済のユーザーについては、改めて用意する必要はありません。
ユーザーID | 姓 | メールアドレス | 所属グループ | アカウントポリシー |
---|---|---|---|---|
user001@workflow |
ユーザー001 |
GemUser |
標準 |
|
user002@workflow |
ユーザー002 |
GemUser |
標準 |
|
user003@workflow |
ユーザー003 |
GemUser |
標準 |
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
practice/PracticeWorkflow001 |
displayName |
PracticeWorkflow001 |
description |
問合せ管理 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。記載のない項目名については設定不要です。
-
StartEvent
項目名 設定値 historyLogging
true
-
EndEvent
項目名 設定値 historyLogging
true
-
UserTask1
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
userTaskName
お問合せ対応:${variableItem1.inquiryNo}
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
EQL
ID取得ロジック
state = 'V'
-
taskResultStatus
項目名 設定値 name
ok
displayName
完了
-
-
UpdateEntityTask1
項目名 設定値 historyLogging
true
variableName
variableItem1
updateRule
項目名 設定値 タイプ
property
プロパティ名
inquiryStatus
更新値
3
-
UserTask2
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
userTaskName
お問合せ対応の承認:${variableItem1.inquiryNo}
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ANYONE
完了条件
ANYONE
定義形式
EQL
ID取得ロジック
state = 'V'
-
taskResultStatus
項目名 設定値 name
ok
displayName
承認
項目名 設定値 name
ng
displayName
差し戻し
-
-
SequenceFlow(UserTask2 → UpdateEntityTask3)
承認の場合のフローになります。
項目名 設定値 nodeResultStatus
ok
-
SequenceFlow(UserTask2 → UpdateEntityTask2)
差し戻しの場合のフローになります。
項目名 設定値 nodeResultStatus
ng
-
UpdateEntityTask2
項目名 設定値 historyLogging
true
variableName
variableItem1
updateRule
項目名 設定値 タイプ
property
プロパティ名
inquiryStatus
更新値
2
-
UpdateEntityTask3
項目名 設定値 historyLogging
true
variableName
variableItem1
updateRule
項目名 設定値 タイプ
property
プロパティ名
inquiryStatus
更新値
4
以上でWorkflowの設定は完了です。
Save
ボタンをクリックして保存してください。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
Workflowの利用
管理者アカウントでログインし、「practice.PracticeWorkflowEntity001」にデータを登録することでWorkflowが自動的に起動します。
単純な承認と同様にワークフローを確認してください。
担当者になっている任意のユーザー(user001@workflow 等)でログインし、 完了
ボタンをクリックします。
MYタスクには表示されなくなります。 「作成したタスク」を選択してください。 担当者が自分ではなくなっていることが確認できます。
担当者になっているユーザーでログインし、 承認
ボタンをクリックしてタスクを完了させます。
完了したタスクを確認すると、以下のようになっていると思います。
以上が問合せ管理Workflowとなります。
4.2. 配送管理
キューを利用した割り当て処理を行うワークフローを作成します。
事前準備
「practice.PracticeWorkflowEntity002」というEntityを準備しておいてください。
-
Properties
作成したEntityを開き、Propertiesタブから以下のプロパティを追加してください。
Name | Display Name | Type | その他 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
settlementNo |
請求番号 |
AutoNumber |
|
||||||||
settlementStatus |
請求状況 |
Select |
LocalValueに以下の値を追加します。
|
||||||||
deliverGoodsDate |
納品予定日 |
Date |
|||||||||
orderMail |
メール |
String |
-
EventListeners
EventListenersタブから、以下の設定を追加してください。
Type | Script | Events |
---|---|---|
Script |
下記を参照 |
afterInsert |
import java.util.LinkedHashMap;
import java.util.Map;
import org.iplass.mtp.workflow.WorkflowManager;
def wm = manager(WorkflowManager.class);
Map<String, Object> parameters = new LinkedHashMap<String, Object>();
parameters.put("variableItem1", entity);
parameters.put("variableItem2", entity.orderMail);
wm.startProcess("practice/PracticeWorkflow002", parameters);
以上でEntityの設定は完了です。 Save
ボタンをクリックして保存してください。
この設定により、Entityへのデータ登録後に自動的にWorkflowが起動するようになります。
今回はUserTaskQueueを利用します。 UserTaskQueueとは、ユーザーに直接タスクを割り当てずに、キューにタスクをプールする方法です。
以下の手順を実施し、事前にUserTaskQueueを利用するためのデータを登録しておきます。
-
AdminConsole
View Components配下にあるMenuから、EntityMenuItemを右クリックして以下のメニューを作成し、Menu Treeに設置します。項目名 設定値 name
mtp/workflow/UserTaskQueue
displayName
UserTaskQueue
entity
mtp.workflow.UserTaskQueue
-
GEM画面
GEMのトップ画面を更新し、追加したUserTaskQueueのメニュー画面から以下のデータを新規登録してください。項目名 設定値 基本項目.名前
practiceWorkflowQueue002
オブジェクト情報.コード
practiceWorkflowQueue002
以下のユーザーを用意してください。 作成済のユーザーについては、改めて用意する必要はありません。
ユーザーID | 姓 | メールアドレス | 所属グループ | アカウントポリシー |
---|---|---|---|---|
user001@workflow |
ユーザー001 |
GemUser |
標準 |
|
user002@workflow |
ユーザー002 |
GemUser |
標準 |
|
user003@workflow |
ユーザー003 |
GemUser |
標準 |
以下の2つのMailTemplateを用意してください。
-
practice/PracticeWorkflow002_001
-
practice/PracticeWorkflow002_002
Name | Display Name | Description |
---|---|---|
practice/PracticeWorkflow002_001 |
PracticeWorkflow002_001 |
ご注文の確認 |
practice/PracticeWorkflow002_002 |
PracticeWorkflow002_002 |
ご注文の発送 |
件名、メッセージ内容は任意に設定して下さい。
以下のコマンドを用意してください。
-
practice/PracticeWorkflowCommand002
Name | Display Name | Description | Type | Command Attribute |
---|---|---|---|---|
practice/PracticeWorkflowCommand002 |
PracticeWorkflowCommand002 |
請求更新コマンド |
Script |
下記を参照 |
import org.iplass.mtp.entity.UpdateOption;
import org.iplass.mtp.entity.SelectValue;
import org.iplass.mtp.impl.core.ExecuteContext;
def settlement = request.getAttribute("variableItem1");
// 請求状況
settlement.setValue("settlementStatus", new SelectValue("2"));
// 納品予定日
settlement.setValue("deliverGoodsDate", ExecuteContext.getCurrentContext().getCurrentTimestamp());
UpdateOption option = new UpdateOption(false);
option.setUpdateProperties("settlementStatus", "deliverGoodsDate");
em.update(settlement, option);
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
practice/PracticeWorkflow002 |
displayName |
PracticeWorkflow002 |
description |
配送管理 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。 記載のない項目名については設定不要です。
-
StartEvent
項目名 設定値 historyLogging
true
-
EndEvent
項目名 設定値 historyLogging
true
-
VariableItem2
項目名 設定値 name
variableItem2
displayName
VariableItem2
※今回はメール送信先を保持するためにEntityDataとは別にVariableItemを利用します。
-
MailTask1
項目名 設定値 historyLogging
true
mailTemplateName
practice/PracticeWorkflow002_001
to
項目名 設定値 定義形式
SCRIPT
to取得ロジック
variableItem2
-
UserTask1
項目名 設定値 historyLogging
true
assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
userTaskName
配送処理:${variableItem1.settlementNo}
-
assignRule
項目名 設定値 タイプ
ToQueue
適用フロー名
*
割当種別
ANYONE
完了条件
ANYONE
QueueCode取得ロジック
return "practiceWorkflowQueue002";
今まで同様assignRuleを設定します。 今回はQueueを利用します。 下図のような設定にして下さい。
なお、事前準備のUserTaskQueue登録作業が完了していない場合、ワークフロー実行時にエラーとなります。
-
taskResultStatus
項目名 設定値 name
ok
displayName
配送完了
項目名 設定値 name
ng
displayName
配送不可
-
-
SequenceFlow(UserTask1 → CommandTask1)
配送完了の場合のフローになります。
項目名 設定値 nodeResultStatus
ok
-
SequenceFlow(UserTask1 → UpdateEntityTask1)
配送不可の場合のフローになります。
項目名 設定値 nodeResultStatus
ng
-
UpdateEntityTask1
項目名 設定値 historyLogging
true
variableName
variableItem1
updateRule
項目名 設定値 タイプ
property
プロパティ名
settlementStatus
更新値
3
-
CommandTask1
項目名 設定値 historyLogging
true
commandConfig
practice/PracticeWorkflowCommand002
-
MailTask2
項目名 設定値 historyLogging
true
mailTemplateName
practice/PracticeWorkflow002_002
to
項目名 設定値 定義形式
SCRIPT
to取得ロジック
variableItem2
以上でWorkflowの設定は完了です。
Save
ボタンをクリックして保存してください。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
Workflowの利用
管理者アカウントでログインし、「practice.PracticeWorkflowEntity002」にデータを登録することでWorkflowが自動的に起動します。
メール送信確認のため、メールの項目には必ず値を設定してください。
登録と同時にメールが送信されます。
単純な承認と同様にワークフローを確認してください。
管理者アカウントのトップ画面から、作成したタスクを確認します。
今回は割り当てをユーザーではなくタスクキューにしている為、自動でMYタスクには入りません。
ユーザーID: user001@workflowでログインし、全てのタスクから対象タスクの割当を行います。
MYタスクをみると割り当て済みになってることが確認できます。
MYタスクの編集リンクをクリックし、タスク処理を実施します。
今回は 配送完了
ボタンをクリックします。
完了と同時にメールが送信されます。
なお、タスク処理において配送不可をクリックした場合は請求状況が配送不可として扱われます。
以上が配送管理Workflowとなります。
4.3. 議事録承認
データのロック機能を利用して、議事録の承認後に変更できないようにします。
通知ありのフローではタスク完了後にメール送信タスクを実行します。
事前準備
「practice.PracticeWorkflowEntity003」というEntityを準備しておいてください。
-
Properties
作成したEntityを開き、Propertiesタブから以下のプロパティを追加してください。
Name | Display Name | Type | multiple | その他 | ||||
---|---|---|---|---|---|---|---|---|
minutes |
議事録 |
Binary |
1 |
|||||
members |
回覧先 |
Reference |
* |
|
||||
authorizerList |
承認者リスト |
Binary |
1 |
以上でEntityの設定は完了です。 Save
ボタンをクリックして保存してください。
以下のユーザーを用意してください。 作成済のユーザーについては、改めて用意する必要はありません。
ユーザーID | 姓 | メールアドレス | 所属グループ | アカウントポリシー |
---|---|---|---|---|
user001@workflow |
ユーザー001 |
GemUser |
標準 |
|
user002@workflow |
ユーザー002 |
GemUser |
標準 |
|
user003@workflow |
ユーザー003 |
GemUser |
標準 |
以下のMailTemplateを用意してください。
Name | Display Name | Description |
---|---|---|
practice/PracticeWorkflow003_001 |
PracticeWorkflow003_001 |
議事録提出通知 |
practice/PracticeWorkflow003_002 |
PracticeWorkflow003_002 |
承認/否認依頼通知 |
practice/PracticeWorkflow003_003 |
PracticeWorkflow003_003 |
承認通知 |
practice/PracticeWorkflow003_004 |
PracticeWorkflow003_004 |
否認通知 |
practice/PracticeWorkflow003_005 |
PracticeWorkflow003_005 |
完了通知 |
件名、メッセージ内容は任意に設定して下さい。
以下のコマンドを用意してください。
Name | Display Name | Description | Type | Script |
---|---|---|---|---|
practice/PracticeWorkflowCommand003_001 |
PracticeWorkflowCommand003_001 |
自動承認処理 |
Script |
|
practice/PracticeWorkflowCommand003_002 |
PracticeWorkflowCommand003_002 |
承認者リスト作成処理 |
Script |
|
practice/PracticeWorkflowCommand003_003 |
PracticeWorkflowCommand003_003 |
凍結処理 |
Script |
-
practice/PracticeWorkflowCommand003_001(自動承認処理)
回覧先セットで登録された承認対象者が一定期間(タイマー設定)「承認しなかった場合」も自動的に「承認」とする為の処理です。 タイマーで設定された期間が過ぎた場合に本コマンドが実行されます。
import org.iplass.mtp.entity.query.Query;
import org.iplass.mtp.entity.query.condition.predicate.Equals;
import org.iplass.mtp.entity.EntityManager;
import org.iplass.mtp.entity.SearchResult;
import org.iplass.mtp.entity.SelectValue;
import org.iplass.mtp.entity.UpdateOption;
import org.iplass.mtp.workflow.Assignment;
import org.iplass.mtp.workflow.UserTask;
System.out.println("### START PracticeWorkflowCommand003_001");
// コンテキストからworkflowのoidを取得
def workflowId = request.workflowInstanceId;
// UserTaskのdefinitionKeyを生成(ワークフロー定義名 + ユーザータスク定義名 + ワークフローID)
def definitionKey = "practice/PracticeWorkflow003-" + "userTask3-" + workflowId;
// UserTaskを取得
Query taskQuery = new Query()
.selectAll("mtp.workflow.UserTask", false, false)
.from("mtp.workflow.UserTask").where(new Equals("definitionKey", definitionKey));
UserTask userTask = (UserTask) em.searchEntity(taskQuery).getFirst();
String userTaskOid = userTask.getOid();
// UserTask.oidからAssignmentを取得
Query assignmentQuery = new Query()
.selectAll("mtp.workflow.Assignment", false, false)
.from("mtp.workflow.Assignment")
.where(new Equals("task.oid", userTaskOid));
SearchResult<Assignment> assignment = em.searchEntity(assignmentQuery);
for (Assignment e : assignment) {
String assignState = e.getAssignState().getValue();
System.out.println("assignState : " + assignState);
// Assignmentのうちタスクが処理されていないものはすべて完了に更新する
if ("ASSIGNED".equals(assignState)) {
UpdateOption option = new UpdateOption();
option.setUpdateProperties("assignState", "taskResult", "comment");
e.setAssignState(new SelectValue("COMPLETED"));
e.setComment("自動承認");
e.setTaskResult("ok");
em.update(e, option);
}
}
-
practice/PracticeWorkflowCommand003_002(承認者リスト作成処理)
「承認」したユーザー(自動承認含む)のみを取得し、CSVファイルを作成します。 また、作成したファイルを議事録ワークフロー用エンティティに登録する処理です。
import org.iplass.mtp.entity.query.Query;
import org.iplass.mtp.entity.query.condition.predicate.Equals;
import org.iplass.mtp.entity.BinaryReference;
import org.iplass.mtp.entity.EntityManager;
import org.iplass.mtp.entity.SearchResult;
import org.iplass.mtp.entity.UpdateOption;
import org.iplass.mtp.workflow.Assignment;
import org.iplass.mtp.workflow.UserTask;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;
System.out.println("### PracticeWorkflowCommand003_002");
// コンテキストからwokrflowのoidを取得
def workflowId = request.workflowInstanceId;
System.out.println("### workflowId : " + workflowId);
// UserTaskのdefinitionKeyを生成(ワークフロー定義名 + ユーザータスク定義名 + ワークフローID)
def definitionKey = "practice/PracticeWorkflow003-" + "userTask3-" + workflowId;
// UserTaskを取得
Query taskQuery = new Query()
.selectAll("mtp.workflow.UserTask", false, false)
.from("mtp.workflow.UserTask")
.where(new Equals("definitionKey", definitionKey));
UserTask userTask = (UserTask) em.searchEntity(taskQuery).getFirst();
String userTaskOid = userTask.getOid();
// UserTask.oidからAssignmentを取得
Query AssignmentQuery = new Query()
.selectAll("mtp.workflow.Assignment", false, true)
.from("mtp.workflow.Assignment")
.where(new Equals("task.oid", userTaskOid));
SearchResult<Assignment> assignment = em.searchEntity(AssignmentQuery);
// 承認者リスト作成
def authorizerList = "";
for (Assignment e : assignment) {
if ("ok".equals(e.taskResult)) {
authorizerList = authorizerList + e.user.name + "\r\n";
}
}
// BinaryReferenceを利用するためのInputStreamを承認者情報のStringから作成
InputStream is = new ByteArrayInputStream(authorizerList.getBytes());
// BinaryReferenceの作成
BinaryReference br = em.createBinaryReference("承認者リスト.csv", "text/csv", is);
// Streamをclose
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
// Entityの操作
def entity = request.getAttribute("variableItem1");
entity.setValue("authorizerList", br);
// 更新
UpdateOption option = new UpdateOption();
option.setUpdateProperties("authorizerList");
em.update(entity, option);
-
practice/PracticeWorkflowCommand003_003(凍結処理)
登録した議事録、回覧先ユーザー、承認者リストを更新できないようにロックする処理です。
import org.iplass.mtp.entity.query.Query;
import org.iplass.mtp.entity.query.condition.predicate.Equals;
import org.iplass.mtp.entity.EntityManager;
import org.iplass.mtp.entity.UpdateOption;
System.out.println("### PracticeWorkflowCommand003_003");
// コンテキストからworkflowのoidを取得
def workflowId = request.workflowInstanceId;
// workflowIdからWorkflowTargetを取得
Query workflowTargetQuery = new Query()
.select("targetEntityOid")
.from("mtp.workflow.WorkflowTarget")
.where(new Equals("workflow.oid", workflowId));
def workflowTarget = em.searchEntity(workflowTargetQuery).getFirst();
// 凍結対象エンティティ
def entity = em.lockByUser(workflowTarget.targetEntityOid, "practice.PracticeWorkflowEntity003");
Workflowの設定
下記の通りWorkflowのMetaDataを作成します。
項目名 | 設定値 |
---|---|
name |
practice/PracticeWorkflow003 |
displayName |
PracticeWorkflow003 |
description |
議事録承認 |
作成したワークフローを表示し、下図のワークフローを作成してください。 具体的な操作は操作方法を参考にして下さい。
各Itemの設定をしていきます。記載のない項目名については設定不要です。
-
UserTask1
項目名 設定値 assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ANYONE
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名 設定値 name
post
displayName
議事録提出
-
-
MailTask1
項目名 設定値 mailTemplateName
practice/PracticeWorkflow003_001
to
項目名 設定値 定義形式
STRING
to取得ロジック
任意のアドレス
-
UserTask2
項目名 設定値 assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
ANYONE
定義形式
STRING
ID取得ロジック
authorizer@workflow
-
taskResultStatus
項目名 設定値 name
memberset
displayName
回覧先セット
項目名 設定値 name
ngminutes
displayName
議事録差し戻し
-
-
MailTask2
項目名 設定値 mailTemplateName
practice/PracticeWorkflow003_002
to
項目名 設定値 定義形式
STRING
to取得ロジック
任意のアドレス
-
IntermediateTimerEvent1
項目名 設定値 timer
項目名 設定値 Timer Type
Delay
Timer Unit
Minuites
Delay Expression
"3"
-
CommandTask1
項目名 設定値 commandConfig
practice/PracticeWorkflowCommand003_001
-
UserTask3
項目名 設定値 assignRule
assignRule参照
taskResultStatus
taskResultStatus参照
-
assignRule
項目名 設定値 タイプ
ById
適用フロー名
*
割当種別
ALL
完了条件
VOTE
定義形式
SCRIPT
ID取得ロジック
下記コード参照
対象EntityのmembersにセットされたアカウントIDを取得しています。
import org.iplass.mtp.entity.query.Query; import org.iplass.mtp.entity.query.condition.predicate.Equals; import org.iplass.mtp.entity.EntityManager; Query membersQuery = new Query() .select("members.accountId") .from("practice.PracticeWorkflowEntity003") .where(new Equals("oid", variableItem1.oid)); def em = manager(EntityManager.class); def members = em.searchEntity(membersQuery).getList(); def result = []; int cnt = 0; for (def e : members) { System.out.println(e.members.accountId); result[cnt] = e.members.accountId; cnt ++; } return result;
-
taskResultStatus
項目名 設定値 name
ok
displayName
承認
項目名 設定値 name
ng
displayName
否認
-
-
MailTask3
項目名 設定値 mailTemplateName
practice/PracticeWorkflow003_003
to
項目名 設定値 定義形式
STRING
to取得ロジック
任意のアドレス
-
MailTask4
項目名 設定値 mailTemplateName
practice/PracticeWorkflow003_004
to
項目名 設定値 定義形式
STRING
to取得ロジック
任意のアドレス
-
CommandTask2
項目名 設定値 commandConfig
practice/PracticeWorkflowCommand003_002
-
CommandTask3
項目名 設定値 commandConfig
practice/PracticeWorkflowCommand003_003
-
MailTask5
項目名 設定値 mailTemplateName
practice/PracticeWorkflow003_005
to
項目名 設定値 定義形式
STRING
to取得ロジック
任意のアドレス
-
SequenceFlow(UserTask2 → UserTask1)
議事録差し戻しの場合のフローになります。
項目名 設定値 nodeResultStatus
ngminutes
-
SequenceFlow(UserTask2 → SP)
回覧先セット(承認ルート)の場合のフローになります。
項目名 設定値 nodeResultStatus
memberset
-
SequenceFlow(UserTask3 → MailTask4 → UserTask2)
否認の場合のフローになります。
項目名 設定値 nodeResultStatus
ng
-
SequenceFlow(UserTask3 → MailTask3)
項目名 設定値 nodeResultStatus
ok
以上でWorkflowの設定は完了です。
Save
ボタンをクリックして保存してください。
ここからは今までの操作で作成したWorkflowを実施に利用するための準備となります。
-
DetailFormViewの設定
事前準備で作成した「practice.PracticeWorkflowEntity003」の「DetailLayout」を開き、 単純な承認と同様に標準ロードを実施後、以下を設定してください。項目名 設定値 ワークフロー定義名
practice/PracticeWorkflow003
ワークフロー変数名
variableItem1
ボタン表示名
議事録ワークフロー起動
プロセス実行中のメッセージ
議事録ワークフロー実行中です。
-
SearchLayoutの設定
「practice.PracticeWorkflowEntity003」の「SearchLayout」を開き、標準ロードを実施後に保存してください。
ここまででWorkflow利用準備が完了しました。 次項からはWorkflowを利用してみましょう。
Workflowの利用
管理者アカウントでログインし単純な承認と同様にEntityに任意のデータを作成後、ワークフローを起動してください。
オブジェクト情報は後述の手順で追加するため、ここでは未設定の状態にしておきます。
単純な承認と同様にワークフローを確認してください。
ユーザーID: authorizer@workflow でログインし、
トップ画面のタスク一覧にあるuserTask1の「編集」リンクをクリックします。
表示された「タスク処理」の編集画面にある「タスク対象データ」内のリンクをクリックするとEntity詳細画面がダイアログ表示されるので、 編集
ボタンをクリックします。
表示された編集画面で、議事録に任意のファイル(docx、xlsx、txtなど)を登録して保存してください。
その後、「タスク処理」の編集画面で任意のコメントを入力し、 議事録提出
ボタンをクリックしてフローを進めてください。
議事録提出
ボタンをクリックした時点でメール通知がされます。
回覧先を登録し、回覧先セットを実施します。
ユーザーID: authorizer@workflowでログインし、
トップ画面のタスク一覧にあるuserTask2の「編集」リンクをクリックします。
議事録の登録時と同様に、Entityデータの編集画面にて以下の回覧先を選択して保存します。
-
user001@workflow
-
user002@workflow
-
user003@workflow
ここでセットしたユーザーが承認/否認実施者となります。
その後、userTask2の編集画面で任意のコメントを入力し、 回覧先セット
ボタンをクリックしてフローを進めてください。
回覧先セット
ボタンをクリックした時点でメール通知がされます。
セットしたユーザーで承認するか、タイマーで設定した時間待機します。 承認判定が完了した時点でメール通知がされます。
ワークフローが完了したら、承認者リストが登録され、ロックされていることを確認します。
以上が議事録承認Workflowとなります。
5. 次のステップ
ワークフローについて、このチュートリアルで触れた内容が知りたい場合は、Developer GuideのWorkflowを参照してください。
その他の機能の詳細を理解したい場合は、 Developer Guide を参照し、いろいろと定義を変更してみてください。