alarm_service.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """压缩机告警(compressor_alarm)查询,仅限压力/振动两类。"""
  2. import json
  3. from typing import Any
  4. from db import connect
  5. ALARM_TYPES = ("振动故障", "润滑油压力故障")
  6. def _parse_info(raw: Any) -> dict[str, Any]:
  7. if not raw:
  8. return {}
  9. try:
  10. value = json.loads(raw)
  11. except (TypeError, ValueError):
  12. return {}
  13. return value if isinstance(value, dict) else {}
  14. def list_alarms(
  15. device_code: str | None = None,
  16. alarm_type: str | None = None,
  17. page: int = 1,
  18. page_size: int = 10,
  19. ) -> dict[str, Any]:
  20. where = ["alarm_type IN (%s, %s)"]
  21. params: list[Any] = list(ALARM_TYPES)
  22. if device_code:
  23. where.append("device_code = %s")
  24. params.append(device_code)
  25. if alarm_type:
  26. where.append("alarm_type = %s")
  27. params.append(alarm_type)
  28. clause = " AND ".join(where)
  29. connection = connect()
  30. try:
  31. with connection.cursor() as cursor:
  32. cursor.execute(f"SELECT COUNT(*) AS c FROM compressor_alarm WHERE {clause}", params)
  33. total = int(cursor.fetchone()["c"])
  34. offset = (page - 1) * page_size
  35. cursor.execute(
  36. f"""
  37. SELECT id, device_code, device_part, device_point, alarm_type, alarm_level,
  38. alarm_time_start, alarm_time_end, alarm_des, alarm_info_json
  39. FROM compressor_alarm
  40. WHERE {clause}
  41. ORDER BY alarm_time_start DESC, id DESC
  42. LIMIT %s OFFSET %s
  43. """,
  44. params + [page_size, offset],
  45. )
  46. rows = cursor.fetchall()
  47. finally:
  48. connection.close()
  49. items = [
  50. {
  51. "id": int(row["id"]),
  52. "device_code": row["device_code"],
  53. "device_part": row["device_part"],
  54. "device_point": row["device_point"],
  55. "alarm_type": row["alarm_type"],
  56. "alarm_level": row["alarm_level"],
  57. "alarm_time_start": row["alarm_time_start"],
  58. "alarm_time_end": row["alarm_time_end"],
  59. "alarm_des": row["alarm_des"],
  60. "alarm_info": _parse_info(row["alarm_info_json"]),
  61. }
  62. for row in rows
  63. ]
  64. return {"total": total, "page": page, "page_size": page_size, "items": items}
  65. def alarm_filters() -> dict[str, Any]:
  66. connection = connect()
  67. try:
  68. with connection.cursor() as cursor:
  69. cursor.execute(
  70. """
  71. SELECT DISTINCT device_code FROM compressor_alarm
  72. WHERE alarm_type IN (%s, %s) AND device_code IS NOT NULL
  73. ORDER BY device_code
  74. """,
  75. ALARM_TYPES,
  76. )
  77. devices = [row["device_code"] for row in cursor.fetchall()]
  78. finally:
  79. connection.close()
  80. return {"devices": devices, "alarm_types": list(ALARM_TYPES)}