Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

list_config_meta.go 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package metamanagement
  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/queryreq"
  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/tables"
  12. )
  13. // ConfigMetaQueryRequest 配置元信息查询请求
  14. // 嵌入通用的QueryRequest,同时保持向后兼容的旧字段
  15. type ConfigMetaQueryRequest struct {
  16. queryreq.QueryRequest // 通用查询请求(分页、排序、筛选)
  17. // 向后兼容的旧字段(新客户端应使用QueryRequest中的Filters)
  18. ConfigName string `json:"configName,omitempty" form:"configName"` // 配置名称模糊搜索
  19. FieldName string `json:"fieldName,omitempty" form:"fieldName"` // 字段名称模糊搜索
  20. YamlName string `json:"yamlName,omitempty" form:"yamlName"` // YAML标签模糊搜索
  21. SortField string `json:"sortField,omitempty" form:"sortField"` // 排序字段(单字段)
  22. SortOrder string `json:"sortOrder,omitempty" form:"sortOrder"` // 排序方向: asc/desc
  23. }
  24. // ListConfigMeta 查询配置元信息列表(支持分页、搜索、排序)
  25. func ListConfigMeta(req *ConfigMetaQueryRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.ConfigMetaDB] {
  26. if logger.IsDebug() {
  27. logger.Debug("req: %v", req)
  28. }
  29. // 检查请求参数是否为nil
  30. if req == nil {
  31. logger.ErrorC(reqCtx, "ListConfigMeta请求参数为nil,创建默认参数")
  32. req = &ConfigMetaQueryRequest{}
  33. req.Page = 0
  34. req.PageSize = 10
  35. }
  36. // 验证和规范化请求参数
  37. req.Validate()
  38. // 将旧字段转换为新的Filters和Sorts(向后兼容)
  39. convertLegacyFields(req)
  40. logger.Debug(fmt.Sprintf("ListConfigMeta-开始查询配置元信息,参数: page=%d, pageSize=%d, filters=%d, sorts=%d, legacyFields=[configName=%s, fieldName=%s, yamlName=%s]",
  41. req.Page, req.PageSize, len(req.Filter), len(req.Filter), req.ConfigName, req.FieldName, req.YamlName))
  42. // 获取数据库连接
  43. db := dbFactory.GetDB()
  44. // 定义字段映射函数:前端字段名 -> 数据库列名
  45. fieldMapper := func(field string) string {
  46. switch field {
  47. case "id":
  48. return "id"
  49. case "configName":
  50. return "config_name"
  51. case "fieldName":
  52. return "field_name"
  53. case "fieldType":
  54. return "field_type"
  55. case "yamlName":
  56. return "yaml_name"
  57. case "fieldDesc", "configDesc": // 支持两种命名
  58. return "field_desc"
  59. case "creator":
  60. return "creator"
  61. case "createdAt":
  62. return "created_at"
  63. default:
  64. // 未知字段,返回空字符串(将被忽略)
  65. return ""
  66. }
  67. }
  68. // 使用通用查询构建器构建SQL
  69. whereClause, whereArgs := queryreq.BuildWhereClause(req.Filter, fieldMapper)
  70. orderByClause := queryreq.BuildOrderByClause(req.Sort, fieldMapper)
  71. // 构建基础查询
  72. baseQuery := `
  73. SELECT id, config_name, field_name, field_type, yaml_name, field_desc, creator, created_at
  74. FROM config_meta
  75. `
  76. // 构建计数查询
  77. countQuery := "SELECT COUNT(*) FROM config_meta"
  78. if whereClause != "" {
  79. countQuery += " " + whereClause
  80. }
  81. // 构建数据查询
  82. dataQuery := baseQuery
  83. if whereClause != "" {
  84. dataQuery += " " + whereClause
  85. }
  86. if orderByClause != "" {
  87. dataQuery += " " + orderByClause
  88. } else {
  89. // 默认排序
  90. dataQuery += " ORDER BY config_name, field_name"
  91. }
  92. // 添加分页限制
  93. dataQuery += " LIMIT ? OFFSET ?"
  94. queryArgs := append(whereArgs, req.PageSize, req.GetOffset())
  95. // 查询总记录数
  96. var totalCount int64
  97. err := db.GetContext(ctx, &totalCount, countQuery, whereArgs...)
  98. if err != nil {
  99. logger.ErrorC(reqCtx, fmt.Sprintf("查询配置元信息总数失败: %v", err))
  100. return util.CreateErrorResult[[]tables.ConfigMetaDB](fmt.Sprintf("查询配置元信息总数失败: %v", err), reqCtx)
  101. }
  102. // 查询分页数据
  103. var metaList []tables.ConfigMetaDB
  104. err = db.SelectContext(ctx, &metaList, dataQuery, queryArgs...)
  105. if err != nil {
  106. logger.ErrorC(reqCtx, fmt.Sprintf("查询配置元信息失败: %v", err))
  107. return util.CreateErrorResult[[]tables.ConfigMetaDB](fmt.Sprintf("查询配置元信息失败: %v", err), reqCtx)
  108. }
  109. logger.Debug(fmt.Sprintf("查询到 %d 条配置元信息,总记录数: %d", len(metaList), totalCount))
  110. // 创建结果,设置TotalCount
  111. result := util.CreateSuccessResultData[[]tables.ConfigMetaDB](metaList, reqCtx)
  112. result.TotalCount = int(totalCount)
  113. // 计算总页数
  114. pageSize := req.PageSize
  115. if pageSize <= 0 {
  116. pageSize = 10 // 默认每页10条
  117. }
  118. lastPage := 1
  119. if pageSize > 0 && totalCount > 0 {
  120. lastPage = (int(totalCount) + pageSize - 1) / pageSize
  121. }
  122. result.LastPage = lastPage
  123. logger.Debug(fmt.Sprintf("设置QueryResult TotalCount: %d, LastPage: %d", result.TotalCount, result.LastPage))
  124. return result
  125. }
  126. // convertLegacyFields 将旧字段转换为新的Filters和Sorts(向后兼容)
  127. func convertLegacyFields(req *ConfigMetaQueryRequest) {
  128. // 转换旧搜索字段为Filters
  129. if req.ConfigName != "" {
  130. req.Filter = append(req.Filter, queryreq.FilterParam{
  131. Field: "configName",
  132. Operator: queryreq.OpLike,
  133. Value: req.ConfigName,
  134. })
  135. }
  136. if req.FieldName != "" {
  137. req.Filter = append(req.Filter, queryreq.FilterParam{
  138. Field: "fieldName",
  139. Operator: queryreq.OpLike,
  140. Value: req.FieldName,
  141. })
  142. }
  143. if req.YamlName != "" {
  144. req.Filter = append(req.Filter, queryreq.FilterParam{
  145. Field: "yamlName",
  146. Operator: queryreq.OpLike,
  147. Value: req.YamlName,
  148. })
  149. }
  150. // 转换旧排序字段为Sorts
  151. if req.SortField != "" {
  152. // 映射可能的旧字段名
  153. sortField := req.SortField
  154. switch sortField {
  155. case "config_name":
  156. sortField = "configName"
  157. case "field_name":
  158. sortField = "fieldName"
  159. case "field_type":
  160. sortField = "fieldType"
  161. case "yaml_name":
  162. sortField = "yamlName"
  163. case "field_desc":
  164. sortField = "fieldDesc"
  165. case "created_at":
  166. sortField = "createdAt"
  167. }
  168. sortOrder := req.SortOrder
  169. if sortOrder != "asc" && sortOrder != "desc" {
  170. sortOrder = "asc"
  171. }
  172. req.Sort = append(req.Sort, queryreq.SortParam{
  173. Field: sortField,
  174. Order: sortOrder,
  175. })
  176. }
  177. }
  178. // SearchConfigMeta 搜索配置元信息
  179. func SearchConfigMeta(ctx context.Context, dbFactory *database.DBFactory, configName, fieldName, yamlName string, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.ConfigMetaDB] {
  180. logger.Debug("SearchConfigMeta-开始搜索配置元信息")
  181. // 获取数据库连接
  182. db := dbFactory.GetDB()
  183. // 构建查询条件和参数
  184. query := `
  185. SELECT id, config_name, field_name, field_type, yaml_name, field_desc, creator, created_at
  186. FROM config_meta
  187. WHERE 1=1
  188. `
  189. var args []interface{}
  190. if configName != "" {
  191. query += " AND config_name LIKE ?"
  192. args = append(args, "%"+configName+"%")
  193. }
  194. if fieldName != "" {
  195. query += " AND field_name LIKE ?"
  196. args = append(args, "%"+fieldName+"%")
  197. }
  198. if yamlName != "" {
  199. query += " AND yaml_name LIKE ?"
  200. args = append(args, "%"+yamlName+"%")
  201. }
  202. query += " ORDER BY config_name, field_name"
  203. var metaList []tables.ConfigMetaDB
  204. err := db.SelectContext(ctx, &metaList, query, args...)
  205. if err != nil {
  206. logger.ErrorC(reqCtx, fmt.Sprintf("搜索配置元信息失败: %v", err))
  207. return util.CreateErrorResult[[]tables.ConfigMetaDB](fmt.Sprintf("搜索配置元信息失败: %v", err), reqCtx)
  208. }
  209. logger.Debug(fmt.Sprintf("搜索到 %d 条配置元信息", len(metaList)))
  210. return util.CreateSuccessResultData[[]tables.ConfigMetaDB](metaList, reqCtx)
  211. }