# 逾時機制
###### 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 協助確認