| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- """结算报表导出数据 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))
|