Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 41 additions & 9 deletions api/dms/service/v1/data_export_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ type DataExportWorkflow struct {
// Required: true
// example: [export_task_uid1,export_task_uid2]
Tasks []Task `json:"tasks" validate:"required"`
// workflow template id from SQLE; omit or 0 to use project default data_export template
// Required: false
// example: 1
WorkflowTemplateId uint `json:"workflow_template_id"`
}

// swagger:model AddDataExportWorkflowReply
Expand Down Expand Up @@ -76,6 +80,9 @@ type ListDataExportWorkflowsReq struct {
// filter fuzzy key word for id/name
// in:query
FuzzyKeyword string `json:"fuzzy_keyword" query:"fuzzy_keyword"`
// filter by workflow template id
// in:query
FilterWorkflowTemplateId uint `json:"filter_workflow_template_id" query:"filter_workflow_template_id"`
}

// swagger:parameters FilterGlobalDataExportWorkflowReq
Expand Down Expand Up @@ -171,15 +178,17 @@ type ListDataExportWorkflowsReply struct {
}

type ListDataExportWorkflow struct {
ProjectUid string `json:"project_uid"`
ProjectName string `json:"project_name"` // 项目名称
WorkflowID string `json:"workflow_uid"` // 数据导出工单ID
WorkflowName string `json:"workflow_name"` // 数据导出工单的名称
Description string `json:"desc"` // 数据导出工单的描述
Creater UidWithName `json:"creater"` // 数据导出工单的创建人
CreatedAt time.Time `json:"created_at"` // 数据导出工单的创建时间
ExportedAt time.Time `json:"exported_at"` // 执行数据导出工单的时间
Status DataExportWorkflowStatus `json:"status"` // 数据导出工单的状态
ProjectUid string `json:"project_uid"`
ProjectName string `json:"project_name"` // 项目名称
WorkflowID string `json:"workflow_uid"` // 数据导出工单ID
WorkflowName string `json:"workflow_name"` // 数据导出工单的名称
Description string `json:"desc"` // 数据导出工单的描述
Creater UidWithName `json:"creater"` // 数据导出工单的创建人
CreatedAt time.Time `json:"created_at"` // 数据导出工单的创建时间
ExportedAt time.Time `json:"exported_at"` // 执行数据导出工单的时间
Status DataExportWorkflowStatus `json:"status"` // 数据导出工单的状态
WorkflowTemplateId uint `json:"workflow_template_id"` // 创建时关联的审批模板 ID(历史工单可为 0)
WorkflowTemplateName string `json:"workflow_template_name"` // 创建时冗余保存的审批模板名称

CurrentStepAssigneeUsers []UidWithName `json:"current_step_assignee_user_list"` // 工单待操作人
DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo `json:"db_service_info,omitempty"` // 所属数据源信息
Expand Down Expand Up @@ -233,12 +242,35 @@ type GetDataExportWorkflow struct {
Desc string `json:"desc,omitempty"`
CreateUser UidWithName `json:"create_user"`
CreateTime *time.Time `json:"create_time"`
WorkflowTemplateId uint `json:"workflow_template_id"`
WorkflowTemplateName string `json:"workflow_template_name"`
WorkflowRecord WorkflowRecord `json:"workflow_record"`
WorkflowRecordHistory []WorkflowRecord `json:"workflow_record_history"`
// UnmaskingWorkflow 关联的查看原文工单摘要;无关联时为 null
UnmaskingWorkflow *DataExportRelatedUnmaskingWorkflow `json:"unmasking_workflow"`
}

// swagger:parameters CheckDataExportWorkflowTemplateUsed
type CheckDataExportWorkflowTemplateUsedReq struct {
// project id
// Required: true
// in:path
ProjectUid string `param:"project_uid" json:"project_uid" validate:"required"`
// workflow template id
// Required: true
// in:query
WorkflowTemplateId uint `query:"workflow_template_id" json:"workflow_template_id" validate:"required"`
}

// swagger:model CheckDataExportWorkflowTemplateUsedReply
type CheckDataExportWorkflowTemplateUsedReply struct {
Data struct {
IsUsed bool `json:"is_used"`
Count int64 `json:"count"`
} `json:"data"`
base.GenericResp
}

// swagger:model DataExportRelatedUnmaskingWorkflow
// DataExportRelatedUnmaskingWorkflow 数据导出工单关联的查看原文工单(仅摘要字段)
type DataExportRelatedUnmaskingWorkflow struct {
Expand Down
21 changes: 21 additions & 0 deletions internal/apiserver/service/dms_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -3907,6 +3907,27 @@ func (ctl *DMSController) ListAllDataExportWorkflows(c echo.Context) error {
return NewOkRespWithReply(c, reply)
}

// swagger:route GET /v1/dms/projects/{project_uid}/data_export_workflows/workflow_template_used DataExportWorkflows CheckDataExportWorkflowTemplateUsed
//
// Check whether a data-export workflow template id is referenced by local workflows.
// Soft-deleted SQLE templates do not block already-created workflow runtime; this is a best-effort hint.
//
// responses:
// 200: body:CheckDataExportWorkflowTemplateUsedReply
// default: body:GenericResp
func (ctl *DMSController) CheckDataExportWorkflowTemplateUsed(c echo.Context) error {
req := new(aV1.CheckDataExportWorkflowTemplateUsedReq)
err := bindAndValidateReq(c, req)
if nil != err {
return NewErrResp(c, err, apiError.BadRequestErr)
}
reply, err := ctl.DMS.CheckDataExportWorkflowTemplateUsed(c.Request().Context(), req)
if nil != err {
return NewErrResp(c, err, apiError.DMSServiceErr)
}
return NewOkRespWithReply(c, reply)
}

// swagger:route GET /v1/dms/projects/{project_uid}/data_export_workflows/{data_export_workflow_uid} DataExportWorkflows GetDataExportWorkflow
//
// Get data_export workflow.
Expand Down
2 changes: 2 additions & 0 deletions internal/apiserver/service/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ func (s *APIServer) initRouter() error {
dataExportWorkflowsV1 := v1.Group("/dms/projects/:project_uid/data_export_workflows")
dataExportWorkflowsV1.POST("", s.DMSController.AddDataExportWorkflow)
dataExportWorkflowsV1.GET("", s.DMSController.ListDataExportWorkflows)
// 只读引用检查:供 SQLE 在跨库成本过高时查询本地冗余引用;软删模板不影响已建工单流转
dataExportWorkflowsV1.GET("/workflow_template_used", s.DMSController.CheckDataExportWorkflowTemplateUsed)
dataExportWorkflowsV1.GET("/:data_export_workflow_uid", s.DMSController.GetDataExportWorkflow)
dataExportWorkflowsV1.POST("/:data_export_workflow_uid/approve", s.DMSController.ApproveDataExportWorkflow)
dataExportWorkflowsV1.POST("/:data_export_workflow_uid/reject", s.DMSController.RejectDataExportWorkflow)
Expand Down
26 changes: 15 additions & 11 deletions internal/dms/biz/data_export_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,17 +61,19 @@ func (et DataExportWorkflowEventAction) String() string {
type Workflow struct {
Base

UID string
Name string
ProjectUID string
WorkflowType string
Desc string
CreateTime time.Time
CreateUserUID string
Status string
WorkflowRecordUid string
Tasks []Task
TaskIds []string
UID string
Name string
ProjectUID string
WorkflowType string
Desc string
CreateTime time.Time
CreateUserUID string
Status string
WorkflowRecordUid string
WorkflowTemplateId uint
WorkflowTemplateName string
Tasks []Task
TaskIds []string

WorkflowRecord *WorkflowRecord
DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo // 所属数据源信息
Expand Down Expand Up @@ -125,6 +127,8 @@ type WorkflowRepo interface {
DeleteDataExportWorkflowsByIds(ctx context.Context, dataExportWorkflowUid []string) error
GetGlobalWorkflowsByParameterMap(ctx context.Context, data map[string]interface{}) ([]*Workflow, int64, error)
AuditWorkflowAndAdvanceStep(ctx context.Context, workflowRecordUid string, step *WorkflowStep, nextStepId uint64, operateId, reason string) error
// CountDataExportWorkflowsByTemplateId 供 SQLE 跨库引用检查:模板软删不影响已建工单流转,仅统计本地冗余引用。
CountDataExportWorkflowsByTemplateId(ctx context.Context, projectUID string, templateID uint) (int64, error)
}

type DataExportWorkflowUsecase struct {
Expand Down
4 changes: 4 additions & 0 deletions internal/dms/biz/data_export_workflow_ce.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,7 @@ func (d *DataExportWorkflowUsecase) RecycleDataExportTaskFiles() {}
func (d *DataExportWorkflowUsecase) GetGlobalWorkflowsList(ctx context.Context, req *dmsV1.FilterGlobalDataExportWorkflowReq, limit, offset int) ([]*Workflow, int64, error) {
return nil, 0, errNotDataExportWorkflow
}

func (d *DataExportWorkflowUsecase) CheckDataExportWorkflowTemplateUsed(ctx context.Context, projectUID string, templateID uint) (bool, int64, error) {
return false, 0, errNotDataExportWorkflow
}
20 changes: 11 additions & 9 deletions internal/dms/biz/repo_fields.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

56 changes: 40 additions & 16 deletions internal/dms/service/data_export_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ func (d *DMSService) AddDataExportWorkflow(ctx context.Context, req *dmsV1.AddDa
tasks = append(tasks, biz.Task{UID: t.Uid})
}
args := &biz.Workflow{
Name: req.DataExportWorkflow.Name,
Desc: req.DataExportWorkflow.Desc,
Tasks: tasks,
ProjectUID: req.ProjectUid,
Name: req.DataExportWorkflow.Name,
Desc: req.DataExportWorkflow.Desc,
Tasks: tasks,
ProjectUID: req.ProjectUid,
WorkflowTemplateId: req.DataExportWorkflow.WorkflowTemplateId,
}
uid, err := d.DataExportWorkflowUsecase.AddDataExportWorkflow(ctx, currentUserUid, args)
if err != nil {
Expand Down Expand Up @@ -79,6 +80,14 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List
})
}

if req.FilterWorkflowTemplateId != 0 {
andConditions = append(andConditions, pkgConst.FilterCondition{
Field: string(biz.WorkflowFieldWorkflowTemplateId),
Operator: pkgConst.FilterOperatorEqual,
Value: req.FilterWorkflowTemplateId,
})
}

if len(andConditions) > 0 {
filterByOptions.Groups = append(filterByOptions.Groups, pkgConst.NewConditionGroup(pkgConst.FilterLogicAnd, andConditions...))
}
Expand Down Expand Up @@ -134,13 +143,15 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List
ret := make([]*dmsV1.ListDataExportWorkflow, len(workflows))
for i, w := range workflows {
ret[i] = &dmsV1.ListDataExportWorkflow{
ProjectUid: w.ProjectUID,
ProjectName: projectMap[w.ProjectUID],
WorkflowID: w.UID,
WorkflowName: w.Name,
Description: w.Desc,
CreatedAt: w.CreatedAt,
Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status),
ProjectUid: w.ProjectUID,
ProjectName: projectMap[w.ProjectUID],
WorkflowID: w.UID,
WorkflowName: w.Name,
Description: w.Desc,
CreatedAt: w.CreatedAt,
Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status),
WorkflowTemplateId: w.WorkflowTemplateId,
WorkflowTemplateName: w.WorkflowTemplateName,
}
creater := convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID}))
if len(creater) > 0 {
Expand Down Expand Up @@ -205,11 +216,13 @@ func (d *DMSService) GetDataExportWorkflow(ctx context.Context, req *dmsV1.GetDa
}

data := &dmsV1.GetDataExportWorkflow{
Name: w.Name,
WorkflowID: w.UID,
Desc: w.Desc,
CreateUser: convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID}))[0],
CreateTime: &w.CreateTime,
Name: w.Name,
WorkflowID: w.UID,
Desc: w.Desc,
CreateUser: convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID}))[0],
CreateTime: &w.CreateTime,
WorkflowTemplateId: w.WorkflowTemplateId,
WorkflowTemplateName: w.WorkflowTemplateName,
WorkflowRecord: dmsV1.WorkflowRecord{
CurrentStepNumber: uint(w.WorkflowRecord.CurrentWorkflowStepId),
Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status),
Expand Down Expand Up @@ -413,3 +426,14 @@ func isDataExportWorkflowTerminalStatus(status string) bool {
return false
}
}

func (d *DMSService) CheckDataExportWorkflowTemplateUsed(ctx context.Context, req *dmsV1.CheckDataExportWorkflowTemplateUsedReq) (*dmsV1.CheckDataExportWorkflowTemplateUsedReply, error) {
isUsed, count, err := d.DataExportWorkflowUsecase.CheckDataExportWorkflowTemplateUsed(ctx, req.ProjectUid, req.WorkflowTemplateId)
if err != nil {
return nil, err
}
reply := &dmsV1.CheckDataExportWorkflowTemplateUsedReply{}
reply.Data.IsUsed = isUsed
reply.Data.Count = count
return reply, nil
}
82 changes: 43 additions & 39 deletions internal/dms/storage/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,17 +178,17 @@ func convertBizUser(u *biz.User) (*model.User, error) {
Model: model.Model{
UID: u.UID,
},
TwoFactorEnabled: u.TwoFactorEnabled,
Name: u.Name,
ThirdPartyUserID: u.ThirdPartyUserID,
ThirdPartyUserInfo: u.ThirdPartyUserInfo,
Password: encrypted,
Email: u.Email,
Phone: u.Phone,
WeChatID: u.WxID,
Language: u.Language,
UserAuthenticationType: u.UserAuthenticationType.String(),
Stat: u.Stat.Uint(),
TwoFactorEnabled: u.TwoFactorEnabled,
Name: u.Name,
ThirdPartyUserID: u.ThirdPartyUserID,
ThirdPartyUserInfo: u.ThirdPartyUserInfo,
Password: encrypted,
Email: u.Email,
Phone: u.Phone,
WeChatID: u.WxID,
Language: u.Language,
UserAuthenticationType: u.UserAuthenticationType.String(),
Stat: u.Stat.Uint(),
System: string(u.System),
LastLoginAt: lastLoginAt,
BusinessWritePermission: u.BusinessWritePermission,
Expand Down Expand Up @@ -262,18 +262,18 @@ func convertModelUser(u *model.User) (*biz.User, error) {
}

return &biz.User{
Base: convertBase(u.Model),
UID: u.UID,
ThirdPartyUserID: u.ThirdPartyUserID,
ThirdPartyUserInfo: u.ThirdPartyUserInfo,
Name: u.Name,
Email: u.Email,
Phone: u.Phone,
WxID: u.WeChatID,
Language: u.Language,
Projects: projects,
UserAuthenticationType: typ,
Stat: stat,
Base: convertBase(u.Model),
UID: u.UID,
ThirdPartyUserID: u.ThirdPartyUserID,
ThirdPartyUserInfo: u.ThirdPartyUserInfo,
Name: u.Name,
Email: u.Email,
Phone: u.Phone,
WxID: u.WeChatID,
Language: u.Language,
Projects: projects,
UserAuthenticationType: typ,
Stat: stat,
TwoFactorEnabled: u.TwoFactorEnabled,
System: biz.UserSystem(u.System),
LastLoginAt: lastLoginAt,
Expand Down Expand Up @@ -1042,13 +1042,15 @@ func convertBizWorkflow(b *biz.Workflow) *model.Workflow {
Model: model.Model{
UID: b.UID,
},
Name: b.Name,
ProjectUID: b.ProjectUID,
WorkflowType: b.WorkflowType,
Desc: b.Desc,
CreateTime: &b.CreateTime,
CreateUserUID: b.CreateUserUID,
WorkflowRecordUid: b.WorkflowRecordUid,
Name: b.Name,
ProjectUID: b.ProjectUID,
WorkflowType: b.WorkflowType,
Desc: b.Desc,
CreateTime: &b.CreateTime,
CreateUserUID: b.CreateUserUID,
WorkflowRecordUid: b.WorkflowRecordUid,
WorkflowTemplateId: b.WorkflowTemplateId,
WorkflowTemplateName: b.WorkflowTemplateName,
}
if b.WorkflowRecord != nil {
workflow.WorkflowRecord = convertBizWorkflowRecord(b.WorkflowRecord)
Expand All @@ -1060,15 +1062,17 @@ func convertModelWorkflow(m *model.Workflow) (w *biz.Workflow, err error) {
w = &biz.Workflow{
Base: convertBase(m.Model),

UID: m.UID,
Name: m.Name,
ProjectUID: m.ProjectUID,
WorkflowType: m.WorkflowType,
Desc: m.Desc,
CreateTime: *m.CreateTime,
CreateUserUID: m.CreateUserUID,
WorkflowRecordUid: m.WorkflowRecordUid,
TaskIds: m.GetTaskIds(),
UID: m.UID,
Name: m.Name,
ProjectUID: m.ProjectUID,
WorkflowType: m.WorkflowType,
Desc: m.Desc,
CreateTime: *m.CreateTime,
CreateUserUID: m.CreateUserUID,
WorkflowRecordUid: m.WorkflowRecordUid,
WorkflowTemplateId: m.WorkflowTemplateId,
WorkflowTemplateName: m.WorkflowTemplateName,
TaskIds: m.GetTaskIds(),
}
if m.WorkflowRecord != nil {
w.WorkflowRecord, err = convertModelWorkflowRecord(m.WorkflowRecord)
Expand Down
Loading