[ODC]Workflow関連の(System)Entityを確認してみる

Workflowの基本的な情報・作り方については以下の記事を参照。

https://qiita.com/jyunji_watanabe/items/45d2c822314b684ead77

ここでは、Workflowの登場とともに(System)に追加された5つのEntityがどんなものか、ドキュメントとER図から読み取った情報を元に、実際のレコードを見ることで確認していく。

# ドキュメント
[System entities - ODC Documentation](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/building_apps/about_business_processes/system_entities/)

2024/08/09時点では日本語訳無し。中身もだいぶ薄いので適当な訳で引用。
- ActivityDefinition: Workflow editorで定義した各Activityの定義
- ProcessDefinition: Workflow editorで定義した各Processの定義（ここでのProcessはたぶんWorkflowの意味）
- ActivityInstance: Process実行時の各Activityに対応するレコードを保持する
- HumanActivityInstance: Process実行時の各Human Activityに対応するレコードを保持する
- ProcessInstance: Process実行時のインスタンス

# ER図
(System)下にある5つのWorkflow関係EntityからER図を作ると以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/38457bd4-9464-3214-7c4a-843abe9f7cb8.png)

この関係と名前から、以下のことが言える
- 定義（Definition）と実体（Instance）に分かれる
- 定義・実体それぞれに、ProcessとActivityがある
- ActivityInstanceにだけ、追加属性を管理するためにHumanActivityInstanceという拡張Entityがある（Human Activityにはアサイン先ユーザー・表示するメッセージ・作業用ScreenのURLという特殊な属性があるから）

# 用語の整理
- Process: Workflowのこと
- Activity: Workflow内の1Stepのこと
- Human Activity: Activityの内、人に作業を割り当てるもの
- Instance: WorkflowやActivityを実体化したもの
- Revision: WorkflowをPublishすると増えていく履歴

# 参考Workflow
参照URLで動作確認用に作った以下のWorkflowを使って、どのようなレコードが各Entityに登録されるかを見ていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/33b4a4dc-e239-14a0-ab3f-70cf26840ad4.png)

# ProcessDefinition
以下の通り(他の人のWorkflowが映らないようにNameでフィルタしてある)。恐らく、同じWorkflowでも、有効なInstanceがあるRevision分だけレコードがありそう
- Key: GUID、Workflow EditorでWorkflowを開いたときに、クエリストリングidに設定されるのと同じ値であるようだ
- Name: Workflow自体につけた名前
- Revision: インスタンスのRevision（WorkflowのどのRevisionに対するレコードなのか）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/39f966e3-8ec3-5478-8764-bfa1ec0f9272.png)

# ProcessInstance
以下のスクリーンショットで確認できるように、Workflowの各実行（インスタンス）がレコードになっている。時間がずれているように見えるが、これはODC Portalが動作確認に使ったクライアントのタイムゾーン（JST）なのに対して、View DataはUTCであるため（数字上9時間の差があるが、同じ時間）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0ac50b95-e063-09a3-e1f4-7f9dc703aaff.png)

## Static Entity ProcessStatus
Status属性は、ProcessStatusというStatic Entityで定義されている。上から順に1-4のId。上のスクリーンショット中ではDone (=3) とActive (=1) が使われている。Doneが文字通り一通り処理を終えた状態、Activeは今まさに処理中のインスタンスを示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2f730cb7-6b6e-fce0-6689-d8985f67f509.png)

# ActivityDefinition
Workflow中の、Start・Endを含む各ステップの種類をKind属性で持っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6936d35f-a379-0327-17cb-d80eec6a2b2f.png)

Name属性が、どこからくるかを確認するため、Human ActivityのNameを変更　→　Publish　→　WorkflowのInstanceを発生させ、Human Activityで止めて再度レコードを確認してみた。

- どうもInstanceでの利用実績があるActivityしかレコードができないようだ
- Name属性は、Workflow Editorでつけた名前が入る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/cf158e50-5e55-bfd7-6ee2-ca0f8692a826.png)

Workflow Editorでつけた名前は↓の赤枠の部分を示す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f54ac10e-f324-7e65-bb6c-895533cd82f6.png)

## Static Entity ActivityKind
何を示しているかは、Record定義から明白。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1bc0a68b-788d-d2be-77d6-594d6b2256b0.png)

# ActivityInstance
ジョインが必要なのでAggregateを作って、画面に表示したところ。
Instance Id (一番左の列）が40のインスタンスはStart直後のHuman Activityで止まっている。止まっているときはWaitingになるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a6c88565-3464-9405-862e-0574f2eea373.png)

## Static Entity ActivityStatus

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6a3b57be-25ab-270c-a0b0-43e9c6f75ae6.png)
恐らく各レコードの意味は、O11のときのBPTを考慮すると以下。該当Activityが
- Id: 1 (Waiting。Human Activityが人に割り当てられている？）
- Id: 2 (Running。Automatic Activity実行中？）
- Id: 3 (Complete。正常終了した）
- Id: 4 (Terminated。強制終了？）
- Id: 5 (Error。異常終了した）
- Id: 6 (Open。O11のBPTなら、ActivityOpenがあったが、ODCにはまだ無さそうなので現段階では不明）

# HumanActivityInstance
基本情報は参照URLに記載。

使い方は、恐らく
## 自分に割り当てられたHuman Activityを確認
- HumanActivityInstanceをActivityInstanceとジョインする
- HumanActivityInstance.AssignedUserId = GetUserId()
- ActivityInstance.Status = ActivityStatus.Waiting

## 未割り当てのHuman Activityを確認
- HumanActivityInstanceをActivityInstanceとジョインする
- HumanActivityInstance.AssignedUserId = NullTextIdentifier()
- ActivityInstance.Status = ActivityStatus.Waiting