104 lines
3.6 KiB
Python
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}")
|