2026-05-18 09:12:14 +08:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
2026-05-18 12:35:27 +08:00
|
|
|
from datetime import datetime
|
|
|
|
|
from typing import Any, Dict, List, Optional
|
2026-05-18 09:12:14 +08:00
|
|
|
|
|
|
|
|
from app.db.sqlite import get_connection
|
|
|
|
|
from app.schemas.platform import AlarmEvent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AlarmRepository:
|
|
|
|
|
def save_alarm(self, alarm: AlarmEvent) -> int:
|
|
|
|
|
with get_connection() as connection:
|
|
|
|
|
cursor = connection.execute(
|
|
|
|
|
"""
|
2026-06-26 17:48:42 +08:00
|
|
|
INSERT INTO alarm_event (event_time, line_code, event_type, event_code, event_value, content)
|
2026-05-18 09:12:14 +08:00
|
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
|
|
|
""",
|
|
|
|
|
(
|
2026-06-26 17:48:42 +08:00
|
|
|
alarm.event_time.isoformat(sep=" ", timespec="seconds"),
|
|
|
|
|
alarm.line_code,
|
|
|
|
|
alarm.event_type,
|
|
|
|
|
alarm.event_code,
|
|
|
|
|
alarm.event_value,
|
2026-05-18 09:12:14 +08:00
|
|
|
alarm.content,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
connection.commit()
|
|
|
|
|
return int(cursor.lastrowid)
|
|
|
|
|
|
2026-05-18 12:35:27 +08:00
|
|
|
def list_alarms(
|
|
|
|
|
self,
|
|
|
|
|
page: int = 1,
|
|
|
|
|
size: int = 20,
|
2026-06-26 17:48:42 +08:00
|
|
|
line_code: Optional[int] = None,
|
|
|
|
|
event_type: Optional[int] = None,
|
2026-05-18 12:35:27 +08:00
|
|
|
start_time: Optional[datetime] = None,
|
|
|
|
|
end_time: Optional[datetime] = None,
|
|
|
|
|
) -> List[Dict[str, Any]]:
|
2026-05-18 09:12:14 +08:00
|
|
|
offset = (page - 1) * size
|
2026-05-18 12:35:27 +08:00
|
|
|
conditions = []
|
|
|
|
|
params: List[Any] = []
|
|
|
|
|
|
2026-06-26 17:48:42 +08:00
|
|
|
if line_code is not None:
|
|
|
|
|
conditions.append("line_code = ?")
|
|
|
|
|
params.append(line_code)
|
|
|
|
|
if event_type is not None:
|
|
|
|
|
conditions.append("event_type = ?")
|
|
|
|
|
params.append(event_type)
|
2026-05-18 12:35:27 +08:00
|
|
|
if start_time is not None:
|
2026-06-26 17:48:42 +08:00
|
|
|
conditions.append("event_time >= ?")
|
2026-05-18 12:35:27 +08:00
|
|
|
params.append(start_time.isoformat(sep=" ", timespec="seconds"))
|
|
|
|
|
if end_time is not None:
|
2026-06-26 17:48:42 +08:00
|
|
|
conditions.append("event_time <= ?")
|
2026-05-18 12:35:27 +08:00
|
|
|
params.append(end_time.isoformat(sep=" ", timespec="seconds"))
|
|
|
|
|
|
|
|
|
|
where_clause = ""
|
|
|
|
|
if conditions:
|
|
|
|
|
where_clause = "WHERE " + " AND ".join(conditions)
|
|
|
|
|
|
2026-05-18 09:12:14 +08:00
|
|
|
with get_connection() as connection:
|
|
|
|
|
cursor = connection.execute(
|
2026-05-18 12:35:27 +08:00
|
|
|
f"""
|
2026-06-26 17:48:42 +08:00
|
|
|
SELECT id, event_time, line_code, event_type, event_code, event_value, content
|
2026-05-18 09:12:14 +08:00
|
|
|
FROM alarm_event
|
2026-05-18 12:35:27 +08:00
|
|
|
{where_clause}
|
2026-05-18 09:12:14 +08:00
|
|
|
ORDER BY id DESC
|
|
|
|
|
LIMIT ? OFFSET ?
|
|
|
|
|
""",
|
2026-05-18 12:35:27 +08:00
|
|
|
tuple(params + [size, offset]),
|
2026-05-18 09:12:14 +08:00
|
|
|
)
|
|
|
|
|
return [dict(row) for row in cursor.fetchall()]
|