このチュートリアルは、 Bonita BPM 7.5.0 以上のパージョンに適用できます。
はじめに
このチュートリアルでは、ビジネス オブジェクト内の複数の参照を作成したり、更新したり、削除する方法について説明します。このチュートリアルは、Bonita BPM Community エディションを使って、すべてのエディションで利用できる機能を体験できます。このサンプルでは、ビジネス オブジェクトとして経費レポートの例を使用します。
このチュートリアルでは、UI デザイナーは使用しません。
複数の参照を持つビジネス オブジェクトを更新するタスクのコントラクトとそれに関連するデータ操作を設計します。
ビジネス オブジェクト モデルを作成する
以下のような 「Expense (経費)」ビジネス オブジェクトを作成します。
次に、コンポジションの関連によって複数の Expense を参照する 「ExpenseReport (経費レポート)」ビジネス オブジェクトを作成します。
経費レポートプロセスを設計する
- 新しいプロセスを作成します。
- ExpenseReport 型を持つ新しい 「report」ビジネス変数を追加し、次の Groovy スクリプトで初期化します。
import java.time.LocalDate;
def aDummyExpense = expenseDAO.newInstance();
aDummyExpense.amount = 5
aDummyExpense.nature = "ダミーの経費"
aDummyExpense.expenseDate = LocalDate.now()
def anotherDummyExpense = expenseDAO.newInstance();
anotherDummyExpense.amount = 55
anotherDummyExpense.nature = "別のダミーの経費"
anotherDummyExpense.expenseDate = LocalDate.now()
def report = expenseReportDAO.newInstance()
report.expenses << aDummyExpense
report.expenses << anotherDummyExpense
return report
- タスク名「タスク1」を「経費レポートを更新する」に変更します。
経費レポートを更新するタスクのコントラクトを設計する
- 「経費レポートを更新する」タスクを選択します。
- 実行 > コントラクトのプロパティタブに移動します。
- 以下のようにコントラクトを作成します(「データから追加…」のボタンは使用せず、「追加」と「子を追加」のボタンを使って手動で定義します)。
newExpenses の入力は、レポートに追加する新しい expense のリストを収集するために使用されます。 expensesToDelete の入力は、削除する expense id のリスト収集するために使用されます。expensesToUpdate の入力は、レポートで更新する既存の expense のリストを収集するために使用されます。
persistenceId に対しは、全体が java.lang.Long の範囲をサポートするため、数値型の代わりに TEXT 型の入力を使用します。JSON の数値型の範囲は java.lang.Long.MAX_VALUE に適用されません。Long 型への変換は、Groovy スクリプトで行います。
ビジネスデータを更新するデータ操作を追加する
- 実行 > データ操作のプロパティタブに移動します。
- データ操作を追加します。
- 左側のオペランドとしてビジネス変数「report 」を使用します。
- 演算子を変更し、「Javaメソッドを使用」を選択し、setExpenses のメソッドを選択します。
- 右のオペランドには、report に新しい expense を追加するために、次のスクリプトを使用します(スクリプトの名前は、addNewExpenses にしましょう):
def result = []
result.addAll(report.getExpenses())
newExpenses.each{
def exp = expenseDAO.newInstance()
exp.amount = it.amount
exp.nature = it.nature
exp.expenseDate = it.expenseDate
result << exp
}
return result
- 別のデータ操作を追加します。
- 左側のオペランドとしてビジネス変数「report 」を使用します。
- 演算子を変更し、「Javaメソッドを使用」を選択し、setExpenses のメソッドを選択します。
- 右のオペランドには、report から expense を削除するために、次のスクリプトを使用します(スクリプトの名前は、deleteExpenses にしましょう):
def result = []
result.addAll(report.getExpenses())
result.removeAll(result.findAll{expensesToDelete.contains(it.persistenceId.toString())})
return result
- 別のデータ操作を追加します。
- 左側のオペランドとしてビジネス変数「report 」を使用します。
- 演算子を変更し、「Javaメソッドを使用」を選択し、setExpenses のメソッドを選択します。
- 右のオペランドには、report 内の既存 expense を更新するために、次のスクリプトを使用します(スクリプトの名前は、updateExpenses にしましょう):
import com.company.model.Expense;
def updatedExpenses = []
updatedExpenses.addAll(report.getExpenses())
expensesToUpdate.each{ exp ->
def Expense expenseToUpdate = updatedExpenses.find{
it.persistenceId == exp.persistenceId.toLong()
}
if(expenseToUpdate){
expenseToUpdate.amount = exp.amount
expenseToUpdate.expenseDate = exp.expenseDate
expenseToUpdate.nature = exp.nature
}else{
throw new Exception("$exp.persistenceId を持つ Expense が存在しません。")
}
}
return updatedExpenses
更新のための3つのデータ操作を設定後は、次のようになります。
プロセスを実行する
これで、プロセスを実行し、自動生成されたフォームを使用して期待されるふるまいを検証することができます。
- Studio の「実行」をクリックしてプロセスを起動します。
- プロセスが起動されると下図のフォームが表示されます。このフォームはプールレベルで入力コントラクトを設定していないため、入力フォームが空の状態です。「開始」ボタンがクリックされると先に設定した「report」ビジネス変数の初期化のGroovy スクリプトが実行されます。
- 「開始」ボタンをクリックした直後に、Web ブラウザで、次の Rest API を呼び出すことで 初期化された report のデータ内容をダイレクトに確認することができます: http://localhost:8080/bonita/API/bdm/businessData/com.company.model.ExpenseReport/1/expenses
report のビジネス変数の初期化された結果は、次のように表示されます。
[
{
"persistenceId":1,
"persistenceId_string":"1",
"persistenceVersion":0,
"persistenceVersion_string":"0",
"amount":5.0,
"amount_string":"5.0",
"nature":"ダミーの経費",
"expenseDate":"2017-06-28"
},
{
"persistenceId":2,
"persistenceId_string":"2",
"persistenceVersion":0,
"persistenceVersion_string":"0",
"amount":55.0,
"amount_string":"55.0",
"nature":"別のダミーの経費",
"expenseDate":"2017-06-28"
}
]
- 自動生成された「経費レポートを更新する」タスクフォームに以下のように削除・更新データを入力して「実行」ボタンをクリックします。
- Web ブラウザで、次の Rest API を呼び出すことで report の内容をダイレクトに確認できます: http://localhost:8080/bonita/API/bdm/businessData/com.company.model.ExpenseReport/1/expenses
次のような結果が表示されます:
[
{
"persistenceId":1,
"persistenceId_string":"1",
"persistenceVersion":1,
"persistenceVersion_string":"1",
"amount":7.0,
"amount_string":"7.0",
"nature":"更新された経費",
"expenseDate":"2017-07-01"
},
{
"persistenceId":3,
"persistenceId_string":"3",
"persistenceVersion":0,
"persistenceVersion_string":"0",
"amount":10.0,
"amount_string":"10.0",
"nature":"新しい経費",
"expenseDate":"2017-06-30"
}
]
最後に注意事項として、データ操作のGroovy スクリプトでビジネス オブジェクトのコレクションを変更する場合は、コレクションはビジネス オブジェクトに準拠していない Hibernate 固有の実装を戻すため、アクセサ(つまり、 report.getExpenses() のこと) によって返される値の型は java.util.List にする必要があります。既存オブジェクトにアクセス(案件の更新または削除)する必要がある場合は、コントラクト内にその対象案件を示す persistence id (または他のユニークなオブジェクト属性)を設定することを忘れてはいけません。