企業級 MIS 系統的核心挑戰在於「流程多變、組織多元、權責動態」。本文提出一套高抽象度、可配置化的公文轉發流程資料模型,支援部門/職位導向、文件/表單雙軌、動作可擴展、跨節點跳轉、超時提醒升級等複雜業務場景。
Department (部門/單位)
- Dp_id (PK)
- Dp_name (UK)
- Dp_father (FK -> Department.Dp_id, 根節點設特殊值)
- Dp_layer (VARCHAR(6), 先序遍歷編碼如 001002003,加速子樹查詢)
Position (職位/角色)
- Ps_id (PK)
- Ps_name
- Dp_id (FK -> Department) -- 所屬部門
User (使用者)
- Us_id (PK)
- Us_name
- Ps_id (FK -> Position) -- 主職位
- ...其他屬性
Function (功能/權限項目)
- f_id (PK)
- f_name (UK)
- f_desc
Role_Function (角色-功能映射,或 User_Group_Function)
- Role_id / Group_id
- f_id
Flow_Def (流程定義主檔)
- Fd_id (PK)
- Fd_name (UK)
- Fd_desc
- Fd_version
- Fd_status (啟用/停用/草稿)
- Created_by, Created_at
Flow_Node (流程節點)
- Fn_id (PK)
- Fd_id (FK -> Flow_Def)
- Fn_seq (節點順序)
- Fn_name
- Fn_type (啟動/審核/簽核/歸檔/條件判斷/子流程...)
- Fn_mode (單人/會簽/或簽/部門主管自動判定)
- Fn_timeout_min (最長等待分鐘數,0=不限)
- Fn_remind_interval_min (提醒間隔)
- Fn_escalation_rule (升級規則 JSON: 轉主管/發郵件/記審計)
- Fn_action_set_id (FK -> Action_Set 允許的動作集合)
Flow_Transition (節點轉移/路由)
- Ft_id (PK)
- Fd_id (FK)
- From_Fn_id (FK -> Flow_Node)
- To_Fn_id (FK -> Flow_Node)
- Ft_condition (路由條件運算式,支援欄位比較、函數、子查詢)
- Ft_priority (同起點多條件優先序)
Action_Def (動作定義)
- Ad_id (PK)
- Ad_code (UK, 如 APPROVE, REJECT, TRANSFER, ADD_SIGN, CC)
- Ad_name
- Ad_handler_class (處理類別名稱,如 com.biz.flow.handler.ApproveHandler)
- Ad_icon, Ad_color (UI 顯示屬性)
- Ad_is_system (系統內建/自訂)
Action_Set (動作集合,節點綁定一組允許動作)
- As_id (PK)
- As_name
Action_Set_Detail
- As_id (FK)
- Ad_id (FK)
- Display_order
Form_Def (表單定義)
- Fm_id (PK)
- Fm_name
- Fm_layout_json (欄位定義、驗證規則、UI 佈局 JSON)
- Fm_version
Document_Type (文件類型)
- Dt_id (PK)
- Dt_name
- Dt_category (公文/合約/報表...)
Flow_Inst (流程實例)
- Fi_id (PK)
- Fd_id (FK -> Flow_Def 版本快照)
- Fi_title
- Fi_initiator (Us_id)
- Fi_status (進行中/完成/終止/失效)
- Fi_created_at, Fi_finished_at
- Fi_current_node_id (FK -> Flow_Node)
- Fi_business_key (業務主鍵,如採購單號,便於關聯查詢)
Flow_Inst_Node (實例節點執行記錄)
- Fin_id (PK)
- Fi_id (FK)
- Fn_id (FK -> Flow_Node 定義快照)
- Fin_assignee_type (部門/職位/使用者/角色)
- Fin_assignee_id (實際受理者 ID,執行時解析填入)
- Fin_status (待處理/處理中/已核准/已退回/已跳過/超時)
- Fin_start_at, Fin_end_at
- Fin_action_taken (Ad_code)
- Fin_comment
- Fin_is_timed_out (是否超時)
Flow_Inst_Document (實例掛載公文)
- Fid_id (PK)
- Fi_id (FK)
- Dt_id (FK -> Document_Type)
- Fid_file_path / Fid_blob_id (檔案存儲引用)
- Fid_status (原始/已簽核/已退回/已替換)
Flow_Inst_Form_Data (實例表單資料)
- Ffd_id (PK)
- Fi_id (FK)
- Fm_id (FK -> Form_Def 版本快照)
- Ffd_data_json (表單填寫資料 JSON)
- Ffd_version
Notification (通知/提醒記錄)
- Nt_id (PK)
- Fi_id, Fin_id (FK)
- Nt_type (提醒/超時升級/動作完成/失敗)
- Nt_channel (站內信/Email/SMS/Teams/Slack)
- Nt_recipient_id
- Nt_sent_at, Nt_read_at
- Nt_content_template_id
Audit_Log (審計日誌)
- Al_id (PK)
- Fi_id, Fin_id (FK)
- Al_operator (Us_id)
- Al_action (Ad_code)
- Al_before_state_json, Al_after_state_json
- Al_timestamp
- Al_ip, Al_user_agent
| 決策點 | 選擇 | 理由 |
|---|---|---|
| 部門層級 | 限定 3 層 + Dp_layer 編碼 | 平衡查詢效能 (遞歸 CTE 替代) 與多數企業實況 |
| 動作擴展 | Action_Def + Handler Class 機制 | 新增動作僅需註冊類別,零 Schema 變更,符合開放封閉原則 |
| 表單資料 | JSON 存儲 (PostgreSQL JSONB / SQL Server NVARCHAR(MAX) + 計算欄索引) | 支援任意欄位結構,避免 EAV 反模式效能陷阱 |
| 流程版本 | 實例綁定定義快照 (Fd_id 含版本) | 歷史實例不受新版本影響,符合審計要求 |
| 跨節點跳轉 | 建議「複製流程定義並修改」 | 避免複雜路由條件導致不可維護,利用現有版本機制 |
Flow_Inst(Fi_status, Fi_current_node_id), Flow_Inst_Node(Fi_id, Fin_status)此模型以「高內聚、低耦合、可配置、可審計」為核心,前期投入較大 (表現層/業務邏輯層開發量大),但上線後 **極少需修改資料庫 Schema** 即可支撐業務持續演進。若專案不需極高靈活性,可簡化:合併文件/表單、固定動作集合、移除版本快照等。權衡點在於「現在多花力氣,未來少煩惱」。