"""结算报表导出数据 API(01–06 独立查询,前端再生成 Excel)。""" from __future__ import annotations from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.api.admin import ( _effective_settlement_region_id, get_admin_allowed_region_ids, get_admin_region_filter, require_admin, ) from app.core.database import get_db from app.core.response import error_response, success_response from app.services import settlement_reports as svc router = APIRouter(prefix="/web/admin/settlement-reports", tags=["结算报表导出"]) def _resolve_eff_region( db: Session, current_user: dict, region_id: Optional[str], ): allowed_region_ids = get_admin_allowed_region_ids(db, current_user) if allowed_region_ids is not None and region_id and region_id not in allowed_region_ids: return None, error_response(403, "无权访问该区域数据") admin_region_id = get_admin_region_filter(db, current_user) # 多区域运营:允许按 Tab 的 regionId 筛选(在权限集合内) if allowed_region_ids is not None and len(allowed_region_ids) > 1 and region_id: eff = region_id else: eff = _effective_settlement_region_id(admin_region_id, region_id) return eff, None def _split_ids(raw: Optional[str]) -> Optional[list]: ids = [x.strip() for x in (raw or "").split(",") if x.strip()] return ids or None @router.get("/client-order-lines") def export_client_order_lines( regionId: Optional[str] = Query(None), clientId: Optional[str] = Query(None), keyword: Optional[str] = Query(None), startDate: Optional[str] = Query(None), endDate: Optional[str] = Query(None), orderIds: Optional[str] = Query(None, description="逗号分隔订单ID,优先于日期筛选"), yearMonth: Optional[str] = Query(None, description="YYYY-MM;单月兼容"), yearMonthStart: Optional[str] = Query(None, description="YYYY-MM 起始月"), yearMonthEnd: Optional[str] = Query(None, description="YYYY-MM 结束月"), db: Session = Depends(get_db), current_user: dict = Depends(require_admin), ): eff, err = _resolve_eff_region(db, current_user, regionId) if err is not None: return err try: rows = svc.build_client_order_lines( db, region_id=eff, client_id=clientId, keyword=keyword, start=startDate, end=endDate, order_ids=_split_ids(orderIds), year_month=yearMonth, year_month_start=yearMonthStart, year_month_end=yearMonthEnd, ) return success_response({"list": rows, "total": len(rows)}) except ValueError as e: return error_response(400, str(e)) @router.get("/client-monthly") def export_client_monthly( yearMonth: Optional[str] = Query(None, description="YYYY-MM;单月兼容"), yearMonthStart: Optional[str] = Query(None, description="YYYY-MM 起始月"), yearMonthEnd: Optional[str] = Query(None, description="YYYY-MM 结束月"), regionId: Optional[str] = Query(None), db: Session = Depends(get_db), current_user: dict = Depends(require_admin), ): eff, err = _resolve_eff_region(db, current_user, regionId) if err is not None: return err try: rows = svc.build_client_monthly_summary( db, region_id=eff, year_month=yearMonth, year_month_start=yearMonthStart, year_month_end=yearMonthEnd, ) return success_response({"list": rows, "total": len(rows)}) except ValueError as e: return error_response(400, str(e)) @router.get("/supplier-supply-lines") def export_supplier_supply_lines( regionId: Optional[str] = Query(None), supplierId: Optional[str] = Query(None), keyword: Optional[str] = Query(None), startDate: Optional[str] = Query(None), endDate: Optional[str] = Query(None), orderIds: Optional[str] = Query(None, description="逗号分隔订单ID,优先于日期筛选"), yearMonth: Optional[str] = Query(None, description="YYYY-MM;单月兼容"), yearMonthStart: Optional[str] = Query(None, description="YYYY-MM 起始月"), yearMonthEnd: Optional[str] = Query(None, description="YYYY-MM 结束月"), db: Session = Depends(get_db), current_user: dict = Depends(require_admin), ): eff, err = _resolve_eff_region(db, current_user, regionId) if err is not None: return err try: rows = svc.build_supplier_supply_lines( db, region_id=eff, supplier_id=supplierId, keyword=keyword, start=startDate, end=endDate, order_ids=_split_ids(orderIds), year_month=yearMonth, year_month_start=yearMonthStart, year_month_end=yearMonthEnd, ) return success_response({"list": rows, "total": len(rows)}) except ValueError as e: return error_response(400, str(e)) @router.get("/supplier-monthly") def export_supplier_monthly( yearMonth: Optional[str] = Query(None, description="YYYY-MM;单月兼容"), yearMonthStart: Optional[str] = Query(None, description="YYYY-MM 起始月"), yearMonthEnd: Optional[str] = Query(None, description="YYYY-MM 结束月"), regionId: Optional[str] = Query(None), db: Session = Depends(get_db), current_user: dict = Depends(require_admin), ): eff, err = _resolve_eff_region(db, current_user, regionId) if err is not None: return err try: rows = svc.build_supplier_monthly_summary( db, region_id=eff, year_month=yearMonth, year_month_start=yearMonthStart, year_month_end=yearMonthEnd, ) return success_response({"list": rows, "total": len(rows)}) except ValueError as e: return error_response(400, str(e)) @router.get("/delivery-lines") def export_delivery_lines( regionId: Optional[str] = Query(None), keyword: Optional[str] = Query(None), status: Optional[str] = Query(None), deliverId: Optional[str] = Query(None), startDate: Optional[str] = Query(None), endDate: Optional[str] = Query(None), yearMonth: Optional[str] = Query(None, description="YYYY-MM;单月兼容"), yearMonthStart: Optional[str] = Query(None, description="YYYY-MM 起始月"), yearMonthEnd: Optional[str] = Query(None, description="YYYY-MM 结束月"), db: Session = Depends(get_db), current_user: dict = Depends(require_admin), ): eff, err = _resolve_eff_region(db, current_user, regionId) if err is not None: return err try: rows = svc.build_delivery_lines( db, region_id=eff, keyword=keyword, status=status, deliver_id=deliverId, start=startDate, end=endDate, year_month=yearMonth, year_month_start=yearMonthStart, year_month_end=yearMonthEnd, ) return success_response({"list": rows, "total": len(rows)}) except ValueError as e: return error_response(400, str(e)) @router.get("/delivery-monthly") def export_delivery_monthly( yearMonth: Optional[str] = Query(None, description="YYYY-MM;单月兼容"), yearMonthStart: Optional[str] = Query(None, description="YYYY-MM 起始月"), yearMonthEnd: Optional[str] = Query(None, description="YYYY-MM 结束月"), regionId: Optional[str] = Query(None), db: Session = Depends(get_db), current_user: dict = Depends(require_admin), ): eff, err = _resolve_eff_region(db, current_user, regionId) if err is not None: return err try: rows = svc.build_delivery_monthly_summary( db, region_id=eff, year_month=yearMonth, year_month_start=yearMonthStart, year_month_end=yearMonthEnd, ) return success_response({"list": rows, "total": len(rows)}) except ValueError as e: return error_response(400, str(e))