它這個東西https://github.com/js-ojus/flow很有意思,沒有任何example,完全靠蒙,或者看它test摸索吧,看它issue裏別人的例子。
首先安裝mysql
然後建立一個用戶travis,並且密碼爲空
CREATE USER 'travis'@'localhost' IDENTIFIED BY ''";
然後還要新建一個數據庫flow,選擇utf8mb4,它源碼的某個地方有講。
——然後給用戶travis設置flow這個數據庫的權限
然後進入文件夾內,初始化和進行測試。
D:\gowork\src\github.com\js-ojus\flow>setup_db.sh -t
D:\gowork\src\github.com\js-ojus\flow>setup_blob_dirs.sh
D:\gowork\src\github.com\js-ojus\flow>go test
PASS
ok github.com/js-ojus/flow 5.965s
D:\gowork\src\github.com\js-ojus\flow>
beego裏使用:
package controllers
import (
"database/sql"
// "strings"
// "testing"
"fmt"
_ "github.com/go-sql-driver/mysql"
// "github.com/astaxie/beego"
"github.com/js-ojus/flow"
// _ "github.com/mattn/go-sqlite3"
// "github.com/astaxie/beego/httplib"
// "github.com/astaxie/beego/logs"
"log"
)
type WFApi struct {
flow.Document
}
// fatal1 expects a value and an error value as its arguments.
func fatal1(val1 interface{}, err error) interface{} {
if err != nil {
fmt.Println("%v", err)
}
return val1
}
// Initialise DB connection.
// func init() {
// gt = t
// Connect to the database.travis
// driver, connStr := "mysql", "root:root@/flow"
// tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
// flow.RegisterDB(tdb)
// if tdb == nil {
// log.Fatal("given database handle is `nil`")
// }
// db = tdb
// return nil
// }
// func RegisterDB(sdb *sql.DB) error {
// if sdb == nil {
// log.Fatal("given database handle is `nil`")
// }
// db = sdb
// return nil
// }
func WorkflowsCreate() {
driver, connStr := "mysql", "root:root@/flow"
tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
// flow.RegisterDB(tdb)
if tdb == nil {
log.Fatal("given database handle is `nil`")
}
db := tdb
// var db *sql.DB
tx, _ := db.Begin()
// var tx *sql.Tx
defer tx.Rollback()
docType1, err := flow.DocTypes.New(tx, "EXAM:COMMON")
if err != nil {
fmt.Println(err)
}
docState1, err := flow.DocStates.New(tx, "Init") //初始化
// docState2, err := flow.DocStates.New(tx, "EntrustCreate") //委託創建
// docState3, err := flow.DocStates.New(tx, "EntrustApproved") //委託審覈
// docState4, err := flow.DocStates.New(tx, "SampleHandon") //樣本交接
// docState5, err := flow.DocStates.New(tx, "PrepareFinish") //製備完成
flow.DocStates.New(tx, "PrepareApproved") //製備審覈
flow.DocStates.New(tx, "TaskAssign") //任務分配
flow.DocStates.New(tx, "DataApproved") //數據錄入審覈
flow.DocStates.New(tx, "ReportGen") //報告生成
flow.DocStates.New(tx, "ReportApproved") //報告審覈
/////
docActionID1, _ := flow.DocActions.New(tx, "CreateEntrust", false) //創建委託
docActionID2, _ := flow.DocActions.New(tx, "ApproveEntrust", false) //審覈委託
docActionID3, _ := flow.DocActions.New(tx, "HandonSample", false) //提交樣本
docActionID4, _ := flow.DocActions.New(tx, "FinishPrepare", true) //完成製備
docActionID5, _ := flow.DocActions.New(tx, "ApprovePrepare", true) //審覈製備
docActionID6, _ := flow.DocActions.New(tx, "AssignTask", false) //分配任務
docActionID7, _ := flow.DocActions.New(tx, "ApproveData", false) //審覈數據
docActionID8, _ := flow.DocActions.New(tx, "GenReport", false) //生成報告
docActionID9, _ := flow.DocActions.New(tx, "ApproveReport", true) //審覈報告
workflowId, _ := flow.Workflows.New(tx, "Examination", docType1, docState1)
flow.Workflows.SetActive(tx, workflowId, true)
//創建Docments
contextId, _ := flow.AccessContexts.New(tx, "Context")
groupId, _ := flow.Groups.New(tx, "Examination", "exam")
resUser, _ := tx.Exec(`INSERT INTO users_master(first_name, last_name, email, active)
VALUES('admin', 'dashoo', '[email protected]', 1)`)
uid, _ := resUser.LastInsertId()
userID1 := flow.UserID(uid)
flow.Groups.AddUser(tx, groupId, userID1)
roleID1, _ := flow.Roles.New(tx, "administrator")
flow.Roles.AddPermissions(tx, roleID1, docType1, []flow.DocActionID{docActionID1, docActionID2,
docActionID3, docActionID4, docActionID5, docActionID6, docActionID7, docActionID8, docActionID9})
docNewInput := flow.DocumentsNewInput{
DocTypeID: docType1,
AccessContextID: contextId,
GroupID: groupId,
Title: "entrust flow",
Data: "eid: 111, entrustNo: 2222",
}
flow.Documents.New(tx, &docNewInput)
// documentID1, err := flow.Documents.New(tx, &docNewInput)
// Documents.setState(tx, docType1, documentID1, docState2, contextId)
tx.Commit()
}
func (this *WFApi) WorkflowsNext() {
// tx, _ := flow.db.Begin()
var tx *sql.Tx
defer tx.Rollback()
/*docNewInput := DocumentsNewInput {
DocTypeID: docType1,
AccessContextID: contextId,
GroupID: groupId,
Title: "entrust flow",
Data: "eid: 111, entrustNo: 2222",
}
documentID1, err := Documents.New(tx, &docNewInput)
fmt.Println("documentID1=", documentID1, err)*/
docEventInput := flow.DocEventsNewInput{
DocTypeID: flow.DocTypeID(1),
DocumentID: flow.DocumentID(1),
DocStateID: flow.DocStateID(2),
DocActionID: flow.DocActionID(2),
GroupID: flow.GroupID(1),
Text: "開始審批",
}
groupIds := []flow.GroupID{flow.GroupID(1)}
myWorkflow, err := flow.Workflows.Get(flow.WorkflowID(1))
docEvent1, err := flow.DocEvents.New(tx, &docEventInput)
myDocEvent, err := flow.DocEvents.Get(docEvent1)
newDocStateId, err := myWorkflow.ApplyEvent(tx, myDocEvent, groupIds)
fmt.Println("newDocStateId=", newDocStateId, err)
tx.Commit()
}
main.go裏調用
func main() {
controllers.WorkflowsCreate()
beego.Run()
}
類似這樣而已。暫時到這了。