暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

add_service_config.go 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package servicemanagement
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "git.x2erp.com/qdy/go-base/ctx"
  7. "git.x2erp.com/qdy/go-base/logger"
  8. "git.x2erp.com/qdy/go-base/model/response"
  9. "git.x2erp.com/qdy/go-base/util"
  10. "git.x2erp.com/qdy/go-db/factory/database"
  11. "github.com/jmoiron/sqlx"
  12. )
  13. // AddServiceConfigRequest 添加微服务配置请求
  14. type AddServiceConfigRequest struct {
  15. ServiceName string `json:"service_name"`
  16. MetaIDs []string `json:"meta_ids"`
  17. }
  18. // AddServiceConfig 从元元素多选添加配置到微服务
  19. func AddServiceConfig(req *AddServiceConfigRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[int64] {
  20. logger.Debug(fmt.Sprintf("AddServiceConfig-开始为微服务 %s 添加配置", req.ServiceName))
  21. if req.ServiceName == "" || len(req.MetaIDs) == 0 {
  22. logger.ErrorC(reqCtx, "参数不能为空")
  23. return util.CreateErrorResult[int64]("参数不能为空", reqCtx)
  24. }
  25. // 获取数据库连接
  26. db := dbFactory.GetDB()
  27. // 开始事务
  28. tx, err := db.BeginTxx(ctx, nil)
  29. if err != nil {
  30. logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err))
  31. return util.CreateErrorResult[int64](fmt.Sprintf("开始事务失败: %v", err), reqCtx)
  32. }
  33. defer func() {
  34. if p := recover(); p != nil {
  35. tx.Rollback()
  36. panic(p)
  37. }
  38. }()
  39. // 查询选中的元元素信息
  40. metaQuery := `
  41. SELECT id, config_name, field_name, field_type, yaml_name
  42. FROM config_meta
  43. WHERE id IN (?)
  44. `
  45. // 处理IN查询参数
  46. query, args, err := sqlx.In(metaQuery, req.MetaIDs)
  47. if err != nil {
  48. tx.Rollback()
  49. logger.ErrorC(reqCtx, fmt.Sprintf("构建IN查询失败: %v", err))
  50. return util.CreateErrorResult[int64](fmt.Sprintf("构建IN查询失败: %v", err), reqCtx)
  51. }
  52. type MetaRecord struct {
  53. ID string `db:"id"`
  54. ConfigName string `db:"config_name"`
  55. FieldName string `db:"field_name"`
  56. FieldType string `db:"field_type"`
  57. YamlName string `db:"yaml_name"`
  58. }
  59. var metaRecords []MetaRecord
  60. err = tx.SelectContext(ctx, &metaRecords, query, args...)
  61. if err != nil {
  62. tx.Rollback()
  63. logger.ErrorC(reqCtx, fmt.Sprintf("查询元元素失败: %v", err))
  64. return util.CreateErrorResult[int64](fmt.Sprintf("查询元元素失败: %v", err), reqCtx)
  65. }
  66. if len(metaRecords) != len(req.MetaIDs) {
  67. logger.WarnC(reqCtx, fmt.Sprintf("部分元元素未找到,找到 %d 个,请求 %d 个", len(metaRecords), len(req.MetaIDs)))
  68. }
  69. // 批量插入配置记录
  70. creator := reqCtx.UserID
  71. if creator == "" {
  72. creator = "system"
  73. }
  74. var insertedCount int64
  75. for _, meta := range metaRecords {
  76. // 生成配置ID
  77. configID := fmt.Sprintf("config_startup_svc.%s.%s.%s", req.ServiceName, meta.ConfigName, meta.YamlName)
  78. // 检查是否已存在相同配置
  79. checkQuery := `SELECT COUNT(*) FROM config_startup_svc WHERE id = ?`
  80. var count int
  81. err := tx.GetContext(ctx, &count, checkQuery, configID)
  82. if err == nil && count > 0 {
  83. logger.Debug(fmt.Sprintf("配置已存在: %s,跳过", configID))
  84. continue
  85. }
  86. // 插入配置记录
  87. insertQuery := `
  88. INSERT INTO config_startup_svc
  89. (id, service_name, config_name, yaml_name, yaml_value, creator, created_at)
  90. VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
  91. `
  92. // 默认值根据字段类型设置
  93. defaultValue := ""
  94. switch strings.ToLower(meta.FieldType) {
  95. case "int", "integer", "number":
  96. defaultValue = "0"
  97. case "bool", "boolean":
  98. defaultValue = "false"
  99. case "string":
  100. defaultValue = ""
  101. default:
  102. defaultValue = ""
  103. }
  104. _, err = tx.ExecContext(ctx, insertQuery,
  105. configID,
  106. req.ServiceName,
  107. meta.ConfigName,
  108. meta.YamlName,
  109. defaultValue,
  110. creator,
  111. )
  112. if err != nil {
  113. tx.Rollback()
  114. logger.ErrorC(reqCtx, fmt.Sprintf("插入配置失败: %v", err))
  115. return util.CreateErrorResult[int64](fmt.Sprintf("插入配置失败: %v", err), reqCtx)
  116. }
  117. insertedCount++
  118. logger.Debug(fmt.Sprintf("成功插入配置: %s", configID))
  119. }
  120. // 提交事务
  121. if err := tx.Commit(); err != nil {
  122. logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err))
  123. return util.CreateErrorResult[int64](fmt.Sprintf("提交事务失败: %v", err), reqCtx)
  124. }
  125. logger.Debug(fmt.Sprintf("成功为微服务 %s 添加 %d 个配置项", req.ServiceName, insertedCount))
  126. return util.CreateSuccessResultData[int64](insertedCount, reqCtx)
  127. }