| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- 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)
- }
|