customs-data / apps /api /routers /trade.py
3v324v23's picture
feat: 新增贸易查询筛选条件并完善巴西贸易数据解析
98897be
Raw
History Blame Contribute Delete
2.58 kB
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()
@router.post("/search", response_model=PaginatedResponse[TradeRecordResponse])
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
)