仓储层的 list_*/count_* 此前以 keyword/status/offset/limit 四五个散参数 传参,调用点重复铺开、易漏传且不可扩展;按项目「参数 >4 封装 DTO」的 约定统一收敛为各模块的 Query 对象(如 RoleQuery、BusinessQuery), 服务层与测试调用同步调整,行为不变。 - repositories 层查询方法签名改为 (session, query),分页与筛选条件 由 Query 承载,_apply_filters 同步收口 - schemas 层补齐各模块 Query 模型(approval/business_role/report 等) - services 层调用点同步改为传 Query - tests 随之调整;新增用例:待办角色流转(财务通过后领导出现待办)、 参数预览顺序稳定 验证:全量 pytest 900 passed(11:08);单元 526 passed;ruff check 绿。 Co-Authored-By: Claude Code <noreply@anthropic.com>
39 lines
1.4 KiB
Python
39 lines
1.4 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,
|
||
current_user: _DashboardUser,
|
||
month: Annotated[
|
||
str | None, Query(max_length=7, description="统计月份 YYYY-MM,默认当月")
|
||
] = None,
|
||
) -> ApiResponse[DashboardOut]:
|
||
"""一次返回经营总览/待办/风险预警/最近动态(待办与预警实时派生)。
|
||
|
||
待办按当前用户角色只返回其可操作节点(admin 可查看全部在途单)。
|
||
"""
|
||
return ok(dashboard_service.get_dashboard(session, month, current_user=current_user))
|