feat: LocalPro Finder — отзывы, рейтинги, чат, AI-оценка, диагностика, подписки
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
"""Онлайн-диагностика — 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
|
||||
Reference in New Issue
Block a user