從設(shè)計到開發(fā),實現(xiàn)一個人人都可以簡單使用及管理的工作流系統(tǒng)

工作流介紹

工作流(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è)計圖。

工作流數(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è)計

表單設(shè)計

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

此次我們主要是介紹了一下數(shù)據(jù)結(jié)構(gòu)的設(shè)計及代碼的演示。同時也展示了一下數(shù)據(jù)在工作流開發(fā)中,比較復(fù)雜,但是對于用戶體驗來說很好的兩個功能,一個是流程管理,一個是表單設(shè)計。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容