""" 数据盘点智能分析服务路由 包含以下接口: 1. /api/v1/inventory/parse-document - 文档解析接口 2. /api/v1/inventory/parse-sql-result - SQL 结果解析接口 3. /api/v1/inventory/parse-business-tables - 业务表解析接口 4. /api/v1/inventory/ai-analyze - 数据资产智能识别接口 """ from fastapi import APIRouter from app.core.response import success_response, APIResponse from app.schemas.inventory import AIAnalyzeRequest, AIAnalyzeResponse from app.schemas.parse_document import ParseDocumentRequest, ParseDocumentResponse from app.schemas.parse_business_tables import ParseBusinessTablesRequest, ParseBusinessTablesResponse from app.schemas.parse_sql_result import ParseSQLResultRequest, ParseSQLResultResponse from app.services.ai_analyze_service import AIAnalyzeService from app.services.parse_document_service import ParseDocumentService from app.services.parse_business_tables_service import ParseBusinessTablesService from app.services.parse_sql_result_service import ParseSQLResultService from app.utils.logger import logger router = APIRouter(prefix="/inventory", tags=["数据盘点"]) @router.post( "/parse-document", response_model=APIResponse[ParseDocumentResponse], summary="文档解析接口", description="解析上传的数据字典文档(Excel/Word/PDF),提取表结构信息" ) async def parse_document(request: ParseDocumentRequest): """ 文档解析接口 解析数据字典文档,支持以下格式: - Excel (.xlsx, .xls) - Word (.doc, .docx) - PDF (.pdf) Args: request: 文档解析请求,包含文件路径、文件类型、项目ID Returns: 解析出的表结构信息 """ logger.info( f"收到文档解析请求 - 文件: {request.file_path}, " f"类型: {request.file_type}, 项目ID: {request.project_id}" ) try: # 调用服务解析文档 result = await ParseDocumentService.parse( file_path=request.file_path, file_type=request.file_type, project_id=request.project_id ) # 返回成功响应 return success_response( data=result, message="文档解析成功" ) except Exception as e: # 异常已在全局异常处理器中处理 logger.exception(f"文档解析接口处理失败: {str(e)}") raise @router.post( "/parse-sql-result", response_model=APIResponse[ParseSQLResultResponse], summary="SQL 结果解析接口", description="解析 IT 执行 SQL 脚本后导出的 Excel/CSV 结果文件" ) async def parse_sql_result(request: ParseSQLResultRequest): """ SQL 结果解析接口 解析 IT 部门执行标准 SQL 脚本后导出的结果文件,支持: - Excel (.xlsx, .xls) - CSV (.csv) Args: request: SQL 结果解析请求,包含文件路径、文件类型、项目ID Returns: 解析出的表结构信息 """ logger.info( f"收到 SQL 结果解析请求 - 文件: {request.file_path}, " f"类型: {request.file_type}, 项目ID: {request.project_id}" ) try: # 调用服务解析 SQL 结果 result = await ParseSQLResultService.parse( file_path=request.file_path, file_type=request.file_type, project_id=request.project_id ) # 返回成功响应 return success_response( data=result, message="SQL 结果解析成功" ) except Exception as e: # 异常已在全局异常处理器中处理 logger.exception(f"SQL 结果解析接口处理失败: {str(e)}") raise @router.post( "/parse-business-tables", response_model=APIResponse[ParseBusinessTablesResponse], summary="业务表解析接口", description="解析业务人员手动导出的核心业务表(Excel/CSV),支持批量文件解析" ) async def parse_business_tables(request: ParseBusinessTablesRequest): """ 业务表解析接口 批量解析业务人员导出的核心业务表文件,支持: - Excel (.xlsx, .xls) - CSV (.csv) - 多文件批量处理 Args: request: 业务表解析请求,包含文件路径列表、项目ID Returns: 解析出的表结构信息 """ logger.info( f"收到业务表解析请求 - 文件数: {len(request.file_paths)}, " f"项目ID: {request.project_id}" ) try: # 调用服务解析业务表 result = await ParseBusinessTablesService.parse( file_paths=request.file_paths, project_id=request.project_id ) # 返回成功响应 return success_response( data=result, message=f"成功解析 {result['success_files']}/{result['total_files']} 个文件,提取 {result['total_tables']} 个表" ) except Exception as e: # 异常已在全局异常处理器中处理 logger.exception(f"业务表解析接口处理失败: {str(e)}") raise @router.post( "/ai-analyze", response_model=APIResponse[AIAnalyzeResponse], summary="数据资产智能识别接口", description="使用大模型识别数据资产的中文名称、业务含义、PII 敏感信息、重要数据特征,并提供置信度评分" ) async def ai_analyze(request: AIAnalyzeRequest): """ 数据资产智能识别接口 使用大模型技术智能识别和标注数据资产,包括: - 表名和字段名中文命名识别 - 业务含义描述生成 - PII(个人信息)识别 - 重要数据识别 - 置信度评分 Args: request: AI 分析请求,包含表列表、项目ID、行业信息、业务背景等 Returns: AI 分析结果,包含识别结果、统计信息、处理时间等 """ logger.info( f"收到 AI 分析请求 - 项目ID: {request.project_id}, " f"表数量: {len(request.tables)}" ) try: # 调用服务执行分析 result = await AIAnalyzeService.analyze( tables=request.tables, project_id=request.project_id, industry=request.industry, context=request.context, options=request.options ) # 返回成功响应 return success_response( data=result, message="数据资产识别成功" ) except Exception as e: # 异常已在全局异常处理器中处理 logger.exception(f"AI 分析接口处理失败: {str(e)}") raise