dingdanquanliucheng/backend/app/api/salesman.py
taiyi 71c2ab2005 feat: 仪表盘接口加入 Redis 缓存
仪表盘聚合结果缓存 30s,订单/提醒变更时自动清除仪表盘缓存。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-31 11:17:56 +08:00

66 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
业务员工作台路由模块
提供业务员个人工作台的概览数据接口,包括:
- 订单概览(最近订单列表)
- 提醒概览(待处理提醒列表)
- 汇总统计(订单数量、提醒数量)
URL 前缀:/api/salesman
权限要求salesman/admin 角色
"""
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from backend.app.api.deps import require_permissions, require_roles
from backend.app.db import get_db_session
from backend.app.core.cache import cache_delete_pattern, cache_get, cache_set
from backend.app.core.error_codes import ErrorCode
from backend.app.core.exceptions import AppException
from backend.app.schemas.common import success_payload
from backend.app.services.reminder_service import reminder_service
from backend.app.services.order_service import order_service
router = APIRouter(prefix="/api/salesman", tags=["salesman"])
@router.get("/dashboard")
def salesman_dashboard(
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("salesman", "admin")), # 当前登录用户仅salesman和admin可访问
_permission_user: dict = Depends(require_permissions("order:list")), # 权限校验:订单列表查看权限
) -> dict:
"""
获取业务员工作台概览数据
返回当前业务员的订单列表最近20条、提醒列表及汇总统计信息。
业务员只能查看自己的数据,管理员可查看所有。
返回值:
包含以下字段的字典:
- orders: 最近20条订单列表
- reminders: 提醒列表
- summary: 汇总数据order_count 订单总数、reminder_count 提醒总数)
权限要求salesman、admin 角色,需 order:list 权限
"""
user_id = current_user.get("user_id")
cache_key = f"dashboard:{user_id}"
cached = cache_get(cache_key)
if cached is not None:
return success_payload(cached)
orders = order_service.list_orders(session, {"salesman_id": user_id})
reminders = reminder_service.list_reminders(session, {"receiver_user_id": user_id})
result = {
"orders": orders[:20],
"reminders": reminders.get("list", []) if isinstance(reminders, dict) else [],
"summary": {
"order_count": len(orders),
"reminder_count": len(reminders.get("list", [])) if isinstance(reminders, dict) else 0,
},
}
cache_set(cache_key, result, ttl=30)
return success_payload(result)