- 后端 /api/v1/dashboard 单端点返回四区块:经营总览(绩效/应付/人数/团队数/月结状态/近 6 个月趋势)、待办(待审批 + 回款未指定批次 + 同步显式降级)、风险预警(回款逾期/审批超时,阈值参数化)、最近动态(操作日志) - dashboard_service 实时派生(不落表、不引调度器);参数快照一次解析;总览只做 SQL 聚合,不复用报表的重查询 - V10 迁移新增预警参数三项(warning.enabled / warning.receipt.overdue.days=90 / warning.approval.timeout.days=3),参数注册表 19→22,init-dev 与 V10 SQL 双轨同步 - 测试:test_dashboard 5 例(权限文案/总览对账+非法月份 400/待办三类/预警命中与参数关闭/动态来源);全量 852 passed - 依赖闭包并入:core/month.py 月份校验、api/v1/base/business_roles.py(router 已挂载的岗位只读端点)、test_month_validation - 修复:alembic --sql 在 Windows 按控制台 GBK 输出,V10 SQL 以 UTF-8 重新导出(README 已记) Co-Authored-By: Claude Code <noreply@anthropic.com>
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
"""工作台接口(M4 ⑧):四区块一次性聚合。
|
||
|
||
准入:管理员/财务/领导(与报表、审批接口一致;FR-033/036 的「全部用户」
|
||
待业务权限清单 #6 答复后再放宽)。只读接口,不写操作日志。
|
||
"""
|
||
|
||
from typing import Annotated
|
||
|
||
from fastapi import APIRouter, Depends, Query
|
||
|
||
from app.api.deps import DbSession, require_roles
|
||
from app.core.constants import ROLE_ADMIN, ROLE_FINANCE, ROLE_LEADER
|
||
from app.core.response import ApiResponse, ok
|
||
from app.models import User
|
||
from app.schemas.dashboard import DashboardOut
|
||
from app.services import dashboard_service
|
||
|
||
router = APIRouter(prefix="/dashboard", tags=["工作台"])
|
||
|
||
_DashboardUser = Annotated[
|
||
User,
|
||
Depends(
|
||
require_roles(
|
||
ROLE_ADMIN, ROLE_FINANCE, ROLE_LEADER, message="无权访问工作台"
|
||
)
|
||
),
|
||
]
|
||
|
||
|
||
@router.get("", response_model=ApiResponse[DashboardOut], summary="工作台四区块")
|
||
def get_dashboard(
|
||
session: DbSession,
|
||
_: _DashboardUser,
|
||
month: Annotated[
|
||
str | None, Query(max_length=7, description="统计月份 YYYY-MM,默认当月")
|
||
] = None,
|
||
) -> ApiResponse[DashboardOut]:
|
||
"""一次返回经营总览/待办/风险预警/最近动态(待办与预警实时派生)。"""
|
||
return ok(dashboard_service.get_dashboard(session, month))
|