package metamanagement import ( "context" "fmt" "git.x2erp.com/qdy/go-base/ctx" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/model/request/queryreq" "git.x2erp.com/qdy/go-base/model/response" "git.x2erp.com/qdy/go-base/util" "git.x2erp.com/qdy/go-db/factory/database" "git.x2erp.com/qdy/go-svc-configure/internal/tables" ) // ConfigMetaQueryRequest 配置元信息查询请求 // 嵌入通用的QueryRequest,同时保持向后兼容的旧字段 type ConfigMetaQueryRequest struct { queryreq.QueryRequest // 通用查询请求(分页、排序、筛选) // 向后兼容的旧字段(新客户端应使用QueryRequest中的Filters) ConfigName string `json:"configName,omitempty" form:"configName"` // 配置名称模糊搜索 FieldName string `json:"fieldName,omitempty" form:"fieldName"` // 字段名称模糊搜索 YamlName string `json:"yamlName,omitempty" form:"yamlName"` // YAML标签模糊搜索 SortField string `json:"sortField,omitempty" form:"sortField"` // 排序字段(单字段) SortOrder string `json:"sortOrder,omitempty" form:"sortOrder"` // 排序方向: asc/desc } // ListConfigMeta 查询配置元信息列表(支持分页、搜索、排序) func ListConfigMeta(req *ConfigMetaQueryRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.ConfigMetaDB] { if logger.IsDebug() { logger.Debug("req: %v", req) } // 检查请求参数是否为nil if req == nil { logger.ErrorC(reqCtx, "ListConfigMeta请求参数为nil,创建默认参数") req = &ConfigMetaQueryRequest{} req.Page = 0 req.PageSize = 10 } // 验证和规范化请求参数 req.Validate() // 将旧字段转换为新的Filters和Sorts(向后兼容) convertLegacyFields(req) logger.Debug(fmt.Sprintf("ListConfigMeta-开始查询配置元信息,参数: page=%d, pageSize=%d, filters=%d, sorts=%d, legacyFields=[configName=%s, fieldName=%s, yamlName=%s]", req.Page, req.PageSize, len(req.Filter), len(req.Filter), req.ConfigName, req.FieldName, req.YamlName)) // 获取数据库连接 db := dbFactory.GetDB() // 定义字段映射函数:前端字段名 -> 数据库列名 fieldMapper := func(field string) string { switch field { case "id": return "id" case "configName": return "config_name" case "fieldName": return "field_name" case "fieldType": return "field_type" case "yamlName": return "yaml_name" case "fieldDesc", "configDesc": // 支持两种命名 return "field_desc" case "creator": return "creator" case "createdAt": return "created_at" default: // 未知字段,返回空字符串(将被忽略) return "" } } // 使用通用查询构建器构建SQL whereClause, whereArgs := queryreq.BuildWhereClause(req.Filter, fieldMapper) orderByClause := queryreq.BuildOrderByClause(req.Sort, fieldMapper) // 构建基础查询 baseQuery := ` SELECT id, config_name, field_name, field_type, yaml_name, field_desc, creator, created_at FROM config_meta ` // 构建计数查询 countQuery := "SELECT COUNT(*) FROM config_meta" if whereClause != "" { countQuery += " " + whereClause } // 构建数据查询 dataQuery := baseQuery if whereClause != "" { dataQuery += " " + whereClause } if orderByClause != "" { dataQuery += " " + orderByClause } else { // 默认排序 dataQuery += " ORDER BY config_name, field_name" } // 添加分页限制 dataQuery += " LIMIT ? OFFSET ?" queryArgs := append(whereArgs, req.PageSize, req.GetOffset()) // 查询总记录数 var totalCount int64 err := db.GetContext(ctx, &totalCount, countQuery, whereArgs...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("查询配置元信息总数失败: %v", err)) return util.CreateErrorResult[[]tables.ConfigMetaDB](fmt.Sprintf("查询配置元信息总数失败: %v", err), reqCtx) } // 查询分页数据 var metaList []tables.ConfigMetaDB err = db.SelectContext(ctx, &metaList, dataQuery, queryArgs...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("查询配置元信息失败: %v", err)) return util.CreateErrorResult[[]tables.ConfigMetaDB](fmt.Sprintf("查询配置元信息失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("查询到 %d 条配置元信息,总记录数: %d", len(metaList), totalCount)) // 创建结果,设置TotalCount result := util.CreateSuccessResultData[[]tables.ConfigMetaDB](metaList, reqCtx) result.TotalCount = int(totalCount) // 计算总页数 pageSize := req.PageSize if pageSize <= 0 { pageSize = 10 // 默认每页10条 } lastPage := 1 if pageSize > 0 && totalCount > 0 { lastPage = (int(totalCount) + pageSize - 1) / pageSize } result.LastPage = lastPage logger.Debug(fmt.Sprintf("设置QueryResult TotalCount: %d, LastPage: %d", result.TotalCount, result.LastPage)) return result } // convertLegacyFields 将旧字段转换为新的Filters和Sorts(向后兼容) func convertLegacyFields(req *ConfigMetaQueryRequest) { // 转换旧搜索字段为Filters if req.ConfigName != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "configName", Operator: queryreq.OpLike, Value: req.ConfigName, }) } if req.FieldName != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "fieldName", Operator: queryreq.OpLike, Value: req.FieldName, }) } if req.YamlName != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "yamlName", Operator: queryreq.OpLike, Value: req.YamlName, }) } // 转换旧排序字段为Sorts if req.SortField != "" { // 映射可能的旧字段名 sortField := req.SortField switch sortField { case "config_name": sortField = "configName" case "field_name": sortField = "fieldName" case "field_type": sortField = "fieldType" case "yaml_name": sortField = "yamlName" case "field_desc": sortField = "fieldDesc" case "created_at": sortField = "createdAt" } sortOrder := req.SortOrder if sortOrder != "asc" && sortOrder != "desc" { sortOrder = "asc" } req.Sort = append(req.Sort, queryreq.SortParam{ Field: sortField, Order: sortOrder, }) } } // SearchConfigMeta 搜索配置元信息 func SearchConfigMeta(ctx context.Context, dbFactory *database.DBFactory, configName, fieldName, yamlName string, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.ConfigMetaDB] { logger.Debug("SearchConfigMeta-开始搜索配置元信息") // 获取数据库连接 db := dbFactory.GetDB() // 构建查询条件和参数 query := ` SELECT id, config_name, field_name, field_type, yaml_name, field_desc, creator, created_at FROM config_meta WHERE 1=1 ` var args []interface{} if configName != "" { query += " AND config_name LIKE ?" args = append(args, "%"+configName+"%") } if fieldName != "" { query += " AND field_name LIKE ?" args = append(args, "%"+fieldName+"%") } if yamlName != "" { query += " AND yaml_name LIKE ?" args = append(args, "%"+yamlName+"%") } query += " ORDER BY config_name, field_name" var metaList []tables.ConfigMetaDB err := db.SelectContext(ctx, &metaList, query, args...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("搜索配置元信息失败: %v", err)) return util.CreateErrorResult[[]tables.ConfigMetaDB](fmt.Sprintf("搜索配置元信息失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("搜索到 %d 条配置元信息", len(metaList))) return util.CreateSuccessResultData[[]tables.ConfigMetaDB](metaList, reqCtx) }