78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
|
|
"""Онлайн-диагностика — AI задаёт вопросы, мастер подтверждает"""
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends, HTTPException
|
||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
|
import uuid
|
||
|
|
|
||
|
|
from ...core.database import async_session_factory, Diagnosis, Project
|
||
|
|
from pydantic import BaseModel
|
||
|
|
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
|
||
|
|
class CreateDiagnosisRequest(BaseModel):
|
||
|
|
project_id: uuid.UUID
|
||
|
|
problem_description: str
|
||
|
|
photos: list[str] = []
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/")
|
||
|
|
async def create_diagnosis(req: CreateDiagnosisRequest, session: AsyncSession = Depends(async_session_factory), user=Depends(get_current_user)):
|
||
|
|
"""Создать диагностику проблемы."""
|
||
|
|
|
||
|
|
project = await session.get(Project, req.project_id)
|
||
|
|
if not project or project.client_id != user.id:
|
||
|
|
raise HTTPException(403)
|
||
|
|
|
||
|
|
diagnosis = Diagnosis(
|
||
|
|
project_id=req.project_id,
|
||
|
|
problem_description=req.problem_description,
|
||
|
|
photos=req.photos,
|
||
|
|
ai_questions=["Какой тип крана?", "Как давно течёт?"], # AI генерирует динамически
|
||
|
|
)
|
||
|
|
session.add(diagnosis)
|
||
|
|
await session.commit()
|
||
|
|
|
||
|
|
return {"id": str(diagnosis.id), "ai_questions": diagnosis.ai_questions}
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/{diagnosis_id}/answer")
|
||
|
|
async def answer_diagnosis(diagnosis_id: uuid.UUID, answers: dict, session: AsyncSession = Depends(async_session_factory)):
|
||
|
|
"""Ответить на вопросы диагностики."""
|
||
|
|
|
||
|
|
diagnosis = await session.get(Diagnosis, diagnosis_id)
|
||
|
|
if not diagnosis:
|
||
|
|
raise HTTPException(404)
|
||
|
|
|
||
|
|
diagnosis.client_answers = answers
|
||
|
|
# AI генерирует результат
|
||
|
|
diagnosis.diagnosis_result = "Замена картриджа однорычажного крана. Стоимость ~1500₽."
|
||
|
|
await session.commit()
|
||
|
|
|
||
|
|
return {"diagnosis_result": diagnosis.diagnosis_result}
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/{diagnosis_id}/confirm")
|
||
|
|
async def confirm_diagnosis(diagnosis_id: uuid.UUID, master_confirmation: str, session: AsyncSession = Depends(async_session_factory)):
|
||
|
|
"""Мастер подтверждает диагностику."""
|
||
|
|
|
||
|
|
diagnosis = await session.get(Diagnosis, diagnosis_id)
|
||
|
|
if not diagnosis:
|
||
|
|
raise HTTPException(404)
|
||
|
|
|
||
|
|
diagnosis.master_confirmation = master_confirmation
|
||
|
|
await session.commit()
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/project/{project_id}")
|
||
|
|
async def get_project_diagnosis(project_id: uuid.UUID, session: AsyncSession = Depends(async_session_factory)):
|
||
|
|
"""Получить диагностику проекта."""
|
||
|
|
|
||
|
|
result = await session.execute(select(Diagnosis).where(Diagnosis.project_id == project_id))
|
||
|
|
diagnosis = result.scalar_one_or_none()
|
||
|
|
return diagnosis.mapped() if diagnosis else None
|
||
|
|
|
||
|
|
|
||
|
|
from sqlalchemy import select
|