monitoring.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from __future__ import annotations
  2. from fastapi import APIRouter, Depends, Query
  3. from sqlalchemy.orm import Session
  4. from app.db.repositories import monitoring as monitoring_repo
  5. from app.db.repositories.base import create_model
  6. from app.db.models.monitoring import SensorReading
  7. from app.db.session import get_db
  8. from app.schemas.monitoring import (
  9. AlarmRead,
  10. DataSourceRead,
  11. MonitoringOverview,
  12. SensorRead,
  13. SensorReadingCreate,
  14. SensorReadingRead,
  15. VentilationFacilityRead,
  16. )
  17. router = APIRouter(prefix="/monitoring", tags=["数据感知与监测"])
  18. @router.get("/overview", response_model=MonitoringOverview, summary="监测总览")
  19. def overview(
  20. mine_id: str = Query(...),
  21. db: Session = Depends(get_db),
  22. ) -> MonitoringOverview:
  23. return MonitoringOverview(**monitoring_repo.monitoring_overview(db, mine_id))
  24. @router.get("/sources", response_model=list[DataSourceRead], summary="数据源列表")
  25. def sources(mine_id: str = Query(...), db: Session = Depends(get_db)):
  26. return monitoring_repo.list_data_sources(db, mine_id)
  27. @router.get("/sensors", response_model=list[SensorRead], summary="传感器列表")
  28. def sensors(
  29. mine_id: str = Query(...),
  30. sensor_type: str | None = Query(None),
  31. db: Session = Depends(get_db),
  32. ):
  33. return monitoring_repo.list_sensors(db, mine_id, sensor_type)
  34. @router.get(
  35. "/sensors/{sensor_id}/readings",
  36. response_model=list[SensorReadingRead],
  37. summary="传感器最近监测数据",
  38. )
  39. def readings(
  40. sensor_id: str,
  41. limit: int = Query(200, ge=1, le=2000),
  42. db: Session = Depends(get_db),
  43. ):
  44. return monitoring_repo.list_readings(db, sensor_id, limit=limit)
  45. @router.post(
  46. "/readings",
  47. response_model=SensorReadingRead,
  48. status_code=201,
  49. summary="写入实时监测数据",
  50. )
  51. def create_reading(payload: SensorReadingCreate, db: Session = Depends(get_db)):
  52. reading = create_model(db, SensorReading, payload.model_dump())
  53. sensor = monitoring_repo.get_sensor(db, payload.sensor_id)
  54. if sensor is not None:
  55. sensor.last_value = payload.value
  56. sensor.last_seen_at = payload.measured_at
  57. db.add(sensor)
  58. db.commit()
  59. db.refresh(reading)
  60. return reading
  61. @router.get(
  62. "/facilities",
  63. response_model=list[VentilationFacilityRead],
  64. summary="通风设施列表",
  65. )
  66. def facilities(mine_id: str = Query(...), db: Session = Depends(get_db)):
  67. return monitoring_repo.list_facilities(db, mine_id)
  68. @router.get("/alarms", response_model=list[AlarmRead], summary="告警列表")
  69. def alarms(
  70. mine_id: str = Query(...),
  71. status: str | None = Query(None),
  72. limit: int = Query(100, ge=1, le=1000),
  73. db: Session = Depends(get_db),
  74. ):
  75. return monitoring_repo.list_alarms(db, mine_id, status=status, limit=limit)