Spaces:
Runtime error
Runtime error
| from fastapi import APIRouter, Depends | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from sqlalchemy import select, func, desc | |
| from packages.core.database import get_db_session | |
| from packages.core.models import StandardTradeRecord | |
| from apps.api.schemas.trade import TradeQueryRequest, TradeRecordResponse, PaginatedResponse | |
| router = APIRouter() | |
| async def search_trade_records( | |
| query: TradeQueryRequest, | |
| db: AsyncSession = Depends(get_db_session) | |
| ): | |
| """ | |
| 检索标准贸易记录 | |
| 支持按国家、方向、HS、商品、企业名、起运/目的国及日期范围筛选 | |
| """ | |
| stmt = select(StandardTradeRecord) | |
| count_stmt = select(func.count()).select_from(StandardTradeRecord) | |
| # 动态构建查询条件 | |
| filters = [] | |
| if query.source_country: | |
| filters.append(StandardTradeRecord.source_country == query.source_country) | |
| if query.trade_direction: | |
| filters.append(StandardTradeRecord.trade_direction == query.trade_direction) | |
| if query.hs_code: | |
| filters.append(StandardTradeRecord.hs_code.like(f"{query.hs_code}%")) | |
| if query.product_name: | |
| filters.append(StandardTradeRecord.product_name.ilike(f"%{query.product_name}%")) | |
| if query.importer_name: | |
| filters.append(StandardTradeRecord.importer_name.ilike(f"%{query.importer_name}%")) | |
| if query.exporter_name: | |
| filters.append(StandardTradeRecord.exporter_name.ilike(f"%{query.exporter_name}%")) | |
| if query.origin_country: | |
| filters.append(StandardTradeRecord.origin_country == query.origin_country) | |
| if query.destination_country: | |
| filters.append(StandardTradeRecord.destination_country == query.destination_country) | |
| if query.start_date: | |
| filters.append(StandardTradeRecord.trade_date >= query.start_date) | |
| if query.end_date: | |
| filters.append(StandardTradeRecord.trade_date <= query.end_date) | |
| if filters: | |
| stmt = stmt.where(*filters) | |
| count_stmt = count_stmt.where(*filters) | |
| # 计算总数 | |
| count_stmt = select(func.count()).select_from(stmt.subquery()) | |
| total_result = await db.execute(count_stmt) | |
| total = total_result.scalar() or 0 | |
| # 分页查询 | |
| stmt = stmt.order_by(desc(StandardTradeRecord.trade_date)) | |
| stmt = stmt.offset((query.page - 1) * query.limit).limit(query.limit) | |
| result = await db.execute(stmt) | |
| records = result.scalars().all() | |
| return PaginatedResponse( | |
| total=total, | |
| items=records | |
| ) | |