public_vehicles.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """地磅公共只读:免登车牌 options(现场填写页)"""
  2. from __future__ import annotations
  3. from typing import Optional
  4. from fastapi import APIRouter, Depends, HTTPException, Query
  5. from sqlalchemy.orm import Session
  6. from app.core.database import get_db
  7. from app.models.db_models import DbInboundOutbound, DbPurchasePlan
  8. from app.models.pl_models import PlVehicle
  9. router = APIRouter(prefix="/public/db", tags=["地磅-公共车牌"])
  10. def _resolve_tenant_no(
  11. db: Session,
  12. inventory_id: Optional[str],
  13. plan_id: Optional[str],
  14. ) -> str:
  15. if inventory_id:
  16. row = (
  17. db.query(DbInboundOutbound)
  18. .filter(DbInboundOutbound.id == inventory_id, DbInboundOutbound.del_flag == 0)
  19. .first()
  20. )
  21. if not row:
  22. raise HTTPException(status_code=404, detail="出入库单不存在")
  23. return row.tenant_no
  24. if plan_id:
  25. plan = (
  26. db.query(DbPurchasePlan)
  27. .filter(DbPurchasePlan.id == plan_id, DbPurchasePlan.del_flag == 0)
  28. .first()
  29. )
  30. if not plan:
  31. raise HTTPException(status_code=404, detail="计划不存在")
  32. return plan.tenant_no
  33. raise HTTPException(status_code=400, detail="需要提供 inventoryId 或 planId")
  34. @router.get("/vehicle-plates")
  35. def list_public_vehicle_plates(
  36. q: Optional[str] = Query(None),
  37. inventory_id: Optional[str] = Query(None, alias="inventoryId"),
  38. plan_id: Optional[str] = Query(None, alias="planId"),
  39. db: Session = Depends(get_db),
  40. ):
  41. """免登:按出入库/计划解析 tenant_no,返回 pl_vehicle 车牌(self + carrier)。"""
  42. tenant_no = _resolve_tenant_no(db, inventory_id, plan_id)
  43. query = db.query(PlVehicle).filter(
  44. PlVehicle.tenant_no == tenant_no,
  45. PlVehicle.del_flag == 0,
  46. PlVehicle.vehicle_type.in_(["self", "carrier"]),
  47. )
  48. kw = (q or "").strip()
  49. if kw:
  50. query = query.filter(PlVehicle.license_plate.contains(kw))
  51. rows = (
  52. query.order_by(PlVehicle.create_time.desc()).limit(100).all()
  53. )
  54. return [
  55. {"licensePlate": r.license_plate, "vehicleType": r.vehicle_type}
  56. for r in rows
  57. if r.license_plate
  58. ]