darker
2025-02-21 debee9b5cae51f744937fc4f0ef4c25272886676
1. 添加错误文件的加载好保存,并提供ID查询功能
已修改2个文件
147 ■■■■■ 文件已修改
SourceCode/Bond/Servo/AlarmManager.cpp 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/AlarmManager.h 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}
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;
};