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