暫無描述
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.

list_table_field_alias.go 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package aliasmanagement
  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/request/queryreq"
  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/tables"
  13. )
  14. // ListTableFieldAlias 查询字段别名字典列表(支持分页、搜索、排序)
  15. func ListTableFieldAlias(req *TableFieldAliasQueryRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableFieldAliasDB] {
  16. if logger.IsDebug() {
  17. logger.Debug("ListTableFieldAlias req: %v", req)
  18. }
  19. // 检查请求参数是否为nil
  20. if req == nil {
  21. logger.ErrorC(reqCtx, "ListTableFieldAlias请求参数为nil,创建默认参数")
  22. req = &TableFieldAliasQueryRequest{}
  23. req.Page = 0
  24. req.PageSize = 10
  25. }
  26. // 验证和规范化请求参数
  27. req.Validate()
  28. // 将旧字段转换为新的Filters和Sorts(向后兼容)
  29. convertLegacyTableFieldAliasFields(req)
  30. logger.Debug(fmt.Sprintf("ListTableFieldAlias-开始查询字段别名字典,参数: page=%d, pageSize=%d, filters=%d, sorts=%d, legacyFields=[tableID=%s, fieldID=%s, fieldName=%s, fieldAlias=%s]",
  31. req.Page, req.PageSize, len(req.Filter), len(req.Filter), req.TableID, req.FieldID, req.FieldName, req.FieldAlias))
  32. // 获取数据库连接
  33. db := dbFactory.GetDB()
  34. // 定义字段映射函数:前端字段名 -> 数据库列名
  35. fieldMapper := func(field string) string {
  36. switch field {
  37. case "id":
  38. return "id"
  39. case "fieldID":
  40. return "field_id"
  41. case "tableID":
  42. return "table_id"
  43. case "fieldName":
  44. return "field_name"
  45. case "fieldAlias":
  46. return "field_alias"
  47. case "description":
  48. return "description"
  49. case "whereCondition":
  50. return "where"
  51. case "createdAt":
  52. return "created_at"
  53. case "updatedAt":
  54. return "updated_at"
  55. case "deletedAt":
  56. return "deleted_at"
  57. default:
  58. // 未知字段,返回空字符串(将被忽略)
  59. return ""
  60. }
  61. }
  62. // 使用通用查询构建器构建SQL
  63. whereClause, whereArgs := queryreq.BuildWhereClause(req.Filter, fieldMapper)
  64. orderByClause := queryreq.BuildOrderByClause(req.Sort, fieldMapper)
  65. // 构建基础查询
  66. baseQuery := `
  67. SELECT id, field_id, table_id, field_name, field_alias, description, where, created_at, updated_at, deleted_at
  68. FROM dic_table_field_alias
  69. WHERE deleted_at IS NULL
  70. `
  71. // 构建计数查询
  72. countQuery := "SELECT COUNT(*) FROM dic_table_field_alias WHERE deleted_at IS NULL"
  73. if whereClause != "" {
  74. // 移除"WHERE"前缀并清理空格
  75. conditions := strings.TrimSpace(strings.TrimPrefix(whereClause, "WHERE"))
  76. if conditions != "" {
  77. countQuery += " AND " + conditions
  78. }
  79. }
  80. // 构建数据查询
  81. dataQuery := baseQuery
  82. if whereClause != "" {
  83. // 移除"WHERE"前缀并清理空格
  84. conditions := strings.TrimSpace(strings.TrimPrefix(whereClause, "WHERE"))
  85. if conditions != "" {
  86. dataQuery += " AND " + conditions
  87. }
  88. }
  89. if orderByClause != "" {
  90. dataQuery += " " + orderByClause
  91. } else {
  92. // 默认排序
  93. dataQuery += " ORDER BY table_id, field_name, field_alias"
  94. }
  95. // 添加分页限制
  96. dataQuery += " LIMIT ? OFFSET ?"
  97. queryArgs := append(whereArgs, req.PageSize, req.GetOffset())
  98. // 查询总记录数
  99. var totalCount int64
  100. err := db.GetContext(ctx, &totalCount, countQuery, whereArgs...)
  101. if err != nil {
  102. logger.ErrorC(reqCtx, fmt.Sprintf("查询字段别名字典总数失败: %v", err))
  103. return util.CreateErrorResult[[]tables.DicTableFieldAliasDB](fmt.Sprintf("查询字段别名字典总数失败: %v", err), reqCtx)
  104. }
  105. // 查询分页数据
  106. var tableFieldAliasList []tables.DicTableFieldAliasDB
  107. err = db.SelectContext(ctx, &tableFieldAliasList, dataQuery, queryArgs...)
  108. if err != nil {
  109. logger.ErrorC(reqCtx, fmt.Sprintf("查询字段别名字典失败: %v", err))
  110. return util.CreateErrorResult[[]tables.DicTableFieldAliasDB](fmt.Sprintf("查询字段别名字典失败: %v", err), reqCtx)
  111. }
  112. logger.Debug(fmt.Sprintf("查询到 %d 条字段别名字典,总记录数: %d", len(tableFieldAliasList), totalCount))
  113. // 创建结果,设置TotalCount
  114. result := util.CreateSuccessResultData[[]tables.DicTableFieldAliasDB](tableFieldAliasList, reqCtx)
  115. result.TotalCount = int(totalCount)
  116. // 计算总页数
  117. pageSize := req.PageSize
  118. if pageSize <= 0 {
  119. pageSize = 10 // 默认每页10条
  120. }
  121. lastPage := 1
  122. if pageSize > 0 && totalCount > 0 {
  123. lastPage = (int(totalCount) + pageSize - 1) / pageSize
  124. }
  125. result.LastPage = lastPage
  126. logger.Debug(fmt.Sprintf("设置QueryResult TotalCount: %d, LastPage: %d", result.TotalCount, result.LastPage))
  127. return result
  128. }
  129. // convertLegacyTableFieldAliasFields 将旧字段转换为新的Filters和Sorts(向后兼容)
  130. func convertLegacyTableFieldAliasFields(req *TableFieldAliasQueryRequest) {
  131. // 转换旧搜索字段为Filters
  132. if req.TableID != "" {
  133. req.Filter = append(req.Filter, queryreq.FilterParam{
  134. Field: "tableID",
  135. Operator: queryreq.OpLike,
  136. Value: req.TableID,
  137. })
  138. }
  139. if req.FieldID != "" {
  140. req.Filter = append(req.Filter, queryreq.FilterParam{
  141. Field: "fieldID",
  142. Operator: queryreq.OpLike,
  143. Value: req.FieldID,
  144. })
  145. }
  146. if req.FieldName != "" {
  147. req.Filter = append(req.Filter, queryreq.FilterParam{
  148. Field: "fieldName",
  149. Operator: queryreq.OpLike,
  150. Value: req.FieldName,
  151. })
  152. }
  153. if req.FieldAlias != "" {
  154. req.Filter = append(req.Filter, queryreq.FilterParam{
  155. Field: "fieldAlias",
  156. Operator: queryreq.OpLike,
  157. Value: req.FieldAlias,
  158. })
  159. }
  160. // 转换旧排序字段为Sorts
  161. if req.SortField != "" {
  162. // 映射可能的旧字段名
  163. sortField := req.SortField
  164. switch sortField {
  165. case "field_id":
  166. sortField = "fieldID"
  167. case "table_id":
  168. sortField = "tableID"
  169. case "field_name":
  170. sortField = "fieldName"
  171. case "field_alias":
  172. sortField = "fieldAlias"
  173. case "description":
  174. sortField = "description"
  175. case "where":
  176. sortField = "whereCondition"
  177. case "created_at":
  178. sortField = "createdAt"
  179. case "updated_at":
  180. sortField = "updatedAt"
  181. }
  182. sortOrder := req.SortOrder
  183. if sortOrder != "asc" && sortOrder != "desc" {
  184. sortOrder = "asc"
  185. }
  186. req.Sort = append(req.Sort, queryreq.SortParam{
  187. Field: sortField,
  188. Order: sortOrder,
  189. })
  190. }
  191. }
  192. // SearchTableFieldAlias 搜索字段别名字典(简单搜索)
  193. func SearchTableFieldAlias(ctx context.Context, dbFactory *database.DBFactory, tableID, fieldID, fieldName, fieldAlias string, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableFieldAliasDB] {
  194. logger.Debug("SearchTableFieldAlias-开始搜索字段别名字典")
  195. // 获取数据库连接
  196. db := dbFactory.GetDB()
  197. // 构建查询条件和参数
  198. query := `
  199. SELECT id, field_id, table_id, field_name, field_alias, description, where, created_at, updated_at, deleted_at
  200. FROM dic_table_field_alias
  201. WHERE deleted_at IS NULL
  202. `
  203. var args []interface{}
  204. if tableID != "" {
  205. query += " AND table_id LIKE ?"
  206. args = append(args, "%"+tableID+"%")
  207. }
  208. if fieldID != "" {
  209. query += " AND field_id LIKE ?"
  210. args = append(args, "%"+fieldID+"%")
  211. }
  212. if fieldName != "" {
  213. query += " AND field_name LIKE ?"
  214. args = append(args, "%"+fieldName+"%")
  215. }
  216. if fieldAlias != "" {
  217. query += " AND field_alias LIKE ?"
  218. args = append(args, "%"+fieldAlias+"%")
  219. }
  220. query += " ORDER BY table_id, field_name, field_alias"
  221. var tableFieldAliasList []tables.DicTableFieldAliasDB
  222. err := db.SelectContext(ctx, &tableFieldAliasList, query, args...)
  223. if err != nil {
  224. logger.ErrorC(reqCtx, fmt.Sprintf("搜索字段别名字典失败: %v", err))
  225. return util.CreateErrorResult[[]tables.DicTableFieldAliasDB](fmt.Sprintf("搜索字段别名字典失败: %v", err), reqCtx)
  226. }
  227. logger.Debug(fmt.Sprintf("搜索到 %d 条字段别名字典", len(tableFieldAliasList)))
  228. return util.CreateSuccessResultData(tableFieldAliasList, reqCtx)
  229. }