# goravel-workflow **Repository Path**: hulutech/goravel-workflow ## Basic Information - **Project Name**: goravel-workflow - **Description**: a golang workflow-engine,base on goravel framework - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-24 - **Last Updated**: 2024-12-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言, 流程审批 ## README

### 演示

### 文档 使用手册请访问[文档](https://hulutech-web.github.io/goravel-workflow.github.io/) ### 一、安装 ```shell go get github.com/hulutech-web/goravel-workflow ``` #### 1.1 注册服务提供者:config/app.go ```shell import "github.com/hulutech-web/goravel-workflow" ``` #### 1.2 注册服务提供者:config/app.go ```go func init() { "providers": []foundation.ServiceProvider{ .... &workflow.ServiceProvider{}, } } ``` ### 二、发布资源,默认将发布2类资源,一是配置文件,而是数据表迁移 #### 2.1 发布资源:config/app.go ```shell go run . artisan vendor:publish --package=github.com/hulutech-web/goravel-workflow ``` #### 2.2 发布迁移文件:database ```shell artisan vendor:publish --package=github.com/hulutech-web/goravel-workflow ``` #### 2.3 执行迁移建表 在database/seeders/database_seeder.go下的添加 ```go func (s *DatabaseSeeder) Run() error { return facades.Seeder().Call([]seeder.Seeder{ &WorkflowDatabaseSeeder{}, }) } ``` #### 2.4 执行迁移 ```shell go run . artisan migrate:refresh --seed ``` #### 2.5 检查路由重名 如果启动项目报错,请检查路由是否有重名,并修改路由 #### 2.6 模型映射 发布资源后,config/workflow.go中的配置文件中有默认的关联映射,根据需要自行修改和修改 ### 三、实现Hook接口(可选) 用户自定义User结构中注入流程框架,并实现框架中的Hook接口 ```go type User struct { orm.Model Name string `gorm:"column:name;type:varchar(255);not null" form:"name" json:"name"` WorkNo string `gorm:"column:workno;not null;unique_index:users_workno_unique" json:"workno" form:"workno"` Password string `gorm:"column:password;type:varchar(255);not null" form:"password" json:"password"` ... Workflow *Workflow orm.SoftDeletes } ``` 实现接口 ```go // 通知发起人,在被驳回时调用,或者整个流程结束时调用。 func (u *User) NotifySendOne(id uint) error { fmt.Printf("custom ======User %d unpasshook called.\n", id) return nil } // 通知下一个审批人,当当前环节的审批人通过时,触发。 func (u *User) NotifyNextAuditor(id uint) error { fmt.Printf("custom ======User %d passhook called.\n", id) return nil } ``` ### 实例化workflow 框架提供了2个``hooks``,供开发者自行实现逻辑,可以发送邮件通知,短信通知等 ``app/providers/app_services_provider.go`` 实例化workflow,并注入服务 ```go func (receiver *AppServiceProvider) Boot(app foundation.Application) { wf := workflow.NewBaseWorkflow() // 注册子级的方法到工作流中 user := &models.User{Workflow: wf} wf.RegisterHook("NotifySendOneHook", reflect.ValueOf(user.NotifySendOne)) wf.RegisterHook("NotifyNextAuditorHook", reflect.ValueOf(user.NotifyNextAuditor)) } 回调参数将在User结构中的NotifySendOne和NotifyNextAuditor方法中执行后续操作,由开发者自行实现 ``` ### 二、框架路由说明 ```go package routes import ( "github.com/goravel/framework/contracts/foundation" "github.com/goravel/framework/contracts/route" "github.com/goravel/framework/facades" controllers "github.com/hulutech-web/goravel-workflow/controllers" "github.com/hulutech-web/goravel-workflow/middleware" ) func Api(app foundation.Application) { router := app.MakeRoute() authController := controllers.NewAuthController() router.Post("/api/auth/login", authController.AdminLogin) router.Post("/api/h5/login", authController.H5Login) captchaController := controllers.NewCaptchaController() router.Get("/api/captcha/get", captchaController.GetCaptcha) router.Post("/api/captcha/validate", captchaController.ValidateCaptcha) facades.Route().Middleware(middleware.Jwt()).Prefix("/api").Group(func(router route.Router) { //文件上传 uploadCtrl := controllers.NewUploadController() router.Post("/upload", uploadCtrl.Upload) homeCtrl := controllers.NewHomeController() router.Get("/home", homeCtrl.Index) // 部门 deptCtrl := controllers.NewDeptController() router.Resource("dept", deptCtrl) router.Post("dept/bindmanager", deptCtrl.BindManager) router.Post("dept/binddirector", deptCtrl.BindDirector) // 员工 empCtrl := controllers.NewEmpController() router.Resource("emp", empCtrl) router.Post("emp/search", empCtrl.Search) router.Get("emp/options", empCtrl.Options) router.Post("emp/bind", empCtrl.BindUser) //流程 flowCtrl := controllers.NewFlowController() router.Resource("flow", flowCtrl) router.Get("flow/list", flowCtrl.List) router.Get("flow/create", flowCtrl.Create) //流程设计 router.Get("flow/flowchart/{id}", flowCtrl.FlowDesign) router.Post("flow/publish", flowCtrl.Publish) //entry节点 entryCtrl := controllers.NewEntryController() router.Get("flow/{id}/entry", entryCtrl.Create) router.Post("entry", entryCtrl.Store) router.Get("entry/{id}", entryCtrl.Show) router.Get("entry/{id}/entrydata", entryCtrl.EntryData) //流程重发 router.Post("entry/resend", entryCtrl.Resend) //流程轨迹 flowlinkCtrl := controllers.NewFlowlinkController() router.Post("flowlink", flowlinkCtrl.Update) //模板控件 templateformCtrl := controllers.NewTemplateformController() router.Get("template/{id}/templateform", templateformCtrl.Index) router.Post("templateform", templateformCtrl.Store) router.Put("templateform/{id}", templateformCtrl.Update) router.Delete("templateform/{id}", templateformCtrl.Destroy) router.Get("templateform/{id}", templateformCtrl.Show) //模板 templateCtrl := controllers.NewTemplateController() router.Resource("template", templateCtrl) // 流程 processCtrl := controllers.NewProcessController() router.Resource("process", processCtrl) router.Get("process/attribute", processCtrl.Attribute) router.Post("process/con", processCtrl.Condition) // 审批流转 procCtrl := controllers.NewProcController() router.Get("proc/{entry_id}", procCtrl.Index) //同意 router.Post("pass", procCtrl.Pass) //驳回 router.Post("unpass", procCtrl.UnPass) }) } ``` ### 三、前端集成 请访问前端框架[goravel-workflow-vue](https://github.com/hulutech-web/goravel-workflow-vue)下载安装扩展,并按照文档进行集成 ### 四、接口文档 请访问前端框架[goravel-workflow-doc](https://github.com/hulutech-web/goravel-workflow-vuepress)进行查看