package servicemanagement import ( "context" "fmt" "strings" "git.x2erp.com/qdy/go-base/ctx" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/model/response" "git.x2erp.com/qdy/go-base/util" "git.x2erp.com/qdy/go-db/factory/database" "github.com/jmoiron/sqlx" ) // AddServiceConfigRequest 添加微服务配置请求 type AddServiceConfigRequest struct { ServiceName string `json:"service_name"` MetaIDs []string `json:"meta_ids"` } // AddServiceConfig 从元元素多选添加配置到微服务 func AddServiceConfig(req *AddServiceConfigRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[int64] { logger.Debug(fmt.Sprintf("AddServiceConfig-开始为微服务 %s 添加配置", req.ServiceName)) if req.ServiceName == "" || len(req.MetaIDs) == 0 { logger.ErrorC(reqCtx, "参数不能为空") return util.CreateErrorResult[int64]("参数不能为空", reqCtx) } // 获取数据库连接 db := dbFactory.GetDB() // 开始事务 tx, err := db.BeginTxx(ctx, nil) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err)) return util.CreateErrorResult[int64](fmt.Sprintf("开始事务失败: %v", err), reqCtx) } defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } }() // 查询选中的元元素信息 metaQuery := ` SELECT id, config_name, field_name, field_type, yaml_name FROM config_meta WHERE id IN (?) ` // 处理IN查询参数 query, args, err := sqlx.In(metaQuery, req.MetaIDs) if err != nil { tx.Rollback() logger.ErrorC(reqCtx, fmt.Sprintf("构建IN查询失败: %v", err)) return util.CreateErrorResult[int64](fmt.Sprintf("构建IN查询失败: %v", err), reqCtx) } type MetaRecord struct { ID string `db:"id"` ConfigName string `db:"config_name"` FieldName string `db:"field_name"` FieldType string `db:"field_type"` YamlName string `db:"yaml_name"` } var metaRecords []MetaRecord err = tx.SelectContext(ctx, &metaRecords, query, args...) if err != nil { tx.Rollback() logger.ErrorC(reqCtx, fmt.Sprintf("查询元元素失败: %v", err)) return util.CreateErrorResult[int64](fmt.Sprintf("查询元元素失败: %v", err), reqCtx) } if len(metaRecords) != len(req.MetaIDs) { logger.WarnC(reqCtx, fmt.Sprintf("部分元元素未找到,找到 %d 个,请求 %d 个", len(metaRecords), len(req.MetaIDs))) } // 批量插入配置记录 creator := reqCtx.UserID if creator == "" { creator = "system" } var insertedCount int64 for _, meta := range metaRecords { // 生成配置ID configID := fmt.Sprintf("config_startup_svc.%s.%s.%s", req.ServiceName, meta.ConfigName, meta.YamlName) // 检查是否已存在相同配置 checkQuery := `SELECT COUNT(*) FROM config_startup_svc WHERE id = ?` var count int err := tx.GetContext(ctx, &count, checkQuery, configID) if err == nil && count > 0 { logger.Debug(fmt.Sprintf("配置已存在: %s,跳过", configID)) continue } // 插入配置记录 insertQuery := ` INSERT INTO config_startup_svc (id, service_name, config_name, yaml_name, yaml_value, creator, created_at) VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP) ` // 默认值根据字段类型设置 defaultValue := "" switch strings.ToLower(meta.FieldType) { case "int", "integer", "number": defaultValue = "0" case "bool", "boolean": defaultValue = "false" case "string": defaultValue = "" default: defaultValue = "" } _, err = tx.ExecContext(ctx, insertQuery, configID, req.ServiceName, meta.ConfigName, meta.YamlName, defaultValue, creator, ) if err != nil { tx.Rollback() logger.ErrorC(reqCtx, fmt.Sprintf("插入配置失败: %v", err)) return util.CreateErrorResult[int64](fmt.Sprintf("插入配置失败: %v", err), reqCtx) } insertedCount++ logger.Debug(fmt.Sprintf("成功插入配置: %s", configID)) } // 提交事务 if err := tx.Commit(); err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err)) return util.CreateErrorResult[int64](fmt.Sprintf("提交事务失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("成功为微服务 %s 添加 %d 个配置项", req.ServiceName, insertedCount)) return util.CreateSuccessResultData[int64](insertedCount, reqCtx) }