dingdanquanliucheng/backend/app/api/reminders.py
taiyi 9b32afdbb4 为后端全部 86 个 Python 文件添加中文注释
覆盖所有模块:
- api 层:17 个路由文件,每个接口标注用途、参数、返回值、权限
- services 层:18 个服务文件,每个方法标注作用、参数、返回值、调用方
- repositories 层:13 个仓储文件,每个方法标注查询逻辑和被调用方
- schemas 层:11 个请求/响应体文件,每个字段标注业务含义
- core 层:config、security、exceptions、responses、error_codes
- models 层:19 个 ORM 模型类,每个表标注业务含义和关联关系
- scripts:bootstrap_data、smoke_check
- migrations:env.py 和版本迁移文件

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 07:23:33 +08:00

194 lines
6.7 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/reminders
权限要求salesman/manager/admin 角色,部分检测接口仅 manager/admin
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from backend.app.api.deps import require_roles
from backend.app.db import get_db_session
from backend.app.schemas.common import success_payload
from backend.app.services.reminder_service import reminder_service
router = APIRouter(prefix="/api/reminders", tags=["reminders"])
@router.get("")
def list_reminders(
reminder_type: str | None = Query(default=None), # 提醒类型筛选(如 arrears/logistics_timeout/inactive_customer
status: str | None = Query(default=None), # 提醒状态筛选pending/read
receiver_user_id: int | None = Query(default=None), # 接收人用户ID筛选
page_no: int = Query(default=1), # 页码从1开始
page_size: int = Query(default=20), # 每页条数
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("salesman", "manager", "admin")), # 当前登录用户
) -> dict:
"""
获取提醒列表
支持按提醒类型、状态、接收人进行筛选,分页返回。
业务员角色只能查看自己的提醒,管理员和经理可查看所有。
请求参数:
reminder_type: 提醒类型(可选)
status: 状态(可选)
receiver_user_id: 接收人ID可选业务员自动过滤为本人
page_no: 页码默认1
page_size: 每页条数默认20
返回值:
分页的提醒列表数据
权限要求salesman、manager、admin 角色
"""
filters = {
"reminder_type": reminder_type,
"status": status,
"receiver_user_id": receiver_user_id,
"page_no": page_no,
"page_size": page_size,
}
if current_user.get("role_code") == "salesman":
filters["receiver_user_id"] = current_user.get("user_id")
return success_payload(reminder_service.list_reminders(session, filters))
@router.get("/dashboard")
def reminder_dashboard(
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("salesman", "manager", "admin")), # 当前登录用户
) -> dict:
"""
获取提醒仪表盘数据
返回提醒的汇总统计信息(总数、待处理数、已读数)及最新提醒列表。
业务员只看自己的提醒,管理员和经理可看所有。
返回值:
包含以下字段的字典:
- summary: 汇总统计total 总数、pending 待处理数、read 已读数)
- list: 提醒列表最多200条
- checked_at: 最后检查时间
权限要求salesman、manager、admin 角色
"""
filters = {"page_no": 1, "page_size": 200}
if current_user.get("role_code") == "salesman":
filters["receiver_user_id"] = current_user.get("user_id")
reminders = reminder_service.list_reminders(session, filters)
return success_payload(
{
"summary": {
"total": reminders["total"],
"pending": len([item for item in reminders["list"] if item["status"] == "pending"]),
"read": len([item for item in reminders["list"] if item["status"] == "read"]),
},
"list": reminders["list"],
"checked_at": "",
}
)
@router.post("/{reminder_id}/read")
def read_reminder(
reminder_id: int, # 提醒ID
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("salesman", "manager", "admin")), # 当前登录用户
) -> dict:
"""
标记提醒为已读
将指定ID的提醒标记为已读状态。
请求参数:
reminder_id: 路径参数提醒ID
返回值:
操作结果
权限要求salesman、manager、admin 角色
"""
return success_payload(reminder_service.read_reminder(reminder_id, session, current_user))
@router.post("/arrears/check")
def check_arrears_reminders(
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 当前登录用户仅manager和admin
) -> dict:
"""
检测欠款提醒
扫描系统中存在欠款的客户,自动生成欠款提醒通知相关业务员。
返回值:
检测结果,包含新生成的提醒数量等信息
权限要求manager、admin 角色
"""
return success_payload(reminder_service.check_arrears(session))
@router.post("/inactive-customers/check")
def check_inactive_customer_reminders(
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 当前登录用户仅manager和admin
) -> dict:
"""
检测不活跃客户提醒
扫描长期无交易的客户,自动生成不活跃客户提醒通知相关业务员跟进。
返回值:
检测结果,包含新生成的提醒数量等信息
权限要求manager、admin 角色
"""
return success_payload(reminder_service.check_inactive_customers(session))
@router.post("/logistics-timeout/check")
def check_logistics_timeout_reminders(
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 当前登录用户仅manager和admin
) -> dict:
"""
检测物流超时提醒
扫描超出预计时间未完成的物流任务,自动生成物流超时提醒通知相关人员。
返回值:
检测结果,包含新生成的提醒数量等信息
权限要求manager、admin 角色
"""
return success_payload(reminder_service.check_logistics_timeout(session))
@router.post("/check-all")
def check_all_reminders(
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 当前登录用户仅manager和admin
) -> dict:
"""
一键检测全部提醒
依次执行欠款检测、不活跃客户检测和物流超时检测,统一生成所有类型的提醒。
返回值:
各项检测的汇总结果
权限要求manager、admin 角色
"""
return success_payload(reminder_service.check_all(session))