From debee9b5cae51f744937fc4f0ef4c25272886676 Mon Sep 17 00:00:00 2001
From: darker <mr.darker@163.com>
Date: 星期五, 21 二月 2025 11:13:06 +0800
Subject: [PATCH] 1. 添加错误文件的加载好保存,并提供ID查询功能

---
 SourceCode/Bond/Servo/AlarmManager.cpp |  105 +++++++++++++++++++++++++++++++++++
 SourceCode/Bond/Servo/AlarmManager.h   |   42 ++++++++++++++
 2 files changed, 147 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/AlarmManager.cpp b/SourceCode/Bond/Servo/AlarmManager.cpp
index 7864235..18953a6 100644
--- a/SourceCode/Bond/Servo/AlarmManager.cpp
+++ b/SourceCode/Bond/Servo/AlarmManager.cpp
@@ -1,6 +1,7 @@
 #include "stdafx.h"
 #include "AlarmManager.h"
 #include <sstream>
+#include <fstream>
 #include <iostream>
 #include <stdexcept>
 #include <ctime>
@@ -287,3 +288,107 @@
     }
     m_pDB->executeQuery(query.str());
 }
+
+// 读取报警文件
+bool AlarmManager::readAlarmFile(const std::string& filename) {
+    std::ifstream file(filename);
+    std::string line;
+    bool first_line = true;
+
+    if (!file.is_open()) {
+        std::cerr << "Error opening file!" << std::endl;
+        return false;
+    }
+
+    while (std::getline(file, line)) {
+        if (first_line) {
+            first_line = false;
+            continue;
+        }
+
+        std::stringstream ss(line);
+        std::string cell;
+        AlarmInfo alarm;
+
+        std::getline(ss, cell, ',');
+        std::getline(ss, alarm.strUnitID, ',');
+        std::getline(ss, alarm.strUnitNo, ',');
+        std::getline(ss, cell, ',');
+        alarm.nAlarmLevel = std::stoi(cell);
+        std::getline(ss, cell, ',');
+        alarm.nAlarmCode = std::stoi(cell);
+        std::getline(ss, cell, ',');
+        alarm.nAlarmID = std::stoi(cell);
+        std::getline(ss, alarm.strAlarmText, ',');
+        std::getline(ss, alarm.strDescription, ',');
+
+        if (m_mapAlarm.find(alarm.nAlarmID) == m_mapAlarm.end()) {
+            m_mapAlarm[alarm.nAlarmID] = alarm;
+        }
+        else {
+            std::cerr << "Duplicate AlarmID: " << alarm.nAlarmID << std::endl;
+        }
+    }
+
+    file.close();
+    return true;
+}
+
+// 将报警数据保存到文件
+bool AlarmManager::saveAlarmFile(const std::string& filename) {
+    std::ofstream file(filename);
+
+    if (!file.is_open()) {
+        std::cerr << "打开文件写入失败!" << std::endl;
+        return false;
+    }
+
+    // 写入标题行
+    file << "No,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description\n";
+
+    // 写入报警数据
+    int nIndex = 1;
+    for (const auto& pair : m_mapAlarm) {
+        const AlarmInfo& alarm = pair.second;
+        file << nIndex++ << ","
+            << alarm.strUnitID << ","
+            << alarm.strUnitNo << ","
+            << alarm.nAlarmLevel << ","
+            << alarm.nAlarmCode << ","
+            << alarm.nAlarmID << ","
+            << alarm.strAlarmText << ","
+            << alarm.strDescription << "\n";
+    }
+
+    file.close();
+    return true;
+}
+
+// 通过 AlarmID 查询对应的报警信息
+const AlarmInfo* AlarmManager::getAlarmInfoByID(int nAlarmID) const {
+    auto it = m_mapAlarm.find(nAlarmID);
+    if (it != m_mapAlarm.end()) {
+        return &(it->second);
+    }
+    else {
+        std::cerr << "未找到 AlarmID: " << nAlarmID << std::endl;
+        return nullptr;
+    }
+}
+
+// 通过多个 AlarmID 查询对应的报警信息
+std::vector<AlarmInfo> AlarmManager::getAlarmsInfoByIDs(const std::vector<int>& alarmIDs) const {
+    std::vector<AlarmInfo> alarms;
+
+    for (int alarmID : alarmIDs) {
+        auto it = m_mapAlarm.find(alarmID);
+        if (it != m_mapAlarm.end()) {
+            alarms.push_back(it->second);
+        }
+        else {
+            std::cerr << "未找到 AlarmID: " << alarmID << std::endl;
+        }
+    }
+
+    return alarms;
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/AlarmManager.h b/SourceCode/Bond/Servo/AlarmManager.h
index 28bea98..71cac72 100644
--- a/SourceCode/Bond/Servo/AlarmManager.h
+++ b/SourceCode/Bond/Servo/AlarmManager.h
@@ -4,7 +4,20 @@
 #include <string>
 #include <vector>
 #include <mutex>
+#include <unordered_map>
 #include "Database.h"
+
+struct AlarmInfo {
+    std::string strUnitID;
+    std::string strUnitNo;
+    int nAlarmLevel;
+    int nAlarmCode;
+    int nAlarmID;
+    std::string strAlarmText;
+    std::string strDescription;
+};
+
+using AlarmMap = std::unordered_map<int, AlarmInfo>;
 
 class AlarmManager {
 public:
@@ -148,6 +161,34 @@
      */
     void cleanOldAlarms(int daysToKeep = 30, const std::string& deviceName = "");
 
+	/**
+	 * 读取报警文件
+	 * @param filename 文件名
+	 * @return 成功返回true,失败返回false
+	 */
+    bool readAlarmFile(const std::string& filename);
+
+    /**
+     * 保存报警文件
+     * @param filename 文件名
+     * @return 成功返回true,失败返回false
+     */
+    bool saveAlarmFile(const std::string& filename);
+
+	/**
+	 * 通过报警ID查询报警信息
+	 * @param nAlarmID 报警ID
+	 * @return 报警信息的指针
+	 */
+    const AlarmInfo* getAlarmInfoByID(int nAlarmID) const;
+
+    /**
+    * 通过多个报警ID查询对应的报警信息
+    * @param alarmIDs 多个报警ID
+	* @return 返回多个报警信息
+    */
+    std::vector<AlarmInfo> getAlarmsInfoByIDs(const std::vector<int>& alarmIDs) const;
+
 private:
     AlarmManager();
     ~AlarmManager();
@@ -157,6 +198,7 @@
     AlarmManager& operator=(const AlarmManager&) = delete;
 
     BL::Database* m_pDB;
+    AlarmMap m_mapAlarm;
     static std::mutex m_mutex;
 };
 

--
Gitblit v1.9.3