[ODC]WorkflowがGAになったので触ってみる

2024年7月末にGAされたWorkflow機能を触ってみる。

# 環境情報
ODC Studio(Version 1.4.17)

# リソース
オンラインのトレーニング：[Building Workflows in ODC](https://learn.outsystems.com/training/journeys/building-workflows-in-odc-2690)
ドキュメント：[About business processes - ODC Documentation](https://success.outsystems.com/documentation/outsystems_developer_cloud/building_apps/about_business_processes/)

# 機能の概要
要するに、OutSystems 11のBPTに相当する機能。
いわゆるワークフローのように、人手を介するものを含む一連のタスクを、Appから独立した要素として作成する。


つまり、ODCで作成できるモジュール相当の要素が、App, Library, Workflowの3つになったといえる。

BPTとは違い、IDE（ODC Studio）とは独立した、Webベースのエディタで作成。
Eventを起点に開始し、2024/07時点では以下の要素を使える
- Automatic Activity: 小さなロジック（Service Action）を実行
- Human Activity: 人にタスクを割り当てる（基本的にはScreenを紐づける）
- Desicion: 条件分岐
- Go to a previous step: (Desicionより後でないと使えない）その場所より前のステップに制御を戻す

## AO
Workflowは起点がEventなのでそこで1AO。
Human ActivityのClose OnはEventで必須なので、基本的には1AO。また、通常はScreenを割り当てるので、そこでも1AO。

Workflowは最大で、「1 + Human Activity数　× 2」 AOを使う。
　（Eventは複数箇所で共有したり、ScreenはそもそもApp側の要件で必要となるものを流用することが多いので、実際には少なくなるはず）

# Workflowのサンプル
以下のチュートリアル終了後のサンプル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e8469e1c-bbd1-1848-157f-48db6c0a8ff9.png)

# チュートリアル
簡単なWorkflowを作って操作方法を確認しておく。
## シナリオ
「新規App/Libraryの払い出し依頼」（開発チームのOrganization roleにCreateの権限がついていない場合）
1. 開発チームの代表者が、払い出し依頼画面から作成依頼
1. 払い出し担当者にHuman Activityを割り当て。払い出し画面で内容を確認し、ODC PortalでApp/Libraryを作成。作業内容を画面に登録
1. Decisionで、メールでの連絡を希望しているかどうかを判定
1. （メール連絡希望有りの場合）Automatic Activityが起動し、申請者にメール送信

## App側で事前作業
### Eventを作成
ODC StudioでEventsタブ > Eventsの下に作成する。
以下の2つのEventを作成した
- AppCreateRequestEvent: 払い出し依頼があったことを示す、Workflowの起点
- AppCreatedEvent: 払い出し依頼を受けて、App/Libraryの作成が完了したことを担当者が登録したことを示す、HumanActivityが終了する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5e03c7a5-3b18-2295-f16c-2b939f92d088.png)

### Entityを作成
Workflowで作成・更新していくデータの入れ物として作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/181a96ac-ea3c-139c-c21a-d9c87bda90d5.png)
払い出し依頼時にRequestedAt/HandledAt以外の全項目を依頼者が入力 (このときRequestedAtは現在日時を自動設定）。
App/Library作成を担当者が登録するときに、HandledAtに自動で現在日時を設定。

### Screenを作成
以下の3つの画面を作成
1. 払い出し依頼画面
2. 払い出し依頼メンテナンス画面（Human Activityに紐づけられる画面。Public=Yesにする必要がある）
3. 自分に割り当てられたHuman Activity一覧画面

3について。(System)にある、HumanActivityInstance EntityのAssignedUserId属性をGetUserId()でフィルタすると、自分に割り当てられたHuman Activity一覧を得られる。

このとき、URLにはクエリストリングまで含めた遷移先画面へのパスが入っているので、この属性をLinkの遷移先に使えば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/47416521-ee4b-0688-70a2-c5dcd693b905.png)

## Editorを起動する
ODC Portalにアクセスし、左上にあるWorkflowsメニューを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/01112c9b-2ddc-5631-1eb4-a915d65aa7e3.png)

右上の「Create workflow」ボタンで新しいWorkflowを作成する（以下は入力例。App等と入力する内容はほぼ同じ）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7989d2c0-4083-c416-5d0b-bcb1dbacd5b8.png)

## Workflowを起動するEventを指定
Startを選択し、画面右のプロパティで、
- 左のドロップダウンリストでEventを作成したAppを選択
- App内でEvent（このEvent発生時にWorkflowが起動する）を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d2fd8eff-3df0-98c1-9b42-cc54bbbc57d8.png)

ここでは、App/Library作成依頼が発生したことを示すAppCreateRequestEventを選択した。

## Human Activityを配置
StartとEndをつなぐ線上の「＋」アイコンをクリックすると、その位置に追加できる要素がリストアップされる。Human activityのオプションを選択すると追加できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/65cd5ac7-bf10-b07f-e00a-f0aa8d3917b3.png)

Human Activityは、エンドユーザーの操作が必要であることを示す要素。普通はScreenに紐づけられる。
以下は設定例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/bfb3112b-b899-a61e-9ebf-c8cb77df0a39.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3c2dcfe4-e1e2-a124-439c-df20c3dd26e9.png)

Close onは必須。 Conditionをつけないと、Eventを見ている全てのHuman Activityが終了する。

## Desicionを配置
Desicionは、Action FlowのSwitchと役割は同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1b3c8544-2ae1-42cf-08a0-8671c6fe6b17.png)

## Automatic Activityを配置
自動実行されるロジックを示す要素。Service Actionに紐づける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a05b6f95-732d-1883-95a9-3ce0c7792c99.png)
このとき、Input Parameterは基本データ型のみで、Identifier型は不可である点に注意（そのため、ここではWorkflowが受け取ったId型をIdentifierToLongIntegerでLong Integer型にキャストしている）。

## 動作確認
依頼者が以下のように入力して、依頼ボタンをクリック（背後でEntityのレコードを作成し、そのIdを引数に、Trigger EventでAppCreateRequestEventを発生させる）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/cf1ec191-b56f-e3ae-675c-1b21e3cc9dc3.png)

このとき、Workflowが自動で発生し、Human Activityに到達する。
ODC Portal > Workflows > 該当のWorkflowを開き、Instancesタブを見ると、このWorkflowの現在実行中のInstanceを見られる。以下はその1つを開いたところ。視覚的にどこまでWorkflowが進んでいるのかを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/bfd21af5-fc69-d000-9f1b-361a5c859fbe.png)

割当ユーザーでAppにログインし、事前準備で作っておいた自分に割り当てられたHuman Activity一覧画面へ。このリンクをクリックすると紐づけられた画面が開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e36d4683-d013-f4f3-0df5-98170b49210e.png)

リンクにはWorkflowから渡されたIdが含まれている。Idを使って検索し、Entityのレコードが表示される。要望に従ってApp/Libraryを作成したら「完了登録」ボタンをクリック。このとき背後で、Trigger Eventを動かし、AppCreatedEventを対象レコードのIdとメール送信を希望するか否かの属性をInput Parameterとして渡す。
確認は省略するが、前者によって、このインスタンスのHuman Activityを終了させ、続くDesicionは後者のパラメータによって分岐する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2f31618d-f34f-1c10-14eb-d765d39766b3.png)

Endまで到達し、終了したインスタンスの様子。通過した要素のみを順番に表示するようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b1cc817d-7f1f-9881-711f-7210b0dc4843.png)