覆盖所有模块: - 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>
194 lines
6.7 KiB
Python
194 lines
6.7 KiB
Python
"""
|
||
提醒通知路由模块
|
||
|
||
提供系统提醒的查询、已读标记及各类自动检测接口,包括:
|
||
- 提醒列表查询(支持按类型、状态、接收人筛选)
|
||
- 提醒仪表盘(汇总未读/已读数量)
|
||
- 标记提醒为已读
|
||
- 欠款提醒检测、不活跃客户检测、物流超时检测
|
||
- 一键检测全部提醒
|
||
|
||
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))
|