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