Oracle APEX　ワークフローを使ってみる　Vol.3: ヒューマンタスク作成編

# はじめに
この記事では、Oracle Live Labsのワークショップ[「Simplify Business Process Management Using APEX Workflows」](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=3880)をもとに、Oracle APEXで
APEXアプリケーション「Doctor Appointments Made Easy！」を作成し、ワークフローの機能を使って医師の診察を予約・管理するシステムを実装してみます。

[こちらの記事](https://qiita.com/bambooseven/items/fcfa4db91cd087029a3a)で、Oracle APEXを使用して医師の予約ワークフローを作成するプロセスを作成しました。

Oracle APEXの承認コンポーネントを使用してヒューマンタスクを作成するプロセスについて説明します。ヒューマンタスクは、医師予約ワークフローに必要なステップであり、医師または患者が手動で承認、拒否、または完了する必要があります。具体的なステップとして、医師への予約要求の送信、患者の請求書要求の発行、患者のフィードバック要求の発行などのタスクがあります。

上記の手順は、ヒューマンタスクアクティビティに対応しています。ワークフローで使用する前に、承認コンポーネントを使用してタスク定義を作成します。

### 本記事で行うこと
ヒューマンタスクを作成して以下を行います。

* 医師に予約リクエストを送信する
* 患者の請求書要求の発行
* 患者へのフィードバック要求の提起


# ワークフローを作成
APEXアプリケーション「Doctor Appointments Made Easy！」を設計することで、医師の診察を予約・管理する効率的なシステムを実装します。実現のために、以下のアプローチに従っていきます。
* ビジネスロジックを、管理可能で実行可能なステップに分解
* これらのステップの実行を制御するシーケンスと条件を特定
* このビジネスプロセスに関与する組織内の主要な人物を特定

まず、診療予約のビジネスプロセスをステップに分解し、各ステップに関連する登場人物を特定します。以下に概要を示します：


### ワークフローへのヒューマンタスクの追加
*  予定申請のタスク定義の作成
1. ページ・デザイナから、「共有コンポーネント」に移ります。

    ![APEXワークフロー_4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/f420dd38-1ec3-536e-015e-2327f717afe8.png)

1. 「ワークフローと自動化」から、「タスク定義」を選択します。
    ![APEXワークフロー_4-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/cb8bcbd3-4675-ee4c-2a00-fd149915c3cb.png)

1. 画面右上の「作成」をクリックします。
1. タスク定義の作成の欄で、次のように入力し、「作成」をクリックします。

    名前: Appointment Request (予約申請)
    件名: Appointment for &PATIENT_NAME. on &APPOINTMENT_DATE. 
    優先度:3-中
    ![APEXワークフロー_4-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/b757bd24-e246-b107-2112-a11a38493650.png)

1. 「タスク定義」のページで、「タスクの詳細ページの番号」が空になっていることを確認します。「タスクの詳細ページの作成」ボタンをクリックして、このタスクの詳細ページを生成します。

    次に使用可能なページ番号を使用するかどうかを確認するポップアップダイアログが表示されるので、[OK] をクリックします。

    ![APEXワークフロー_4-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/e1fa8ef5-a34d-df76-9507-d8d8f1713d29.png)

1. 「タスク詳細ページ番号」が、生成された「詳細」ページへのリンクを含む「タスク詳細ページ」のURLに置き換えられます。画面左上の[変更の適用] をクリックします。

    「タスク定義」ページで、「Appointment Request」をクリックします。

1. Appointment Requestの[タスク定義] ページの設定で、以下のように入力します。

    アクション・ソース: SQL問合わせ
    アクションSQL問合せ:以下のSQLをコピーして貼り付けます。
    ```
    select * from doctor where dno = :APEX$TASK_PK
    ```
    >APEX$TASK_PKは、記録システムの主キー値(この場合は医師の従業員番号)を保持する置換文字列です。
    
    ![APEXワークフロー_4-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/07ceff62-55be-cf4d-b777-03d306d74403.png)
    このステップでは、タスクを記録システム(この場合は医師の記録)に結び付けます。
1. タスク定義の[参加者] セクションに移動し、[行の追加] をクリックし、次を入力します。

    参加者種別: 潜在的所有者
    値タイプ: 式
    値: :DNAME (DNAMEはDOCTOR表のDNAME列を参照します)。

    ![APEXワークフロー_4-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/f1f0fd73-f85a-426f-65ce-d01b9bd4d989.png)

1. [パラメータ] で、[行の追加] をクリックして以下を追加し、[変更の適用] をクリックしてタスク定義を保存します。

    ![APEXワークフロー_4-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/aa32ce04-cbbe-07e8-546a-ad852884b831.png)

    
    静的ID|ラベル
    ---|---
    APPOINTMENT_DATE|Appointment Date
     PATIENT_DESC|	Consultation Form
    PATIENT_NAME|	Patient name

* 請求書要求のタスク定義の作成

1. 「共有コンポーネント」に移動します。「ワークフローと自動化」で、「タスク定義」を選択し、「作成」をクリックします。

1. タスク定義の作成ウィザードで次のように入力し、「作成」をクリックします。

    名前: Feedback Request
    タイプ: アクションタスク
    件名: Invoice for &PATIENT_USERNAME. for consultation on &SCHEDULE.
    優先度:3-中
    ![APEXワークフロー_4-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/35fc66b2-5d4b-e41a-e2c8-a8c2797260aa.png)

1. 「タスク定義の編集」ページで、「タスク詳細ページ番号」が空になっていることを確認します。「タスク詳細ページの作成」をクリックして、このタスクの詳細ページを生成します。使用可能なページ番号を使用するかどうかを尋ねるポップアップダイアログが表示されますので、[OK] をクリックします。

1. 「タスク詳細ページ番号」が、生成された「詳細」ページへのリンクを含む「タスク詳細ページ」のURLに置き換えられていることがわかります。[変更の適用] をクリックします。

1. 「タスク定義」ページで、「Invoice Request」をクリックして、タスク定義を編集モードで開きます。以下を設定します。

    [設定]で、次のように指定します。
    アクション・ソース: SQL問合せ
    アクションSQL問合せ: 次の SQL文を指定します。
    ```
    select * from appointment where BOOKING_ID = :APEX$TASK_PK
    ```
    
    ![APEXワークフロー_4-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/1b45dc05-f0bd-081f-ac19-0c572de2c1f1.png)

    ※注: APEX$TASK_PKは、レコード・システムの主キー値(この場合は医師の従業員番号)を保持する置換文字列です。

1. 「Invoice Request」のタスク定義から、「参加者」セクションに移動し、次のように行を編集します。

    参加者タイプ: 潜在的所有者
    値タイプ: 静的
    値: &PATIENT_USERNAME.

    ![APEXワークフロー_4-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/a0725313-3542-60a0-f242-b75655a85853.png)

1. 「パラメータ」タブに移動します。[行の追加] をクリックして以下を追加し、[変更の適用] をクリックしてタスク定義を保存します。

     静的ID|ラベル
    ---|---
    DOCTOR_NAME|Doctor Name
     FEES|	Fees
    PATIENT_NAME|Patient Name
    

* Feedback Requestのタスク定義の作成

1. 「共有コンポーネント」に移動します。「ワークフローと自動化」で、「タスク定義」を選択します。次に、「作成」をクリックします。

1. タスク定義の作成ウィザードで、次の詳細を入力し、「作成」をクリックします。

    名前: Feedback Request
    種別: アクション・タスク
    件名:Feedback for Consultation on &SCHEDULE.
    優先度:3-中
    

1. 「タスク定義の編集」ページで、「タスク詳細ページ番号」が空になっていることを確認します。「タスク詳細ページの作成」をクリックして、このタスクの詳細ページを生成します。次に使用可能なページ番号を使用するかどうかを尋ねるポップアップダイアログが表示されます。[OK] をクリックします。

1. 「タスク詳細ページ番号」が、生成された「詳細」ページへのリンクを含む「タスク詳細ページ」のURLに置き換えられていることがわかります。[Apply Changes] をクリックします。

1. 「タスク定義」ページで、「フィードバック・リクエスト」をクリックして、タスク定義を編集モードで開きます。以下を設定します。

1. [設定]で、次の操作を行います。
    アクション・ソース: SQL問合せ
    アクション SQL問合せ: 次のSQL文を指定します。
    ```
    select * from appointment where BOOKING_ID = :APEX$TASK_PK
    ```
    ※注: APEX$TASK_PKは、レコード・システムの主キー値(この場合は医師の従業員番号)を保持する置換文字列です。

1. 「Feedback Request 」タスク定義ページで、「参加者」タブに移動し、次のように行を編集します。

    参加者タイプ: 潜在的所有者
    値タイプ: 静的
    値: &PATIENT_USERNAME.

1. [Task Parameters] で、[Add Row] をクリックして以下のパラメータを追加し、[Apply Changes] をクリックしてタスク定義を保存します。

BOOKING_ID：Booking Id

# まとめ
これで、Oracle APEXを使用して医師予約ワークフローを作成するプロセスができました。
次回は、ヒューマンタスクをワークフローに追加していきます。

# 参考情報
 * [Oracle Live labs- Simplify Business Process Management Using APEX Workflows](https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=3880)