Files

43 lines
2.1 KiB
Python

from fastapi import APIRouter, Depends
from sqlalchemy import or_
from sqlalchemy.orm import Session
from app import models, schemas
from app.database import get_db
router = APIRouter(prefix="/dashboard", tags=["dashboard"])
@router.get("/summary", response_model=schemas.DashboardSummary)
def dashboard_summary(db: Session = Depends(get_db)) -> schemas.DashboardSummary:
last_task = db.query(models.TaskRun).order_by(models.TaskRun.created_at.desc()).first()
return schemas.DashboardSummary(
total_sessions=db.query(models.FeishuSession).count(),
processed_sessions=db.query(models.FeishuSession)
.filter(models.FeishuSession.process_status.in_([models.ProcessStatus.pending_review, models.ProcessStatus.completed]))
.count(),
pending_review_count=db.query(models.RawQAItem)
.filter(models.RawQAItem.review_status.in_([models.ReviewStatus.pending, models.ReviewStatus.reviewing]))
.count(),
high_risk_count=db.query(models.RawQAItem)
.filter(or_(models.RawQAItem.risk_level == models.RiskLevel.high, models.RawQAItem.risk_level == models.RiskLevel.forbidden))
.count(),
approved_qa_count=db.query(models.RawQAItem).filter(models.RawQAItem.review_status == models.ReviewStatus.approved).count(),
standard_qa_count=db.query(models.StandardQAItem).count(),
callable_qa_count=db.query(models.StandardQAItem)
.join(models.RawQAItem)
.filter(
models.StandardQAItem.audit_status == models.AuditStatus.approved,
models.StandardQAItem.call_status == models.CallStatus.callable,
models.StandardQAItem.risk_level.in_([models.RiskLevel.low, models.RiskLevel.medium]),
models.RawQAItem.desensitization_status.in_(
[models.DesensitizationStatus.done, models.DesensitizationStatus.not_needed]
),
)
.count(),
last_task_status=last_task.task_status.value if last_task else None,
last_task_time=last_task.ended_at if last_task else None,
last_task_error=last_task.error_message if last_task else None,
)