212 lines
7.2 KiB
Python
212 lines
7.2 KiB
Python
"""
|
||
统计分析API路由
|
||
"""
|
||
from typing import Optional, Dict, Any
|
||
from datetime import date
|
||
from fastapi import APIRouter, Depends, Query
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
from app.core.deps import get_db, get_current_user
|
||
from app.services.statistics_service import statistics_service
|
||
|
||
router = APIRouter()
|
||
|
||
|
||
@router.get("/overview", response_model=Dict[str, Any])
|
||
async def get_statistics_overview(
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取总览统计
|
||
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回资产总数、总价值、各状态数量、采购统计、网点数等概览信息
|
||
"""
|
||
return await statistics_service.get_overview(db, organization_id=organization_id)
|
||
|
||
|
||
@router.get("/assets/purchase", response_model=Dict[str, Any])
|
||
async def get_purchase_statistics(
|
||
start_date: Optional[date] = Query(None, description="开始日期"),
|
||
end_date: Optional[date] = Query(None, description="结束日期"),
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取采购统计
|
||
|
||
- **start_date**: 开始日期
|
||
- **end_date**: 结束日期
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回采购数量、采购金额、月度趋势、供应商分布等统计信息
|
||
"""
|
||
return await statistics_service.get_purchase_statistics(
|
||
db,
|
||
start_date=start_date,
|
||
end_date=end_date,
|
||
organization_id=organization_id
|
||
)
|
||
|
||
|
||
@router.get("/assets/depreciation", response_model=Dict[str, Any])
|
||
async def get_depreciation_statistics(
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取折旧统计
|
||
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回折旧金额、折旧率、分类折旧等统计信息
|
||
"""
|
||
return await statistics_service.get_depreciation_statistics(db, organization_id=organization_id)
|
||
|
||
|
||
@router.get("/assets/value", response_model=Dict[str, Any])
|
||
async def get_value_statistics(
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取价值统计
|
||
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回资产总价值、净值、折旧、分类价值、网点价值、高价值资产等统计信息
|
||
"""
|
||
return await statistics_service.get_value_statistics(db, organization_id=organization_id)
|
||
|
||
|
||
@router.get("/assets/trend", response_model=Dict[str, Any])
|
||
async def get_trend_analysis(
|
||
start_date: Optional[date] = Query(None, description="开始日期"),
|
||
end_date: Optional[date] = Query(None, description="结束日期"),
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取趋势分析
|
||
|
||
- **start_date**: 开始日期
|
||
- **end_date**: 结束日期
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回资产数量趋势、价值趋势、采购趋势、维修趋势、调拨趋势等分析数据
|
||
"""
|
||
return await statistics_service.get_trend_analysis(
|
||
db,
|
||
start_date=start_date,
|
||
end_date=end_date,
|
||
organization_id=organization_id
|
||
)
|
||
|
||
|
||
@router.get("/maintenance/summary", response_model=Dict[str, Any])
|
||
async def get_maintenance_summary(
|
||
start_date: Optional[date] = Query(None, description="开始日期"),
|
||
end_date: Optional[date] = Query(None, description="结束日期"),
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取维修汇总
|
||
|
||
- **start_date**: 开始日期
|
||
- **end_date**: 结束日期
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回维修次数、维修费用、状态分布等统计信息
|
||
"""
|
||
return await statistics_service.get_maintenance_statistics(
|
||
db,
|
||
start_date=start_date,
|
||
end_date=end_date,
|
||
organization_id=organization_id
|
||
)
|
||
|
||
|
||
@router.get("/allocation/summary", response_model=Dict[str, Any])
|
||
async def get_allocation_summary(
|
||
start_date: Optional[date] = Query(None, description="开始日期"),
|
||
end_date: Optional[date] = Query(None, description="结束日期"),
|
||
organization_id: Optional[int] = Query(None, description="网点ID筛选"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
获取分配汇总
|
||
|
||
- **start_date**: 开始日期
|
||
- **end_date**: 结束日期
|
||
- **organization_id**: 网点ID筛选
|
||
|
||
返回分配次数、状态分布、网点分配统计等信息
|
||
"""
|
||
return await statistics_service.get_allocation_statistics(
|
||
db,
|
||
start_date=start_date,
|
||
end_date=end_date,
|
||
organization_id=organization_id
|
||
)
|
||
|
||
|
||
@router.post("/export")
|
||
async def export_statistics(
|
||
report_type: str = Query(..., description="报表类型"),
|
||
start_date: Optional[date] = Query(None, description="开始日期"),
|
||
end_date: Optional[date] = Query(None, description="结束日期"),
|
||
organization_id: Optional[int] = Query(None, description="网点ID"),
|
||
format: str = Query("xlsx", description="导出格式"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user = Depends(get_current_user)
|
||
):
|
||
"""
|
||
导出统计报表
|
||
|
||
- **report_type**: 报表类型(overview/purchase/depreciation/value/trend/maintenance/allocation)
|
||
- **start_date**: 开始日期
|
||
- **end_date**: 结束日期
|
||
- **organization_id**: 网点ID
|
||
- **format**: 导出格式(xlsx/csv/pdf)
|
||
|
||
返回导出文件信息
|
||
"""
|
||
# 根据报表类型获取数据
|
||
if report_type == "overview":
|
||
data = await statistics_service.get_overview(db, organization_id)
|
||
elif report_type == "purchase":
|
||
data = await statistics_service.get_purchase_statistics(db, start_date, end_date, organization_id)
|
||
elif report_type == "depreciation":
|
||
data = await statistics_service.get_depreciation_statistics(db, organization_id)
|
||
elif report_type == "value":
|
||
data = await statistics_service.get_value_statistics(db, organization_id)
|
||
elif report_type == "trend":
|
||
data = await statistics_service.get_trend_analysis(db, start_date, end_date, organization_id)
|
||
elif report_type == "maintenance":
|
||
data = await statistics_service.get_maintenance_statistics(db, start_date, end_date, organization_id)
|
||
elif report_type == "allocation":
|
||
data = await statistics_service.get_allocation_statistics(db, start_date, end_date, organization_id)
|
||
else:
|
||
raise ValueError(f"不支持的报表类型: {report_type}")
|
||
|
||
# TODO: 实现导出逻辑
|
||
# 1. 生成Excel/CSV/PDF文件
|
||
# 2. 保存到文件系统
|
||
# 3. 返回文件URL
|
||
|
||
return {
|
||
"message": "导出功能待实现",
|
||
"data": data,
|
||
"report_type": report_type,
|
||
"format": format
|
||
}
|