""" 导出 API 提供对账结果导出、金蝶凭证导出等接口 """ from typing import Any, Dict from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks from fastapi.responses import StreamingResponse from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.core.tenant import get_current_company_id from app.services.export_service import export_task_result, export_kingdee_voucher router = APIRouter(prefix="/api/exports", tags=["导出"]) @router.get("/task/{task_id}") async def export_task( task_id: int, db: AsyncSession = Depends(get_db), company_id: int = Depends(get_current_company_id), ): """ 导出任务对账结果 返回 Excel 文件,包含: - 概览 - 异常列表 - 异常统计 """ try: data = await export_task_result(db, task_id) return StreamingResponse( iter([data]), media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", headers={ "Content-Disposition": f"attachment; filename=对账结果_{task_id}.xlsx" }, ) except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) except ImportError as e: raise HTTPException(status_code=500, detail="导出功能未启用,请安装 openpyxl") @router.get("/kingdee/{task_id}") async def export_kingdee( task_id: int, db: AsyncSession = Depends(get_db), company_id: int = Depends(get_current_company_id), ): """ 导出金蝶凭证 返回 Excel 文件,可导入到金蝶系统 """ try: data = await export_kingdee_voucher(db, task_id) return StreamingResponse( iter([data]), media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", headers={ "Content-Disposition": f"attachment; filename=金蝶凭证_{task_id}.xlsx" }, ) except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) except ImportError as e: raise HTTPException(status_code=500, detail="导出功能未启用,请安装 openpyxl") @router.post("/task/{task_id}/async") async def export_task_async( task_id: int, background_tasks: BackgroundTasks, db: AsyncSession = Depends(get_db), company_id: int = Depends(get_current_company_id), ): """ 异步导出任务对账结果 适用于大数据量导出的场景,返回导出任务ID """ # TODO: 实现异步导出任务 return { "success": True, "message": "异步导出任务已创建", "task_id": task_id, }