@@ -75,17 +75,17 @@ type ExptTemplateManagerImpl struct {
7575 scheduleAdapter rpc.IExptScheduleAdapter
7676}
7777
78- func (e * ExptTemplateManagerImpl ) CheckName (ctx context.Context , name string , spaceID int64 , session * entity.Session ) (bool , error ) {
79- _ , exists , err := e .templateRepo .GetByName (ctx , name , spaceID )
78+ func (e * ExptTemplateManagerImpl ) CheckName (ctx context.Context , name string , spaceID int64 , exptType entity. ExptType , session * entity.Session ) (bool , error ) {
79+ _ , exists , err := e .templateRepo .GetByName (ctx , name , spaceID , exptType )
8080 if err != nil {
8181 return false , err
8282 }
8383 return ! exists , nil
8484}
8585
8686func (e * ExptTemplateManagerImpl ) Create (ctx context.Context , param * entity.CreateExptTemplateParam , session * entity.Session ) (* entity.ExptTemplate , error ) {
87- // 验证名称
88- pass , err := e .CheckName (ctx , param .Name , param .SpaceID , session )
87+ // 验证名称:按 expt_type 隔离,避免在线/离线模板互相判重
88+ pass , err := e .CheckName (ctx , param .Name , param .SpaceID , param . ExptType , session )
8989 if ! pass {
9090 return nil , errorx .NewByCode (errno .ExperimentNameExistedCode , errorx .WithExtraMsg (fmt .Sprintf ("template name %s already exists" , param .Name )))
9191 }
@@ -265,9 +265,9 @@ func (e *ExptTemplateManagerImpl) Update(ctx context.Context, param *entity.Upda
265265 return nil , errorx .NewByCode (errno .ResourceNotFoundCode , errorx .WithExtraMsg (fmt .Sprintf ("template %d not found" , param .TemplateID )))
266266 }
267267
268- // 如果名称改变,检查新名称是否可用(允许和当前名称重复)
268+ // 如果名称改变,检查新名称是否可用(允许和当前名称重复);按现有模板的 expt_type 隔离判重
269269 if param .Name != "" && param .Name != existingTemplate .GetName () {
270- pass , err := e .CheckName (ctx , param .Name , param .SpaceID , session )
270+ pass , err := e .CheckName (ctx , param .Name , param .SpaceID , existingTemplate . Meta . ExptType , session )
271271 if ! pass {
272272 return nil , errorx .NewByCode (errno .ExperimentNameExistedCode , errorx .WithExtraMsg (fmt .Sprintf ("template name %s already exists" , param .Name )))
273273 }
@@ -436,6 +436,15 @@ func (e *ExptTemplateManagerImpl) Update(ctx context.Context, param *entity.Upda
436436 }
437437 }
438438
439+ // 显式传入 expt_source(含 Scheduler 等)时覆盖到 TemplateConf;
440+ // 当 templateConf 还未初始化(请求未带字段映射等),克隆现有再写入,避免污染其他字段。
441+ if param .ExptSource != nil {
442+ if updatedTemplate .TemplateConf == nil {
443+ updatedTemplate .TemplateConf = & entity.ExptTemplateConfiguration {}
444+ }
445+ updatedTemplate .TemplateConf .ExptSource = param .ExptSource
446+ }
447+
439448 // 从 TemplateConf 构建 FieldMappingConfig,并根据 EvaluatorConf.ScoreWeight 设置是否启用分数权重
440449 e .buildFieldMappingConfigAndEnableScoreWeight (updatedTemplate , updatedTemplate .TemplateConf )
441450
@@ -489,9 +498,9 @@ func (e *ExptTemplateManagerImpl) UpdateMeta(ctx context.Context, param *entity.
489498 return nil , errorx .NewByCode (errno .ResourceNotFoundCode , errorx .WithExtraMsg (fmt .Sprintf ("template %d not found" , param .TemplateID )))
490499 }
491500
492- // 如果名称改变,检查新名称是否可用(允许和当前名称重复)
501+ // 如果名称改变,检查新名称是否可用(允许和当前名称重复);按现有模板的 expt_type 隔离判重
493502 if param .Name != "" && param .Name != existingTemplate .GetName () {
494- pass , err := e .CheckName (ctx , param .Name , param .SpaceID , session )
503+ pass , err := e .CheckName (ctx , param .Name , param .SpaceID , existingTemplate . Meta . ExptType , session )
495504 if ! pass {
496505 return nil , errorx .NewByCode (errno .ExperimentNameExistedCode , errorx .WithExtraMsg (fmt .Sprintf ("template name %s already exists" , param .Name )))
497506 }
0 commit comments