| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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)
|