# 开发指南 ## 📋 接口开发清单 本框架已经构建完成,包含了所有7个接口的路由占位符。后续需要逐个实现每个接口的具体功能。 ### 待开发接口列表 #### 模块一:数据盘点智能分析服务 1. **`/api/v1/inventory/parse-document`** - 文档解析接口 - 文件位置: `app/api/v1/inventory/routes.py` - 状态: ⏳ 待实现 - 优先级: 中 - 工作量: 5 人日 - 参考文档: `docs/01-parse-document.md` 2. **`/api/v1/inventory/parse-sql-result`** - SQL 结果解析接口 - 文件位置: `app/api/v1/inventory/routes.py` - 状态: ⏳ 待实现 - 优先级: 低 - 工作量: 2 人日 - 参考文档: `docs/02-parse-sql-result.md` 3. **`/api/v1/inventory/parse-business-tables`** - 业务表解析接口 - 文件位置: `app/api/v1/inventory/routes.py` - 状态: ⏳ 待实现 - 优先级: 中 - 工作量: 3 人日 - 参考文档: `docs/03-parse-business-tables.md` 4. **`/api/v1/inventory/ai-analyze`** - 数据资产智能识别接口 ⭐⭐⭐ - 文件位置: `app/api/v1/inventory/routes.py` - 状态: ⏳ 待实现 - 优先级: **高** - 工作量: **15 人日** - 参考文档: `docs/04-ai-analyze.md` - 需要: 大模型集成 #### 模块二:场景挖掘智能推荐服务 5. **`/api/v1/value/scenario-recommendation`** - 潜在场景推荐接口 ⭐⭐ - 文件位置: `app/api/v1/value/routes.py` - 状态: ⏳ 待实现 - 优先级: **高** - 工作量: **12 人日** - 参考文档: `docs/05-scenario-recommendation.md` - 需要: 大模型集成 6. **`/api/v1/value/scenario-optimization`** - 存量场景优化建议接口 - 文件位置: `app/api/v1/value/routes.py` - 状态: ⏳ 待实现 - 优先级: 中 - 工作量: 8 人日 - 参考文档: `docs/06-scenario-optimization.md` - 需要: 大模型集成、OCR #### 模块三:数据资产盘点报告生成服务 7. **`/api/v1/delivery/generate-report`** - 完整报告生成接口 ⭐⭐⭐ - 文件位置: `app/api/v1/delivery/routes.py` - 状态: ⏳ 待实现 - 优先级: **高** - 工作量: **20 人日** - 参考文档: `docs/07-generate-report.md`、`docs/数据资产盘点报告-大模型接口设计文档.md` - 需要: 大模型集成、分阶段生成 ## 🛠️ 框架使用说明 ### 1. 配置管理 所有配置都在 `app/core/config.py` 中管理,通过环境变量加载。 ```python from app.core.config import settings # 使用配置 api_key = settings.DASHSCOPE_API_KEY max_upload_size = settings.MAX_UPLOAD_SIZE ``` ### 2. 统一响应格式 使用 `app/core/response.py` 中的响应格式: ```python from app.core.response import success_response, error_response # 成功响应 return success_response( data={"result": "..."}, message="操作成功" ) # 错误响应 return error_response( message="操作失败", code=400, error_code="ERROR_CODE", error_detail="详细信息" ) ``` ### 3. 异常处理 使用 `app/core/exceptions.py` 中的自定义异常: ```python from app.core.exceptions import FileUploadException, LLMAPIException # 抛出异常 raise FileUploadException("文件上传失败", error_detail="具体错误信息") ``` ### 4. 大模型调用 使用 `app/utils/llm_client.py` 中的 LLM 客户端: ```python from app.utils.llm_client import llm_client # 调用大模型 response = await llm_client.call( prompt="你的提示词", system_prompt="系统提示词", temperature=0.3, model="qwen-max" ) # 解析 JSON 响应 result = llm_client.parse_json_response(response) ``` ### 5. 文件处理 使用 `app/utils/file_handler.py` 中的文件处理工具: ```python from app.utils.file_handler import save_upload_file, detect_file_type, cleanup_temp_file # 保存上传文件 file_path = await save_upload_file(file, project_id="project_001") # 检测文件类型 file_type = detect_file_type(file.filename) # 清理临时文件 cleanup_temp_file(file_path) ``` ### 6. 日志记录 使用 `app/utils/logger.py` 中的日志工具: ```python from app.utils.logger import logger logger.info("信息日志") logger.warning("警告日志") logger.error("错误日志") logger.exception("异常日志(带堆栈)") ``` ## 📝 开发步骤示例 以开发 `parse-document` 接口为例: ### 步骤 1: 定义请求和响应模型 在 `app/schemas/` 目录下创建或更新模型文件: ```python # app/schemas/inventory.py from pydantic import BaseModel from typing import Optional, List from app.schemas.common import TableInfo class ParseDocumentRequest(BaseModel): project_id: str file_type: Optional[str] = None # 可选,自动识别 class ParseDocumentResponse(BaseModel): tables: List[TableInfo] total_tables: int total_fields: int parse_time: float file_info: dict ``` ### 步骤 2: 实现业务逻辑 在 `app/services/` 目录下创建服务类: ```python # app/services/document_parser.py from app.utils.file_handler import detect_file_type import pandas as pd class DocumentParser: @staticmethod async def parse_excel(file_path: str) -> List[TableInfo]: # 实现 Excel 解析逻辑 pass @staticmethod async def parse_word(file_path: str) -> List[TableInfo]: # 实现 Word 解析逻辑 pass ``` ### 步骤 3: 实现路由处理函数 在 `app/api/v1/inventory/routes.py` 中实现: ```python from fastapi import UploadFile, File, Form from app.schemas.inventory import ParseDocumentRequest, ParseDocumentResponse from app.services.document_parser import DocumentParser from app.core.response import success_response from app.utils.file_handler import save_upload_file, detect_file_type @router.post("/parse-document", response_model=ParseDocumentResponse) async def parse_document( file: UploadFile = File(...), project_id: str = Form(...), file_type: Optional[str] = Form(None) ): """文档解析接口""" try: # 保存文件 file_path = await save_upload_file(file, project_id) # 检测文件类型 if not file_type: file_type = detect_file_type(file.filename) # 解析文件 parser = DocumentParser() if file_type == "excel": tables = await parser.parse_excel(file_path) elif file_type == "word": tables = await parser.parse_word(file_path) else: raise ValueError(f"不支持的文件类型: {file_type}") # 返回结果 return success_response( data={ "tables": [table.dict() for table in tables], "total_tables": len(tables), "total_fields": sum(t.field_count for t in tables), "parse_time": 0.0, # 实际计算耗时 "file_info": { "file_name": file.filename, "file_type": file_type } }, message="文档解析成功" ) except Exception as e: # 异常已在全局异常处理器中处理 raise ``` ### 步骤 4: 编写测试 在 `tests/` 目录下创建测试文件: ```python # tests/test_inventory.py import pytest from fastapi.testclient import TestClient def test_parse_document(client: TestClient): with open("test_data/sample.xlsx", "rb") as f: response = client.post( "/api/v1/inventory/parse-document", files={"file": ("test.xlsx", f, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")}, data={"project_id": "test_project"} ) assert response.status_code == 200 data = response.json() assert data["success"] is True assert "tables" in data["data"] ``` ## 🎯 开发建议 ### 优先级顺序 1. **第一阶段(MVP)**: - 数据资产智能识别接口 (`ai-analyze`) - 完整报告生成接口 (`generate-report`) - 文档解析接口 (`parse-document`) 2. **第二阶段**: - 潜在场景推荐接口 (`scenario-recommendation`) - 业务表解析接口 (`parse-business-tables`) - 存量场景优化建议接口 (`scenario-optimization`) 3. **第三阶段**: - SQL 结果解析接口 (`parse-sql-result`) ### 代码规范 - 使用类型注解 - 添加文档字符串(docstring) - 遵循 PEP 8 代码风格 - 编写单元测试 - 添加日志记录 - 处理异常情况 ### 注意事项 1. **大模型接口**: 注意 Token 消耗和 API 限流 2. **文件处理**: 及时清理临时文件,限制文件大小 3. **错误处理**: 提供清晰的错误信息和错误码 4. **性能优化**: 对于耗时操作,考虑异步处理或任务队列 5. **安全性**: 验证文件类型和大小,防止路径遍历攻击