Coze源码分析-资源库-编辑工作流-后端源码-流程/技术/总结

10. 工作流编辑流程图

10.1 UpdateWorkflowMeta接口调用流程

工作流编辑的完整调用流程,从用户点击编辑到响应返回的各个环节。

复制代码
用户点击编辑 → 前端发起编辑请求 → API网关层 → 业务服务层 → 领域服务层 → 数据访问层 → 数据库
                                 ↓           ↓           ↓            ↓          ↓
                            参数验证     权限验证      锁定验证     版本控制      数据更新
                                 ↓           ↓           ↓            ↓          ↓
                           响应格式化    事件发布    缓存刷新     异步索引更新   返回结果

10.2 工作流编辑详细流程说明

API网关层流程

go 复制代码
// UpdateWorkflowMeta API处理函数
func UpdateWorkflowMeta(ctx context.Context, c *app.RequestContext) {
    var req workflow_develop.UpdateWorkflowMetaRequest
    
    // 1. 参数绑定和验证
    err := c.BindAndValidate(&req)
    if err != nil {
        invalidParamRequestResponse(c, err.Error())
        return
    }
    
    // 2. 获取用户信息
    userID := c.GetInt64("user_id")
    req.UserID = userID
    
    // 3. 调用应用层服务
    resp, err := workflow.WorkflowApplicationSVC.UpdateWorkflowMeta(ctx, &req)
    if err != nil {
        // 4. 错误处理
        if errors.Is(err, errorx.New(errno.ErrPluginVersionConflict, "")) {
            conflictResponse(c, err.Error())
            return
        }
        internalServerErrorResponse(ctx, c, err)
        return
    }
    
    // 5. 返回成功响应
    c.JSON(consts.StatusOK, resp)
}

业务服务层流程

go 复制代码
// UpdateWorkflowMeta 应用层工作流编辑方法
func (s *WorkflowApplicationService) UpdateWorkflowMeta(ctx context.Context, req *UpdateWorkflowMetaRequest) (*UpdateWorkflowMetaResponse, error) {
    // 1. 记录编辑操作日志
    logs.CtxInfof(ctx, "Update workflow meta request, userID=%d, workflowID=%d", req.UserID, req.WorkflowID)
    
    // 2. 验证编辑请求
    if err := s.validateUpdateRequest(ctx, req); err != nil {
        return nil, err
    }
    
    // 3. 调用领域服务执行编辑
    updatedWorkflow, err := s.workflowDomainService.UpdateWorkflowMeta(ctx, &domain.UpdateWorkflowRequest{
        WorkflowID:   req.WorkflowID,
        SpaceID:      req.SpaceID,
        Name:         req.Name,
        Desc:         req.Desc,
        CanvasData:   req.CanvasData,
        CommonParams: req.CommonParams,
        Version:      req.Version,
        LockID:       req.LockID,
        UserID:       req.UserID,
    })
    if err != nil {
        return nil, err
    }
    
    // 4. 续期锁定
    if err := s.lockService.ExtendLock(ctx, req.WorkflowID, req.LockID, 30*time.Minute); err != nil {
        logs.CtxWarnf(ctx, "Extend lock failed: %v", err)
    }
    
    // 5. 构建响应
    resp := &UpdateWorkflowMetaResponse{
        Code:       0,
        Msg:        "success",
        Success:    true,
        WorkflowID: updatedWorkflow.ID,
        Version:    updatedWorkflow.Version,
        LockStatus: &LockStatus{
            LockID:       req.LockID,
            ExpireTime:   time.Now().Add(30 * time.Minute).Unix(),
            RenewTime:    time.Now().Unix(),
        },
    }
    
    return resp, nil
}

11. 核心技术特点

11.1 工作流编辑的分层架构设计

Coze工作流编辑系统采用经典的分层架构设计,各层职责明确、耦合度低,便于维护和扩展。整体架构从上到下依次为API层、应用层、领域层、数据访问层和数据存储层。

11.1.1 API层

API层负责接收和响应HTTP请求,对请求进行参数验证,并调用应用层服务处理业务逻辑。

go 复制代码
// API层处理请求示例
type Handler struct {
    workflowSvc workflow.Service
}

func (h *Handler) CreateWorkflow(c echo.Context) error {
    // 参数绑定和验证
    var req vo.CreateWorkflowReq
    if err := c.Bind(&req); err != nil {
        return errno.ErrInvalidParameter
    }
    
    // 调用应用层服务
    workflow, err := h.workflowSvc.Create(c.Request().Context(), &req)
    if err != nil {
        return err
    }
    
    return c.JSON(http.StatusOK, workflow)
}
11.1.2 应用层

应用层封装业务流程,协调不同领域服务的调用,处理事务边界,是业务逻辑的核心实现层。

go 复制代码
// 应用层服务示例
type ServiceImpl struct {
    repo workflow.Repository
}

func (s *ServiceImpl) Create(ctx context.Context, req *vo.CreateWorkflowReq) (*entity.Workflow, error) {
    // 业务逻辑处理
    meta := &vo.Meta{
        Name:        req.Name,
        Desc:        req.Desc,
        SpaceID:     req.SpaceID,
        CreatorID:   req.UserID,
        ContentType: req.ContentType,
        Mode:        req.Mode,
    }
    
    // 调用数据访问层
    id, err := s.repo.CreateMeta(ctx, meta)
    if err != nil {
        return nil, err
    }
    
    return &entity.Workflow{ID: id, Meta: meta}, nil
}
11.1.3 领域层

领域层定义核心业务概念和规则,包含实体、值对象、领域事件等,实现领域内的业务逻辑。

go 复制代码
// 领域实体示例
type Workflow struct {
    ID      int64
    Meta    *vo.Meta
    Draft   *vo.DraftInfo
    Version *vo.VersionInfo
}

type WorkflowReferenceKey struct {
    ReferredID       int64
    ReferringID      int64
    ReferType        vo.ReferType
    ReferringBizType vo.ReferringBizType
}
11.1.4 数据访问层

数据访问层抽象了对数据存储的操作,提供统一的数据访问接口,屏蔽底层存储实现细节。通过Repository模式,将业务逻辑与数据持久化解耦。

go 复制代码
// Repository接口定义
type Repository interface {
    // 元数据操作
    CreateMeta(ctx context.Context, meta *vo.Meta) (int64, error)
    GetMeta(ctx context.Context, id int64) (*vo.Meta, error)
    UpdateMeta(ctx context.Context, id int64, metaUpdate *vo.MetaUpdate) error
    
    // 版本管理
    CreateVersion(ctx context.Context, id int64, info *vo.VersionInfo, newRefs map[entity.WorkflowReferenceKey]struct{}) (err error)
    GetVersion(ctx context.Context, id int64, version string) (*vo.VersionInfo, bool, error)
    GetLatestVersion(ctx context.Context, id int64) (*vo.VersionInfo, error)
    
    // 草稿管理
    CreateOrUpdateDraft(ctx context.Context, id int64, draft *vo.DraftInfo) error
    DraftV2(ctx context.Context, id int64, commitID string) (*vo.DraftInfo, error)
    
    // 批量操作
    MGetMetas(ctx context.Context, query *vo.MetaQuery) (map[int64]*vo.Meta, int64, error)
    MGetReferences(ctx context.Context, policy *vo.MGetReferencePolicy) ([]*entity.WorkflowReference, error)
    Delete(ctx context.Context, id int64) error
    MDelete(ctx context.Context, ids []int64) error
    
    // 其他接口...
    InterruptEventStore
    CancelSignalStore
    ExecuteHistoryStore
    compose.CheckPointStore
    idgen.IDGenerator
    ConversationRepository
    WorkflowConfig
    Suggester
}

Repository实现类通过依赖注入的方式集成各种数据存储组件:

go 复制代码
// Repository实现
type RepositoryImpl struct {
    idgen.IDGenerator
    query *query.Query        // 数据库查询对象
    redis cache.Cmdable       // Redis缓存
    tos   storage.Storage     // 对象存储
    einoCompose.CheckPointStore
    workflow.InterruptEventStore
    workflow.CancelSignalStore
    workflow.ExecuteHistoryStore
    builtinModel cm.BaseChatModel
    workflow.WorkflowConfig
    workflow.Suggester
}

// Repository构造函数
func NewRepository(idgen idgen.IDGenerator, db *gorm.DB, redis cache.Cmdable, tos storage.Storage,
    cpStore einoCompose.CheckPointStore, chatModel cm.BaseChatModel, workflowConfig workflow.WorkflowConfig) (workflow.Repository, error) {
    sg, err := NewSuggester(chatModel)
    if err != nil {
        return nil, err
    }
    return &RepositoryImpl{
        IDGenerator:     idgen,
        query:           query.Use(db),
        redis:           redis,
        tos:             tos,
        CheckPointStore: cpStore,
        InterruptEventStore: &interruptEventStoreImpl{
            redis: redis,
        },
        CancelSignalStore: &cancelSignalStoreImpl{
            redis: redis,
        },
        ExecuteHistoryStore: &executeHistoryStoreImpl{
            query: query.Use(db),
            redis: redis,
        },
        builtinModel:   chatModel,
        Suggester:      sg,
        WorkflowConfig: workflowConfig,
    }, nil
}
11.1.5 数据存储层

数据存储层定义了工作流系统的数据模型,包括元数据、草稿和版本信息等核心存储结构,使用GORM框架进行ORM映射。

WorkflowMeta模型:存储工作流的基础元数据

go 复制代码
// WorkflowMeta 工作流元数据表,用于记录工作流的基本元数据
type WorkflowMeta struct {
    ID              int64          `gorm:"column:id;primaryKey;comment:workflow id" json:"id"`
    Name            string         `gorm:"column:name;not null;comment:workflow name" json:"name"`
    Description     string         `gorm:"column:description;not null;comment:workflow description" json:"description"`
    IconURI         string         `gorm:"column:icon_uri;not null;comment:icon uri" json:"icon_uri"`
    Status          int32          `gorm:"column:status;not null;comment:0: Not published, 1: Published" json:"status"`
    ContentType     int32          `gorm:"column:content_type;not null;comment:0 Users 1 Official" json:"content_type"`
    Mode            int32          `gorm:"column:mode;not null;comment:0:workflow, 3:chat_flow" json:"mode"`
    CreatedAt       int64          `gorm:"column:created_at;not null;autoCreateTime:milli;comment:create time in millisecond" json:"created_at"`
    UpdatedAt       int64          `gorm:"column:updated_at;autoUpdateTime:milli;comment:update time in millisecond" json:"updated_at"`
    DeletedAt       gorm.DeletedAt `gorm:"column:deleted_at;comment:delete time in millisecond" json:"deleted_at"`
    CreatorID       int64          `gorm:"column:creator_id;not null;comment:user id for creator" json:"creator_id"`
    Tag             int32          `gorm:"column:tag;comment:template tag" json:"tag"`
    AuthorID        int64          `gorm:"column:author_id;not null;comment:Original author user ID" json:"author_id"`
    SpaceID         int64          `gorm:"column:space_id;not null;comment:space id" json:"space_id"`
    UpdaterID       int64          `gorm:"column:updater_id;comment:User ID for updating metadata" json:"updater_id"`
    SourceID        int64          `gorm:"column:source_id;comment:Workflow ID of source" json:"source_id"`
    AppID           int64          `gorm:"column:app_id;comment:app id" json:"app_id"`
    LatestVersion   string         `gorm:"column:latest_version;comment:the version of the most recent publish" json:"latest_version"`
    LatestVersionTs int64          `gorm:"column:latest_version_ts;comment:create time of latest version" json:"latest_version_ts"`
}

WorkflowDraft模型:存储工作流的草稿信息

go 复制代码
// WorkflowDraft 工作流画布草稿表,用于记录工作流的最新草稿画布信息
type WorkflowDraft struct {
    ID             int64          `gorm:"column:id;primaryKey;comment:workflow ID" json:"id"`
    Canvas         string         `gorm:"column:canvas;not null;comment:Front end schema" json:"canvas"`
    InputParams    string         `gorm:"column:input_params;comment:Input schema" json:"input_params"`
    OutputParams   string         `gorm:"column:output_params;comment:Output parameter schema" json:"output_params"`
    TestRunSuccess bool           `gorm:"column:test_run_success;not null;comment:0 not running, 1 running successfully" json:"test_run_success"`
    Modified       bool           `gorm:"column:modified;not null;comment:0 has not been modified, 1 has been modified" json:"modified"`
    UpdatedAt      int64          `gorm:"column:updated_at;autoUpdateTime:milli;comment:Update Time in Milliseconds" json:"updated_at"`
    DeletedAt      gorm.DeletedAt `gorm:"column:deleted_at;comment:Delete Time" json:"deleted_at"`
    CommitID       string         `gorm:"column:commit_id;not null;comment:used to uniquely identify a draft snapshot" json:"commit_id"`
}

WorkflowVersion模型:存储工作流的版本信息

go 复制代码
// WorkflowVersion 工作流画布版本信息表,用于记录不同版本的画布信息
type WorkflowVersion struct {
    ID                 int64          `gorm:"column:id;primaryKey;autoIncrement:true;comment:ID" json:"id"`
    WorkflowID         int64          `gorm:"column:workflow_id;not null;comment:workflow id" json:"workflow_id"`
    Version            string         `gorm:"column:version;not null;comment:Published version" json:"version"`
    VersionDescription string         `gorm:"column:version_description;not null;comment:Version Description" json:"version_description"`
    Canvas             string         `gorm:"column:canvas;not null;comment:Front end schema" json:"canvas"`
    InputParams        string         `gorm:"column:input_params;comment:input params" json:"input_params"`
    OutputParams       string         `gorm:"column:output_params;comment:output params" json:"output_params"`
    CreatorID          int64          `gorm:"column:creator_id;not null;comment:creator id" json:"creator_id"`
    CreatedAt          int64          `gorm:"column:created_at;not null;autoCreateTime:milli;comment:Create Time in Milliseconds" json:"created_at"`
    DeletedAt          gorm.DeletedAt `gorm:"column:deleted_at;comment:Delete Time" json:"deleted_at"`
    CommitID           string         `gorm:"column:commit_id;not null;comment:the commit id corresponding to this version" json:"commit_id"`
}
11.1.6 分层架构优势
  1. 职责分离:各层职责明确,关注点分离,便于团队协作开发
  2. 可维护性:业务逻辑与数据访问解耦,修改一处不影响其他部分
  3. 可扩展性:可以独立扩展各层功能,如替换底层存储实现
  4. 可测试性:各层可以独立进行单元测试,提高代码质量
  5. 灵活性:支持多种存储介质,包括关系型数据库、缓存和对象存储

Coze工作流编辑系统通过这种分层架构设计,实现了高度的模块化和灵活性,能够有效支撑复杂的工作流编辑、版本管理和执行功能。

11.2 工作流数据存储和索引技术

工作流编辑采用了优化的数据库存储和索引技术,支持高效的编辑和查询操作。

go 复制代码
// 工作流数据库表结构(支持编辑和版本控制)
type WorkflowDraft struct {
    ID          int64     `gorm:"column:id;primaryKey" json:"id"`
    WorkflowID  string    `gorm:"column:workflow_id;unique;index" json:"workflow_id"`
    SpaceID     int64     `gorm:"column:space_id;index" json:"space_id"`
    Name        string    `gorm:"column:name" json:"name"`
    Version     string    `gorm:"column:version;index" json:"version"` // 乐观锁
    EditCount   int64     `gorm:"column:edit_count" json:"edit_count"`
    LockStatus  int32     `gorm:"column:lock_status" json:"lock_status"`
    UpdatedAt   time.Time `gorm:"column:updated_at" json:"updated_at"`
}

// 工作流ES索引映射(支持实时编辑更新)
type WorkflowESDocument struct {
    ResID        int64  `json:"res_id"`
    ResType      int32  `json:"res_type"`
    WorkflowID   string `json:"workflow_id"`
    SpaceID      int64  `json:"space_id"`
    Name         string `json:"name"`
    Description  string `json:"description"`
    EditorID     int64  `json:"editor_id"`
    Version      string `json:"version"`
    EditCount    int64  `json:"edit_count"`
    UpdateTime   int64  `json:"update_time"`
}

11.3 工作流编辑安全机制

工作流编辑实现了多层次的安全验证机制,确保编辑操作的安全性和合法性。

go 复制代码
// 工作流编辑验证器
func (v *WorkflowEditValidator) ValidateWorkflowEdit(ctx context.Context, req *UpdateWorkflowRequest, userID int64) error {
    // 1. 身份验证
    if userID == 0 {
        return errors.New("用户未登录,无法编辑工作流")
    }
    // 更多验证逻辑...
}

11.4 数据存储层设计

工作流编辑采用了多表协作的数据存储设计,通过元数据、草稿和版本三个核心表实现了完整的数据管理。

go 复制代码
// 1. 工作流元数据表 - 存储工作流基本信息
// workflow_meta表
const TableNameWorkflowMeta = "workflow_meta"

type WorkflowMeta struct {
    ID              int64          `gorm:"column:id;primaryKey;comment:workflow id" json:"id"`
    Name            string         `gorm:"column:name;not null;comment:workflow name" json:"name"`
    Description     string         `gorm:"column:description;not null;comment:workflow description" json:"description"`
    IconURI         string         `gorm:"column:icon_uri;not null;comment:icon uri" json:"icon_uri"`
    Status          int32          `gorm:"column:status;not null;comment:0: Not published, 1: Published" json:"status"`
    ContentType     int32          `gorm:"column:content_type;not null;comment:0 Users 1 Official" json:"content_type"`
    Mode            int32          `gorm:"column:mode;not null;comment:0:workflow, 3:chat_flow" json:"mode"`
    CreatedAt       int64          `gorm:"column:created_at;not null;autoCreateTime:milli;comment:create time in millisecond" json:"created_at"`
    UpdatedAt       int64          `gorm:"column:updated_at;autoUpdateTime:milli;comment:update time in millisecond" json:"updated_at"`
    DeletedAt       gorm.DeletedAt `gorm:"column:deleted_at;comment:delete time in millisecond" json:"deleted_at"`
    CreatorID       int64          `gorm:"column:creator_id;not null;comment:user id for creator" json:"creator_id"`
    AuthorID        int64          `gorm:"column:author_id;not null;comment:Original author user ID" json:"author_id"`
    SpaceID         int64          `gorm:"column:space_id;not null;comment:space id" json:"space_id"`
    UpdaterID       int64          `gorm:"column:updater_id;comment:User ID for updating metadata" json:"updater_id"`
    SourceID        int64          `gorm:"column:source_id;comment:Workflow ID of source" json:"source_id"`
    AppID           int64          `gorm:"column:app_id;comment:app id" json:"app_id"`
    LatestVersion   string         `gorm:"column:latest_version;comment:the version of the most recent publish" json:"latest_version"`
    LatestVersionTs int64          `gorm:"column:latest_version_ts;comment:create time of latest version" json:"latest_version_ts"`
}

// 2. 工作流草稿表 - 存储最新编辑状态
// workflow_draft表
const TableNameWorkflowDraft = "workflow_draft"

type WorkflowDraft struct {
    ID             int64          `gorm:"column:id;primaryKey;comment:workflow ID" json:"id"`
    Canvas         string         `gorm:"column:canvas;not null;comment:Front end schema" json:"canvas"`
    InputParams    string         `gorm:"column:input_params;comment:Input schema" json:"input_params"`
    OutputParams   string         `gorm:"column:output_params;comment:Output parameter schema" json:"output_params"`
    TestRunSuccess bool           `gorm:"column:test_run_success;not null;comment:0 not running, 1 running successfully" json:"test_run_success"`
    Modified       bool           `gorm:"column:modified;not null;comment:0 has not been modified, 1 has been modified" json:"modified"`
    UpdatedAt      int64          `gorm:"column:updated_at;autoUpdateTime:milli;comment:Update Time in Milliseconds" json:"updated_at"`
    DeletedAt      gorm.DeletedAt `gorm:"column:deleted_at;comment:Delete Time" json:"deleted_at"`
    CommitID       string         `gorm:"column:commit_id;not null;comment:used to uniquely identify a draft snapshot" json:"commit_id"`
}

// 3. 工作流版本表 - 存储已发布版本
// workflow_version表
const TableNameWorkflowVersion = "workflow_version"

type WorkflowVersion struct {
    ID                 int64          `gorm:"column:id;primaryKey;autoIncrement:true;comment:ID" json:"id"`
    WorkflowID         int64          `gorm:"column:workflow_id;not null;comment:workflow id" json:"workflow_id"`
    Version            string         `gorm:"column:version;not null;comment:Published version" json:"version"`
    VersionDescription string         `gorm:"column:version_description;not null;comment:Version Description" json:"version_description"`
    Canvas             string         `gorm:"column:canvas;not null;comment:Front end schema" json:"canvas"`
    InputParams        string         `gorm:"column:input_params;comment:input params" json:"input_params"`
    OutputParams       string         `gorm:"column:output_params;comment:output params" json:"output_params"`
    CreatorID          int64          `gorm:"column:creator_id;not null;comment:creator id" json:"creator_id"`
    CreatedAt          int64          `gorm:"column:created_at;not null;autoCreateTime:milli;comment:Create Time in Milliseconds" json:"created_at"`
    DeletedAt          gorm.DeletedAt `gorm:"column:deleted_at;comment:Delete Time" json:"deleted_at"`
    CommitID           string         `gorm:"column:commit_id;not null;comment:the commit id corresponding to this version" json:"commit_id"`
}

11.5 数据访问层实现

数据访问层通过统一的Repository接口提供对工作流数据的访问能力,实现了复杂的查询、更新和事务操作。

go 复制代码
// Repository接口定义 - 提供完整的数据访问能力
type Repository interface {
    // 元数据相关操作
    CreateMeta(ctx context.Context, meta *vo.Meta) (int64, error)
    GetMeta(ctx context.Context, id int64) (*vo.Meta, error)
    UpdateMeta(ctx context.Context, id int64, metaUpdate *vo.MetaUpdate) error
    MGetMetas(ctx context.Context, query *vo.MetaQuery) (map[int64]*vo.Meta, int64, error)
    
    // 版本相关操作
    CreateVersion(ctx context.Context, id int64, info *vo.VersionInfo, newRefs map[entity.WorkflowReferenceKey]struct{}) error
    GetVersion(ctx context.Context, id int64, version string) (*vo.VersionInfo, bool, error)
    GetLatestVersion(ctx context.Context, id int64) (*vo.VersionInfo, error)
    
    // 草稿相关操作
    CreateOrUpdateDraft(ctx context.Context, id int64, draft *vo.DraftInfo) error
    DraftV2(ctx context.Context, id int64, commitID string) (*vo.DraftInfo, error)
    UpdateWorkflowDraftTestRunSuccess(ctx context.Context, id int64) error
    
    // 实体查询操作
    GetEntity(ctx context.Context, policy *vo.GetPolicy) (*entity.Workflow, error)
    MGetDrafts(ctx context.Context, policy *vo.MGetPolicy) ([]*entity.Workflow, int64, error)
    MGetLatestVersion(ctx context.Context, policy *vo.MGetPolicy) ([]*entity.Workflow, int64, error)
    
    // 引用关系管理
    MGetReferences(ctx context.Context, policy *vo.MGetReferencePolicy) ([]*entity.WorkflowReference, error)
    
    // 其他必要操作
    Delete(ctx context.Context, id int64) error
    MDelete(ctx context.Context, ids []int64) error
    CreateSnapshotIfNeeded(ctx context.Context, id int64, commitID string) error
    
    // 组合其他存储接口
    InterruptEventStore
    CancelSignalStore
    ExecuteHistoryStore
    compose.CheckPointStore
    
    // ID生成和配置
    idgen.IDGenerator
    GetKnowledgeRecallChatModel() model.BaseChatModel
    ConversationRepository
    WorkflowConfig
    Suggester
}

// RepositoryImpl实现 - 提供具体的数据访问实现
func NewRepository(idgen idgen.IDGenerator, db *gorm.DB, redis cache.Cmdable, tos storage.Storage,
    cpStore einoCompose.CheckPointStore, chatModel cm.BaseChatModel, workflowConfig workflow.WorkflowConfig) (workflow.Repository, error) {
    sg, err := NewSuggester(chatModel)
    if err != nil {
        return nil, err
    }
    return &RepositoryImpl{
        IDGenerator:     idgen,
        query:           query.Use(db),
        redis:           redis,
        tos:             tos,
        CheckPointStore: cpStore,
        InterruptEventStore: &interruptEventStoreImpl{
            redis: redis,
        },
        CancelSignalStore: &cancelSignalStoreImpl{
            redis: redis,
        },
        ExecuteHistoryStore: &executeHistoryStoreImpl{
            query: query.Use(db),
            redis: redis,
        },
        builtinModel:   chatModel,
        Suggester:      sg,
        WorkflowConfig: workflowConfig,
    }, nil
}

// 元数据创建实现示例
func (r *RepositoryImpl) CreateMeta(ctx context.Context, meta *vo.Meta) (int64, error) {
    id, err := r.GenID(ctx)
    if err != nil {
        return 0, vo.WrapError(errno.ErrIDGenError, err)
    }
    wfMeta := &model.WorkflowMeta{
        ID:          id,
        Name:        meta.Name,
        Description: meta.Desc,
        IconURI:     meta.IconURI,
        ContentType: int32(meta.ContentType),
        Mode:        int32(meta.Mode),
        CreatorID:   meta.CreatorID,
        AuthorID:    meta.AuthorID,
        SpaceID:     meta.SpaceID,
        DeletedAt:   gorm.DeletedAt{Valid: false},
    }

    if meta.Tag != nil {
        wfMeta.Tag = int32(*meta.Tag)
    }

    if meta.SourceID != nil {
        wfMeta.SourceID = *meta.SourceID
    }

    if meta.AppID != nil {
        wfMeta.AppID = *meta.AppID
    }

    if err = r.query.WorkflowMeta.Create(wfMeta); err != nil {
        return 0, vo.WrapError(errno.ErrDatabaseError, fmt.Errorf("create workflow meta: %w", err))
    }

    return id, nil
}

// 版本创建实现示例 - 包含事务处理和引用关系更新
func (r *RepositoryImpl) CreateVersion(ctx context.Context, id int64, info *vo.VersionInfo, newRefs map[entity.WorkflowReferenceKey]struct{}) (err error) {
    defer func() {
        if err != nil {
            err = vo.WrapIfNeeded(errno.ErrDatabaseError, err)
        }
    }()

    // 更新引用关系
    if err = r.updateReferences(ctx, id, newRefs); err != nil {
        return err
    }

    // 创建版本记录
    if err = r.query.WorkflowVersion.WithContext(ctx).Create(&model.WorkflowVersion{
        WorkflowID:         id,
        Version:            info.Version,
        VersionDescription: info.VersionDescription,
        Canvas:             info.Canvas,
        InputParams:        info.InputParamsStr,
        OutputParams:       info.OutputParamsStr,
        CreatorID:          info.VersionCreatorID,
        CommitID:           info.CommitID,
    }); err != nil {
        return fmt.Errorf("publish failed: %w", err)
    }
    
    // 后续操作...
}

11.6 数据库访问抽象层

工作流编辑通过抽象的数据库访问层实现了对底层数据库操作的统一封装,支持事务管理和高效查询。

go 复制代码
// Query结构体 - 统一的数据库查询入口
type Query struct {
    *gen.Query
    
    // 工作流相关表的查询器
    WorkflowMeta       *workflowMeta
    WorkflowDraft      *workflowDraft
    WorkflowVersion    *workflowVersion
    WorkflowReference  *workflowReference
    WorkflowExecution  *workflowExecution
    NodeExecution      *nodeExecution
    WorkflowSnapshot   *workflowSnapshot
    ChatFlowRoleConfig *chatFlowRoleConfig
    
    // 应用会话相关表
    AppConversationTemplateDraft  *appConversationTemplateDraft
    AppConversationTemplateOnline *appConversationTemplateOnline
    AppStaticConversationDraft    *appStaticConversationDraft
    AppStaticConversationOnline   *appStaticConversationOnline
    AppDynamicConversationDraft   *appDynamicConversationDraft
    AppDynamicConversationOnline  *appDynamicConversationOnline
    
    // 连接器相关
    ConnectorWorkflowVersion *connectorWorkflowVersion
}

// 事务管理示例
type QueryTx struct {
    *gen.QueryTx
    
    // 各表的事务查询器
    WorkflowMeta       *workflowMeta
    WorkflowDraft      *workflowDraft
    // ...其他表的事务查询器
}

// 使用事务进行复杂操作
func (r *RepositoryImpl) ComplexOperationWithTransaction(ctx context.Context) error {
    return r.query.Transaction(func(tx *query.QueryTx) error {
        // 在事务中执行多个相关操作
        if err := tx.WorkflowMeta.Where(...).Update(...); err != nil {
            return err
        }
        
        if err := tx.WorkflowDraft.Where(...).Update(...); err != nil {
            return err
        }
        
        return nil
    })
}

11.7 工作流事件驱动架构

工作流编辑采用了事件驱动的架构设计,实现了编辑操作的异步处理和数据同步。

go 复制代码
// 工作流编辑事件处理
func (h *WorkflowEventHandler) HandleWorkflowUpdatedEvent(ctx context.Context, event *WorkflowUpdatedEvent) error {
    // 1. 更新ES索引
    if err := h.updateESIndex(ctx, event); err != nil {
        logs.CtxErrorf(ctx, "Failed to update ES index: %v", err)
        return err
    }
    
    // 2. 刷新缓存
    if err := h.refreshCache(ctx, event); err != nil {
        logs.CtxWarnf(ctx, "Failed to refresh cache: %v", err)
    }
    
    // 3. 更新锁定状态(延长锁定时间)
    if err := h.extendLock(ctx, event.WorkflowID, event.EditorID); err != nil {
        logs.CtxWarnf(ctx, "Failed to extend lock: %v", err)
    }
    
    // 4. 记录编辑审计
    if err := h.recordEditAudit(ctx, event); err != nil {
        logs.CtxWarnf(ctx, "Failed to record edit audit: %v", err)
    }
    
    return nil
}

11.8 工作流编辑性能优化策略

工作流编辑实现了多种性能优化策略,提高了编辑操作的响应速度和并发处理能力。

go 复制代码
// 工作流编辑缓存管理器
func (c *WorkflowEditCacheManager) RefreshWorkflowCache(ctx context.Context, workflow *WorkflowInfo) error {
    // 1. 更新Redis缓存
    cacheKey := fmt.Sprintf("workflow:%s", workflow.WorkflowID)
    workflowData, _ := json.Marshal(workflow)
    if err := c.redisClient.Set(ctx, cacheKey, workflowData, time.Hour).Err(); err != nil {
        logs.CtxWarnf(ctx, "Failed to refresh Redis cache: %v", err)
    }
    
    // 2. 使相关列表缓存失效
    listCacheKey := fmt.Sprintf("workflow_list:space:%d", workflow.SpaceID)
    if err := c.redisClient.Del(ctx, listCacheKey).Err(); err != nil {
        logs.CtxWarnf(ctx, "Failed to invalidate list cache: %v", err)
    }
    
    return nil
}

12. 总结

12.1 工作流编辑功能的架构优势

Coze工作流编辑功能采用了现代化的分层架构设计,具有以下显著优势:

1. 高可扩展性

  • 分层架构设计使得工作流编辑各层职责清晰,便于独立扩展和维护
  • 基于接口的依赖倒置设计支持不同存储引擎的灵活切换
  • 事件驱动架构支持工作流编辑相关业务的异步处理,提高系统吞吐量

2. 高可用性

  • 乐观锁机制确保工作流编辑的数据一致性,避免编辑冲突
  • 异步事件处理确保工作流编辑主流程的稳定性
  • 编辑锁定机制防止并发编辑冲突,提高系统可靠性
  • 完善的错误处理和重试机制保证编辑操作的最终一致性

3. 高性能

  • 版本控制和乐观锁策略提高并发编辑效率
  • 缓存刷新和批量更新策略提升编辑后的数据访问性能
  • 异步索引更新机制减少编辑操作对系统性能的影响
  • Redis缓存编辑锁定状态,提高锁定操作响应速度

4. 高安全性

  • 多层次的编辑权限验证机制(身份认证 + 空间权限 + 工作流权限 + 锁定验证)
  • 版本控制和冲突检测防止恶意编辑和数据覆盖
  • 操作审计和日志记录确保编辑操作的可追溯性
  • 编辑锁定机制防止未授权的修改操作

12.2 工作流编辑功能的技术亮点

1. 智能化的编辑机制

  • 针对工作流编辑特点设计的乐观锁版本控制策略
  • 支持多种编辑场景(元数据编辑、画布编辑、配置编辑)
  • 合理的索引设计优化编辑后的并发访问性能

2. 智能化的编辑安全机制

  • 多维度的编辑安全验证(权限、版本、锁定)
  • 可配置的编辑策略支持不同业务场景
  • 实时的锁定检查和版本验证防止冲突编辑

3. 事件驱动的编辑处理

  • 基于工作流编辑事件实现数据库到ES的实时索引更新
  • 保证了编辑操作的最终一致性
  • 支持编辑锁定续期和自动释放机制

4. 精细化的编辑权限控制

  • 基于角色的多维度编辑权限验证(所有者、管理员、编辑者)
  • 编辑锁定机制确保实时权限控制和并发安全
  • 灵活的编辑策略支持不同业务场景需求

通过以上的架构设计和技术实现,Coze工作流编辑功能为用户提供了高效、安全、可靠的工作流编辑管理服务,为AI应用开发中的工作流生命周期管理提供了强有力的基础设施支撑。该系统不仅满足了当前的编辑业务需求,还具备了良好的扩展性和可维护性,能够适应未来编辑策略和功能扩展的发展需要。

相关推荐
lypzcgf12 小时前
Coze源码分析-资源库-编辑工作流-前端源码-核心流程/API/总结
前端·工作流·coze·coze源码分析·智能体平台·ai应用平台·agent平台
lypzcgf12 小时前
Coze源码分析-资源库-编辑工作流-前端源码-核心组件
前端·工作流·coze·coze源码分析·智能体平台·agent平台
lypzcgf1 天前
Coze源码分析-资源库-编辑插件-后端源码-领域/数据访问层
系统架构·插件·coze·coze源码分析·智能体平台·ai应用平台·agent平台
Penge6661 天前
Go语言中的切片展开操作符 ...
后端·go
lypzcgf2 天前
Coze源码分析-资源库-编辑插件-后端源码-安全与错误处理
安全·插件·coze·coze源码分析·智能体平台·ai应用平台·agent平台
野木香2 天前
go语言websocket连接,重连,发心跳示例
websocket·go
后端小肥肠3 天前
Coze+liblib 强强联合!阿容容治愈插画、灵魂画手素描、火柴人漫画,一键生成不翻车
人工智能·aigc·coze
豆浆whisky3 天前
netpoll性能调优:Go网络编程的隐藏利器|Go语言进阶(8)
开发语言·网络·后端·golang·go
lypzcgf3 天前
Coze源码分析-资源库-编辑插件-后端源码-核心技术与总结
系统架构·插件·coze·coze源码分析·智能体平台·ai应用平台·agent平台