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

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)
}