Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

list_dic_table.go 7.7KB

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