init
This commit is contained in:
55
transport/backend/app/services/event_detector.py
Normal file
55
transport/backend/app/services/event_detector.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models import Vehicle, Position, Event
|
||||
from app.config import settings
|
||||
|
||||
|
||||
async def detect_events(
|
||||
db: AsyncSession,
|
||||
vehicle: Vehicle,
|
||||
current: Position,
|
||||
previous: Optional[Position]
|
||||
) -> list[Event]:
|
||||
"""Обнаружение событий на основе новой позиции"""
|
||||
events = []
|
||||
|
||||
# Check for overspeed
|
||||
if current.speed > settings.overspeed_limit:
|
||||
event = Event(
|
||||
vehicle_id=vehicle.id,
|
||||
timestamp=current.timestamp,
|
||||
type="OVERSPEED",
|
||||
payload={
|
||||
"speed": current.speed,
|
||||
"limit": settings.overspeed_limit,
|
||||
"lat": current.lat,
|
||||
"lon": current.lon
|
||||
}
|
||||
)
|
||||
db.add(event)
|
||||
await db.commit()
|
||||
await db.refresh(event)
|
||||
events.append(event)
|
||||
|
||||
# Check for long stop (if speed is 0 and was 0 for a while)
|
||||
if previous and current.speed < 2 and previous.speed < 2:
|
||||
time_diff = current.timestamp - previous.timestamp
|
||||
if time_diff >= timedelta(minutes=settings.long_stop_minutes):
|
||||
event = Event(
|
||||
vehicle_id=vehicle.id,
|
||||
timestamp=current.timestamp,
|
||||
type="LONG_STOP",
|
||||
payload={
|
||||
"duration_minutes": time_diff.total_seconds() / 60,
|
||||
"lat": current.lat,
|
||||
"lon": current.lon
|
||||
}
|
||||
)
|
||||
db.add(event)
|
||||
await db.commit()
|
||||
await db.refresh(event)
|
||||
events.append(event)
|
||||
|
||||
return events
|
||||
Reference in New Issue
Block a user