dingdanquanliucheng/backend/app/api/reports.py
wsb1224 eebb5a849e fix: 会计角色访问报表页面提示无权限
- reports API 两个 GET 接口 require_roles 加入 kuaiji
- 新增 migration 为 kuaiji 角色补上报表统计/报表核对的 sys_role_menu 记录

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-04 14:07:51 +08:00

140 lines
5.6 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.

"""
数据报表路由模块
提供业务数据统计与导出接口,包括:
- 业绩统计报表(支持按月/自定义时间段,可按产品分类筛选)
- 业绩报表导出支持CSV格式
URL 前缀:/api/reports
权限要求manager/admin 角色
"""
from fastapi import APIRouter, Depends, Query
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.schemas.common import success_payload
from backend.app.services.report_service import report_service
router = APIRouter(prefix="/api/reports", tags=["reports"])
@router.get("/performance")
def performance_report(
stat_type: str = Query(default="month"), # 统计类型month按月/ custom自定义时间段
start_date: str | None = Query(default=None), # 自定义开始日期,格式 YYYY-MM-DD
end_date: str | None = Query(default=None), # 自定义结束日期,格式 YYYY-MM-DD
category_id: int | None = Query(default=None, gt=0), # 产品分类ID筛选必须大于0
order_type: str | None = Query(default=None), # 订单类型筛选industry/daily
exclude_ecommerce: bool = Query(default=False), # 是否排除电商渠道订单
salesman_id: int | None = Query(default=None), # 业务员ID筛选
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin", "kuaiji")), # 当前登录用户manager/admin/会计
_permission_user: dict = Depends(require_permissions("report:performance:view")), # 权限校验:业绩报表查看权限
) -> dict:
"""
获取业绩统计报表
根据统计类型(按月/自定义时间段)和可选的分类筛选,返回业绩统计数据。
请求参数:
stat_type: 统计类型month 或 custom默认 month
start_date: 开始日期,仅 custom 时有效(可选)
end_date: 结束日期,仅 custom 时有效(可选)
category_id: 产品分类ID可选筛选条件
exclude_ecommerce: 是否排除电商订单(默认 False
返回值:
业绩统计数据,包含各维度的销售汇总
权限要求manager、admin、kuaiji 角色,需 report:performance:view 权限
"""
return success_payload(
report_service.performance_report(
{
"stat_type": stat_type,
"start_date": start_date,
"end_date": end_date,
"category_id": category_id,
"order_type": order_type,
"exclude_ecommerce": exclude_ecommerce,
"salesman_id": salesman_id,
},
session,
)
)
@router.get("/audit")
def report_audit(
stat_type: str = Query(default="month"),
start_date: str | None = Query(default=None),
end_date: str | None = Query(default=None),
category_id: int | None = Query(default=None, gt=0),
exclude_ecommerce: bool = Query(default=False),
salesman_id: int | None = Query(default=None),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin", "kuaiji")),
_permission_user: dict = Depends(require_permissions("report:performance:view")),
) -> dict:
"""报表核对接口,返回基础数据 + 动态异常检测结果。"""
return success_payload(
report_service.audit_report(
{
"stat_type": stat_type,
"start_date": start_date,
"end_date": end_date,
"category_id": category_id,
"exclude_ecommerce": exclude_ecommerce,
"salesman_id": salesman_id,
},
session,
)
)
@router.get("/performance/export")
def export_performance_report(
stat_type: str = Query(default="month"), # 统计类型month 或 custom
start_date: str | None = Query(default=None), # 自定义开始日期
end_date: str | None = Query(default=None), # 自定义结束日期
category_id: int | None = Query(default=None, gt=0), # 产品分类ID
exclude_ecommerce: bool = Query(default=False), # 是否排除电商渠道订单
export_format: str = Query(default="csv"), # 导出格式,默认 csv
session: Session = Depends(get_db_session), # 数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 当前登录用户
_permission_user: dict = Depends(require_permissions("report:performance:export")), # 权限校验:业绩报表导出权限
) -> dict:
"""
导出业绩统计报表
将业绩统计数据导出为文件支持CSV等格式。参数与业绩查询接口一致额外支持导出格式选择。
请求参数:
stat_type: 统计类型(默认 month
start_date: 开始日期custom 模式可选)
end_date: 结束日期custom 模式可选)
category_id: 产品分类ID可选
exclude_ecommerce: 是否排除电商订单(默认 False
export_format: 导出格式,默认 csv
返回值:
导出文件的下载链接或文件内容
权限要求manager、admin 角色,需 report:performance:export 权限
"""
return success_payload(
report_service.export_performance_report(
{
"stat_type": stat_type,
"start_date": start_date,
"end_date": end_date,
"category_id": category_id,
"exclude_ecommerce": exclude_ecommerce,
"export_format": export_format,
},
session,
)
)