| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- 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)
- }
|