from __future__ import annotations from .shared import * from .helpers import _build_service @router.post("/validate-match") async def validate_model_requirement_match( request: ValidateMatchRequest, current_user: User = Depends(get_current_user), tenant_id: int = Depends(get_tenant_id), db: AsyncSession = Depends(get_db), ): """需求-模型匹配校验""" _ = current_user service = _build_service(db) try: data = await service.validate_model_requirement_match( truth_node_id=request.truth_node_id, model_version_id=request.model_version_id, tenant_id=tenant_id, project_id=request.project_id, ) return success_response(data=data) except ValueError as exc: return JSONResponse( status_code=404, content=error_response(ErrorCode.NOT_FOUND, str(exc)), ) except Exception as exc: return JSONResponse( status_code=500, content=error_response(ErrorCode.INTERNAL_ERROR, f"匹配校验失败: {exc}"), ) @router.get("/capability-gaps") async def list_capability_gaps( status: Optional[str] = Query(default=None), severity: Optional[str] = Query(default=None), limit: int = Query(default=100, ge=1, le=500), current_user: User = Depends(get_current_user), tenant_id: int = Depends(get_tenant_id), db: AsyncSession = Depends(get_db), ): """列出能力差距预警""" _ = current_user service = _build_service(db) try: data = await service.list_capability_gaps( tenant_id=tenant_id, status=status, severity=severity, limit=limit, ) return success_response(data=data) except Exception as exc: return JSONResponse( status_code=500, content=error_response(ErrorCode.INTERNAL_ERROR, f"查询能力差距失败: {exc}"), ) @router.get("/cost-tracking/{truth_node_id}") async def get_cost_tracking( truth_node_id: int, period: str = Query(default="weekly", pattern="^(daily|weekly|monthly|project)$"), current_user: User = Depends(get_current_user), tenant_id: int = Depends(get_tenant_id), db: AsyncSession = Depends(get_db), ): """查询成本跟踪与 ROI""" _ = current_user service = _build_service(db) try: data = await service.get_cost_tracking( truth_node_id=truth_node_id, period=period, tenant_id=tenant_id, ) return success_response(data=data) except Exception as exc: return JSONResponse( status_code=500, content=error_response(ErrorCode.INTERNAL_ERROR, f"查询成本跟踪失败: {exc}"), ) @router.get("/cost-optimization/{truth_node_id}") async def get_cost_optimization( truth_node_id: int, period: str = Query(default="weekly", pattern="^(daily|weekly|monthly|project)$"), current_user: User = Depends(get_current_user), tenant_id: int = Depends(get_tenant_id), db: AsyncSession = Depends(get_db), ): """查询成本优化建议(必要时自动触发一次计算)""" _ = current_user service = _build_service(db) try: tracking = await service.get_cost_tracking( truth_node_id=truth_node_id, period=period, tenant_id=tenant_id, ) optimization = tracking.get("optimization_suggestions") or {} if not optimization: computed = await service.track_cost_and_roi( truth_node_id=truth_node_id, period=period, tenant_id=tenant_id, ) optimization = computed.get("optimization_suggestions", {}) tracking = await service.get_cost_tracking( truth_node_id=truth_node_id, period=period, tenant_id=tenant_id, ) return success_response( data={ "truth_node_id": truth_node_id, "period": period, "optimization_suggestions": optimization, "roi_score": tracking.get("roi_score"), "actual_cost_usd": tracking.get("actual_cost_usd", 0.0), } ) except Exception as exc: return JSONResponse( status_code=500, content=error_response(ErrorCode.INTERNAL_ERROR, f"查询成本优化失败: {exc}"), )