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/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" ) // GetDicTableDetail 获取数据库表字典详情(主表+子表) func GetDicTableDetail(tableID string, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[DicTableDetail] { logger.Debug(fmt.Sprintf("GetDicTableDetail-开始获取数据库表字典详情: %s", tableID)) // 参数验证 if tableID == "" { logger.ErrorC(reqCtx, "表ID不能为空") return util.CreateErrorResult[DicTableDetail]("表ID不能为空", reqCtx) } // 获取数据库连接 db := dbFactory.GetDB() // 查询主表信息 var table tables.DicTableDB query := ` SELECT table_id, table_type, table_name, description, creator, created_at, updated_at, deleted_at FROM dic_table WHERE table_id = ? AND deleted_at IS NULL ` err := db.GetContext(ctx, &table, query, tableID) if err != nil { errMsg := err.Error() // 检查是否是"表不存在"错误(no rows in result set) // 处理不同数据库驱动可能返回的不同错误消息 lowerErrMsg := strings.ToLower(errMsg) if strings.Contains(lowerErrMsg, "no rows") || strings.Contains(lowerErrMsg, "没有找到") || strings.Contains(lowerErrMsg, "不存在") || strings.Contains(lowerErrMsg, "not found") { logger.DebugC(reqCtx, fmt.Sprintf("表 %s 不存在", tableID)) return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字典主表失败: sql: no rows in result set"), reqCtx) } // 检查是否是context取消错误 if strings.Contains(errMsg, "context canceled") || strings.Contains(errMsg, "context deadline exceeded") { logger.WarnC(reqCtx, fmt.Sprintf("查询表 %s 被取消: %v", tableID, err)) return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字典主表失败: context canceled"), reqCtx) } // 其他查询错误 logger.ErrorC(reqCtx, fmt.Sprintf("查询数据库表字典主表失败: %v", err)) return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字典主表失败: %v", err), reqCtx) } // 查询子表信息(字段列表) var fields []tables.DicTableFieldDB fieldQuery := ` SELECT id, field_id, table_id, filed_type, data_type, field_name, field_name_cn, description, creator, created_at, updated_at, deleted_at FROM dic_table_field WHERE table_id = ? AND deleted_at IS NULL ORDER BY created_at ` err = db.SelectContext(ctx, &fields, fieldQuery, tableID) if err != nil { errMsg := err.Error() // 检查是否是context取消错误 if strings.Contains(errMsg, "context canceled") || strings.Contains(errMsg, "context deadline exceeded") { logger.WarnC(reqCtx, fmt.Sprintf("查询表 %s 字段被取消: %v", tableID, err)) return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字段字典失败: context canceled"), reqCtx) } // 其他查询错误(SelectContext通常不会返回no rows错误) logger.ErrorC(reqCtx, fmt.Sprintf("查询数据库表字段字典失败: %v", err)) return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字段字典失败: %v", err), reqCtx) } logger.Debug(fmt.Sprintf("获取到数据库表字典详情: %s, 包含 %d 个字段", tableID, len(fields))) // 构建返回结果 detail := DicTableDetail{ Table: table, Fields: fields, } return util.CreateSuccessResultData[DicTableDetail](detail, reqCtx) }