You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.6 KiB
95 lines
2.6 KiB
1 month ago
|
package workflow
|
||
|
|
||
|
import (
|
||
|
"gofaster/internal/core"
|
||
|
"gofaster/internal/shared/config"
|
||
|
"gofaster/internal/shared/database"
|
||
|
"gofaster/internal/workflow/controller"
|
||
|
"gofaster/internal/workflow/model"
|
||
|
"gofaster/internal/workflow/repository"
|
||
|
"gofaster/internal/workflow/service"
|
||
|
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"go.uber.org/zap"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
type WorkflowModule struct {
|
||
|
workflowCtrl *controller.WorkflowController
|
||
|
engine *service.WorkflowEngine
|
||
|
logger *zap.Logger
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
core.RegisterModuleType(&WorkflowModule{})
|
||
|
}
|
||
|
|
||
|
func (m *WorkflowModule) Name() string {
|
||
|
return "workflow"
|
||
|
}
|
||
|
|
||
|
func (m *WorkflowModule) Init(config *config.Config, logger *zap.Logger, db *gorm.DB, redis *database.RedisClient) error {
|
||
|
m.logger = logger
|
||
|
|
||
|
// 初始化仓库
|
||
|
workflowRepo := repository.NewWorkflowRepo(db)
|
||
|
|
||
|
// 初始化服务
|
||
|
workflowService := service.NewWorkflowService(workflowRepo)
|
||
|
m.engine = service.NewWorkflowEngine(db)
|
||
|
|
||
|
// 初始化控制器
|
||
|
m.workflowCtrl = controller.NewWorkflowController(workflowService, m.engine)
|
||
|
|
||
|
// 自动迁移工作流相关表
|
||
|
if err := db.AutoMigrate(
|
||
|
&model.Workflow{},
|
||
|
&model.WorkflowNode{},
|
||
|
&model.WorkflowInstance{},
|
||
|
&model.WorkflowTask{},
|
||
|
); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
m.logger.Info("Workflow module initialized successfully")
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (m *WorkflowModule) RegisterRoutes(router *gin.RouterGroup) {
|
||
|
// 工作流基础路由
|
||
|
workflowGroup := router.Group("/workflows")
|
||
|
{
|
||
|
workflowGroup.POST("", m.workflowCtrl.CreateWorkflow)
|
||
|
workflowGroup.GET("", m.workflowCtrl.ListWorkflows)
|
||
|
workflowGroup.GET("/:id", m.workflowCtrl.GetWorkflow)
|
||
|
workflowGroup.PUT("/:id", m.workflowCtrl.UpdateWorkflow)
|
||
|
workflowGroup.DELETE("/:id", m.workflowCtrl.DeleteWorkflow)
|
||
|
|
||
|
// 工作流节点路由
|
||
|
workflowGroup.POST("/:id/nodes", m.workflowCtrl.AddNode)
|
||
|
workflowGroup.PUT("/nodes/:node_id", m.workflowCtrl.UpdateNode)
|
||
|
workflowGroup.DELETE("/nodes/:node_id", m.workflowCtrl.DeleteNode)
|
||
|
}
|
||
|
|
||
|
// 工作流实例路由
|
||
|
instanceGroup := router.Group("/workflow-instances")
|
||
|
{
|
||
|
instanceGroup.POST("", m.workflowCtrl.StartWorkflow)
|
||
|
instanceGroup.GET("", m.workflowCtrl.ListInstances)
|
||
|
instanceGroup.GET("/:id", m.workflowCtrl.GetInstance)
|
||
|
instanceGroup.PUT("/:id/cancel", m.workflowCtrl.CancelInstance)
|
||
|
|
||
|
// 任务路由
|
||
|
instanceGroup.GET("/:id/tasks", m.workflowCtrl.ListTasks)
|
||
|
instanceGroup.POST("/tasks/:task_id/process", m.workflowCtrl.ProcessTask)
|
||
|
}
|
||
|
|
||
|
// 用户任务路由
|
||
|
router.GET("/my-tasks", m.workflowCtrl.GetUserTasks)
|
||
|
}
|
||
|
|
||
|
func (m *WorkflowModule) Cleanup() {
|
||
|
m.logger.Info("Cleaning up workflow module")
|
||
|
// 这里可以添加资源释放逻辑
|
||
|
}
|