工做流(Workflow)就是工做流程的計算模型,即將工做流程中的工做如何先後組織在一塊兒的邏輯和規則在計算機中以恰當的模型進行表示並對其實施計算。python
工做流在IT領域不算是「新人」了,工做流思想在上世紀60年代就有人提出過;70年代就有人開始嘗試,可是因爲當時許多的限制,工做流一直沒有成功的被實現;80年代纔出現第一批成功的工做流系統;90年代工做流技術走向了第一個發展高峯期;90年代後至今工做流出現了不少版本,可是主旨仍是不變的,爲了使咱們的工做變得更加高效。shell
咱們經過工做流能夠節省不少沒必要要的時間,預設置好的處理人,可讓咱們沒必要反覆的問別人誰負責此節點;經過任務來實現最後的操做,可讓咱們減小不少人力成本,固然想要實現一套完善、簡單、通用、方便管理的工做流系統也是很是不容易的,接下來推薦一個較爲通用的,方便使用及管理的工做流系統。數據庫
Demo: 工做流系統(ferry)json
項目問答社區: 問答社區數據結構
此工做流系統使用的技術棧:ide
對於一個完整的工做流系統來講,咱們須要有流程、模版、分組、用戶、任務等等,而且這些東西都是能夠靈活定製的,由於若是不能靈活定製的話,對於普通的使用這來講是很是不方便的,因此對於一個好的工做流系統,是必需要實現靈活性的。ui
下面直接來展現一下,數據結構的設計圖。設計
接下來對各個表進行詳細的介紹,這裏僅僅是中文介紹,至於數據庫的表名,可自行定義:code
表 | 介紹 |
---|---|
用戶管理 | 這個是一個用戶管理的綜合,包括(用戶管理,用戶組管理,部門管理,權限管理) |
流程分類 | 只爲區分各個功能的流程 |
流程 | 管理流程信息,對節點、流轉、分類等數據的管理及維護 |
模版 | 保存咱們自定義設置的模版,方便在建立或處理流程的時候渲染表單 |
工單 | 記錄每次提交的流程申請 |
工單綁定模版 | 綁定模版而且記錄每次流程申請對應的申請數據 |
工單流轉歷史 | 記錄流程申請的每一次的處理結果 |
任務 | 每一個節點及流程結束後須要執行的任務,可選項 |
任務執行歷史 | 記錄每次任務執行的歷史並保存執行結果 |
流程分類orm
type Classify struct { base.Model Name string `gorm:"column:name; type: varchar(128)" json:"name" form:"name"` // 分類名稱 Creator int `gorm:"column:creator; type: int(11)" json:"creator" form:"creator"` // 建立者 } func (Classify) TableName() string { return "process_classify" }
流程
type Info struct { base.Model Name string `gorm:"column:name; type:varchar(128)" json:"name" form:"name"` // 流程名稱 Structure json.RawMessage `gorm:"column:structure; type:json" json:"structure" form:"structure"` // 流程結構 Classify int `gorm:"column:classify; type:int(11)" json:"classify" form:"classify"` // 分類ID Tpls json.RawMessage `gorm:"column:tpls; type:json" json:"tpls" form:"tpls"` // 模版 Task json.RawMessage `gorm:"column:task; type:json" json:"task" form:"task"` // 任務ID, array, 可執行多個任務,能夠當成通知任務,每一個節點都會去執行 Creator int `gorm:"column:creator; type:int(11)" json:"creator" form:"creator"` // 建立者 } func (Info) TableName() string { return "process_info" }
模版
type Info struct { base.Model Name string `gorm:"column:name; type: varchar(128)" json:"name" form:"name" binding:"required"` // 模板名稱 FormStructure json.RawMessage `gorm:"column:form_structure; type: json" json:"form_structure" form:"form_structure" binding:"required"` // 表單結構 Creator int `gorm:"column:creator; type: int(11)" json:"creator" form:"creator"` // 建立者 Remarks string `gorm:"column:remarks; type: longtext" json:"remarks" form:"remarks"` // 備註 } func (Info) TableName() string { return "tpl_info" }
工單
type Info struct { base.Model Title string `gorm:"column:title; type:varchar(128)" json:"title" form:"title"` // 工單標題 Process int `gorm:"column:process; type:int(11)" json:"process" form:"process"` // 流程ID Classify int `gorm:"column:classify; type:int(11)" json:"classify" form:"classify"` // 分類ID IsEnd int `gorm:"column:is_end; type:int(11); default:0" json:"is_end" form:"is_end"` // 是否結束, 0 未結束,1 已結束 State json.RawMessage `gorm:"column:state; type:json" json:"state" form:"state"` // 狀態信息 RelatedPerson json.RawMessage `gorm:"column:related_person; type:json" json:"related_person" form:"related_person"` // 工單全部處理人 Creator int `gorm:"column:creator; type:int(11)" json:"creator" form:"creator"` // 建立人 } func (Info) TableName() string { return "work_order_info" }
工單綁定模版
type TplData struct { base.Model WorkOrder int `gorm:"column:work_order; type: int(11)" json:"work_order" form:"work_order"` // 工單ID FormStructure json.RawMessage `gorm:"column:form_structure; type: json" json:"form_structure" form:"form_structure"` // 表單結構 FormData json.RawMessage `gorm:"column:form_data; type: json" json:"form_data" form:"form_data"` // 表單數據 } func (TplData) TableName() string { return "work_order_tpl_data" }
工單流轉歷史
type CirculationHistory struct { base.Model Title string `gorm:"column:title; type: varchar(128)" json:"title" form:"title"` // 工單標題 WorkOrder int `gorm:"column:work_order; type: int(11)" json:"work_order" form:"work_order"` // 工單ID State string `gorm:"column:state; type: varchar(128)" json:"state" form:"state"` // 工單狀態 Source string `gorm:"column:source; type: varchar(128)" json:"source" form:"source"` // 源節點ID Target string `gorm:"column:target; type: varchar(128)" json:"target" form:"target"` // 目標節點ID Circulation string `gorm:"column:circulation; type: varchar(128)" json:"circulation" form:"circulation"` // 流轉ID Processor string `gorm:"column:processor; type: varchar(45)" json:"processor" form:"processor"` // 處理人 ProcessorId int `gorm:"column:processor_id; type: int(11)" json:"processor_id" form:"processor_id"` // 處理人ID CostDuration string `gorm:"column:cost_duration; type: varchar(128)" json:"cost_duration" form:"cost_duration"` // 處理時長 Remarks string `gorm:"column:remarks; type: longtext" json:"remarks" form:"remarks"` // 備註 } func (CirculationHistory) TableName() string { return "work_order_circulation_history" }
任務
type Info struct { base.Model Name string `gorm:"column:name; type: varchar(256)" json:"name" form:"name"` // 任務名稱 TaskType string `gorm:"column:task_type; type: varchar(45)" json:"task_type" form:"task_type"` // 任務類型 Content string `gorm:"column:content; type: longtext" json:"content" form:"content"` // 任務內容 Creator int `gorm:"column:creator; type: int(11)" json:"creator" form:"creator"` // 建立者 Remarks string `gorm:"column:remarks; type: longtext" json:"remarks" form:"remarks"` // 備註 } func (Info) TableName() string { return "task_info" }
任務執行歷史
type History struct { base.Model Task int `gorm:"column:task; type: int(11)" json:"task" form:"task"` // 任務ID Name string `gorm:"column:name; type: varchar(256)" json:"name" form:"name"` // 任務名稱 TaskType int `gorm:"column:task_type; type: int(11)" json:"task_type" form:"task_type"` // 任務類型, python, shell ExecutionTime string `gorm:"column:execution_time; type: varchar(128)" json:"execution_time" form:"execution_time"` // 執行時間 Result string `gorm:"column:result; type: longtext" json:"result" form:"result"` // 任務返回 } func (History) TableName() string { return "task_history" }
流程管理
很是簡單的就能夠建立流程,拖拽一下,連接一下對應的節點,填充一下節點及流轉對應的右邊的數據,就能夠完美的建立一條流程數據。經過這條流程,咱們就能夠去進行流程申請了。
表單設計
可以自定義表單對於一個工做流系統來講,是很是重要的。由於這樣,就能夠很是方便的管理用戶的輸入數據是啥。同時也能很是方便的來控制用戶的輸入。同時對於工做流管理這來講,大大的節省了表單維護的時間。