Skip to content

Commit 948c655

Browse files
feat: attach ops type to data export workflows
Persist optional ops_type_uid on create, ignore updates, and expose name/filter on list/detail/dashboard paths. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 0c67feb commit 948c655

9 files changed

Lines changed: 200 additions & 17 deletions

File tree

api/dms/service/v1/data_export_workflow.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ type DataExportWorkflow struct {
3232
// Required: false
3333
// example: 1
3434
WorkflowTemplateId uint `json:"workflow_template_id"`
35+
// ops type uid from project dictionary; omit or empty means unset; immutable after create
36+
// Required: false
37+
// example: 7002001
38+
OpsTypeUID string `json:"ops_type_uid"`
3539
}
3640

3741
// swagger:model AddDataExportWorkflowReply
@@ -83,9 +87,12 @@ type ListDataExportWorkflowsReq struct {
8387
// filter by workflow template id
8488
// in:query
8589
FilterWorkflowTemplateId uint `json:"filter_workflow_template_id" query:"filter_workflow_template_id"`
90+
// filter by ops type uid(单选;空则不筛;不提供「未设置」)
91+
// in:query
92+
FilterByOpsTypeUid string `json:"filter_by_ops_type_uid" query:"filter_by_ops_type_uid"`
8693
}
8794

88-
// swagger:parameters FilterGlobalDataExportWorkflowReq
95+
// swagger:parameters GetGlobalDataExportWorkflows
8996
type FilterGlobalDataExportWorkflowReq struct {
9097
// filter status list
9198
// in:query
@@ -145,6 +152,9 @@ type FilterGlobalDataExportWorkflowReq struct {
145152
// filter update time to
146153
// in:query
147154
FilterUpdateTimeTo string `json:"filter_update_time_to" query:"filter_update_time_to"`
155+
// filter by ops type uid(单选;空则不筛;不提供「未设置」;与项目内列表同构)
156+
// in:query
157+
FilterByOpsTypeUid string `json:"filter_by_ops_type_uid" query:"filter_by_ops_type_uid"`
148158
}
149159

150160
// swagger:model GetGlobalDataExportWorkflowsReply
@@ -163,6 +173,8 @@ type GlobalDataExportWorkflow struct {
163173
CreatedAt time.Time `json:"created_at"` // 数据导出工单的创建时间
164174
UpdatedAt time.Time `json:"updated_at"` // 数据导出工单的更新时间
165175
Status DataExportWorkflowStatus `json:"status"` // 数据导出工单的状态
176+
// OpsType 运维类型(按工单所属项目字典批量解析);未设置或字典项已删时省略
177+
OpsType *dmsCommonV1.OpsType `json:"ops_type,omitempty"`
166178

167179
CurrentStepAssigneeUsers []UidWithName `json:"current_step_assignee_user_list"` // 工单待操作人
168180
DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo `json:"db_service_info,omitempty"` // 所属数据源信息
@@ -189,6 +201,8 @@ type ListDataExportWorkflow struct {
189201
Status DataExportWorkflowStatus `json:"status"` // 数据导出工单的状态
190202
WorkflowTemplateId uint `json:"workflow_template_id"` // 创建时关联的审批模板 ID(历史工单可为 0)
191203
WorkflowTemplateName string `json:"workflow_template_name"` // 创建时冗余保存的审批模板名称
204+
// OpsType 运维类型(项目字典批量解析);未设置或字典项已删时省略,供前端「-」约定
205+
OpsType *dmsCommonV1.OpsType `json:"ops_type,omitempty"`
192206

193207
CurrentStepAssigneeUsers []UidWithName `json:"current_step_assignee_user_list"` // 工单待操作人
194208
DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo `json:"db_service_info,omitempty"` // 所属数据源信息
@@ -237,15 +251,17 @@ const (
237251
)
238252

239253
type GetDataExportWorkflow struct {
240-
Name string `json:"workflow_name"`
241-
WorkflowID string `json:"workflow_uid"`
242-
Desc string `json:"desc,omitempty"`
243-
CreateUser UidWithName `json:"create_user"`
244-
CreateTime *time.Time `json:"create_time"`
245-
WorkflowTemplateId uint `json:"workflow_template_id"`
246-
WorkflowTemplateName string `json:"workflow_template_name"`
247-
WorkflowRecord WorkflowRecord `json:"workflow_record"`
248-
WorkflowRecordHistory []WorkflowRecord `json:"workflow_record_history"`
254+
Name string `json:"workflow_name"`
255+
WorkflowID string `json:"workflow_uid"`
256+
Desc string `json:"desc,omitempty"`
257+
CreateUser UidWithName `json:"create_user"`
258+
CreateTime *time.Time `json:"create_time"`
259+
WorkflowTemplateId uint `json:"workflow_template_id"`
260+
WorkflowTemplateName string `json:"workflow_template_name"`
261+
// OpsType 运维类型(项目字典解析);未设置或字典项已删时省略,供前端「-」约定
262+
OpsType *dmsCommonV1.OpsType `json:"ops_type,omitempty"`
263+
WorkflowRecord WorkflowRecord `json:"workflow_record"`
264+
WorkflowRecordHistory []WorkflowRecord `json:"workflow_record_history"`
249265
// UnmaskingWorkflow 关联的查看原文工单摘要;无关联时为 null
250266
UnmaskingWorkflow *DataExportRelatedUnmaskingWorkflow `json:"unmasking_workflow"`
251267
}
@@ -299,7 +315,7 @@ type WorkflowRecord struct {
299315
CurrentStepNumber uint `json:"current_step_number,omitempty"`
300316
Status DataExportWorkflowStatus `json:"status"`
301317
// 导出失败摘要(人类可读);失败类状态时有值,成功/非导出失败为空
302-
ExportFailSummary string `json:"export_fail_summary,omitempty"`
318+
ExportFailSummary string `json:"export_fail_summary,omitempty"`
303319
Steps []*WorkflowStep `json:"workflow_step_list,omitempty"`
304320
}
305321

internal/dms/biz/data_export_workflow.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import (
1414

1515
var ErrDataExportWorkflowNameDuplicate = errors.New("data export workflow name duplicate")
1616

17+
// ErrOpsTypeNotBelongToProject 所选运维类型标识不属于本项目字典(或不存在)。
18+
var ErrOpsTypeNotBelongToProject = errors.New("所选运维类型不属于本项目字典")
19+
1720
type DataExportWorkflowStatus string
1821

1922
const (
@@ -72,8 +75,10 @@ type Workflow struct {
7275
WorkflowRecordUid string
7376
WorkflowTemplateId uint
7477
WorkflowTemplateName string
75-
Tasks []Task
76-
TaskIds []string
78+
// OpsTypeUID 运维类型字典项标识;空表示未设置;创建后不可改
79+
OpsTypeUID string
80+
Tasks []Task
81+
TaskIds []string
7782

7883
WorkflowRecord *WorkflowRecord
7984
DBServiceInfos []*dmsCommonV1.DBServiceUidWithNameInfo // 所属数据源信息
@@ -118,6 +123,8 @@ type WorkflowRepo interface {
118123
UpdateWorkflowStatusById(ctx context.Context, dataExportWorkflowUid string, status DataExportWorkflowStatus) error
119124
// UpdateWorkflowExportStatusById 更新工单导出状态与失败摘要(进入 exporting 时 summary 传空以清空上一轮)
120125
UpdateWorkflowExportStatusById(ctx context.Context, dataExportWorkflowUid string, status DataExportWorkflowStatus, exportFailSummary string) error
126+
// UpdateWorkflowColumns 更新 workflows 行字段;强制忽略 ops_type_uid(创建后不可改)。
127+
UpdateWorkflowColumns(ctx context.Context, workflowUID string, updates map[string]interface{}) error
121128
GetDataExportWorkflowsByIds(ctx context.Context, dataExportWorkflowUid []string) ([]*Workflow, error)
122129
CancelWorkflow(ctx context.Context, workflowRecordIds []string, workflowSteps []*WorkflowStep, operateId string) error
123130
AuditWorkflow(ctx context.Context, dataExportWorkflowUid string, status DataExportWorkflowStatus, step *WorkflowStep, operateId, reason string) error
@@ -133,6 +140,8 @@ type WorkflowRepo interface {
133140
AuditWorkflowAndAdvanceStep(ctx context.Context, workflowRecordUid string, step *WorkflowStep, nextStepId uint64, operateId, reason string) error
134141
// CountDataExportWorkflowsByTemplateId 供 SQLE 跨库引用检查:模板软删不影响已建工单流转,仅统计本地冗余引用。
135142
CountDataExportWorkflowsByTemplateId(ctx context.Context, projectUID string, templateID uint) (int64, error)
143+
// CountDataExportWorkflowsByOpsTypeUID 供运维类型删除前引用校验:统计本项目数据导出工单对该类型标识的引用数。
144+
CountDataExportWorkflowsByOpsTypeUID(ctx context.Context, projectUID, opsTypeUID string) (int64, error)
136145
}
137146

138147
type DataExportWorkflowUsecase struct {
@@ -145,6 +154,7 @@ type DataExportWorkflowUsecase struct {
145154
dmsProxyTargetRepo ProxyTargetRepo
146155
opPermissionVerifyUsecase *OpPermissionVerifyUsecase
147156
projectUsecase *ProjectUsecase
157+
opsTypeUsecase *OpsTypeUsecase
148158
clusterUsecase *ClusterUsecase
149159
webhookUsecase *WebHookConfigurationUsecase
150160
userUsecase *UserUsecase
@@ -155,7 +165,7 @@ type DataExportWorkflowUsecase struct {
155165
reportHost string
156166
}
157167

158-
func NewDataExportWorkflowUsecase(logger utilLog.Logger, tx TransactionGenerator, repo WorkflowRepo, dataExportTaskRepo DataExportTaskRepo, dbServiceRepo DBServiceRepo, maskingConfigRepo DataExportMaskingConfigRepo, maskingRuleRepo DataExportMaskingRuleRepo, opPermissionVerifyUsecase *OpPermissionVerifyUsecase, projectUsecase *ProjectUsecase, proxyTargetRepo ProxyTargetRepo, clusterUseCase *ClusterUsecase, webhookUsecase *WebHookConfigurationUsecase, userUsecase *UserUsecase, systemVariableUsecase *SystemVariableUsecase, dbServiceUsecase *DBServiceUsecase, unmaskingWorkflowUsecase *dataMaskingBiz.UnmaskingWorkflowUsecase, reportHost string) *DataExportWorkflowUsecase {
168+
func NewDataExportWorkflowUsecase(logger utilLog.Logger, tx TransactionGenerator, repo WorkflowRepo, dataExportTaskRepo DataExportTaskRepo, dbServiceRepo DBServiceRepo, maskingConfigRepo DataExportMaskingConfigRepo, maskingRuleRepo DataExportMaskingRuleRepo, opPermissionVerifyUsecase *OpPermissionVerifyUsecase, projectUsecase *ProjectUsecase, opsTypeUsecase *OpsTypeUsecase, proxyTargetRepo ProxyTargetRepo, clusterUseCase *ClusterUsecase, webhookUsecase *WebHookConfigurationUsecase, userUsecase *UserUsecase, systemVariableUsecase *SystemVariableUsecase, dbServiceUsecase *DBServiceUsecase, unmaskingWorkflowUsecase *dataMaskingBiz.UnmaskingWorkflowUsecase, reportHost string) *DataExportWorkflowUsecase {
159169
return &DataExportWorkflowUsecase{
160170
tx: tx,
161171
repo: repo,
@@ -164,6 +174,7 @@ func NewDataExportWorkflowUsecase(logger utilLog.Logger, tx TransactionGenerator
164174
maskingRuleRepo: maskingRuleRepo,
165175
opPermissionVerifyUsecase: opPermissionVerifyUsecase,
166176
projectUsecase: projectUsecase,
177+
opsTypeUsecase: opsTypeUsecase,
167178
dmsProxyTargetRepo: proxyTargetRepo,
168179
dataExportTaskRepo: dataExportTaskRepo,
169180
clusterUsecase: clusterUseCase,
@@ -177,6 +188,14 @@ func NewDataExportWorkflowUsecase(logger utilLog.Logger, tx TransactionGenerator
177188
}
178189
}
179190

191+
// CountDataExportWorkflowsByOpsTypeUID 统计本项目数据导出工单对运维类型标识的引用数(删除字典前引用校验)。
192+
func (d *DataExportWorkflowUsecase) CountDataExportWorkflowsByOpsTypeUID(ctx context.Context, projectUID, opsTypeUID string) (int64, error) {
193+
if opsTypeUID == "" {
194+
return 0, nil
195+
}
196+
return d.repo.CountDataExportWorkflowsByOpsTypeUID(ctx, projectUID, opsTypeUID)
197+
}
198+
180199
type ListWorkflowsOption struct {
181200
PageNumber uint32
182201
LimitPerPage uint32

internal/dms/service/cloudbeaver.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ func NewAndInitCloudbeaverService(logger utilLog.Logger, opts *conf.DMSOptions)
4343
// 预定义解决usecase循环依赖问题
4444
memberUsecase := &biz.MemberUsecase{}
4545
environmentTagUsecase := biz.EnvironmentTagUsecase{}
46+
opsTypeUsecase := biz.OpsTypeUsecase{}
4647
businessTagUsecase := biz.NewBusinessTagUsecase(storage.NewBusinessTagRepo(logger, st), logger)
4748
dmsProxyTargetRepo := storage.NewProxyTargetRepo(logger, st)
4849
projectRepo := storage.NewProjectRepo(logger, st)
49-
projectUsecase := biz.NewProjectUsecase(logger, tx, projectRepo, memberUsecase, opPermissionVerifyUsecase, pluginUseCase, businessTagUsecase, &environmentTagUsecase)
50+
projectUsecase := biz.NewProjectUsecase(logger, tx, projectRepo, memberUsecase, opPermissionVerifyUsecase, pluginUseCase, businessTagUsecase, &environmentTagUsecase, &opsTypeUsecase)
5051
dbServiceRepo := storage.NewDBServiceRepo(logger, st)
5152
environmentTagUsecase = *biz.NewEnvironmentTagUsecase(storage.NewEnvironmentTagRepo(logger, st), logger, projectUsecase, opPermissionVerifyUsecase)
53+
opsTypeUsecase = *biz.NewOpsTypeUsecase(storage.NewOpsTypeRepo(logger, st), logger, projectUsecase, opPermissionVerifyUsecase)
5254
discoveryTaskRepo := storage.NewSensitiveDataDiscoveryTaskRepo(logger, st)
5355
dbServiceUseCase := biz.NewDBServiceUsecase(logger, dbServiceRepo, discoveryTaskRepo, pluginUseCase, opPermissionVerifyUsecase, projectUsecase, dmsProxyTargetRepo, &environmentTagUsecase)
5456

internal/dms/service/data_export_workflow.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/actiontech/dms/internal/dms/biz"
1010
pkgConst "github.com/actiontech/dms/internal/dms/pkg/constant"
1111
"github.com/actiontech/dms/internal/pkg/locale"
12+
dmsCommonV1 "github.com/actiontech/dms/pkg/dms-common/api/dms/v1"
1213
)
1314

1415
func (d *DMSService) AddDataExportWorkflow(ctx context.Context, req *dmsV1.AddDataExportWorkflowReq, currentUserUid string) (reply *dmsV1.AddDataExportWorkflowReply, err error) {
@@ -23,6 +24,7 @@ func (d *DMSService) AddDataExportWorkflow(ctx context.Context, req *dmsV1.AddDa
2324
Tasks: tasks,
2425
ProjectUID: req.ProjectUid,
2526
WorkflowTemplateId: req.DataExportWorkflow.WorkflowTemplateId,
27+
OpsTypeUID: req.DataExportWorkflow.OpsTypeUID,
2628
}
2729
uid, err := d.DataExportWorkflowUsecase.AddDataExportWorkflow(ctx, currentUserUid, args)
2830
if err != nil {
@@ -88,6 +90,14 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List
8890
})
8991
}
9092

93+
if req.FilterByOpsTypeUid != "" {
94+
andConditions = append(andConditions, pkgConst.FilterCondition{
95+
Field: string(biz.WorkflowFieldOpsTypeUID),
96+
Operator: pkgConst.FilterOperatorEqual,
97+
Value: req.FilterByOpsTypeUid,
98+
})
99+
}
100+
91101
if len(andConditions) > 0 {
92102
filterByOptions.Groups = append(filterByOptions.Groups, pkgConst.NewConditionGroup(pkgConst.FilterLogicAnd, andConditions...))
93103
}
@@ -140,6 +150,9 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List
140150
}
141151
}
142152

153+
// 按项目批量解析运维类型名称(D8:禁止逐条请求字典)
154+
opsTypeNameByProject := d.buildOpsTypeNameMapsByProjects(ctx, projectUIDs)
155+
143156
ret := make([]*dmsV1.ListDataExportWorkflow, len(workflows))
144157
for i, w := range workflows {
145158
ret[i] = &dmsV1.ListDataExportWorkflow{
@@ -152,6 +165,7 @@ func (d *DMSService) ListDataExportWorkflow(ctx context.Context, req *dmsV1.List
152165
Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status),
153166
WorkflowTemplateId: w.WorkflowTemplateId,
154167
WorkflowTemplateName: w.WorkflowTemplateName,
168+
OpsType: resolveOpsTypeFromNameMap(w.OpsTypeUID, opsTypeNameByProject[w.ProjectUID]),
155169
}
156170
creater := convertBizUidWithName(d.UserUsecase.GetBizUserWithNameByUids(ctx, []string{w.CreateUserUID}))
157171
if len(creater) > 0 {
@@ -183,6 +197,9 @@ func (d *DMSService) GetGlobalWorkflowsList(ctx context.Context, req *dmsV1.Filt
183197
}
184198
}
185199

200+
// 跨项目按所属项目字典批量解析名称(D8:禁止逐条请求)
201+
opsTypeNameByProject := d.buildOpsTypeNameMapsByProjects(ctx, projectUIDs)
202+
186203
ret := make([]*dmsV1.GlobalDataExportWorkflow, len(workflows))
187204
for i, w := range workflows {
188205
ret[i] = &dmsV1.GlobalDataExportWorkflow{
@@ -194,6 +211,7 @@ func (d *DMSService) GetGlobalWorkflowsList(ctx context.Context, req *dmsV1.Filt
194211
UpdatedAt: w.WorkflowRecord.UpdateTime,
195212
Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status),
196213
DBServiceInfos: w.DBServiceInfos,
214+
OpsType: resolveOpsTypeFromNameMap(w.OpsTypeUID, opsTypeNameByProject[w.ProjectUID]),
197215
}
198216

199217
creater := convertBizUidWithName(d.UserUsecase.GetBizUserIncludeDeletedWithNameByUids(ctx, []string{w.CreateUserUID}))
@@ -223,6 +241,7 @@ func (d *DMSService) GetDataExportWorkflow(ctx context.Context, req *dmsV1.GetDa
223241
CreateTime: &w.CreateTime,
224242
WorkflowTemplateId: w.WorkflowTemplateId,
225243
WorkflowTemplateName: w.WorkflowTemplateName,
244+
OpsType: d.resolveDataExportWorkflowOpsType(ctx, w.ProjectUID, w.OpsTypeUID),
226245
WorkflowRecord: dmsV1.WorkflowRecord{
227246
CurrentStepNumber: uint(w.WorkflowRecord.CurrentWorkflowStepId),
228247
Status: dmsV1.DataExportWorkflowStatus(w.WorkflowRecord.Status),
@@ -256,6 +275,70 @@ func (d *DMSService) GetDataExportWorkflow(ctx context.Context, req *dmsV1.GetDa
256275
}, nil
257276
}
258277

278+
// resolveDataExportWorkflowOpsType 按项目字典解析运维类型展示名;未设置/已删/非本项目 → nil(前端「-」)。
279+
func (d *DMSService) resolveDataExportWorkflowOpsType(ctx context.Context, projectUID, opsTypeUID string) *dmsCommonV1.OpsType {
280+
if opsTypeUID == "" || d.OpsTypeUsecase == nil {
281+
return nil
282+
}
283+
opsType, err := d.OpsTypeUsecase.GetOpsTypeByUID(ctx, opsTypeUID)
284+
if err != nil || opsType == nil {
285+
return nil
286+
}
287+
if opsType.ProjectUID != "" && projectUID != "" && opsType.ProjectUID != projectUID {
288+
return nil
289+
}
290+
return &dmsCommonV1.OpsType{
291+
UID: opsType.UID,
292+
Name: localizeOpsTypeDisplayName(ctx, opsType.Name),
293+
}
294+
}
295+
296+
const listOpsTypesBatchPageSize = 1000
297+
298+
// buildOpsTypeNameMapsByProjects 按项目一次拉取字典,构建 uid→name(列表批量回填,禁止逐条 Get)。
299+
func (d *DMSService) buildOpsTypeNameMapsByProjects(ctx context.Context, projectUIDs map[string]bool) map[string]map[string]string {
300+
out := make(map[string]map[string]string, len(projectUIDs))
301+
if d.OpsTypeUsecase == nil {
302+
return out
303+
}
304+
for projectUID := range projectUIDs {
305+
if projectUID == "" {
306+
continue
307+
}
308+
opsTypes, _, err := d.OpsTypeUsecase.ListOpsTypes(ctx, &biz.ListOpsTypesOption{
309+
ProjectUID: projectUID,
310+
Limit: listOpsTypesBatchPageSize,
311+
Offset: 0,
312+
})
313+
if err != nil {
314+
continue
315+
}
316+
nameByUID := make(map[string]string, len(opsTypes))
317+
for _, ot := range opsTypes {
318+
if ot == nil || ot.UID == "" {
319+
continue
320+
}
321+
nameByUID[ot.UID] = localizeOpsTypeDisplayName(ctx, ot.Name)
322+
}
323+
out[projectUID] = nameByUID
324+
}
325+
return out
326+
}
327+
328+
func resolveOpsTypeFromNameMap(opsTypeUID string, nameByUID map[string]string) *dmsCommonV1.OpsType {
329+
if opsTypeUID == "" || nameByUID == nil {
330+
return nil
331+
}
332+
name, ok := nameByUID[opsTypeUID]
333+
if !ok {
334+
return nil
335+
}
336+
return &dmsCommonV1.OpsType{
337+
UID: opsTypeUID,
338+
Name: name,
339+
}
340+
}
341+
259342
func (d *DMSService) ExportDataExportWorkflow(ctx context.Context, req *dmsV1.ExportDataExportWorkflowReq, currentUserUid string) error {
260343
return d.DataExportWorkflowUsecase.ExportDataExportWorkflow(ctx, req.ProjectUid, req.DataExportWorkflowUid, currentUserUid)
261344

internal/dms/storage/convert.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,7 @@ func convertBizWorkflow(b *biz.Workflow) *model.Workflow {
10511051
WorkflowRecordUid: b.WorkflowRecordUid,
10521052
WorkflowTemplateId: b.WorkflowTemplateId,
10531053
WorkflowTemplateName: b.WorkflowTemplateName,
1054+
OpsTypeUID: b.OpsTypeUID,
10541055
}
10551056
if b.WorkflowRecord != nil {
10561057
workflow.WorkflowRecord = convertBizWorkflowRecord(b.WorkflowRecord)
@@ -1072,6 +1073,7 @@ func convertModelWorkflow(m *model.Workflow) (w *biz.Workflow, err error) {
10721073
WorkflowRecordUid: m.WorkflowRecordUid,
10731074
WorkflowTemplateId: m.WorkflowTemplateId,
10741075
WorkflowTemplateName: m.WorkflowTemplateName,
1076+
OpsTypeUID: m.OpsTypeUID,
10751077
TaskIds: m.GetTaskIds(),
10761078
}
10771079
if m.WorkflowRecord != nil {

0 commit comments

Comments
 (0)