|
|
|
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")
|
|
|
|
// 这里可以添加资源释放逻辑
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start 启动工作流模块
|
|
|
|
func (m *WorkflowModule) Start(config *config.Config, db *gorm.DB) error {
|
|
|
|
m.logger.Info("Starting workflow module")
|
|
|
|
// 这里可以添加启动逻辑,比如启动工作流引擎
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Stop 停止工作流模块
|
|
|
|
func (m *WorkflowModule) Stop() error {
|
|
|
|
m.logger.Info("Stopping workflow module")
|
|
|
|
// 这里可以添加停止逻辑,比如停止工作流引擎
|
|
|
|
return nil
|
|
|
|
}
|