初始化医疗报告生成项目,添加核心代码文件

This commit is contained in:
2026-02-13 18:32:52 +08:00
commit faaf2158d4
69 changed files with 29836 additions and 0 deletions

144
backend/main.py Normal file
View File

@@ -0,0 +1,144 @@
from fastapi import FastAPI, UploadFile, File, HTTPException, Form
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from typing import List
import os
import tempfile
from pathlib import Path
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
from services.ocr_service import OCRService
from services.llm_service import LLMService
from services.report_integrator import ReportIntegrator
from services.pdf_service import PDFService
from services.template_service import TemplateService
from services.batch_report_service import BatchReportService
from services.deepseek_health_service import DeepSeekHealthService
app = FastAPI(title="医疗报告分析系统")
# CORS配置
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173", "http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 初始化服务(仅用于综合报告流程)
ocr_service = OCRService()
llm_service = LLMService()
report_integrator = ReportIntegrator(llm_service)
pdf_service = PDFService()
template_service = TemplateService()
batch_service = BatchReportService(ocr_service, llm_service, pdf_service, template_service)
# 检查 DeepSeek 配置状态
deepseek_key = os.getenv("DEEPSEEK_API_KEY", "")
if deepseek_key:
print("✓ DeepSeek API Key 已配置,健康评估和建议功能已启用")
else:
print("⚠ DeepSeek API Key 未配置,健康评估和建议功能将被跳过")
@app.get("/")
async def root():
return {"message": "医疗报告分析系统API", "status": "running"}
@app.post("/api/comprehensive-report")
async def generate_comprehensive_report(
files: List[UploadFile] = File(...),
patient_name: str = Form(default="患者")
):
"""
批量上传并生成综合健康报告
注意:上传的文件不会永久存储,处理完后自动删除
"""
temp_files = []
try:
# 验证文件类型
allowed_extensions = {".pdf", ".jpg", ".jpeg", ".png", ".bmp"}
# 临时保存上传的文件
for file in files:
file_ext = Path(file.filename).suffix.lower()
if file_ext not in allowed_extensions:
raise HTTPException(
status_code=400,
detail=f"不支持的文件格式: {file.filename}"
)
# 创建临时文件
temp_file = tempfile.NamedTemporaryFile(
delete=False,
suffix=file_ext,
dir=str(batch_service.temp_dir)
)
# 写入文件内容
content = await file.read()
temp_file.write(content)
temp_file.close()
temp_files.append(temp_file.name)
# 批量处理报告
result = batch_service.process_multiple_reports(
file_paths=temp_files,
patient_name=patient_name
)
return {
"success": True,
"patient_name": result["patient_name"],
"report_count": result["report_count"],
"pdf_filename": Path(result["pdf_path"]).name,
"pdf_path": result["pdf_path"],
"generated_at": result["generated_at"],
# 包含健康评估和建议内容
"health_assessment": result.get("analysis", {}).get("health_assessment", {}),
"health_advice": result.get("analysis", {}).get("health_advice", {})
}
except HTTPException:
# 清理临时文件
batch_service._cleanup_temp_files(temp_files)
raise
except Exception as e:
# 清理临时文件
batch_service._cleanup_temp_files(temp_files)
import traceback
error_detail = f"综合报告生成失败: {str(e)}\n{traceback.format_exc()}"
print(error_detail) # 打印完整错误堆栈
raise HTTPException(status_code=500, detail=f"综合报告生成失败: {str(e)}")
@app.get("/api/comprehensive-report/download/{pdf_filename}")
async def download_comprehensive_report(pdf_filename: str):
"""下载综合健康报告"""
try:
pdf_path = pdf_service.output_dir / pdf_filename
if not pdf_path.exists():
raise HTTPException(status_code=404, detail="PDF文件不存在")
return FileResponse(
path=str(pdf_path),
media_type="application/pdf",
filename=pdf_filename
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"下载失败: {str(e)}")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8001)