Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

create_config_startup.go 6.1KB

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