Sin descripción
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_sync_solution.go 7.8KB

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