2026-01-11 07:48:19 +08:00

209 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
数据盘点智能分析服务路由
包含以下接口:
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