ソースを参照

修复bug:禁用告警计划失败

nifangxu 1 ヶ月 前
コミット
22c804b16e
4 ファイル変更127 行追加114 行削除
  1. 28 0
      Dockerfile
  2. 0 21
      Dockerfile.txt
  3. 99 92
      core/alarm_plan_manager.py
  4. 0 1
      db/db_sqls.py

+ 28 - 0
Dockerfile

@@ -0,0 +1,28 @@
+# Dockerfile
+FROM python:3.9-slim
+
+# 非交互
+ENV DEBIAN_FRONTEND=noninteractive
+ENV PYTHONUNBUFFERED=1
+ENV TZ=Asia/Shanghai
+
+WORKDIR /app
+
+# 安装系统依赖(如果你需要其他依赖,可在 requirements.txt 中指定)
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    build-essential \
+    ca-certificates \
+ && rm -rf /var/lib/apt/lists/*
+
+# 拷贝依赖与代码
+COPY requirements.txt /app/requirements.txt
+RUN pip install --no-cache-dir -r /app/requirements.txt
+
+COPY . /app
+
+# 暴露端口(根据你的程序端口调整)
+EXPOSE 8080
+
+# 启动命令:假设你的入口是 start.py 或 flask/asgi app
+# 推荐使用 gunicorn 运行 Flask/FastAPI: 如果是 flask: app:app;修改为你的实际模块
+CMD ["gunicorn", "--bind", "0.0.0.0:8080", "--workers", "3", "app:app"]

+ 0 - 21
Dockerfile.txt

@@ -1,21 +0,0 @@
-FROM python:3.11-alpine
-
-# 设置工作目录
-WORKDIR /app
-
-# 拷贝 Python 程序到容器内
-COPY ..
-
-# 安装依赖(如果有 requirements.txt)
-RUN pip install --no-cache-dir -r requirements.txt
-
-# 设置时区
-ENV TZ=Asiz/shanghai
-
-# 接收 build-arg, 指定运行环境
-ARG PY_ENV=dev
-ENV PY_ENV=${PY_ENV}
-
-# 暴露应用端口
-EXPOSE 8091
-

+ 99 - 92
core/alarm_plan_manager.py

@@ -33,19 +33,19 @@ class AlarmPlanManager:
         self.running = False
         self.thread = None
 
-    def push(self, plan_uuid: str, alarm_plan: AlarmPlan) -> None:
+    def push_plan(self, plan_uuid: str, alarm_plan: AlarmPlan) -> None:
         with self.lock_:
             self.alarm_plan_map_[plan_uuid] = alarm_plan
 
-    def pop(self, plan_uuid: str) -> Optional[AlarmPlan]:
+    def pop_plan(self, plan_uuid: str) -> Optional[AlarmPlan]:
         with self.lock_:
             return self.alarm_plan_map_.pop(plan_uuid, None)
 
-    def find(self, plan_uuid: str) -> Optional[AlarmPlan]:
+    def find_plan(self, plan_uuid: str) -> Optional[AlarmPlan]:
         with self.lock_:
             return self.alarm_plan_map_.get(plan_uuid, None)
 
-    def delete(self, plan_uuid: str) -> bool:
+    def delete_plan(self, plan_uuid: str) -> bool:
         with self.lock_:
             if plan_uuid in self.alarm_plan_map_:
                 del self.alarm_plan_map_[plan_uuid]
@@ -225,14 +225,32 @@ class AlarmPlanManager:
             "plan_uuid": plan_uuid
         }
         db_req_que.put(DBRequest_Async(sql=sqls.sql_query_one_alarm_plan, params=params,
-                                 callback=self.cb_query_one_alarm_plan))
+                                 callback=self.cb_query_one_alarm_plan, userdata=plan_uuid))
+
+
+    # 更新单条告警计划
+    def update_one_alarm_plan(self, alarm_plan:AlarmPlan):
+        plan_uuid = alarm_plan.plan_uuid_
+        plan_name = alarm_plan.name_
+        if alarm_plan.enable_:
+            # 塞入告警计划
+            if not alarm_plan.cron_:
+                self.push_plan(plan_uuid, alarm_plan)
+            else:
+                self.push_cron(plan_uuid, alarm_plan)
+            LOGINFO(f"update alarm_plan: {plan_uuid}, {plan_name}")
+        else:
+            self.remove_one_alarm_plan(plan_uuid)
+            LOGINFO(f"disable alarm_plan: {plan_uuid}, {plan_name}")
 
 
     # 查询单个告警计划回调
     def cb_query_one_alarm_plan(self, result, userdata):
         try:
+            plan_uuid = userdata
             if not result:
                 LOGDBG("cb_query_one_alarm_plan, invalid result")
+                self.remove_one_alarm_plan(plan_uuid)
 
             for row in result:
                 plan_uuid: str  = row["plan_uuid"]
@@ -302,12 +320,9 @@ class AlarmPlanManager:
                 if alarm_plan.event_attr_ is None:
                     LOGERR(f"drop plan {plan_uuid}, invalid event_type: {event_type}")
                     continue
-                # 塞入告警计划
-                if not alarm_plan.cron_:
-                    self.push(plan_uuid, alarm_plan)
-                else:
-                    self.push_cron(plan_uuid, alarm_plan)
-                LOGINFO(f"update alarm_plan: {plan_uuid}, {plan_name}")
+
+                # 更新告警计划
+                self.update_one_alarm_plan(alarm_plan)
 
         except json.JSONDecodeError as e:
             tb_info = traceback.extract_tb(e.__traceback__)
@@ -353,88 +368,80 @@ def region_to_rect(region: dict) -> list:
 # 回调函数,处理查询结果:查询所有的告警计划信息
 def cb_handle_query_all_alarm_plan_info(result, userdata):
     try:
-        if result:
-            for row in result:
-                plan_uuid: str  = row["plan_uuid"]
-                plan_name: str  = row["plan_name"]
-                dev_id: str     = row["dev_id"]
-                dev_name: str   = row["dev_name"]
-                enable: int     = bool(row["enable"])
-                # region          = row["region"]
-                # rect            = json.loads(region_to_rect(region))
-                rect: list      = json.loads(row["region"]) if row.get("region") else []
-                threshold_time: int = row["threshold_time"]
-                merge_time: int     = row["merge_time"]
-                param: dict     = json.loads(row["param"])
-
-                event_val: int   = row["event_val"]
-                event_type      = event_val
-                event_str: str   = row["event_str"]
-                event_desc: str  = row["event_desc"]
-                tenant_id: int  = row.get("tenant_id", 0)
-
-                start_date  = row["start_date"]
-                stop_date   = row["stop_date"]
-                time_range  = json.loads(row["time_range"])
-                month_days = None
-                if row["month_days"]:
-                    month_days = ast.literal_eval(row["month_days"])
-                weekdays = None
-                if row["weekdays"]:
-                    weekdays = ast.literal_eval(row["weekdays"])
-
-                linkage_push_wechat_service: int = row.get("linkage_push_wechat_service") or 0
-                linkage_action  = LinkageAction(wechat_service=linkage_push_wechat_service)
-
-                cron = None
-                if ((event_type == EventType.TOILETING_FREQUENCY.value) or
-                    (event_type == EventType.NIGHT_TOILETING_FREQUENCY.value) or
-                    (event_type == EventType.TOILETING_FREQUENCY_ABNORMAL.value) or
-                    (event_type == EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value) or
-                    (event_type == EventType.BATHROOM_STAY_FREQUENCY.value)):
-                    cron = {
-                        "hour": 7,
-                        "minute": 0
-                    }
-
-                time_plan = TimePlan(
-                    time_range  = time_range,
-                    start_date  = start_date,
-                    stop_date   = stop_date,
-                    weekdays    = weekdays,
-                    month_days  = month_days
-                )
-
-                alarm_plan = AlarmPlan(
-                    plan_uuid   = plan_uuid,
-                    name        = plan_name,
-                    dev_id      = dev_id,
-                    dev_name    = dev_name,
-                    enable      = enable,
-                    time_plan   = time_plan,
-                    rect        = rect,
-                    event_type  = event_type,
-                    threshold_time  = threshold_time,
-                    merge_time  = merge_time,
-                    param       = param,
-                    cron        = cron,
-                    linkage_action=linkage_action,
-                    tenant_id   = tenant_id
-                )
-
-                if alarm_plan.event_attr_ is None:
-                    LOGERR(f"drop plan {plan_uuid}, invalid event_type: {event_type}")
-                    continue
-
-                # 塞入告警计划
-                if not alarm_plan.cron_:
-                    g_las.g_alarm_plan_mgr.push(plan_uuid, alarm_plan)
-                else:
-                    g_las.g_alarm_plan_mgr.push_cron(plan_uuid, alarm_plan)
-
-            LOGDBG(f"cb_handle_query_all_alarm_plan_info succeed")
-        else:
+        if not result:
             LOGDBG("cb_handle_query_all_alarm_plan_info, invalid result")
+        for row in result:
+            plan_uuid: str  = row["plan_uuid"]
+            plan_name: str  = row["plan_name"]
+            dev_id: str     = row["dev_id"]
+            dev_name: str   = row["dev_name"]
+            enable: int     = bool(row["enable"])
+            # region          = row["region"]
+            # rect            = json.loads(region_to_rect(region))
+            rect: list      = json.loads(row["region"]) if row.get("region") else []
+            threshold_time: int = row["threshold_time"]
+            merge_time: int     = row["merge_time"]
+            param: dict     = json.loads(row["param"])
+            event_val: int   = row["event_val"]
+            event_type      = event_val
+            event_str: str   = row["event_str"]
+            event_desc: str  = row["event_desc"]
+            tenant_id: int  = row.get("tenant_id", 0)
+            start_date  = row["start_date"]
+            stop_date   = row["stop_date"]
+            time_range  = json.loads(row["time_range"])
+            month_days = None
+            if row["month_days"]:
+                month_days = ast.literal_eval(row["month_days"])
+            weekdays = None
+            if row["weekdays"]:
+                weekdays = ast.literal_eval(row["weekdays"])
+            linkage_push_wechat_service: int = row.get("linkage_push_wechat_service") or 0
+            linkage_action  = LinkageAction(wechat_service=linkage_push_wechat_service)
+            cron = None
+            if ((event_type == EventType.TOILETING_FREQUENCY.value) or
+                (event_type == EventType.NIGHT_TOILETING_FREQUENCY.value) or
+                (event_type == EventType.TOILETING_FREQUENCY_ABNORMAL.value) or
+                (event_type == EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value) or
+                (event_type == EventType.BATHROOM_STAY_FREQUENCY.value)):
+                cron = {
+                    "hour": 7,
+                    "minute": 0
+                }
+            time_plan = TimePlan(
+                time_range  = time_range,
+                start_date  = start_date,
+                stop_date   = stop_date,
+                weekdays    = weekdays,
+                month_days  = month_days
+            )
+            alarm_plan = AlarmPlan(
+                plan_uuid   = plan_uuid,
+                name        = plan_name,
+                dev_id      = dev_id,
+                dev_name    = dev_name,
+                enable      = enable,
+                time_plan   = time_plan,
+                rect        = rect,
+                event_type  = event_type,
+                threshold_time  = threshold_time,
+                merge_time  = merge_time,
+                param       = param,
+                cron        = cron,
+                linkage_action=linkage_action,
+                tenant_id   = tenant_id
+            )
+            if alarm_plan.event_attr_ is None:
+                LOGERR(f"drop plan {plan_uuid}, invalid event_type: {event_type}")
+                continue
+            # 塞入告警计划
+            if not alarm_plan.cron_:
+                g_las.g_alarm_plan_mgr.push_plan(plan_uuid, alarm_plan)
+            else:
+                g_las.g_alarm_plan_mgr.push_cron(plan_uuid, alarm_plan)
+
+        LOGDBG(f"cb_handle_query_all_alarm_plan_info succeed")
+
 
     except json.JSONDecodeError as e:
         tb_info = traceback.extract_tb(e.__traceback__)

+ 0 - 1
db/db_sqls.py

@@ -128,7 +128,6 @@ LEFT JOIN alarm_time_plan atp
 LEFT JOIN dev_info di
        ON ap.dev_id = di.client_id
 WHERE
-    ap.enable = 1 AND
     ap.uuid = %(plan_uuid)s;
 """