From f0e9c7745f0f01e93b00306c2ba64b0586e70b9d Mon Sep 17 00:00:00 2001
From: Darker <mr.darker@163.com>
Date: 星期二, 04 三月 2025 10:56:41 +0800
Subject: [PATCH] 1. 添加通过 alarm_event_id 解除报警(更新结束时间) 2. 通过多个属性查找并解除报警(更新结束时间)

---
 SourceCode/Bond/Servo/AlarmManager.cpp |   61 ++++++++++++++++++++++++++++++
 SourceCode/Bond/Servo/AlarmManager.h   |   20 ++++++++++
 2 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/AlarmManager.cpp b/SourceCode/Bond/Servo/AlarmManager.cpp
index 73ce376..74b1006 100644
--- a/SourceCode/Bond/Servo/AlarmManager.cpp
+++ b/SourceCode/Bond/Servo/AlarmManager.cpp
@@ -694,6 +694,67 @@
     return lastInsertId;
 }
 
+// 通过 alarm_event_id 解除报警(更新结束时间)
+bool AlarmManager::clearAlarmByEventId(int alarmEventId, const std::string& endTime) {
+    if (!m_pDB) {
+        return false;
+    }
+
+    bool result = true;
+    auto it = m_mapCache.find(alarmEventId);
+    if (it != m_mapCache.end()) {
+        std::lock_guard<std::mutex> lock(m_mutex);
+
+        std::ostringstream query;
+        query << "UPDATE alarms SET end_time = '" << endTime << "' WHERE alarm_event_id = " << alarmEventId << ";";
+        bool result = m_pDB->executeQuery(query.str());
+        if (result) {
+            m_mapCache.erase(it);
+        }
+    }
+
+    return result;
+}
+
+// 通过多个属性查找并解除报警(更新结束时间)
+bool AlarmManager::clearAlarmByAttributes(int nId, int nSeverityLevel, int nDeviceId, int nUnitId, const std::string& strDescription, const std::string& endTime) {
+    if (!m_pDB) {
+        return false;
+    }
+
+    std::lock_guard<std::mutex> lock(m_mutex);
+
+    // 先在缓存中查找匹配的 alarm_event_id
+    int alarmEventId = -1;
+    for (AlarmDataMap::const_iterator it = m_mapCache.begin(); it != m_mapCache.end(); ++it) {
+        const AlarmData& alarm = it->second;
+        if (alarm.nId == nId &&
+            alarm.nSeverityLevel == nSeverityLevel &&
+            alarm.nDeviceId == nDeviceId &&
+            alarm.nUnitId == nUnitId &&
+            alarm.strDescription == strDescription) {
+
+            alarmEventId = it->first;
+            break;
+        }
+    }
+
+    // 如果没找到匹配的记录,则直接返回 false
+    if (alarmEventId == -1) {
+        return false;
+    }
+
+    // 构建 SQL 语句,使用找到的 alarm_event_id 来更新结束时间
+    std::ostringstream query;
+    query << "UPDATE alarms SET end_time = '" << endTime << "' WHERE alarm_event_id = " << alarmEventId << ";";
+    bool result = m_pDB->executeQuery(query.str());
+    if (result) {
+        m_mapCache.erase(alarmEventId);
+    }
+
+    return result;
+}
+
 // 读取报警文件
 bool AlarmManager::readAlarmFile(const std::string& filename) {
     std::ifstream file(filename);
diff --git a/SourceCode/Bond/Servo/AlarmManager.h b/SourceCode/Bond/Servo/AlarmManager.h
index c046c93..f99aafe 100644
--- a/SourceCode/Bond/Servo/AlarmManager.h
+++ b/SourceCode/Bond/Servo/AlarmManager.h
@@ -214,6 +214,26 @@
     */
     int getLastInsertId();
 
+    /**
+    * 通过事件id解除报警(更新结束时间)
+    * @param alarmEventId 事件ID
+    * @param endTime 结束时间
+    * @return 成功返回true,失败返回false
+    */
+    bool clearAlarmByEventId(int alarmEventId, const std::string& endTime);
+
+    /**
+    * 通过多个属性查找并解除报警(更新结束时间)
+    * @param nId 报警ID
+    * @param nSeverityLevel 报警等级
+    * @param nDeviceId 设备ID
+    * @param nUnitId 单元ID
+    * @param strDescription 描述
+    * @param endTime 结束时间
+    * @return 成功返回true,失败返回false
+    */
+    bool clearAlarmByAttributes(int nId, int nSeverityLevel, int nDeviceId, int nUnitId, const std::string& strDescription, const std::string& endTime);
+
 	/**
 	 * 读取报警文件
 	 * @param filename 文件名

--
Gitblit v1.9.3