Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

create_config_startup_svc.go 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package svcstartup
  2. import (
  3. "context"
  4. "fmt"
  5. "git.x2erp.com/qdy/go-base/ctx"
  6. "git.x2erp.com/qdy/go-base/logger"
  7. "git.x2erp.com/qdy/go-base/model/request/configreq"
  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. "git.x2erp.com/qdy/go-svc-configure/internal/service/dao"
  12. "github.com/jmoiron/sqlx"
  13. )
  14. func CreateStartupSVCConfig(serviceName string, req *configreq.ConfigRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[int64] {
  15. logger.Debug("CreateStartupSVCConfig-开始删除启动配置:%s", serviceName)
  16. param := dao.GetConfigStartupParamSVC(serviceName, req)
  17. if len(param.IDS) == 0 {
  18. logger.ErrorC(reqCtx, "参数为空")
  19. return util.CreateErrorResult[int64]("参数为空", reqCtx)
  20. }
  21. // 1. 验证配置字段与元信息一致性
  22. logger.Debug("开始验证配置字段与元信息一致性")
  23. metaRecords, err := dao.ValidateConfigFieldsWithMeta(ctx, dbFactory, param)
  24. if err != nil {
  25. logger.ErrorC(reqCtx, fmt.Sprintf("配置字段验证失败: %v", err))
  26. return util.CreateErrorResult[int64](fmt.Sprintf("配置字段验证失败: %v", err), reqCtx)
  27. }
  28. logger.Debug("配置字段验证通过")
  29. // 2. 验证字段值类型
  30. logger.Debug("开始验证字段值类型")
  31. if err := dao.ValidateFieldValues(req, metaRecords); err != nil {
  32. logger.ErrorC(reqCtx, fmt.Sprintf("字段值验证失败: %v", err))
  33. return util.CreateErrorResult[int64](fmt.Sprintf("字段值验证失败: %v", err), reqCtx)
  34. }
  35. logger.Debug("字段值验证通过")
  36. // 3. 获取数据库连接
  37. db := dbFactory.GetDB()
  38. // 4. 开始事务
  39. logger.Debug("开始数据库事务")
  40. tx, err := db.BeginTxx(ctx, nil)
  41. if err != nil {
  42. logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err))
  43. return util.CreateErrorResult[int64](fmt.Sprintf("开始事务失败: %v", err), reqCtx)
  44. }
  45. defer func() {
  46. if p := recover(); p != nil {
  47. tx.Rollback()
  48. panic(p)
  49. }
  50. }()
  51. countDel, err := deleteSVCExistingConfig(ctx, tx, param)
  52. if err != nil {
  53. tx.Rollback()
  54. logger.ErrorC(reqCtx, fmt.Sprintf("删除现有配置失败: %v", err))
  55. return util.CreateErrorResult[int64](fmt.Sprintf("删除现有配置失败: %v", err), reqCtx)
  56. }
  57. logger.Debug(fmt.Sprintf("已删除配置: %s 的 %d 个字段", req.YamlRoot, countDel))
  58. // 6. 生成批量插入数据
  59. logger.Debug("开始生成批量插入数据")
  60. records := generateBatchInsertDataSVC(serviceName, param, reqCtx.UserID)
  61. logger.Debug(fmt.Sprintf("生成了 %d 条配置记录", len(records)))
  62. // 7. 批量插入配置记录
  63. logger.Debug("开始批量插入配置记录")
  64. count, err := batchInsertConfigRecordsSVC(ctx, tx, records)
  65. if err != nil {
  66. tx.Rollback()
  67. logger.ErrorC(reqCtx, fmt.Sprintf("插入配置记录失败: %v", err))
  68. return util.CreateErrorResult[int64](fmt.Sprintf("插入配置记录失败: %v", err), reqCtx)
  69. }
  70. logger.Debug(fmt.Sprintf("成功插入 %d 条记录", count))
  71. // 8. 提交事务
  72. logger.Debug("正在提交事务")
  73. if err := tx.Commit(); err != nil {
  74. logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err))
  75. return util.CreateErrorResult[int64](fmt.Sprintf("提交事务失败: %v", err), reqCtx)
  76. }
  77. logger.Debug("启动配置创建完成")
  78. return util.CreateSuccessResultData[int64](count, reqCtx)
  79. }
  80. func DeleteSVCtartupConfig(serviceName string, req *configreq.ConfigRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[int64] {
  81. logger.Debug("DeleteSVCtartupConfig-开始删除启动配置:%s", serviceName)
  82. param := dao.GetConfigStartupParamSVC(serviceName, req)
  83. if len(param.IDS) == 0 {
  84. logger.ErrorC(reqCtx, "参数为空")
  85. return util.CreateErrorResult[int64]("参数为空", reqCtx)
  86. }
  87. if len(param.IDS) == 0 {
  88. return util.CreateErrorResult[int64]("需要指定要删除的配置字段", reqCtx)
  89. }
  90. // 获取数据库连接并开始事务
  91. db := dbFactory.GetDB()
  92. tx, err := db.BeginTxx(ctx, nil)
  93. if err != nil {
  94. logger.ErrorC(reqCtx, fmt.Sprintf("开始事务失败: %v", err))
  95. return util.CreateErrorResult[int64](fmt.Sprintf("开始事务失败: %v", err), reqCtx)
  96. }
  97. // 执行删除
  98. count, err := deleteSVCExistingConfig(ctx, tx, param)
  99. if err != nil {
  100. tx.Rollback()
  101. logger.ErrorC(reqCtx, fmt.Sprintf("删除配置失败: %v", err))
  102. return util.CreateErrorResult[int64](fmt.Sprintf("删除配置失败: %v", err), reqCtx)
  103. }
  104. // 提交事务
  105. if err := tx.Commit(); err != nil {
  106. logger.ErrorC(reqCtx, fmt.Sprintf("提交事务失败: %v", err))
  107. return util.CreateErrorResult[int64](fmt.Sprintf("提交事务失败: %v", err), reqCtx)
  108. }
  109. logger.Debug(fmt.Sprintf("成功删除配置: %s 的 %d 个字段", req.YamlRoot, count))
  110. return util.CreateSuccessResultData[int64](count, reqCtx)
  111. }
  112. // 删除现有配置
  113. func deleteSVCExistingConfig(ctx context.Context, tx *sqlx.Tx, param *dao.ConfigMetaParam) (int64, error) {
  114. query := `DELETE FROM config_startup_svc WHERE id IN (?)`
  115. ids := param.GetSvcIDS()
  116. query, args, err := sqlx.In(query, ids)
  117. if err != nil {
  118. return -1, fmt.Errorf("构建删除语句失败: %v", err)
  119. }
  120. result, err := tx.ExecContext(ctx, query, args...)
  121. return dao.ValidateResultRowsAffected(result, err, len(ids))
  122. }
  123. // 生成批量插入数据
  124. func generateBatchInsertDataSVC(serviceName string, param *dao.ConfigMetaParam, creator string) []interface{} {
  125. // 创建字段类型映射
  126. //fieldTypeMap := make(map[string]string)
  127. //for _, record := range metaRecords {
  128. // fieldTypeMap[record.YamlName] = record.FieldType
  129. //}
  130. req := param.ConfigRequest
  131. records := make([]interface{}, 0, len(req.ConfigFields))
  132. for _, configInfo := range req.ConfigFields {
  133. id := param.GetID(configInfo.YamlName)
  134. record := map[string]interface{}{
  135. "id": id,
  136. "service_name": serviceName,
  137. "config_name": req.YamlRoot,
  138. "yaml_name": configInfo.YamlName,
  139. "yaml_value": configInfo.YamlValue,
  140. "creator": creator,
  141. "created_at": "CURRENT_TIMESTAMP",
  142. }
  143. records = append(records, record)
  144. }
  145. return records
  146. }
  147. // 批量插入配置记录
  148. func batchInsertConfigRecordsSVC(ctx context.Context, tx *sqlx.Tx, records []interface{}) (int64, error) {
  149. if len(records) == 0 {
  150. return 0, nil
  151. }
  152. query := `
  153. INSERT INTO config_startup_svc
  154. (id,service_name,config_name, yaml_name, yaml_value, creator, created_at)
  155. VALUES (:id, :service_name, :config_name, :yaml_name, :yaml_value, :creator, CURRENT_TIMESTAMP)
  156. `
  157. result, err := tx.NamedExecContext(ctx, query, records)
  158. return dao.ValidateResultRowsAffected(result, err, len(records))
  159. }