from __future__ import annotations from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.db.repositories import monitoring as monitoring_repo from app.db.repositories.base import create_model from app.db.models.monitoring import SensorReading from app.db.session import get_db from app.schemas.monitoring import ( AlarmRead, DataSourceRead, MonitoringOverview, SensorRead, SensorReadingCreate, SensorReadingRead, VentilationFacilityRead, ) router = APIRouter(prefix="/monitoring", tags=["数据感知与监测"]) @router.get("/overview", response_model=MonitoringOverview, summary="监测总览") def overview( mine_id: str = Query(...), db: Session = Depends(get_db), ) -> MonitoringOverview: return MonitoringOverview(**monitoring_repo.monitoring_overview(db, mine_id)) @router.get("/sources", response_model=list[DataSourceRead], summary="数据源列表") def sources(mine_id: str = Query(...), db: Session = Depends(get_db)): return monitoring_repo.list_data_sources(db, mine_id) @router.get("/sensors", response_model=list[SensorRead], summary="传感器列表") def sensors( mine_id: str = Query(...), sensor_type: str | None = Query(None), db: Session = Depends(get_db), ): return monitoring_repo.list_sensors(db, mine_id, sensor_type) @router.get( "/sensors/{sensor_id}/readings", response_model=list[SensorReadingRead], summary="传感器最近监测数据", ) def readings( sensor_id: str, limit: int = Query(200, ge=1, le=2000), db: Session = Depends(get_db), ): return monitoring_repo.list_readings(db, sensor_id, limit=limit) @router.post( "/readings", response_model=SensorReadingRead, status_code=201, summary="写入实时监测数据", ) def create_reading(payload: SensorReadingCreate, db: Session = Depends(get_db)): reading = create_model(db, SensorReading, payload.model_dump()) sensor = monitoring_repo.get_sensor(db, payload.sensor_id) if sensor is not None: sensor.last_value = payload.value sensor.last_seen_at = payload.measured_at db.add(sensor) db.commit() db.refresh(reading) return reading @router.get( "/facilities", response_model=list[VentilationFacilityRead], summary="通风设施列表", ) def facilities(mine_id: str = Query(...), db: Session = Depends(get_db)): return monitoring_repo.list_facilities(db, mine_id) @router.get("/alarms", response_model=list[AlarmRead], summary="告警列表") def alarms( mine_id: str = Query(...), status: str | None = Query(None), limit: int = Query(100, ge=1, le=1000), db: Session = Depends(get_db), ): return monitoring_repo.list_alarms(db, mine_id, status=status, limit=limit)