golang辦公流程引擎初體驗js-ojus/flow——系列四

golang語言的辦公工作流的包介紹——系列一

golang辦公工作流workflow利用js-ojus/flow做測試——系列二

golang辦公流程引擎初體驗js-ojus/flow——系列三

golang辦公流程引擎初體驗js-ojus/flow——系列四

 

今天嘗試怎樣將這個引擎放到項目中

首先go get 下來release包,readme裏說不要用master下的。

然後將doc.go中init裏添加數據庫連接信息

func init() {
	f := log.Flags()
	log.SetFlags(f | log.Lmicroseconds | log.Lshortfile)
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	RegisterDB(tdb)
}

在beego裏新建一個項目flowtest

controllers代碼如下

package controllers

import (
	"database/sql"
	"github.com/astaxie/beego"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/js-ojus/flow"
	"log"
	"strconv"
)

// Flowtest API
type MainController struct {
	beego.Controller
}

func (c *MainController) Get() {
	c.Data["Website"] = "beego.me"
	c.Data["Email"] = "[email protected]"
	c.TplName = "index.tpl"
}

// @Title show wf page
// @Description show workflow page
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 articls not found
// @router /workflow [get]
// 頁面
func (c *MainController) WorkFlow() {
	c.TplName = "index.tpl"
}

// @Title post wf doctype...
// @Description post workflowdoctype..
// @Param name query string  true "The name of doctype"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowtype [post]
// 管理員定義流程類型doctype、流程狀態state、流程節點node、
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowType() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	name := c.Input().Get("name")
	//定義流程類型
	_, err := flow.DocTypes.New(tx, name) //"圖紙設計流程"
	if err != nil {
		fmt.Println(err)
	}

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf docstate...
// @Description post workflowdocstate..
// @Param name query string  true "The name of docstate"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowstate [post]
// 管理員定義流程類型doctype、流程狀態state、流程節點node、
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowState() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	name := c.Input().Get("name")
	//定義流程狀態
	_, err := flow.DocStates.New(tx, name) //"設計中..."
	if err != nil {
		fmt.Println(err)
	}

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf docaction...
// @Description post workflowdocaction..
// @Param name query string  true "The name of docaction"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowaction [post]
// 管理員定義流程類型doctype、流程狀態state、流程節點node、
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowAction() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	name := c.Input().Get("name")
	//定義流程動作類型
	_, err := flow.DocActions.New(tx, name, false) //"設計完成後提交"改變狀態設計中...爲校覈中...
	if err != nil {
		fmt.Println(err)
	}

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf transition...
// @Description post transition..
// @Param name query string  true "The name of transition"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowtransition [post]
// 管理員定義流程類型doctype、流程狀態state、流程節點node、
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowTransition() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	dtID := c.Input().Get("dtID")
	//pid轉成64爲
	dtID1, err := strconv.ParseInt(dtID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	dsID1str := c.Input().Get("dsID1")
	dsID1, err := strconv.ParseInt(dsID1str, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	daID := c.Input().Get("daID")
	daID1, err := strconv.ParseInt(daID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	dsID2str := c.Input().Get("dsID2")
	dsID2, err := strconv.ParseInt(dsID2str, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//添加流程規則1:oldstate1 action1 newstate2
	err = flow.DocTypes.AddTransition(tx, flow.DocTypeID(dtID1), flow.DocStateID(dsID1), flow.DocActionID(daID1), flow.DocStateID(dsID2))
	if err != nil {
		beego.Error(err)
	}
	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf Workflow...
// @Description post Workflow..
// @Param name query string  true "The name of Workflow"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowworkflow [post]
// 管理員定義流程Workflow
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowWorkflow() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()
	dtID := c.Input().Get("dtID")
	//pid轉成64爲
	dtID1, err := strconv.ParseInt(dtID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	dsID1str := c.Input().Get("dsID1")
	dsID1, err := strconv.ParseInt(dsID1str, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//定義流程類型doctype下的唯一流程workflow
	workflowID1, err := flow.Workflows.New(tx, "圖紙設計-三級校審流程", flow.DocTypeID(dtID1), flow.DocStateID(dsID1)) //初始狀態是“設計中...”——校覈——審查——完成
	if err != nil {
		fmt.Println(err)
	}

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf AccessContext...
// @Description post AccessContext..
// @Param name query string  true "The name of AccessContext"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowaccesscontext [post]
// 管理員定義流程AccessContext
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowAccessContext() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	name := c.Input().Get("name")
	//定義用戶、組、角色、權限集合
	_, err := flow.AccessContexts.New(tx, name) //"Context"
	if err != nil {
		beego.Error(err)
	}

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf Node...
// @Description post Node..
// @Param name query string  true "The name of Node"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flownode [post]
// 管理員定義流程Node
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowNode() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	name := c.Input().Get("name")
	dtID := c.Input().Get("dtID")
	//pid轉成64爲
	dtID1, err := strconv.ParseInt(dtID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	dsID1str := c.Input().Get("dsID1")
	dsID1, err := strconv.ParseInt(dsID1str, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	acID1str := c.Input().Get("acID1")
	acID1, err := strconv.ParseInt(acID1str, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//根據doctypeid獲得workflow
	workflow, err := flow.Workflows.GetByDocType(flow.DocTypeID(dtID1))
	//定義流程類型workflow下的具體每個節點node,用戶對文件執行某個動作(event裏的action)後,會沿着這些節點走
	_, err = flow.Workflows.AddNode(tx, flow.DocTypeID(dtID1), flow.DocStateID(dsID1), flow.AccessContextID(acID1), workflow.ID, name, flow.NodeTypeBegin)
	if err != nil {
		fmt.Println(err)
	}

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf user...
// @Description post user..
// @Param name query string  true "The name of user"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowuser [post]
// 管理員定義流程user
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowUser() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	//定義用戶-組-角色-權限關係
	res, err := tx.Exec(`INSERT INTO users_master(first_name, last_name, email, active)
			VALUES('秦', '曉川-1', '[email protected]', 1)`)
	if err != nil {
		log.Fatalf("%v\n", err)
	}
	uid, _ := res.LastInsertId()
	uID1 := flow.UserID(uid)
	_, err = flow.Groups.NewSingleton(tx, uID1)

	res, err = tx.Exec(`INSERT INTO users_master(first_name, last_name, email, active)
			VALUES('秦', '曉川-2', '[email protected]', 1)`)
	if err != nil {
		log.Fatalf("%v\n", err)
	}
	uid, _ = res.LastInsertId()
	uID2 := flow.UserID(uid)
	_, err = flow.Groups.NewSingleton(tx, uID2)

	res, err = tx.Exec(`INSERT INTO users_master(first_name, last_name, email, active)
			VALUES('秦', '曉川-3', '[email protected]', 1)`)
	if err != nil {
		log.Fatalf("%v\n", err)
	}
	uid, _ = res.LastInsertId()
	uID3 := flow.UserID(uid)
	_, err = flow.Groups.NewSingleton(tx, uID3)

	res, err = tx.Exec(`INSERT INTO users_master(first_name, last_name, email, active)
			VALUES('秦', '曉川-4', '[email protected]', 1)`)
	if err != nil {
		log.Fatalf("%v\n", err)
	}
	uid, _ = res.LastInsertId()
	uID4 := flow.UserID(uid)
	_, err = flow.Groups.NewSingleton(tx, uID4)

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf Group...
// @Description post Group..
// @Param name query string  true "The name of Group"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowgroup [post]
// 管理員定義流程Group
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowGroup() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	_, err := flow.Groups.New(tx, "設計人員組", "G") //).(flow.GroupID)
	if err != nil {
		beego.Error(err)
	}
	// gID2 := fatal1(flow.Groups.New(tx, "校覈人員組", "G")).(flow.GroupID)

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf GroupUser...
// @Description post Group..
// @Param name query string  true "The name of GroupUser"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowgroupuser [post]
// 管理員定義流程GroupUser
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowGroupUser() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	gID := c.Input().Get("gID")
	//pid轉成64爲
	gID1, err := strconv.ParseInt(gID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	uID := c.Input().Get("uID")
	//pid轉成64爲
	uID1, err := strconv.ParseInt(uID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	err = flow.Groups.AddUser(tx, flow.GroupID(gID1), flow.UserID(uID1))
	if err != nil {
		beego.Error(err)
	}
	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf Role...
// @Description post Role..
// @Param name query string  true "The name of Role"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowrole [post]
// 管理員定義流程Role
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowRole() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	_, err := flow.Roles.New(tx, "設計人員角色")
	if err != nil {
		beego.Error(err)
	}
	// roleID2 := fatal1(flow.Roles.New(tx, "校覈人員角色")).(flow.RoleID)

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf Permission...
// @Description post Permission..
// @Param name query string  true "The name of Permission"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowpermission [post]
// 管理員定義流程Permission
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowPermission() {
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	roleID := c.Input().Get("roleID1")
	//pid轉成64爲
	roleID1, err := strconv.ParseInt(roleID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	dtID := c.Input().Get("dtID")
	//pid轉成64爲
	dtID1, err := strconv.ParseInt(dtID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//根據用戶選擇的動作
	var actions []flow.DocActionID //[]flow.DocActionID{daID1, daID2, daID3, daID4}
	//給角色role賦予action權限
	err = flow.Roles.AddPermissions(tx, flow.RoleID(roleID1), flow.DocTypeID(dtID1), actions)

	if err != nil {
		beego.Error(err)
	}
	// fatal0(flow.Roles.AddPermissions(tx, roleID2, dtID1, []flow.DocActionID{daID1, daID2, daID3, daID4, daID5, daID6, daID7}))

	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf GroupRole...
// @Description post GroupRole..
// @Param name query string  true "The name of GroupRole"
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowgrouprole [post]
// 管理員定義流程GroupRole
// 流程動作action、流程流向transition、流程事件event
func (c *MainController) FlowGroupRole() {
	// func init() {
	// orm.RegisterDriver("mysql", orm.DRMySQL)//註冊驅動
	// orm.RegisterModel(new(Model))//註冊 model
	// orm.RegisterDataBase("default", "mysql", "test:123456@/test?charset=utf8",30,30)//註冊默認數據庫
	//orm.RegisterDataBase("default", "mysql", "test:@/test?charset=utf8")//密碼爲空格式
	// }
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, _ := db.Begin()
	db.Close()

	acID := c.Input().Get("acID1")
	//pid轉成64爲
	acID1, err := strconv.ParseInt(acID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	gID := c.Input().Get("gID1")
	//pid轉成64爲
	gID1, err := strconv.ParseInt(gID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	roleID := c.Input().Get("roleID1")
	//pid轉成64爲
	roleID1, err := strconv.ParseInt(roleID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//給用戶組group賦予角色role
	err = flow.AccessContexts.AddGroupRole(tx, flow.AccessContextID(acID1), flow.GroupID(gID1), flow.RoleID(roleID1))
	if err != nil {
		beego.Error(err)
	}
	tx.Commit() //這個必須要!!!!!!

	c.Data["json"] = "ok"
	c.ServeJSON()
}

// @Title post wf state
// @Description post workflow state
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowdocevent [get]
// 每次新建一個文件,自動對文件進行流程初始化,即,進行定義動作事件
func (c *MainController) FlowDocEvent() {
	//連接數據庫
	driver, connStr := "mysql", "travis@/flow?charset=utf8&parseTime=true"
	tdb := fatal1(sql.Open(driver, connStr)).(*sql.DB)
	if tdb == nil {
		log.Fatal("given database handle is `nil`")
	}
	db := tdb
	tx, err := db.Begin()
	if err != nil {
		beego.Error(err)
	}

	//查詢預先定義的doctype流程類型
	dtID1, err := flow.DocTypes.GetByName("圖紙設計")
	if err != nil {
		beego.Error(err)
	}
	beego.Info(dtID1)
	//查詢預先定義的docstate狀態1
	dsID1, err := flow.DocStates.GetByName("設計中...")
	if err != nil {
		fmt.Println(err)
	}
	beego.Info(dsID1)
	//查詢預先定義的docstate狀態2
	dsID2, err := flow.DocStates.GetByName("校覈中...")
	if err != nil {
		fmt.Println(err)
	}
	beego.Info(dsID2)
	//查詢預先定義的docstate狀態3
	dsID3, err := flow.DocStates.GetByName("審查中...")
	if err != nil {
		fmt.Println(err)
	}
	beego.Info(dsID3)
	//查詢預先定義的action動作1
	daID1, err := flow.DocActions.GetByName("提交設計")
	if err != nil {
		fmt.Println(err)
	}
	beego.Info(daID1)
	//查詢預先定義的action動作2
	daID2, err := flow.DocActions.GetByName("校覈") //應該叫"提交校覈"
	if err != nil {
		fmt.Println(err)
	}
	beego.Info(daID2)
	//查詢預先定義的action動作3
	daID3, err := flow.DocActions.GetByName("審查") //應該叫"提交審查"
	if err != nil {
		fmt.Println(err)
	}
	beego.Info(daID3)
	//查詢預先定義的流程類型workflow,這個相當於doctype下面再分很多種流程
	//比如doctype爲圖紙設計流程,下面可以分爲二級校審流程,三級校審流程,四級校審流程
	myWorkflow, err := flow.Workflows.GetByName("圖紙設計-三級校審流程")
	if err != nil {
		beego.Error(err)
	}
	beego.Info(myWorkflow)
	//查詢context——這個應該是管理用戶-組-權限的
	accessContextID1, err := flow.AccessContexts.List("Context", 0, 0)
	if err != nil {
		beego.Error(err)
	}
	beego.Info(accessContextID1[0].ID)

	beego.Info(flow.GroupID(1))
	//開始爲具體一個文件設立流程-此處是新建一個文件。對於舊文件應該怎麼操作來着?
	//document根據doctype取得唯一workflow的state作爲document的state
	docNewInput := flow.DocumentsNewInput{
		DocTypeID:       dtID1.ID,                //屬於圖紙設計類型的流程
		AccessContextID: accessContextID1[0].ID,  //所有用戶權限符合這個contex的要求
		GroupID:         11,                      //groupId,初始狀態下的用戶組,必須是個人用戶組(一個用戶也可以成爲一個獨特的組,因爲用戶無法賦予角色,所以必須將用戶放到組裏)
		Title:           "廠房佈置圖",                 //這個文件的名稱
		Data:            "設計、製圖: 秦曉川1, 校覈: 秦曉川2", //文件的描述
	}
	// flow.Documents.New(tx, &docNewInput)
	DocumentID1, err := flow.Documents.New(tx, &docNewInput)
	if err != nil {
		beego.Error(err)
	}
	// tx.Commit() //new後面一定要跟commit
	beego.Info(DocumentID1)

	beego.Info(daID2)
	beego.Info(flow.GroupID(12))
	//建立好document,循環建立events,根據哪個來建立?
	//根據document的Doctypes.Transitions獲取state和action
	//循環建立events,然後展示給客戶端
	//用戶點開這個文件,根據文件的狀態,list出所有這個狀態的events,比如前進,後退等
	docEventInput := flow.DocEventsNewInput{
		DocTypeID:   dtID1.ID, //flow.DocTypeID(1),
		DocumentID:  DocumentID1,
		DocStateID:  dsID1.ID, //document state must be this state,文檔的現狀狀態
		DocActionID: daID2.ID, //flow.DocActionID(2),
		GroupID:     12,       //必須是個人用戶組
		Text:        "校覈",
	}

	docEventID1, err := flow.DocEvents.New(tx, &docEventInput)
	if err != nil {
		beego.Error(err)
	}
	tx.Commit() //一個函數裏只能有一個commit!
	beego.Info(docEventID1)
	c.Data["json"] = "OK"
	c.ServeJSON()
}

// @Title post wf doclist
// @Description post workflow doclist
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowdoclist [get]
// 文件列表頁,水平顯示每個文件的狀態
func (c *MainController) FlowDocList() {

	documentslistinput := flow.DocumentsListInput{
		DocTypeID:       1, // Documents of this type are listed; required
		AccessContextID: 1, // Access context from within which to list; required
		GroupID:         1, // 本人所在的組List documents created by this (singleton) group
		DocStateID:      1, // 忽略List documents currently in this state
		//CtimeStarting:   time.Now(), // List documents created after this time
		//CtimeBefore:     time.Now(), // List documents created before this time
		//TitleContains:   string,     // List documents whose title contains the given text; expensive operation
		//RootOnly:        bool,       // List only root (top-level) documents
	}
	var offset, limit int64
	offset = 0
	limit = 0
	_, err := flow.Documents.List(&documentslistinput, offset, limit)
	if err != nil {
		beego.Error(err)
	}

}

// @Title post wf state
// @Description post workflow state
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flowdocshow [get]
// 顯示具體文件的操作按鈕-events:
func (c *MainController) FlowDocShow() {
	var tx *sql.Tx
	dtID := c.Input().Get("dtID1")
	//pid轉成64爲
	dtID1, err := strconv.ParseInt(dtID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	docID := c.Input().Get("docid")
	//pid轉成64爲
	docID1, err := strconv.ParseInt(docID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//根據客戶端document的id取得document
	DocumentID1, err := flow.Documents.Get(tx, flow.DocTypeID(dtID1), flow.DocumentID(docID1))
	if err != nil {
		beego.Error(err)
	}
	//用戶點開這個文件,根據文件的狀態,list出所有這個狀態的events,比如前進,後退等
	//doctypeid從哪來?所有操作都帶doctype吧,因爲當前走的流程都屬於這個doctype下的
	docEventListInput := flow.DocEventsListInput{
		DocTypeID:       flow.DocTypeID(dtID1), // Events on documents of this type are listed
		AccessContextID: DocumentID1.AccCtx.ID, // Access context from within which to list
		GroupID:         DocumentID1.Group.ID,  // List events created by this (singleton) group
		DocStateID:      DocumentID1.State.ID,  // List events acting on this state
		// CtimeStarting:   time.Time,             // List events created after this time
		// CtimeBefore:     time.Time,             // List events created before this time
		Status: flow.EventStatusAll, // EventStatusAll,List events that are in this state of application
	}
	var offset, limit int64
	offset = 0
	limit = 0
	myDocEvent, err := flow.DocEvents.List(&docEventListInput, offset, limit)
	if err != nil {
		beego.Error(err)
	}
	beego.Info(myDocEvent)
}

// @Title post wf next
// @Description post workflow next
// @Success 200 {object} models.GetProductsPage
// @Failure 400 Invalid page supplied
// @Failure 404 data not found
// @router /flownext [post]
// 用戶點擊提交,前進——或,回退 等
func (c *MainController) FlowNext() {
	var tx *sql.Tx
	//客戶界面設計上:設計中,然後點擊按鈕提交,這個提交動作怎麼自動賦予的?
	//是系統根據文件的狀態列出所有可能的events
	//根據documentid,查出document,
	//根據doctypeid,查出workflow

	wfID := c.Input().Get("wfID1")
	//pid轉成64爲
	wfID1, err := strconv.ParseInt(wfID, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	deID := c.Input().Get("deID1")
	deID1, err := strconv.ParseInt(deID, 10, 64)
	if err != nil {
		beego.Error(err)
	}

	myWorkflow, err := flow.Workflows.Get(flow.WorkflowID(wfID1))
	if err != nil {
		beego.Error(err)
	}
	beego.Info(myWorkflow)

	//針對具體一個文件定義動作事件,從"校覈中……"狀態通過動作"校覈"將它修改爲"審查中……"
	myDocEvent, err := flow.DocEvents.Get(flow.DocEventID(deID1))
	if err != nil {
		beego.Error(err)
	}
	var groupIds []flow.GroupID
	newDocStateId, err := myWorkflow.ApplyEvent(tx, myDocEvent, groupIds)
	if err != nil {
		beego.Error(err)
	}
	tx.Commit() //一個函數裏只能有一個commit
	fmt.Println("newDocStateId=", newDocStateId, err)

	c.Data["json"] = "OK"
	c.ServeJSON()
}

// 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
}

// error0 expects only an error value as its argument.
func error0(err error) error {
	if err != nil {
		fmt.Println("%v", err)
	}
	return err
}

// error1 expects a value and an error value as its arguments.
func error1(val1 interface{}, err error) interface{} {
	if err != nil {
		fmt.Println("%v", err)
		return nil
	}
	return val1
}

// fatal0 expects only an error value as its argument.
func fatal0(err error) {
	if err != nil {
		fmt.Println("%v", err)
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章