package aliasmanagement import ( "context" "fmt" "strings" "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" ) // ListTableFieldAlias 查询字段别名字典列表(支持分页、搜索、排序) func ListTableFieldAlias(req *TableFieldAliasQueryRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableFieldAliasDB] { if logger.IsDebug() { logger.Debug("ListTableFieldAlias req: %v", req) } // 检查请求参数是否为nil if req == nil { logger.ErrorC(reqCtx, "ListTableFieldAlias请求参数为nil,创建默认参数") req = &TableFieldAliasQueryRequest{} req.Page = 0 req.PageSize = 10 } // 验证和规范化请求参数 req.Validate() // 将旧字段转换为新的Filters和Sorts(向后兼容) convertLegacyTableFieldAliasFields(req) logger.Debug(fmt.Sprintf("ListTableFieldAlias-开始查询字段别名字典,参数: page=%d, pageSize=%d, filters=%d, sorts=%d, legacyFields=[tableID=%s, fieldID=%s, fieldName=%s, fieldAlias=%s]", req.Page, req.PageSize, len(req.Filter), len(req.Filter), req.TableID, req.FieldID, req.FieldName, req.FieldAlias)) // 获取数据库连接 db := dbFactory.GetDB() // 定义字段映射函数:前端字段名 -> 数据库列名 fieldMapper := func(field string) string { switch field { case "id": return "id" case "fieldID": return "field_id" case "tableID": return "table_id" case "fieldName": return "field_name" case "fieldAlias": return "field_alias" case "description": return "description" case "whereCondition": return "where" case "createdAt": return "created_at" case "updatedAt": return "updated_at" case "deletedAt": return "deleted_at" default: // 未知字段,返回空字符串(将被忽略) return "" } } // 使用通用查询构建器构建SQL whereClause, whereArgs := queryreq.BuildWhereClause(req.Filter, fieldMapper) orderByClause := queryreq.BuildOrderByClause(req.Sort, fieldMapper) // 构建基础查询 baseQuery := ` SELECT id, field_id, table_id, field_name, field_alias, description, where, created_at, updated_at, deleted_at FROM dic_table_field_alias WHERE deleted_at IS NULL ` // 构建计数查询 countQuery := "SELECT COUNT(*) FROM dic_table_field_alias WHERE deleted_at IS NULL" if whereClause != "" { // 移除"WHERE"前缀并清理空格 conditions := strings.TrimSpace(strings.TrimPrefix(whereClause, "WHERE")) if conditions != "" { countQuery += " AND " + conditions } } // 构建数据查询 dataQuery := baseQuery if whereClause != "" { // 移除"WHERE"前缀并清理空格 conditions := strings.TrimSpace(strings.TrimPrefix(whereClause, "WHERE")) if conditions != "" { dataQuery += " AND " + conditions } } if orderByClause != "" { dataQuery += " " + orderByClause } else { // 默认排序 dataQuery += " ORDER BY table_id, field_name, field_alias" } // 添加分页限制 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.DicTableFieldAliasDB](fmt.Sprintf("查询字段别名字典总数失败: %v", err), reqCtx) } // 查询分页数据 var tableFieldAliasList []tables.DicTableFieldAliasDB err = db.SelectContext(ctx, &tableFieldAliasList, dataQuery, queryArgs...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("查询字段别名字典失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableFieldAliasDB](fmt.Sprintf("查询字段别名字典失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("查询到 %d 条字段别名字典,总记录数: %d", len(tableFieldAliasList), totalCount)) // 创建结果,设置TotalCount result := util.CreateSuccessResultData[[]tables.DicTableFieldAliasDB](tableFieldAliasList, 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 } // convertLegacyTableFieldAliasFields 将旧字段转换为新的Filters和Sorts(向后兼容) func convertLegacyTableFieldAliasFields(req *TableFieldAliasQueryRequest) { // 转换旧搜索字段为Filters if req.TableID != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "tableID", Operator: queryreq.OpLike, Value: req.TableID, }) } if req.FieldID != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "fieldID", Operator: queryreq.OpLike, Value: req.FieldID, }) } if req.FieldName != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "fieldName", Operator: queryreq.OpLike, Value: req.FieldName, }) } if req.FieldAlias != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "fieldAlias", Operator: queryreq.OpLike, Value: req.FieldAlias, }) } // 转换旧排序字段为Sorts if req.SortField != "" { // 映射可能的旧字段名 sortField := req.SortField switch sortField { case "field_id": sortField = "fieldID" case "table_id": sortField = "tableID" case "field_name": sortField = "fieldName" case "field_alias": sortField = "fieldAlias" case "description": sortField = "description" case "where": sortField = "whereCondition" case "created_at": sortField = "createdAt" case "updated_at": sortField = "updatedAt" } sortOrder := req.SortOrder if sortOrder != "asc" && sortOrder != "desc" { sortOrder = "asc" } req.Sort = append(req.Sort, queryreq.SortParam{ Field: sortField, Order: sortOrder, }) } } // SearchTableFieldAlias 搜索字段别名字典(简单搜索) func SearchTableFieldAlias(ctx context.Context, dbFactory *database.DBFactory, tableID, fieldID, fieldName, fieldAlias string, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableFieldAliasDB] { logger.Debug("SearchTableFieldAlias-开始搜索字段别名字典") // 获取数据库连接 db := dbFactory.GetDB() // 构建查询条件和参数 query := ` SELECT id, field_id, table_id, field_name, field_alias, description, where, created_at, updated_at, deleted_at FROM dic_table_field_alias WHERE deleted_at IS NULL ` var args []interface{} if tableID != "" { query += " AND table_id LIKE ?" args = append(args, "%"+tableID+"%") } if fieldID != "" { query += " AND field_id LIKE ?" args = append(args, "%"+fieldID+"%") } if fieldName != "" { query += " AND field_name LIKE ?" args = append(args, "%"+fieldName+"%") } if fieldAlias != "" { query += " AND field_alias LIKE ?" args = append(args, "%"+fieldAlias+"%") } query += " ORDER BY table_id, field_name, field_alias" var tableFieldAliasList []tables.DicTableFieldAliasDB err := db.SelectContext(ctx, &tableFieldAliasList, query, args...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("搜索字段别名字典失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableFieldAliasDB](fmt.Sprintf("搜索字段别名字典失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("搜索到 %d 条字段别名字典", len(tableFieldAliasList))) return util.CreateSuccessResultData(tableFieldAliasList, reqCtx) }