|
|
|
package service
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"gofaster/internal/workflow/model"
|
|
|
|
"gofaster/internal/workflow/repository"
|
|
|
|
)
|
|
|
|
|
|
|
|
type WorkflowService struct {
|
|
|
|
repo *repository.WorkflowRepo
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewWorkflowService(repo *repository.WorkflowRepo) *WorkflowService {
|
|
|
|
return &WorkflowService{repo: repo}
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateWorkflow 创建工作流定义
|
|
|
|
func (s *WorkflowService) CreateWorkflow(workflow *model.Workflow) error {
|
|
|
|
if workflow.Name == "" {
|
|
|
|
return errors.New("工作流名称不能为空")
|
|
|
|
}
|
|
|
|
return s.repo.CreateWorkflow(workflow)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetWorkflowByID 获取工作流定义
|
|
|
|
func (s *WorkflowService) GetWorkflowByID(id uint) (*model.Workflow, error) {
|
|
|
|
return s.repo.GetWorkflowByID(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListWorkflows 列出工作流定义
|
|
|
|
func (s *WorkflowService) ListWorkflows(page, pageSize int) ([]model.Workflow, int64, error) {
|
|
|
|
if page < 1 {
|
|
|
|
page = 1
|
|
|
|
}
|
|
|
|
if pageSize < 1 || pageSize > 100 {
|
|
|
|
pageSize = 10
|
|
|
|
}
|
|
|
|
return s.repo.ListWorkflows(page, pageSize)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateWorkflow 更新工作流定义
|
|
|
|
func (s *WorkflowService) UpdateWorkflow(workflow *model.Workflow) error {
|
|
|
|
if workflow.Name == "" {
|
|
|
|
return errors.New("工作流名称不能为空")
|
|
|
|
}
|
|
|
|
return s.repo.UpdateWorkflow(workflow)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeleteWorkflow 删除工作流定义
|
|
|
|
func (s *WorkflowService) DeleteWorkflow(id uint) error {
|
|
|
|
// 检查是否有运行中的实例
|
|
|
|
count, err := s.repo.CountInstances(id)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if count > 0 {
|
|
|
|
return errors.New("存在运行中的实例,无法删除")
|
|
|
|
}
|
|
|
|
return s.repo.DeleteWorkflow(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
// AddNode 添加工作流节点
|
|
|
|
func (s *WorkflowService) AddNode(node *model.WorkflowNode) error {
|
|
|
|
if node.Name == "" {
|
|
|
|
return errors.New("节点名称不能为空")
|
|
|
|
}
|
|
|
|
if node.Type == "" {
|
|
|
|
return errors.New("节点类型不能为空")
|
|
|
|
}
|
|
|
|
return s.repo.AddNode(node)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateNode 更新工作流节点
|
|
|
|
func (s *WorkflowService) UpdateNode(node *model.WorkflowNode) error {
|
|
|
|
if node.Name == "" {
|
|
|
|
return errors.New("节点名称不能为空")
|
|
|
|
}
|
|
|
|
if node.Type == "" {
|
|
|
|
return errors.New("节点类型不能为空")
|
|
|
|
}
|
|
|
|
return s.repo.UpdateNode(node)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeleteNode 删除工作流节点
|
|
|
|
func (s *WorkflowService) DeleteNode(id uint) error {
|
|
|
|
// 检查节点是否被使用
|
|
|
|
count, err := s.repo.CountNodeReferences(id)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if count > 0 {
|
|
|
|
return errors.New("节点已被使用,无法删除")
|
|
|
|
}
|
|
|
|
return s.repo.DeleteNode(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateInstance 创建工作流实例
|
|
|
|
func (s *WorkflowService) CreateInstance(instance *model.WorkflowInstance) error {
|
|
|
|
return s.repo.CreateInstance(instance)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetInstanceByID 获取工作流实例
|
|
|
|
func (s *WorkflowService) GetInstanceByID(id uint) (*model.WorkflowInstance, error) {
|
|
|
|
return s.repo.GetInstanceByID(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListInstances 列出工作流实例
|
|
|
|
func (s *WorkflowService) ListInstances(workflowID uint, page, pageSize int) ([]model.WorkflowInstance, int64, error) {
|
|
|
|
if page < 1 {
|
|
|
|
page = 1
|
|
|
|
}
|
|
|
|
if pageSize < 1 || pageSize > 100 {
|
|
|
|
pageSize = 10
|
|
|
|
}
|
|
|
|
return s.repo.ListInstances(workflowID, page, pageSize)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CancelInstance 取消工作流实例
|
|
|
|
func (s *WorkflowService) CancelInstance(id uint) error {
|
|
|
|
instance, err := s.repo.GetInstanceByID(id)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if instance.Status == "completed" || instance.Status == "canceled" {
|
|
|
|
return errors.New("实例已结束,无法取消")
|
|
|
|
}
|
|
|
|
|
|
|
|
instance.Status = "canceled"
|
|
|
|
return s.repo.UpdateInstance(instance)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateTask 创建工作流任务
|
|
|
|
func (s *WorkflowService) CreateTask(task *model.WorkflowTask) error {
|
|
|
|
return s.repo.CreateTask(task)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetTaskByID 获取工作流任务
|
|
|
|
func (s *WorkflowService) GetTaskByID(id uint) (*model.WorkflowTask, error) {
|
|
|
|
return s.repo.GetTaskByID(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListTasksByInstance 列出实例任务
|
|
|
|
func (s *WorkflowService) ListTasksByInstance(instanceID uint) ([]model.WorkflowTask, error) {
|
|
|
|
return s.repo.ListTasksByInstance(instanceID)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateTask 更新工作流任务
|
|
|
|
func (s *WorkflowService) UpdateTask(task *model.WorkflowTask) error {
|
|
|
|
return s.repo.UpdateTask(task)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetUserTasks 获取用户任务
|
|
|
|
func (s *WorkflowService) GetUserTasks(userID uint, status string) ([]*model.WorkflowTask, error) {
|
|
|
|
if status != "" {
|
|
|
|
return s.repo.ListTasksByUserAndStatus(userID, status)
|
|
|
|
}
|
|
|
|
return s.repo.ListTasksByUser(userID)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CompleteTask 完成任务
|
|
|
|
func (s *WorkflowService) CompleteTask(taskID uint, result string) error {
|
|
|
|
task, err := s.repo.GetTaskByID(taskID)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
task.Status = "completed"
|
|
|
|
task.Result = result
|
|
|
|
return s.repo.UpdateTask(task)
|
|
|
|
}
|