from fastapi import APIRouter, Depends, Query, Response from sqlalchemy.orm import Session from typing import Optional from app.core.database import get_db from app.core.security import require_permission from app.models.network import IPStatus from app.services.report_service import ReportExportService router = APIRouter(prefix="/reports", tags=["报表导出"]) @router.get("/ip-addresses/csv", summary="导出IP地址CSV") def export_ip_addresses_csv( network_id: Optional[int] = None, status: Optional[IPStatus] = None, online_only: bool = Query(False, description="仅导出在线IP"), db: Session = Depends(get_db), current_user = Depends(require_permission("report:export")) ): """导出IP地址表CSV""" csv_content, filename = ReportExportService.export_ip_addresses_csv( db, network_id=network_id, status=status, include_online_only=online_only ) return Response( content=csv_content, media_type="text/csv; charset=utf-8-sig", headers={ "Content-Disposition": f"attachment; filename*=UTF-8''{filename}" } ) @router.get("/networks/csv", summary="导出网段汇总CSV") def export_networks_csv( db: Session = Depends(get_db), current_user = Depends(require_permission("report:export")) ): """导出网段汇总CSV""" csv_content, filename = ReportExportService.export_networks_csv(db) return Response( content=csv_content, media_type="text/csv; charset=utf-8-sig", headers={ "Content-Disposition": f"attachment; filename*=UTF-8''{filename}" } ) @router.get("/alerts/csv", summary="导出告警CSV") def export_alerts_csv( status: Optional[str] = None, db: Session = Depends(get_db), current_user = Depends(require_permission("report:export")) ): """导出告警CSV""" csv_content, filename = ReportExportService.export_alerts_csv(db, status=status) return Response( content=csv_content, media_type="text/csv; charset=utf-8-sig", headers={ "Content-Disposition": f"attachment; filename*=UTF-8''{filename}" } ) @router.get("/snmp-devices/csv", summary="导出SNMP设备CSV") def export_snmp_devices_csv( db: Session = Depends(get_db), current_user = Depends(require_permission("report:export")) ): """导出SNMP设备CSV""" csv_content, filename = ReportExportService.export_snmp_devices_csv(db) return Response( content=csv_content, media_type="text/csv; charset=utf-8-sig", headers={ "Content-Disposition": f"attachment; filename*=UTF-8''{filename}" } ) @router.get("/arp-table/csv", summary="导出ARP表CSV") def export_arp_table_csv( device_id: Optional[int] = None, db: Session = Depends(get_db), current_user = Depends(require_permission("report:export")) ): """导出ARP表CSV""" csv_content, filename = ReportExportService.export_arp_table_csv(db, device_id=device_id) return Response( content=csv_content, media_type="text/csv; charset=utf-8-sig", headers={ "Content-Disposition": f"attachment; filename*=UTF-8''{filename}" } ) @router.get("/summary", summary="获取IPAM系统汇总报表") def get_ipam_summary_report( db: Session = Depends(get_db), current_user = Depends(require_permission("report:view")) ): """获取IPAM系统汇总统计报表""" summary = ReportExportService.get_ipam_summary(db) return summary