重构路由
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
# api/v1/upload_router.py
|
||||
from fastapi import APIRouter, UploadFile, File, HTTPException, BackgroundTasks, Depends
|
||||
from typing import Optional
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from models.schemas import ProcessingStatus, create_task_info
|
||||
from utils.file_handler import FileHandler
|
||||
from services.storage_integration_rustfs import StorageIntegrationService
|
||||
from services.redis_task_manager import redis_task_manager
|
||||
from database.database import get_db_session
|
||||
from utils.logger import get_logger
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from services.auth_service import get_current_active_user
|
||||
from services.processing_service import processing_service
|
||||
from models.database import User
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
file_handler = FileHandler()
|
||||
|
||||
|
||||
@router.post("/upload")
|
||||
async def upload_stp(
|
||||
background_tasks: BackgroundTasks,
|
||||
file: UploadFile = File(...),
|
||||
material: Optional[str] = "ABS",
|
||||
db_session: AsyncSession = Depends(get_db_session),
|
||||
current_user: User = Depends(get_current_active_user)
|
||||
):
|
||||
"""上传STP文件并存储到数据库"""
|
||||
|
||||
if not file.filename.lower().endswith(('.stp', '.step')):
|
||||
raise HTTPException(400, "只支持STP/STEP文件")
|
||||
|
||||
task_id = str(uuid.uuid4())
|
||||
|
||||
# 保存文件
|
||||
file_path, file_size = await file_handler.save_uploaded_file(file)
|
||||
|
||||
# 创建存储集成服务实例
|
||||
storage_service = StorageIntegrationService()
|
||||
|
||||
# 保存STP文件到RustFS + PostgreSQL
|
||||
stp_file = await storage_service.save_stp_file(
|
||||
session=db_session,
|
||||
file_path=file_path,
|
||||
original_filename=file.filename,
|
||||
user_id=current_user.id
|
||||
)
|
||||
|
||||
# 创建处理任务记录
|
||||
await storage_service.create_processing_task(db_session, task_id, stp_file.id)
|
||||
|
||||
# 创建任务记录(存入 Redis)
|
||||
task_info = create_task_info(
|
||||
task_id=task_id,
|
||||
status=ProcessingStatus.PROCESSING,
|
||||
filename=file.filename,
|
||||
file_path=str(file_path),
|
||||
file_size=file_size,
|
||||
upload_time=str(datetime.now())
|
||||
)
|
||||
await redis_task_manager.set_task(task_id, task_info)
|
||||
|
||||
# 后台处理(使用独立数据库会话,避免请求会话关闭问题)
|
||||
background_tasks.add_task(
|
||||
processing_service.process_file_with_storage,
|
||||
task_id, file_path, stp_file.id, material
|
||||
)
|
||||
|
||||
return {
|
||||
"task_id": task_id,
|
||||
"status": "processing",
|
||||
"message": "文件上传成功,开始处理并存储到数据库",
|
||||
"file_info": {
|
||||
"filename": file.filename,
|
||||
"size": file_size,
|
||||
"pythonocc_available": True,
|
||||
"database_file_id": stp_file.id
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user