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.
171 lines
4.4 KiB
171 lines
4.4 KiB
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) |
|
}
|
|
|