package dicmanagement 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" ) // DicTableQueryRequest 数据库表字典查询请求 // 嵌入通用的QueryRequest,同时保持向后兼容的旧字段 type DicTableQueryRequest struct { queryreq.QueryRequest // 通用查询请求(分页、排序、筛选) // 向后兼容的旧字段(新客户端应使用QueryRequest中的Filters) TableID string `json:"tableID,omitempty" form:"tableID"` // 表ID模糊搜索 TableName string `json:"tableName,omitempty" form:"tableName"` // 表名称模糊搜索 TableType string `json:"tableType,omitempty" form:"tableType"` // 表类型精确搜索 SortField string `json:"sortField,omitempty" form:"sortField"` // 排序字段(单字段) SortOrder string `json:"sortOrder,omitempty" form:"sortOrder"` // 排序方向: asc/desc } // ListDicTable 查询数据库表字典列表(支持分页、搜索、排序) func ListDicTable(req *DicTableQueryRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableDB] { if logger.IsDebug() { logger.Debug("ListDicTable req: %v", req) } // 检查请求参数是否为nil if req == nil { logger.ErrorC(reqCtx, "ListDicTable请求参数为nil,创建默认参数") req = &DicTableQueryRequest{} req.Page = 0 req.PageSize = 10 } // 验证和规范化请求参数 req.Validate() // 将旧字段转换为新的Filters和Sorts(向后兼容) convertLegacyFields(req) logger.Debug(fmt.Sprintf("ListDicTable-开始查询数据库表字典,参数: page=%d, pageSize=%d, filters=%d, sorts=%d, legacyFields=[tableID=%s, tableName=%s, tableType=%s]", req.Page, req.PageSize, len(req.Filter), len(req.Filter), req.TableID, req.TableName, req.TableType)) // 获取数据库连接 db := dbFactory.GetDB() // 定义字段映射函数:前端字段名 -> 数据库列名 fieldMapper := func(field string) string { switch field { case "tableID": return "table_id" case "tableType": return "table_type" case "name": return "table_name" case "description": return "description" case "creator": return "creator" 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 table_id, table_type, table_name, description, creator, created_at, updated_at, deleted_at FROM dic_table WHERE deleted_at IS NULL ` // 构建计数查询 countQuery := "SELECT COUNT(*) FROM dic_table 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" } // 添加分页限制 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.DicTableDB](fmt.Sprintf("查询数据库表字典总数失败: %v", err), reqCtx) } // 查询分页数据 var tableList []tables.DicTableDB err = db.SelectContext(ctx, &tableList, dataQuery, queryArgs...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("查询数据库表字典失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableDB](fmt.Sprintf("查询数据库表字典失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("查询到 %d 条数据库表字典,总记录数: %d", len(tableList), totalCount)) // 创建结果,设置TotalCount result := util.CreateSuccessResultData[[]tables.DicTableDB](tableList, 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 *DicTableQueryRequest) { // 转换旧搜索字段为Filters if req.TableID != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "tableID", Operator: queryreq.OpLike, Value: req.TableID, }) } if req.TableName != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "name", Operator: queryreq.OpLike, Value: req.TableName, }) } if req.TableType != "" { req.Filter = append(req.Filter, queryreq.FilterParam{ Field: "tableType", Operator: queryreq.OpLike, Value: req.TableType, }) } // 转换旧排序字段为Sorts if req.SortField != "" { // 映射可能的旧字段名 sortField := req.SortField switch sortField { case "table_id": sortField = "tableID" case "table_type": sortField = "tableType" case "table_name": sortField = "name" case "description": sortField = "description" 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, }) } } // SearchDicTable 搜索数据库表字典(简单搜索) func SearchDicTable(ctx context.Context, dbFactory *database.DBFactory, tableID, tableName, tableType string, reqCtx *ctx.RequestContext) *response.QueryResult[[]tables.DicTableDB] { logger.Debug("SearchDicTable-开始搜索数据库表字典") // 获取数据库连接 db := dbFactory.GetDB() // 构建查询条件和参数 query := ` SELECT table_id, table_type, table_name, description, creator, created_at, updated_at, deleted_at FROM dic_table WHERE deleted_at IS NULL ` var args []interface{} if tableID != "" { query += " AND table_id LIKE ?" args = append(args, "%"+tableID+"%") } if tableName != "" { query += " AND table_name LIKE ?" args = append(args, "%"+tableName+"%") } if tableType != "" { query += " AND table_type = ?" args = append(args, tableType) } query += " ORDER BY table_id" var tableList []tables.DicTableDB err := db.SelectContext(ctx, &tableList, query, args...) if err != nil { logger.ErrorC(reqCtx, fmt.Sprintf("搜索数据库表字典失败: %v", err)) return util.CreateErrorResult[[]tables.DicTableDB](fmt.Sprintf("搜索数据库表字典失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("搜索到 %d 条数据库表字典", len(tableList))) return util.CreateSuccessResultData(tableList, reqCtx) }