Fix API compatibility and add user/role/permission and asset import/export

This commit is contained in:
2026-01-25 23:36:23 +08:00
commit 501d11e14e
371 changed files with 68853 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
"""
统计分析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
}