Эх сурвалжийг харах

1. 修改适配数据库字段alarm_plan, events表
2. 支持联动动作
3. 添加租户idtenant_id字段

nifangxu 1 сар өмнө
parent
commit
eda9d589ed

+ 76 - 25
core/alarm_plan.py

@@ -17,6 +17,7 @@ from core.time_plan import TimePlan
 from core.event_type import EventType, event_desc_map
 import core.g_LAS as g_las
 import core.alarm_plan_helper as helper
+from core.linkage_action import LinkageAction
 
 from db.db_process import (
     db_req_que, DBRequest
@@ -189,7 +190,9 @@ class AlarmPlan:
                  threshold_time: int,
                  merge_time: int,
                  param: dict,
-                 cron: Optional[dict] = None
+                 cron: Optional[dict] = None,
+                 linkage_action: LinkageAction = LinkageAction(),
+                 tenant_id:int = 0
                  ):
         self.lock_          = Lock()
         self.plan_uuid_     = plan_uuid     # 计划id
@@ -199,6 +202,8 @@ class AlarmPlan:
         self.enable_        = enable        # 是否启用
         self.time_plan_     = time_plan     # 时间计划
         self.param_         = param         # 参数
+        self.linkage_action_    = linkage_action    # 联动动作
+        self.tenant_id_     = tenant_id     # 租户id
 
         # 维护状态(根据TimePlanu判断)
         self.status_ = 0     # 0未激活,1激活,-1过期
@@ -213,7 +218,8 @@ class AlarmPlan:
         if self.event_attr_ is None:
             raise ValueError(f"Invalid event_type: {event_type}")
 
-        self.cron_ = cron   # {“hour": 6, "minute": 0}
+        # 计划任务的开始时间
+        self.cron_ = cron   # {“hour": 7, "minute": 0}
 
     def execute(self):
         if self.status_ != 1:
@@ -346,17 +352,22 @@ class AlarmPlan:
                 "dev_id": dev_id,
                 "uuid": event_uuid,
                 "plan_uuid": self.plan_uuid_,
-                "event_type": event_desc_map[self.event_type_],
+                "event_type": self.event_type_,
                 "info": json.dumps(info),
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                 "is_handle": 0,
                 "create_time": get_bj_time_s(),
                 "is_deleted": 0,
+                "tenant_id": self.tenant_id_,
                 "remark": json.dumps({}, ensure_ascii=False) 
             }
             db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
             # 通知
-            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, "events")
+            linkage_action = {
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+            }
+            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, linkage_action, "events")
             LOGDBG(f"new event: {event_desc_map[self.event_type_]}, stay_time: {stay_time}")
 
             self.event_attr_.reset()
@@ -419,17 +430,22 @@ class AlarmPlan:
                 "dev_id": dev_id,
                 "uuid": event_uuid,
                 "plan_uuid": self.plan_uuid_,
-                "event_type": event_desc_map[self.event_type_],
+                "event_type": self.event_type_,
                 "info": json.dumps(info),
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                 "is_handle": 0,
                 "create_time": get_bj_time_s(),
                 "is_deleted": 0,
+                "tenant_id": self.tenant_id_,
                 "remark": json.dumps({}, ensure_ascii=False) 
             }
             db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
             # 通知
-            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, "events")
+            linkage_action = {
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+            }
+            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, linkage_action, "events")
             LOGDBG(f"new event: {event_desc_map[self.event_type_]}, stay_time: {stay_time}")
 
             self.event_attr_.reset()
@@ -492,17 +508,22 @@ class AlarmPlan:
                 "dev_id": dev_id,
                 "uuid": event_uuid,
                 "plan_uuid": self.plan_uuid_,
-                "event_type": event_desc_map[self.event_type_],
+                "event_type": self.event_type_,
                 "info": json.dumps(info),
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                 "is_handle": 0,
                 "create_time": get_bj_time_s(),
                 "is_deleted": 0,
+                "tenant_id": self.tenant_id_,
                 "remark": json.dumps({}, ensure_ascii=False) 
             }
             db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
             # 通知
-            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, "events")
+            linkage_action = {
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+            }
+            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, linkage_action, "events")
             LOGDBG(f"new event: {event_desc_map[self.event_type_]}, stay_time: {stay_time}")
 
             self.event_attr_.reset()
@@ -529,7 +550,7 @@ class AlarmPlan:
             start_dt, end_dt = helper.get_query_time_range(self.param_)
             params = {
                 "dev_id"    : self.dev_id_,
-                "event_type": event_desc_map[EventType.TOILETING_DETECTION.value],
+                "event_type": EventType.TOILETING_DETECTION.value,
                 "start_dt": start_dt,
                 "end_dt": end_dt
             }
@@ -565,7 +586,7 @@ class AlarmPlan:
             start_dt, end_dt = helper.get_query_time_range(self.param_)
             params = {
                 "dev_id"    : self.dev_id_,
-                "event_type": event_desc_map[EventType.TOILETING_DETECTION.value],
+                "event_type": EventType.TOILETING_DETECTION.value,
                 "start_dt": start_dt,
                 "end_dt": end_dt
             }
@@ -601,7 +622,7 @@ class AlarmPlan:
             start_dt, end_dt = helper.get_query_time_range(self.param_)
             params = {
                 "dev_id"    : self.dev_id_,
-                "event_type": event_desc_map[EventType.TOILETING_DETECTION.value],
+                "event_type": EventType.TOILETING_DETECTION.value,
                 "start_dt": start_dt,
                 "end_dt": end_dt
             }
@@ -637,7 +658,7 @@ class AlarmPlan:
             start_dt, end_dt = helper.get_query_time_range(self.param_)
             params = {
                 "dev_id"    : self.dev_id_,
-                "event_type": event_desc_map[EventType.TOILETING_DETECTION.value],
+                "event_type": EventType.TOILETING_DETECTION.value,
                 "start_dt": start_dt,
                 "end_dt": end_dt
             }
@@ -672,7 +693,7 @@ class AlarmPlan:
             start_dt, end_dt = helper.get_query_time_range(self.param_)
             params = {
                 "dev_id"    : self.dev_id_,
-                "event_type": event_desc_map[EventType.STAY_DETECTION.value],
+                "event_type": EventType.STAY_DETECTION.value,
                 "start_dt": start_dt,
                 "end_dt": end_dt
             }
@@ -746,17 +767,22 @@ class AlarmPlan:
                 "dev_id": dev_id,
                 "uuid": event_uuid,
                 "plan_uuid": self.plan_uuid_,
-                "event_type": event_desc_map[self.event_type_],
+                "event_type": self.event_type_,
                 "info": json.dumps(info),
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                 "is_handle": 0,
                 "create_time": get_bj_time_s(),
                 "is_deleted": 0,
+                "tenant_id": self.tenant_id_,
                 "remark": json.dumps({}, ensure_ascii=False) 
             }
             db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
             # 通知
-            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, "events")
+            linkage_action = {
+                "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+            }
+            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, linkage_action, "events")
             LOGDBG(f"new event: {event_desc_map[self.event_type_]}, absence_time: {absence_time}")
 
             self.event_attr_.reset()
@@ -809,17 +835,22 @@ class AlarmPlan:
                     "dev_id": dev_id,
                     "uuid": this_event_uuid,
                     "plan_uuid": self.plan_uuid_,
-                    "event_type": event_desc_map[self.event_type_],
+                    "event_type": self.event_type_,
                     "info": json.dumps(last_info, ensure_ascii=False),
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                     "is_handle": 0,
                     "create_time": get_bj_time_s(),
                     "is_deleted": 0,
+                    "tenant_id": self.tenant_id_,
                     "remark": json.dumps({}, ensure_ascii=False) 
                 }
                 db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
                 # 通知
-                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, "events")
+                linkage_action = {
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+                }
+                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, linkage_action, "events")
 
                 LOGINFO(f"cb_toileting_frequency succeed")
             else:
@@ -871,17 +902,22 @@ class AlarmPlan:
                     "dev_id": dev_id,
                     "uuid": this_event_uuid,
                     "plan_uuid": self.plan_uuid_,
-                    "event_type": event_desc_map[self.event_type_],
+                    "event_type": self.event_type_,
                     "info": json.dumps(last_info, ensure_ascii=False),
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                     "is_handle": 0,
                     "create_time": get_bj_time_s(),
                     "is_deleted": 0,
+                    "tenant_id": self.tenant_id_,
                     "remark": json.dumps({}, ensure_ascii=False) 
                 }
                 db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
                 # 通知
-                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, "events")
+                linkage_action = {
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+                }
+                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, linkage_action, "events")
 
                 LOGINFO(f"cb_night_toileting_frequency succeed")
             else:
@@ -936,17 +972,22 @@ class AlarmPlan:
                     "dev_id": dev_id,
                     "uuid": this_event_uuid,
                     "plan_uuid": self.plan_uuid_,
-                    "event_type": event_desc_map[self.event_type_],
+                    "event_type": self.event_type_,
                     "info": json.dumps(last_info, ensure_ascii=False),
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                     "is_handle": 0,
                     "create_time": get_bj_time_s(),
                     "is_deleted": 0,
+                    "tenant_id": self.tenant_id_,
                     "remark": json.dumps({}, ensure_ascii=False) 
                 }
                 db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
                 # 通知
-                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], last_info, "events")
+                linkage_action = {
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+                }
+                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], last_info, linkage_action, "events")
 
                 LOGINFO(f"cb_toileting_frequency_abnormal succeed")
             else:
@@ -1001,17 +1042,22 @@ class AlarmPlan:
                     "dev_id": dev_id,
                     "uuid": this_event_uuid,
                     "plan_uuid": self.plan_uuid_,
-                    "event_type": event_desc_map[self.event_type_],
+                    "event_type": self.event_type_,
                     "info": json.dumps(last_info, ensure_ascii=False),
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                     "is_handle": 0,
                     "create_time": get_bj_time_s(),
                     "is_deleted": 0,
+                    "tenant_id": self.tenant_id_,
                     "remark": json.dumps({}, ensure_ascii=False) 
                 }
                 db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
                 # 通知
-                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], last_info, "events")
+                linkage_action = {
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+                }
+                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], last_info, linkage_action, "events")
 
                 LOGINFO(f"cb_night_toileting_frequency_abnormal succeed")
             else:
@@ -1064,17 +1110,22 @@ class AlarmPlan:
                     "dev_id": dev_id,
                     "uuid": this_event_uuid,
                     "plan_uuid": self.plan_uuid_,
-                    "event_type": event_desc_map[self.event_type_],
+                    "event_type": self.event_type_,
                     "info": json.dumps(last_info, ensure_ascii=False),
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_,
                     "is_handle": 0,
                     "create_time": get_bj_time_s(),
                     "is_deleted": 0,
+                    "tenant_id": self.tenant_id_,
                     "remark": json.dumps({}, ensure_ascii=False) 
                 }
                 db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
 
                 # 通知
-                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, "events")
+                linkage_action = {
+                    "linkage_push_wechat_service": self.linkage_action_.wechat_service_
+                }
+                mqtt_send.alarm_event(dev_id, self.dev_name_, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, linkage_action, "events")
 
                 LOGINFO(f"cb_bathroom_stay_frequency+- succeed")
             else:

+ 19 - 6
core/alarm_plan_manager.py

@@ -14,6 +14,7 @@ from core.alarm_event import AlarmEvent
 from core.alarm_plan import AlarmPlan
 from core.time_plan import TimePlan
 from core.event_type import EventType
+from core.linkage_action import LinkageAction
 import core.g_LAS as g_las
 
 from db.db_process import db_req_que
@@ -187,13 +188,14 @@ class AlarmPlanManager:
                 enable: int     = bool(row["enable"])
                 rect: list      = json.loads(row["region"]) if row.get("region") else []
                 threshold_time: int = row["threshold_time"]
-                merge_time: int     = row["merge_time"]
+                merge_time: int = row["merge_time"]
                 param: dict     = json.loads(row["param"])
 
-                event_val: int   = row["event_val"]
+                event_val: int  = row["event_val"]
                 event_type      = event_val
-                event_str: str   = row["event_str"]
-                event_desc: str  = row["event_desc"]
+                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"]
@@ -205,6 +207,9 @@ class AlarmPlanManager:
                 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
@@ -236,7 +241,9 @@ class AlarmPlanManager:
                     threshold_time  = threshold_time,
                     merge_time  = merge_time,
                     param       = param,
-                    cron        = cron
+                    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}")
@@ -309,6 +316,7 @@ def cb_handle_query_all_alarm_plan_info(result, userdata):
                 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"]
@@ -320,6 +328,9 @@ def cb_handle_query_all_alarm_plan_info(result, userdata):
                 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
@@ -351,7 +362,9 @@ def cb_handle_query_all_alarm_plan_info(result, userdata):
                     threshold_time  = threshold_time,
                     merge_time  = merge_time,
                     param       = param,
-                    cron        = cron
+                    cron        = cron,
+                    linkage_action=linkage_action,
+                    tenant_id   = tenant_id
                 )
 
                 if alarm_plan.event_attr_ is None:

+ 12 - 0
core/linkage_action.py

@@ -0,0 +1,12 @@
+class LinkageAction:
+    def __init__(self,
+                 wechat_service: int=0,
+                 short_msg: int=0,
+                 tel_call: int=0,
+                 voip_call: int=0,
+                 email: int=0):
+        self.wechat_service_    = wechat_service    # 微信服务号推送
+        self.short_msg_         = short_msg         # 短信
+        self.tel_call_          = tel_call          # 电话
+        self.voip_call_         = voip_call         # VOIP语音通话
+        self.email_             = email             # 电子邮件

+ 4 - 1
db/db_scripts/create_events.sql

@@ -9,8 +9,8 @@ CREATE TABLE IF NOT EXISTS `lnxx_dev`.`events` (
   `create_time` DATETIME NULL COMMENT '创建时间',
   `update_time` DATETIME NULL COMMENT '更新时间',
   `is_deleted` INT NULL COMMENT '删除标记:0-未删除,1-已删除',
-  `remark` VARCHAR(255) NULL COMMENT '备注',
   `tenant_id` BIGINT NULL COMMENT '租户表主键id',
+  `remark` VARCHAR(255) NULL COMMENT '备注',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='事件表';
 
@@ -19,3 +19,6 @@ ALTER TABLE `lnxx_dev`.`events`
   MODIFY COLUMN `info` JSON NULL COMMENT '事件信息(json)',
   MODIFY COLUMN `is_handle` INT NULL COMMENT '是否处理:0-未处理,1-已处理',
   MODIFY COLUMN `tenant_id` BIGINT NULL COMMENT '租户表主键id';
+
+ALTER TABLE `lnxx_dev`.`events` 
+ADD COLUMN `linkage_push_wechat_service` int(0) NULL COMMENT '联动推送微信服务号:0-禁用,1-启用' AFTER `info`;

+ 10 - 2
db/db_sqls.py

@@ -64,6 +64,7 @@ SELECT
     ap.param            AS param,
     ap.create_time      AS create_time,
     ap.update_time      AS update_time,
+    ap.linkage_push_wechat_service  AS linkage_push_wechat_service,
 
     et.event_val        AS event_val,
     et.event_str        AS event_str,
@@ -76,7 +77,8 @@ SELECT
     atp.month_days      AS month_days,
     atp.weekdays        AS weekdays,
 
-    di.dev_name         AS dev_name
+    di.dev_name         AS dev_name,
+    di.tenant_id        AS tenant_id   -- 租户id
 
 FROM alarm_plan ap
 LEFT JOIN event_type et 
@@ -103,6 +105,7 @@ SELECT
     ap.param            AS param,
     ap.create_time      AS create_time,
     ap.update_time      AS update_time,
+    ap.linkage_push_wechat_service  AS linkage_push_wechat_service,
 
     et.event_val        AS event_val,
     et.event_str        AS event_str,
@@ -115,7 +118,8 @@ SELECT
     atp.month_days      AS month_days,
     atp.weekdays        AS weekdays,
 
-    di.dev_name         AS dev_name    -- 设备名称
+    di.dev_name         AS dev_name    -- 设备名称,
+    di.tenant_id        AS tenant_id   -- 租户id
 FROM alarm_plan ap
 LEFT JOIN event_type et 
        ON ap.event_val = et.event_val
@@ -138,9 +142,11 @@ INSERT INTO events (
     plan_uuid,
     event_type,
     info,
+    linkage_push_wechat_service,
     is_handle,
     create_time,
     is_deleted,
+    tenant_id,
     remark)
 VALUES (
     %(dev_id)s,
@@ -148,9 +154,11 @@ VALUES (
     %(plan_uuid)s,
     %(event_type)s,
     %(info)s,
+    %(linkage_push_wechat_service)s,
     %(is_handle)s,
     %(create_time)s,
     %(is_deleted)s,
+    %(tenant_id)s,
     %(remark)s
 );
 """

+ 2 - 0
mqtt/mqtt_send.py

@@ -60,6 +60,7 @@ def alarm_event(
         plan_uuid: str,
         event_type: str,
         info: dict,
+        linkage_action: dict,
         table: str):
     format_json = dict()
     format_json["dev_id"] = dev_id
@@ -68,6 +69,7 @@ def alarm_event(
     format_json["plan_uuid"] =plan_uuid
     format_json["event_type"] = event_type
     format_json["info"] = info
+    format_json["linkage_action"] = linkage_action
     format_json["table"] = table
     send_msg(TOPICS.las_alarm_event, format_json, 2)