---
# System prepended metadata

title: 逾時機制
tags: [nuBPM, 逾時]

---

# 逾時機制
###### tags: `nuBPM` `逾時`

> - 撰寫日期：2024-06-07
> - 規劃文件：
>   - [需求文件](https://www.notion.so/_V1-0-238f0de79a43429d8217e92cbf7946bb)
> - 初步設計：Jason

# 零、大綱

[TOC]

# 一、說明

- 詳細請見[產品說明](https://www.notion.so/_V1-0-238f0de79a43429d8217e92cbf7946bb#04684dcb512e41e09668e075bf2975a2)

---

# 二、需求

- 詳細請見[產品說明](https://www.notion.so/_V1-0-238f0de79a43429d8217e92cbf7946bb#cb060dfefdf04d5faeef38e03e23cdd8)

# 三、案例
## 3.1 案例收集與分析

## 3.1.2 案例收集
- 詳細請見[產品說明](https://www.notion.so/_V1-1-238f0de79a43429d8217e92cbf7946bb#9c68f174376c4ef78927e05641ec9515)

## 3.1.2 功能補充

### 案例 1：到達該關卡後自動通知

- 情境:
  - XX申請單作業配置與相關資訊
    - 逾時規則
      - 到達該關卡 1H 後，自動發送通知

- 操作步驟:
  1. A 使用者建立一筆XX申請單並送出(操作時間: 2024-08-01 12:10:00)
  2. 系統在申請單到達該關卡後 1H 自動發送通知 (操作時間: 2024-08-01 12:15:00)

- 預期結果:
  - 通知會在 2024-08-01 12:15:00 發送
> 排程會在每時的00、15、30、45運行，所以預計 2024-08-01 12:10:00 需要被觸發的資料，會在 2024-08-01 12:15:00 被執行

### 案例 2：到達該關卡後自動送出

- 情境:
  - XX申請單作業配置與相關資訊
    - 逾時規則
      - 到達該關卡 1H 後，自動送出

- 操作步驟:
  1. A 使用者建立一筆XX申請單並送出(操作時間: 2024-08-01 12:10:00)
  2. 系統在申請單到達該關卡後 1H 自動送出 (操作時間: 2024-08-01 12:15:00)

- 預期結果:
  - 申請單會在 2024-08-01 12:15:00 自動送出並前往下一關卡
> 排程會在每時的00、15、30、45運行，所以預計 2024-08-01 12:10:00 需要被觸發的資料，會在 2024-08-01 12:15:00 被執行

### 案例 3：到達該關卡後自動送出失敗

- 情境:
  - XX申請單作業配置與相關資訊
    - 逾時規則
      - 到達該關卡 1H 後，自動送出
  - 送出過程中找不到負責人、代理人或無符合的分支條件

- 操作步驟:
  1. A 使用者建立一筆XX申請單並送出(操作時間: 2024-08-01 12:10:00)
  2. 系統在申請單到達該關卡後 1H 自動送出 (操作時間: 2024-08-01 12:15:00)

- 預期結果:
  - 系統會在 2024-08-01 12:15:00 自動送出，但遇上找不到負責人的錯誤，導致停留在原先關卡
> 排程會在每時的00、15、30、45運行，所以預計 2024-08-01 12:10:00 需要被觸發的資料，會在 2024-08-01 12:15:00 被執行

### 案例 4：到達該關卡後依日期與時間欄位決定自動通知

- 情境:
  - XX申請單作業配置與相關資訊
    - 逾時規則
      - 到達該關卡後，根據申請單中的指定日期與時間欄位發送通知

- 操作步驟:
  1. A 使用者建立一筆XX申請單並送出，並設定通知時間為 2024-08-01 13:00:00 (操作時間: 2024-08-01 12:10:00)
  2. 系統根據申請單中的指定時間在 2024-08-01 13:00:00 發送通知 (操作時間: 2024-08-01 13:00:00)

- 預期結果:
  - 通知會在 2024-08-01 13:00:00 發送

### 案例 5：到達該關卡後依日期與時間欄位決定自動送出

- 情境:
  - XX申請單作業配置與相關資訊
    - 逾時規則
      - 到達該關卡後，根據申請單中的指定日期與時間欄位自動送出

- 操作步驟:
  1. A 使用者建立一筆XX申請單並送出，並設定送出時間為 2024-08-01 13:00:00 (操作時間: 2024-08-01 12:10:00)
  2. 系統根據申請單中的指定時間在 2024-08-01 13:00:00 自動送出 (操作時間: 2024-08-01 13:00:00)

- 預期結果:
  - 申請單會在 2024-08-01 13:00:00 自動送出出並前往下一關卡
> 排程會在每時的00、15、30、45運行，所以預計 2024-08-01 13:00:00 需要被觸發的資料，會在 2024-08-01 13:00:00 被執行

### 案例 6：逾時資料已被排程抓取，未執行前將作業刪除

情境:
- XX申請單作業配置與相關資訊
  - 逾時規則
    - 到達該關卡 1H 後，自動發送通知

操作步驟:
1. A 使用者建立一筆XX申請單並送出(操作時間: 2024-08-01 10:20:00)
2. B 使用者刪除XX申請單作業(操作時間: 2024-08-01 11:30:00)

預期結果:
- 通知不會發送，因資料已被刪除，執行時無法正確獲取資料
> 排程會在每時的00、15、30、45運行，所以預計 2024-08-01 11:20:00 需要被觸發的資料，會在 2024-08-01 11:30:00 被執行


# 四、功能
## 4.1 功能劃分與功能流程分析

## 4.1.1 功能劃分說明

- 詳細請見[產品說明](https://www.notion.so/_V1-1-238f0de79a43429d8217e92cbf7946bb#06e81a4b2cef4639a9053efc244d0211)

## 4.1.2 功能補充

#### 後臺 / 作業中心 / 作業管理

- 作業刪除，需同步刪除[電子表單樣板異常資料表](#621-電子表單樣板異常)、 [電子表單逾時紀錄資料表](#622-電子表單逾時紀錄)相關資料
- 作業恢復，需同步重建[電子表單樣板異常資料表](#621-電子表單樣板異常)、 [電子表單逾時紀錄資料表](#622-電子表單逾時紀錄)相關資料

#### 後臺 / 作業中心 / 作業管理 / 作業創建 / 表單設計

- 日期與時間、日期與時間區間元件，修改格式或刪除時，會檢查是否被`逾時處理`套用，若被套用需返回元件關聯的資訊
  > 流程設計 - {關卡名}關卡.逾時處理

#### 後臺 / 作業中心 / 作業管理 / 作業創建 / 流程設計

- 逾時處理彈窗需顯示`日期與時間元件`，需要提供符合的(需排除`子表`內的)元件清單用於顯示
- `簽核人關卡`、`加簽關卡`需擴充逾時處理的相關設定參數
  > `加簽關卡`共用原簽核關卡的逾時截止時間、逾時操作時間
- 關聯元件被強制刪除，需將逾時處理設定還原預設值

#### 後臺 / 作業中心 / 作業監控

- 作業列表增加「申請單已逾時」查詢參數
  - 查詢邏輯針對「申請單已逾時」、「待辦人員離職」這兩個條件，目前會另外擴充[電子表單樣板異常資料表](#621-電子表單樣板異常)，支援異常狀態的查詢
  - 需撰寫一次性工具同步「待辦人員離職」的相關資料

#### 前臺 / 總覽頁

- 需提供各條件下的待辦數量
  - 全部
  - 即將逾時
  - 已逾時
  - 催簽

#### 前臺 / 我的待辦 / 表單列表

- 需增加「申請單即將逾時」、「申請單已逾時」查詢參數
- 資料顯示上，需要增加`逾時截止時間`、`逾時狀態`

#### 前臺 / 我的待辦 / 單筆表單檢視

- 加簽操作，需增加`逾時截止時間`資訊

#### 各類流程圖

- 在簽核人關卡中，需要提供逾時處理的相關資訊

#### 表單流程跑動

- 在簽核人關卡需針對逾時處理的設定，計算逾時截止時間、逾時操作時間，並將資料同步更新[電子表單樣板異常資料表](#621-電子表單樣板異常)、 [電子表單逾時紀錄資料表](#622-電子表單逾時紀錄)

#### 逾時排程

- 運行週期: 15min，每小時的00、15、30、45
  1. 逾時資料處理 
     - 撈取條件: 排程執行的時間點 > 逾時處理時間 & 未處理過逾時
       - 相關資料表: [電子表單逾時紀錄資料表](#622-電子表單逾時紀錄)
     - 處理邏輯: 建立[逾時工作(Job)](#逾時工作Job)至queue中，等待處理
  2. 已逾時作業判斷
     - 處理邏輯: 建立[已逾時作業判斷(Job)](#已逾時作業判斷Job)至queue中，等待處理

#### 逾時工作(Job)

- 參數
  - 公司編號
  - 表單編號
  - 流程編號
- 操作
  - 通知
    - 寄送通知至通知中心
      > P.S. 參考[通知中心語系表](#111-通知中心語系表)
  - 送出
    - 使用該筆資料公司的`系統身分`，進行表單的簽核通過操作
      > P.S. 需注意使用系統身分，資料存取的部分
    - 執行過程中遇到操作失敗(抓不到下關簽核人、無符合的分支條件)，停留在原關卡即可
> P.S. 需注意表單是否已被處理，同一個關卡不可被重複執行

#### 已逾時作業判斷(Job)

- 參數
  - 公司編號
- 操作
  - 查詢待辦中的表單是否有逾時的資料，有/沒有都需要更新[電子表單樣板異常資料表](#621-電子表單樣板異常)



# 五、頁面

- 詳細請見[UI/UX精稿](https://www.figma.com/design/7hLkltWANMrjGZzMy9Ukot/[UI%2FUX]-NUEiP-BPM---3?node-id=31741-6078&t=Ud5yp5Nqp4k9XDZL-0)


# 六、欄位
## 6.1 欄位統整

> 略

## 6.2 資料庫設計

* <span style="color:red;">紅色</span>為本次影響欄位

## 6.2.1 電子表單樣板異常
資料表: <span style="color:red;">eform_template_exception</span>

| 名稱 | 主鍵 | 類型 | 備註 |
| ---- | ---- | --- | ---- |
| eform_template_management_id | v | varchar(36) | 表單樣板系統編號 |
| is_todo_user_resigned | | tinyint(1) | 待辦人員離職 (0: 否, 1: 是) |
| is_form_timeout | | tinyint(1) | 申請單已逾時 (0: 否, 1: 是) |
| created_at | | datetime | 建立日期 |
| updated_at | | datetime | 更新日期 |

## 6.2.2 電子表單逾時紀錄
資料表: <span style="color:red;">eform_timeout_record</span>

| 名稱 | 主鍵 | 類型 | 備註 |
| ---- | ---- | --- | ---- |
| id | v | varchar(36) | 系統編號 |
| form_id | | varchar(36) | 表單編號 |
| form_sn | | varchar(36) | 表單流程編號 |
| deadline_at| datetime | 截止時間 |
| processing_at | | datetime | 處理時間 |
| processing_type | | tinyint(1) | 處理類型(0: 通知, 1: 送出) |
| is_processed | | tinyint(1) | 逾時是否已被處理 |

## 6.2.3 電子表單待辦紀錄
資料表: eform_todo_record

| 名稱 | 類型 | 備註 |
| ---- | --- | ---- |
| id | varchar(36) | 系統編號 |
| company_id | varchar(36) | 公司系統編號 |
| user_id | varchar(36) | 使用者編號 |
| form_id | varchar(36) | 表單編號 |
| flow_sn | varchar(36) | 流程編號 |
| name | varchar(200) | 表單名稱 |
| apply_date | datetime | 表單申請時間 |
| status | ENUM('0', '1', '2', '3', '4') | 節點處理狀態(0:未完成 1:已完成 2:免處理 3:版更停止 4:等待處理) |
| can_batch | ENUM('0', '1') | 是否可以批次處理(0:否, 1:是) |
| is_counter_sign | char(1) | 是否為加簽產生(0:否, 1:是) |
| has_urged | tinyint(1) | 是否已催簽過(0:否, 1:是) |
| <span style="color:red;">timeout_deadline_at</span>| datetime | 逾時截止時間 |
| created_at | datetime | 建立日期 |
| created_by | varchar(36) | 建立人員 |
| updated_at | datetime | 更新日期 |
| updated_by | varchar(36) | 更新人員 |
| deleted_at | datetime | 刪除日期 |
| deleted_by | varchar(36) | 刪除人員 |
| valid | enum('0', '1') | 資料狀態(0:無效 1:有效) |


# 七、資料格式分析 / 定義
## 7.1 流程控制參數、資料交換格式

- **[增加]** 計數 / 總攬
  - GET `/count/overview`
  - Response:
    > Code: 200
    ```json
    {
      "code": 200,
      "message": null,
      "data": {
        // 待辦計數
        "todo": {
          // 全部
          "all": 0,
          // 即將逾時
          "upcoming_timeout": 0,
          // 已逾時
          "timeout_occurred": 0,
          // 催簽
          "urgent_sign": 0
        }
      }
    }
    ```

- **[異動]** 前臺 / 我的待辦 - 列表
  - GET `/eform/my-todo`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | name | String | 作業名稱 |
    | datetime[0] | String | 申請時間開始 |
    | datetime[1] | String | 申請時間結束 |
    | serial_number | String | 表單編號 |
    | is_batch | String | 是否需要批次處理(0:否 1:是) |
    | has_urge | String | 是否為催簽(0:否 1:是) |
    | <span style="color:red;">is_upcoming_timeout</span> | String | 是否為即將逾時(0:否 1:是) |
    | <span style="color:red;">is_timeout_occurred</span> | String | 是否為已逾時(0:否 1:是) |
    | keyword | String | 關鍵字 |
    | page | String | 頁數 |
    | per_page | String | 單頁顯示數量 |
    | sort | String | 排序 |

  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時截止時間`
    ```json
    {
      "code": 200,
      "data": {
        "list": [
          {
            // 待辦資訊
            "info": {
              "row_id": "1eef17c8-eb0f-6f8a-a0e1-0242a3ee6533",
              "form_id": "1eef17c8-eaab-6ac6-a08f-0242a3ee6533",
              "flow_node_sn": "1eef0d16-5116-6878-8078-0242a3ee6533",
              "name": "0402催簽",
              "has_temp": false,
              "is_counter_sign": false,
              "can_batch": false,
              "has_urged": true,
              "icon": "sitemap",
              "comment": 0
            },
            // 表單申請資訊
            "apply": {
              "name": {
                "source": "hrm",
                "type": "user",
                "id": "24907568-fa39-59c8-b502-c80cccc9e9b5",
                "code": "redvelvet001",
                "name": "裴◯現 ixxxe",
                "dept_id": "51b04ad3-2115-54dc-85ed-e35c6b651ac3",
                "company_name": "任遠測試",
                "dept_name": [
                  "red velvet"
                ],
                "title": "經理",
                "enabled": true
              },
              "date": "2024-04-03 13:39:36",
              // 表單狀態
              "status": "1"
            },
            // 摘要
            "abstract": [],
            // 進行中關卡
            "flowNodes": {
              "label": "簽核人"
            },
            // [新增] 逾期資訊
            "timeout": {
              // 截止時間
              "deadline_at": "2024-08-01 00:00",
              // 狀態
              // 可選值: "0": 無逾時 "1": 即將逾時, "2": 已逾時
              "status": "0"
            }
          }
        ],
        ...
      },
      "total": 11,
      "from": 1,
      "to": 10
    }
    ```

- **[異動]** 前臺 / 我的待辦 / 指定表單 - 表單資訊
  - GET `/eform/forms/{form_id}/info`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | form_id | String | 表單編號 |
  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾期資訊`
    ```json
    {
      "code": 200,
      "message": null,
      "data": {
        "apply": {
          "name": [
            {
              "source": "hrm",
              "type": "user",
              "id": "ba586b0d-ce76-54e4-87a9-9fc9fb83a66f",
              "code": "A001",
              "name": "固◯◯◯員 AxxxE",
              "dept_id": "3b0d54da-f70d-5039-b394-6c1f9dc28ea1",
              "company_name": "Jason開發測試用",
              "dept_name": [
                "舊成員存放部門"
              ],
              "title": "董事長",
              "enabled": true
            }
          ],
          "date": "2024-06-05 16:38:22",
          "status": "1"
        },
        "access": {
          "reject": {
            "label": "不通過",
            "value": true,
            "disabled": false
          },
          "submit": {
            "label": "通過",
            "value": true,
            "disabled": false
          },
          "temporary": {
            "label": "暫存",
            "value": true
          }
        },
        "comment": {
          "label": "意見",
          "required": false,
          "commentTypes": "options",
          "canAttached": false,
          "commentOptions": [
            {
              "label": "同意",
              "value": "value-1"
            },
            {
              "label": "不同意",
              "value": "value-2"
            }
          ],
          "commentDefaultOption": ""
        },
        // [新增] 逾期資訊
        "timeout": {
          // 截止時間
          "deadline_at": "2024-08-01 00:00"
        }
      }
    }
    ```

- **[異動]** 前臺 / 我的待辦|我處理的|我申請的 / 指定表單 - 流程圖
  - `/eform/forms/{form_id}/chart`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | form_id | String | 表單編號 |
  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時處理`
    - 請查閱[流程圖通用資料交換格式](#711-流程圖通用資料交換格式)

- **[異動]** 前臺 / 查詢作業 / 指定作業 / 指定表單 - 流程圖
  - GET `/eform/form-flow/{form_id}/chart`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | form_id | String | 表單編號 |
  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時處理`
    - 請查閱[流程圖通用資料交換格式](#711-流程圖通用資料交換格式)

- **[異動]** 後臺 / 作業中心 / 作業監控 - 列表
  - GET `/eform/template/monitor`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | code | String | 作業代碼 |
    | name | String | 作業名稱 |
    | category | String | 作業分類 |
    | ~~todo_status~~ | ~~String~~ | ~~待辦狀態~~ |
    | <span style="color:red;">is_todo_user_resigned</span> | String | 待辦人員已離職(0:否 1:是) |
    | <span style="color:red;">is_form_timeout</span> | String | 申請單已逾時(0:否 1:是) |
    | keyword | String | 關鍵字 |
    | page | String | 頁數 |
    | per_page | String | 單頁顯示數量 |
    | sort | String | 排序 |
  - Response:
    > Code: 200  
    > 異動說明：回傳結果無異動

- **[異動]** 後臺 / 作業中心 / 作業監控 / 指定作業 - 列表
  - GET `/eform/template/monitor/{tmpl_mgmt_id}/list`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | tmpl_mgmt_id | String   | 電子表單樣板編號 |
    | ~~todo_status~~ | ~~String~~ | ~~待辦狀態~~ |
    | <span style="color:red;">is_todo_user_resigned</span> | String | 待辦人員已離職(0:否 1:是) |
    | <span style="color:red;">is_form_timeout</span> | String | 申請單已逾時(0:否 1:是) |
    | keyword | String | 關鍵字 |
    | page | String | 頁數 |
    | per_page | String | 單頁顯示數量 |
    | sort | String | 排序 |
  - Response:
    > Code: 200  
    > 異動說明：增加逾期資訊
    ```json
    {
      "code": 200,
      "message": null,
      "data": {
        "list": [
          {
            "form_id": "1ef22ece-0fca-652c-91d4-0242020d3956",
            "status": "1",
            "flow_nodes": [
              {
                "label": "簽核人1-2",
                "authorizeMember": [
                  ...
                ],
                "counterSignMember": [
                  ...
                ],
                // [新增] 逾期資訊
                "timeout": {
                  // 截止時間
                  "deadline_at": "2024-08-01 00:00",
                  // 狀態
                  // 可選值: "0": 無逾時 "1": 即將逾時, "2": 已逾時
                  "status": "0"
                }
              }
            ],
            "apply_user": {
              ...
            },
            "apply_date": "2024-06-05 11:37:05",
            "updated_date": "2024-06-05 11:42:22",
            "comment_num": 4,
            "abnormal": false
          },
          ...
        ],
        "total": 3,
        "from": 1,
        "to": 3
      }
    }
    ```

- **[異動]** 後臺 / 作業中心 / 作業監控 / 指定作業 / 指定表單 - 流程圖
  - GET `/eform/template/monitor/{form_id}/form/chart`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | form_id | String | 表單編號 |
  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時處理`
    - 請查閱[流程圖通用資料交換格式](#711-流程圖通用資料交換格式)

- **[異動]** 後臺 / 作業中心 / 作業管理 / 作業創建 / 表單設計 - 關聯檢查
  - GET `/eform/template/management/{tmpl_mgmt_id}/versions/{version}/widget/{widget_sn}/check-relation`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | tmpl_mgmt_id | | 電子表單樣板編號 |
    | version | Integer | 版本號 |
    | widget_sn | String | 元件編號 |
  - Response:
    > Code: 200  
    > 異動說明：
    ```json
    {
      // 現行版本 - 廢棄
      "code": 200,
      "data": {
        "has_relation": true,
        "flow_names": [
          "分支設定",
          "簽核人關卡.負責人"
        ],
      }
    }
    ```
    ```json
    {
      // 預計調整版本 - 待與前端討論
      "code": 200,
      "data": {
        "list": [
          {
            "type": "branch",
            "label": "",
            "item": ""
          },
          {
            "type": "approval",
            "label": "簽核人",
            "item": "authorizeMember"
          }
        ]
      }
    }
    ```

- **[異動]** 後臺 / 作業中心 / 作業管理 / 作業創建 / 流程設計
  - GET `/eform/template/management/{tmpl_mgmt_id}/versions/{version}/flow`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | tmpl_mgmt_id | String | 電子表單樣板編號 |
    | version | Integer | 版本號 |
  - Response:
    > Code: 200  
    > 異動說明：增加逾時的元件清單、逾時處理設定
    ```json
    {
      "code": 200,
      "message": null,
      "data": {
        "mode": null,
        "start_sn": "start-default",
        "flowNodes": [
          {
            "sn": "start-default",
            "type": "start",
            "options": {
              ...
            },
            "status": "default"
          },
          {
            "sn": "approval-default",
            "type": "approval",
            "options": {
              "label": "簽核人",
              "authorizeMember": [],
              "counterSignMember": [],
              "sign": "or",
              "showComment": true,
              "comment": {
                ...
              },
              "access": {
                ...
              },
              "noFlowLog": false,
              "bindApproval": [],
              "inform": {
                "enable": false,
                "informMember": []
              },
              "abstractWidgets": [],
              "overrideWidgets": [],
              // [新增] 逾時處理
              "timeout": {
                // 設定狀態
                "status": false,
                // 截止時間
                "deadline": {
                  // 類型
                  // 可選值: "custom": 自訂, "widget": 元件
                  "type": "custom",
                  // 數量
                  "amount": 1,
                  // 單位
                  // 可選值: "day": 日, "hour": 小時, "minute": 分鐘
                  "unit": "day",
                  // 元件編號
                  "widgetId": null,
                  // 時間
                  "time": "00:00"
                },
                // 處理方式
                "process": {
                  // 可選值: "notice": 通知, "submit": 送出
                  "type": "notice",
                  "notice": {
                    // 階段
                    // 可選值: "current": 當前, "before": 之前, "after": 之後
                    "stage": "current",
                    // 數量
                    "amount": 1,
                    // 單位
                    // 可選值: "day": 日, "hour": 小時, "minute": 分鐘
                    "unit": "day"
                  },
                  "submit": {
                    // 階段
                    // 可選值: "current": 當前, "after": 之後
                    "stage": "current",
                    // 數量
                    "amount": 1,
                    // 單位
                    // 可選值: "day": 日, "hour": 小時, "minute": 分鐘
                    "unit": "day"
                  }
                }
              }
            },
            "status": "default"
          },
          {
            "sn": "end-default",
            "type": "end",
            "options": {
              ...
            },
            "status": "default"
          }
        ],
        "defaultOverrideWidgets": [],
        "conditionOptions": [],
        // 逾時元件清單
        "timeoutWidgets": [
          {
            "id": "1ef28623-415d-624a-ad2e-0242020d3956",
            "type": "datetime",
            "options": {
              "label": "日期與時間單日",
              "valueFormat": "yyyy-MM-dd HH:mm:ss"
            }
          }
        ],
        "first_visit": false
      }
    }
    ```


- **[異動]** 後臺 / 作業中心 / 作業管理 / 作業創建 / 流程設計
  - PUT `/eform/template/management/{tmpl_mgmt_id}/versions/{version}/flow`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | tmpl_mgmt_id | String | 電子表單樣板編號 |
    | version | Integer | 版本號 |
  - Response:
    > Code: 200  
    > 異動說明：增加逾時處理設定
    ```json
    {
      "mode": "flow",
      "flowNodes": [
        {
          "sn": "start-default",
          "type": "start",
          "options": {
            ...
          },
          "status": "default"
        },
        {
          "sn": "approval-default",
          "type": "approval",
          "options": {
            "label": "簽核人",
            "authorizeMember": [],
            "counterSignMember": [],
            "sign": "or",
            "showComment": true,
            "comment": {
              ...
            },
            "access": {
              ...
            },
            "noFlowLog": false,
            "bindApproval": [],
            "inform": {
              "enable": false,
              "informMember": []
            },
            "abstractWidgets": [],
            "overrideWidgets": [],
            // [新增] 逾時處理
            "timeout": {
              // 設定狀態
              "status": false,
              // 截止時間
              "deadline": {
                // 類型
                // 可選值: "custom": 自訂, "widget": 元件
                "type": "custom",
                // 數量
                "amount": 1,
                // 單位
                // 可選值: "day": 日, "hour": 小時, "minute": 分鐘
                "unit": "day",
                // 元件編號
                "widgetId": null,
                // 時間
                "time": "00:00"
              },
              // 處理方式
              "process": {
                // 可選值: "notice": 通知, "submit": 送出
                "type": "notice",
                "notice": {
                  // 階段
                  // 可選值: "current": 當前, "before": 之前, "after": 之後
                  "stage": "current",
                  // 數量
                  "amount": 1,
                  // 單位
                  // 可選值: "day": 日, "hour": 小時, "minute": 分鐘
                  "unit": "day"
                },
                "submit": {
                  // 階段
                  // 可選值: "current": 當前, "after": 之後
                  "stage": "current",
                  // 數量
                  "amount": 1,
                  // 單位
                  // 可選值: "day": 日, "hour": 小時, "minute": 分鐘
                  "unit": "day"
                }
              }
            }
          },
          "status": "default"
        },
        {
          "sn": "end-default",
          "type": "end",
          "options": {
            "label": "結束流程"
          },
          "status": "default"
        }
      ]
    }
    ```

- **[異動]** 後臺 / 作業中心 / 作業管理 / 作業創建 / 流程設計 / 流程模擬 - 流程圖
  - GET `/eform/template/management/{tmpl_mgmt_id}/versions/{version}/flow-simulation/chart`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | form_id | String | 表單編號 |
  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時處理`
    - 請查閱[流程圖通用資料交換格式](#711-流程圖通用資料交換格式)

- **[異動]** Portal / 通知設定
  - GET `/personal-notice`
  - Response:
    > Code: 200  
    > 異動說明：增加逾時通知
    ```json
    {
      "code": 200,
      "message": null,
      "data": [
        ...
        {
          // 逾時通知設定
          // TODO: 等待前端定義參數
          "item_key": "",
          "line_notification": "1",
          "email_notification": "1",
          "system_notification": "1"
        },
        ...
      ]
    }
    ```

- **[異動]** Portal 內部API / 表單列表 - 查詢
  - GET `/forms/list`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | name | String | 作業名稱 |
    | datetime[0] | String | 申請時間開始 |
    | datetime[1] | String | 申請時間結束 |
    | serial_number | String | 表單編號 |
    | is_batch | String | 是否需要批次處理(0:否 1:是) |
    | portal_apply_user| Array | Portal申請人員 |
    | limit | String | 數量 |
    | offest | String | 起始值 |

  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時截止時間`
    ```json
    {
      "code": 200,
      "data": {
        "list": [
          {
            // 待辦資訊
            "info": {
              "row_id": "1eef17c8-eb0f-6f8a-a0e1-0242a3ee6533",
              "form_id": "1eef17c8-eaab-6ac6-a08f-0242a3ee6533",
              "flow_node_sn": "1eef0d16-5116-6878-8078-0242a3ee6533",
              "name": "0402催簽",
              "has_temp": false,
              "is_counter_sign": false,
              "can_batch": false,
              "has_urged": true,
              "icon": "sitemap",
              "comment": 0
            },
            // 表單申請資訊
            "apply": {
              "name": {
                "source": "hrm",
                "type": "user",
                "id": "24907568-fa39-59c8-b502-c80cccc9e9b5",
                "code": "redvelvet001",
                "name": "裴◯現 ixxxe",
                "dept_id": "51b04ad3-2115-54dc-85ed-e35c6b651ac3",
                "company_name": "任遠測試",
                "dept_name": [
                  "red velvet"
                ],
                "title": "經理",
                "enabled": true
              },
              "date": "2024-04-03 13:39:36",
              "status": "1"
            },
            // 摘要
            "abstract": [],
            // 進行中關卡
            "flowNodes": {
              "label": "簽核人"
            },
            // [新增] 逾期資訊
            "timeout": {
              // 截止時間
              "deadline_at": "2024-08-01 00:00",
              // 狀態
              // 可選值: "0": 無逾時 "1": 即將逾時, "2": 已逾時
              "status": "0"
            }
          }
        ],
        ...
      },
      "total": 11,
      "from": 1,
      "to": 10
    }
    ```

- **[異動]** Portal 內部API / 表單檢視 - 流程圖
  - GET `/forms/form/{form_id}/chart`
  - Query:
    | Parameter | Type | Description |
    | --------- | ---- | ----------- |
    | form_id | String | 表單編號 |
  - Response:
    > Code: 200  
    > 異動說明：增加參數 `逾時處理`
    - 請查閱[流程圖通用資料交換格式](#711-流程圖通用資料交換格式)

## 7.1.1 流程圖通用資料交換格式
```json
{
  "code": 200,
  "message": null,
  "data": {
    "flow_log": [
      {
        // 申請人關卡
        ...
      },
      {
        // 簽核人關卡
        "sn": "1ef02d84-a8a1-6806-b140-0242a3ee6533",
        "type": "approval",
        "options": {
          "sign": "or",
          "label": "簽核人",
          "access": {
            ...
          },
          "inform": {
            ...
          },
          "comment": {
            ...
          },
          "noFlowLog": false,
          "showComment": true,
          "bindApproval": [],
          "informMember": [
            ...
          ],
          "abstractWidgets": [],
          "authorizeMember": [
            ...
          ],
          "counterSignMember": [],
          // [新增] 逾時處理
          "timeout": {
            // 設定狀態
            "status": false,
            // 截止時間
            "deadline": {
              ...
            },
            // 處理方式
            "process": {
              ...
            }
          }
        },
        "status": "default",
        "mode": "1",
        "label": "簽核人",
        "authorizeMember": [
          ...
        ],
        "authorizeMemberError": "",
        "counterSignMember": [],
        "sign": "or",
        "abnormal": false,
        "isEnded": false
      },
      {
        // 結束流程關卡
        ...
      }
    ],
    "flow_status": "1"
  }
}
```


# 八、函式庫設計
## 影響 - 檔案結構

> 略

---

# 九、工作 & 測試項目

## 9.1 工作項目

總工時 - 15天

第一個 Scrum 10天
- 作業管理 5天
  - 表單設計
    - 關聯檢查擴充 & 資料交換格式調整
  - 流程設計
    - 增加逾時處理設定
    - 流程預設資料補齊
- 各類流程圖資料格式擴充 - 2天
- 我的待辦 1.5天
  - 查詢參數擴充
  - 返回資料擴充
- 作業監控 1.5天
  - 查詢參數擴充
  - 返回資料擴充

第二個 Scrum 5天
- 逾時排程 - 4天
  - 通知/送出
- Poratl API - 1天
  - 表單列表增加逾時資訊
  - 流程圖資料格式擴充


## 9.2 測試項目

> 針對工作項目、需求做測試，須注意明定測試步驟與通過標準

### 前端測試項目

> 頁面規則測試，請確定需求、案例、頁面動態中重要的地方都有測到
> 請條列化或表格化

### 後端測試項目

> 邏輯測試，請確定需求、案例、功能流程中重要的地方都有測到
> 請條列化或表格化

---

# 十、問題紀錄

- 詳細請見 [產品問題討論與決策紀錄](https://www.notion.so/_V1-4-558f9902134d45a6809a7129815d0e05#1fd4363aa0c548df83250a8a932f04dd)

---

# 十一、參考資料

### 11.1 通知中心語系表
- [BPM通知類型語系表](https://docs.google.com/spreadsheets/d/1I2Jvogq-1UMm44cNk4UyrMvdsVT6XeZVRWIO03B_oCw/edit#gid=1032733022)
- [BPM訊息模板語系表](https://docs.google.com/spreadsheets/d/1I2Jvogq-1UMm44cNk4UyrMvdsVT6XeZVRWIO03B_oCw/edit#gid=3588881)

> 目前已將本次需添加的語系填寫上去，若開發時 Code 還未補上，請向 通知中心 SA Jason / Daxton 協助確認
