Files
geMoldInsight/src/api/v1/cam_router.py
T
2026-05-02 00:39:04 +08:00

104 lines
3.6 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Request
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from datetime import datetime
from database.database import get_db_session
from models.database import User, ProcessingTask
from services.auth_service import get_current_active_user
from services.cam_bundle_service import cam_bundle_service
from services.task_query_service import TaskQueryService
from utils.logger import get_logger
logger = get_logger(__name__)
router = APIRouter()
DEFAULT_CAM_PREFERENCES = {
"mold_steel": "P20",
"surface_quality": "standard",
"controller": "fanuc",
"include_gcode": False,
}
@router.post("/cam/plan")
async def generate_cam_plan(
request: Request,
db_session: AsyncSession = Depends(get_db_session),
current_user: User = Depends(get_current_active_user),
):
"""基于任务分模结果生成 CAM 准备包(MVP)。"""
_ = current_user
body = await request.json()
task_id = body.get("task_id")
scheme_id = body.get("scheme_id")
if not task_id:
raise HTTPException(status_code=400, detail="缺少 task_id")
task_result = await db_session.execute(
select(ProcessingTask).where(ProcessingTask.task_id == task_id)
)
processing_task = task_result.scalar_one_or_none()
persisted_preferences = {}
if processing_task and isinstance(processing_task.parameters, dict):
persisted_preferences = (
processing_task.parameters.get("cam_preferences", {}) or {}
)
mold_steel = body.get(
"mold_steel",
persisted_preferences.get("mold_steel", DEFAULT_CAM_PREFERENCES["mold_steel"]),
)
surface_quality = body.get(
"surface_quality",
persisted_preferences.get("surface_quality", DEFAULT_CAM_PREFERENCES["surface_quality"]),
)
controller = body.get(
"controller",
persisted_preferences.get("controller", DEFAULT_CAM_PREFERENCES["controller"]),
)
include_gcode = bool(
body.get(
"include_gcode",
persisted_preferences.get("include_gcode", DEFAULT_CAM_PREFERENCES["include_gcode"]),
)
)
task_view = await TaskQueryService.get_task_view(db_session, task_id)
if not task_view:
raise HTTPException(status_code=404, detail="任务不存在")
if task_view.get("status") != "completed":
raise HTTPException(status_code=400, detail="任务尚未完成,无法生成CAM计划")
try:
data = cam_bundle_service.build_bundle(
task_view=task_view,
scheme_id=scheme_id,
mold_steel=mold_steel,
surface_quality=surface_quality,
controller=controller,
include_gcode=include_gcode,
)
cam_preferences = {
"mold_steel": mold_steel,
"surface_quality": surface_quality,
"controller": controller,
"include_gcode": include_gcode,
}
if processing_task:
parameters = processing_task.parameters if isinstance(processing_task.parameters, dict) else {}
parameters["cam_preferences"] = cam_preferences
parameters["cam_last_plan"] = {
"scheme_id": data.get("scheme_id"),
"generated_at": datetime.now().isoformat(),
}
processing_task.parameters = parameters
await db_session.commit()
return {"status": "success", "data": data, "cam_preferences": cam_preferences}
except Exception as exc:
logger.error(f"生成CAM准备包失败 task_id={task_id}: {exc}")
raise HTTPException(status_code=500, detail=f"生成CAM准备包失败: {exc}")