暫無描述
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_dic_table.go 7.7KB

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