工作流介紹
工作流(Workflow)就是工作流程的計算模型,即將工作流程中的工作如何前后組織在一起的邏輯和規(guī)則在計算機(jī)中以恰當(dāng)?shù)哪P瓦M(jìn)行表示并對其實施計算。
工作流在IT領(lǐng)域不算是“新人”了,工作流思想在上世紀(jì)60年代就有人提出過;70年代就有人開始嘗試,但是由于當(dāng)時許多的限制,工作流一直沒有成功的被實現(xiàn);80年代才出現(xiàn)第一批成功的工作流系統(tǒng);90年代工作流技術(shù)走向了第一個發(fā)展高峰期;90年代后至今工作流出現(xiàn)了很多版本,但是主旨還是不變的,為了使我們的工作變得更加高效。
我們通過工作流可以節(jié)省很多不必要的時間,預(yù)設(shè)置好的處理人,可以讓我們不必反復(fù)的問別人誰負(fù)責(zé)此節(jié)點;通過任務(wù)來實現(xiàn)最后的操作,可以讓我們減少很多人力成本,當(dāng)然想要實現(xiàn)一套完善、簡單、通用、方便管理的工作流系統(tǒng)也是非常不容易的,接下來推薦一個較為通用的,方便使用及管理的工作流系統(tǒng)。
Demo: 工作流系統(tǒng)(ferry)
項目問答社區(qū): 問答社區(qū)
此工作流系統(tǒng)使用的技術(shù)棧:
- Golang
- Gin
- Gorm
- Vue
- Element
數(shù)據(jù)結(jié)構(gòu)設(shè)計
對于一個完整的工作流系統(tǒng)來說,我們需要有流程、模版、分組、用戶、任務(wù)等等,并且這些東西都是可以靈活定制的,因為如果不能靈活定制的話,對于普通的使用這來說是非常不方便的,所以對于一個好的工作流系統(tǒng),是必須要實現(xiàn)靈活性的。
下面直接來展示一下,數(shù)據(jù)結(jié)構(gòu)的設(shè)計圖。

接下來對各個表進(jìn)行詳細(xì)的介紹,這里僅僅是中文介紹,至于數(shù)據(jù)庫的表名,可自行定義:
| 表 | 介紹 |
|---|---|
| 用戶管理 | 這個是一個用戶管理的綜合,包括(用戶管理,用戶組管理,部門管理,權(quán)限管理) |
| 流程分類 | 只為區(qū)分各個功能的流程 |
| 流程 | 管理流程信息,對節(jié)點、流轉(zhuǎn)、分類等數(shù)據(jù)的管理及維護(hù) |
| 模版 | 保存我們自定義設(shè)置的模版,方便在創(chuàng)建或處理流程的時候渲染表單 |
| 工單 | 記錄每次提交的流程申請 |
| 工單綁定模版 | 綁定模版并且記錄每次流程申請對應(yīng)的申請數(shù)據(jù) |
| 工單流轉(zhuǎn)歷史 | 記錄流程申請的每一次的處理結(jié)果 |
| 任務(wù) | 每個節(jié)點及流程結(jié)束后需要執(zhí)行的任務(wù),可選項 |
| 任務(wù)執(zhí)行歷史 | 記錄每次任務(wù)執(zhí)行的歷史并保存執(zhí)行結(jié)果 |
流程分類
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"` // 創(chuàng)建者
}
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"` // 流程結(jié)構(gòu)
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"` // 任務(wù)ID, array, 可執(zhí)行多個任務(wù),可以當(dāng)成通知任務(wù),每個節(jié)點都會去執(zhí)行
Creator int `gorm:"column:creator; type:int(11)" json:"creator" form:"creator"` // 創(chuàng)建者
}
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"` // 表單結(jié)構(gòu)
Creator int `gorm:"column:creator; type: int(11)" json:"creator" form:"creator"` // 創(chuàng)建者
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"` // 工單標(biāo)題
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"` // 是否結(jié)束, 0 未結(jié)束,1 已結(jié)束
State json.RawMessage `gorm:"column:state; type:json" json:"state" form:"state"` // 狀態(tài)信息
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"` // 創(chuàng)建人
}
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"` // 表單結(jié)構(gòu)
FormData json.RawMessage `gorm:"column:form_data; type: json" json:"form_data" form:"form_data"` // 表單數(shù)據(jù)
}
func (TplData) TableName() string {
return "work_order_tpl_data"
}
工單流轉(zhuǎn)歷史
type CirculationHistory struct {
base.Model
Title string `gorm:"column:title; type: varchar(128)" json:"title" form:"title"` // 工單標(biāo)題
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"` // 工單狀態(tài)
Source string `gorm:"column:source; type: varchar(128)" json:"source" form:"source"` // 源節(jié)點ID
Target string `gorm:"column:target; type: varchar(128)" json:"target" form:"target"` // 目標(biāo)節(jié)點ID
Circulation string `gorm:"column:circulation; type: varchar(128)" json:"circulation" form:"circulation"` // 流轉(zhuǎn)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"
}
任務(wù)
type Info struct {
base.Model
Name string `gorm:"column:name; type: varchar(256)" json:"name" form:"name"` // 任務(wù)名稱
TaskType string `gorm:"column:task_type; type: varchar(45)" json:"task_type" form:"task_type"` // 任務(wù)類型
Content string `gorm:"column:content; type: longtext" json:"content" form:"content"` // 任務(wù)內(nèi)容
Creator int `gorm:"column:creator; type: int(11)" json:"creator" form:"creator"` // 創(chuàng)建者
Remarks string `gorm:"column:remarks; type: longtext" json:"remarks" form:"remarks"` // 備注
}
func (Info) TableName() string {
return "task_info"
}
任務(wù)執(zhí)行歷史
type History struct {
base.Model
Task int `gorm:"column:task; type: int(11)" json:"task" form:"task"` // 任務(wù)ID
Name string `gorm:"column:name; type: varchar(256)" json:"name" form:"name"` // 任務(wù)名稱
TaskType int `gorm:"column:task_type; type: int(11)" json:"task_type" form:"task_type"` // 任務(wù)類型, python, shell
ExecutionTime string `gorm:"column:execution_time; type: varchar(128)" json:"execution_time" form:"execution_time"` // 執(zhí)行時間
Result string `gorm:"column:result; type: longtext" json:"result" form:"result"` // 任務(wù)返回
}
func (History) TableName() string {
return "task_history"
}
管理及使用介紹
流程管理

非常簡單的就可以創(chuàng)建流程,拖拽一下,鏈接一下對應(yīng)的節(jié)點,填充一下節(jié)點及流轉(zhuǎn)對應(yīng)的右邊的數(shù)據(jù),就可以完美的創(chuàng)建一條流程數(shù)據(jù)。通過這條流程,我們就可以去進(jìn)行流程申請了。
表單設(shè)計

能夠自定義表單對于一個工作流系統(tǒng)來說,是非常重要的。因為這樣,就可以非常方便的管理用戶的輸入數(shù)據(jù)是啥。同時也能非常方便的來控制用戶的輸入。同時對于工作流管理這來說,大大的節(jié)省了表單維護(hù)的時間。