1ec20ee53e
保存合并前工作树中遗留的进行中改动,避免分支合并时丢失: - scheduler: 填报汇总改为定向推送给支局长/领导(而非广播@all) - router: JWT token 校验修复,bind token(UUID)不被误剥离 - 工作计划/计划列表: 搜索+筛选+分页 UI - 各列表 API 增加 search 参数支持 - docker-compose.backend.yml + backend/.dockerignore 纳入版本管理 Co-Authored-By: Claude <noreply@anthropic.com>
66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
import uuid
|
|
from datetime import date
|
|
from typing import Optional
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from app.database import get_db
|
|
from app.middleware.auth import get_current_user
|
|
from app.services.dashboard import get_dashboard_stats, get_reporting_progress, get_weekly_report
|
|
from app.services.light_board import get_light_board
|
|
|
|
router = APIRouter(prefix="/dashboard", tags=["Dashboard"])
|
|
|
|
|
|
@router.get("/stats")
|
|
async def dashboard_stats(
|
|
reference_date: Optional[str] = Query(None),
|
|
current_user: dict = Depends(get_current_user),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""Get dashboard card statistics. Pass reference_date (YYYY-MM-DD) for historical weeks."""
|
|
ref = date.fromisoformat(reference_date) if reference_date else None
|
|
stats = await get_dashboard_stats(db, ref, current_user["user_id"], current_user["role"])
|
|
return stats
|
|
|
|
|
|
@router.get("/progress")
|
|
async def reporting_progress(
|
|
reference_date: Optional[str] = Query(None),
|
|
current_user: dict = Depends(get_current_user),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""Get per-manager reporting progress. Managers only see themselves."""
|
|
ref = date.fromisoformat(reference_date) if reference_date else None
|
|
return await get_reporting_progress(db, ref, current_user["user_id"], current_user["role"])
|
|
|
|
|
|
@router.get("/weekly-report")
|
|
async def weekly_report(
|
|
manager_id: Optional[str] = Query(None),
|
|
customer_id: Optional[str] = Query(None),
|
|
reference_date: Optional[str] = Query(None),
|
|
current_user: dict = Depends(get_current_user),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""Get full weekly report data. Pass reference_date for historical weeks."""
|
|
ref = date.fromisoformat(reference_date) if reference_date else None
|
|
return await get_weekly_report(
|
|
db=db,
|
|
user_id=uuid.UUID(current_user["user_id"]),
|
|
role=current_user["role"],
|
|
filter_manager_id=uuid.UUID(manager_id) if manager_id else None,
|
|
filter_customer_id=uuid.UUID(customer_id) if customer_id else None,
|
|
reference_date=ref,
|
|
)
|
|
|
|
|
|
@router.get("/light-board")
|
|
async def light_board(
|
|
reference_date: Optional[str] = Query(None),
|
|
current_user: dict = Depends(get_current_user),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""Get customer visit coverage matrix. Managers see only themselves."""
|
|
ref = date.fromisoformat(reference_date) if reference_date else None
|
|
return await get_light_board(db, ref, uuid.UUID(current_user["user_id"]), current_user["role"])
|