chenluhua1980
2026-01-21 bfffbdb8a6d7a3b4805c45583f8bf2101e7b2ad4
SourceCode/Bond/Servo/AlarmManager.h
@@ -1,162 +1,249 @@
#ifndef ALARM_MANAGER_H
#ifndef ALARM_MANAGER_H
#define ALARM_MANAGER_H
#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;
};
struct AlarmData {
    int nId;                       // 错误码
    int nSeverityLevel;            // 报警等级
    int nDeviceId;                 // 设备ID
    int nUnitId;                   // 单元ID
    std::string strDeviceName;     // 设备名称
    std::string strUnitName;       // 单元名称
    std::string strDescription;    // 描述
    std::string strStartTime;      // 开始时间
    std::string strEndTime;        // 结束时间
};
using AlarmInfoMap = std::unordered_map<int, AlarmInfo>;
using AlarmDataMap = std::unordered_map<int, AlarmData>;
class AlarmManager {
public:
    /**
     * 获取单例实例
     * @return AlarmManager实例的引用
     * 获取单例实例
     * @return AlarmManager实例的引用
     */
    static AlarmManager& getInstance();
    /**
     * 设置数据库连接
     * @param db 数据库连接的指针
     */
    void setDatabase(BL::Database* db);
    /**
     * 初始化报警表
     * @return 成功返回true,失败返回false
     * 初始化报警表
     * @return 成功返回true,失败返回false
     */
    bool initAlarmTable();
   /**
    * 销毁报警表
    * 销毁报警表
    */
    void termAlarmTable();
   /**
    * 销毁报警表
    * @return 成功返回true,失败返回false
    * 销毁报警表
    * @return 成功返回true,失败返回false
    */
    bool destroyAlarmTable();
    /**
     * 添加报警
     * @param id 报警ID
    * @param deviceName 设备名称
     * @param description 报警描述
     * @param startTime 报警开始时间
     * @param endTime 报警结束时间
     * @return 成功返回true,失败返回false
     */
    bool addAlarm(const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& endTime);
    * 插入模拟数据
    */
    void insertMockData();
    /**
     * 查询所有报警数据
     * @return 包含所有报警数据的二维字符串向量
     * 添加报警
     * @param alarmData 报警数据的结构体
     * @param alarmEventId 最近插入的 alarm_event_id
     * @return 成功返回true,失败返回false
     */
    std::vector<std::vector<std::string>> getAllAlarms();
    bool addAlarm(const AlarmData& alarmData, int& alarmEventId);
    /**
     * 根据报警ID查询报警
     * @param id 报警ID
     * @return 包含筛选后报警数据的二维字符串向量
     * 查询所有报警数据
     * @return 包含所有报警数据的结构体
     */
    std::vector<std::vector<std::string>> getAlarmsById(const std::string& id);
    std::vector<AlarmData> getAllAlarms();
    /**
     * 根据描述查询报警
     * @param description 报警描述的筛选条件
     * @return 包含筛选后报警数据的二维字符串向量
     * 根据报警ID查询报警
     * @param id 报警ID
     * @return 包含筛选后报警数据的结构体
     */
    std::vector<std::vector<std::string>> getAlarmsByDescription(const std::string& description);
    std::vector<AlarmData> getAlarmsById(const std::string& id);
    /**
     * 根据时间范围查询报警
     * @param startTime 起始时间
     * @param endTime 结束时间
     * @return 包含查询结果的二维字符串向量
     * 根据描述查询报警
     * @param description 报警描述的筛选条件
     * @return 包含筛选后报警数据的结构体
     */
    std::vector<std::vector<std::string>> getAlarmsByTimeRange(
        const std::string& startTime, const std::string& endTime);
    std::vector<AlarmData> getAlarmsByDescription(const std::string& description);
    /**
     * 根据时间范围查询报警
     * @param startTime 起始时间
     * @param endTime 结束时间
     * @return 包含查询结果的报警数据
     */
    std::vector<AlarmData> getAlarmsByTimeRange(const std::string& startTime, const std::string& endTime);
   /**
   * 根据ID和时间范围查询报警
    * @param id 报警ID
    * @param startTime 起始时间
    * @param endTime 结束时间
    * @return 包含查询结果的二维字符串向量
   * 根据ID和时间范围查询报警
    * @param id 报警ID
    * @param startTime 起始时间
    * @param endTime 结束时间
    * @return 包含查询结果的报警数据
    */
    std::vector<std::vector<std::string>> getAlarmsByIdAndTimeRange(
        const std::string& id, const std::string& startTime, const std::string& endTime);
    std::vector<AlarmData> getAlarmsByIdAndTimeRange(const std::string& id, const std::string& startTime, const std::string& endTime);
    /**
     * 获取报警数据
     * @param startPosition 起始位置
     * @param count 获取的记录数量
     * @return 包含报警数据的二维字符串向量
     * 获取报警数据
     * @param startPosition 起始位置
     * @param count 获取的记录数量
     * @return 包含查询结果的报警数据
     */
    std::vector<std::vector<std::string>> getAlarms(int startPosition, int count);
    /**
     * 获取筛选后的报警数据
    * @param id 报警ID的筛选条件
    * @param deviceName 设备名称的筛选条件
     * @param description 报警描述的筛选条件
     * @param startTime 起始时间筛选条件
     * @param endTime 结束时间筛选条件
     * @param pageNumber 页码
     * @param pageSize 每页的记录数
     * @return 包含筛选后报警数据的二维字符串向量
     */
    std::vector<std::vector<std::string>> getFilteredAlarms(
        const std::string& id,
        const std::string& deviceName,
        const std::string& description,
        const std::string& startTime,
        const std::string& endTime,
        int pageNumber,
        int pageSize);
    /**
     * 获取符合条件的报警总数
     * @param id 报警ID的筛选条件
    * @param deviceName 设备名称的筛选条件
     * @param description 报警描述的筛选条件
     * @param startTime 起始时间筛选条件
     * @param endTime 结束时间筛选条件
     * @return 符合条件的报警总数
     */
    int getTotalAlarmCount(
        const std::string& id,
        const std::string& deviceName,
        const std::string& description,
        const std::string& startTime,
        const std::string& endTime);
    std::vector<AlarmData> getAlarms(int startPosition, int count);
    std::vector<AlarmData> getActiveAlarms(int recentHours = 12);
   /**
    * 更新报警结束时间
    * @param id 报警ID
    * @param description 报警描述
    * @param startTime 报警开始时间
    * @param newEndTime 新的报警结束时间
    * @return 成功返回true,失败返回false
    * 筛选报警数据
    * @param keyword 关键字筛选条件
    * @param startTime 起始时间筛选条件
    * @param endTime 结束时间筛选条件
    * @param pageNumber 页码
    * @param pageSize 每页记录数
    * @return 包含筛选后报警数据的结构体
    */
    bool updateAlarmEndTime(const std::string& id, const std::string& deviceName, const std::string& description, const std::string& startTime, const std::string& newEndTime);
    std::vector<AlarmData> getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize);
    /**
     * 清理旧报警
     * @param daysToKeep 保留的天数
    * @param deviceName 设备名称
     * 获取符合条件的报警总数
     * @param keyword 关键字筛选条件
     * @param startTime 起始时间筛选条件
     * @param endTime 结束时间筛选条件
     * @return 符合条件的报警总数
     */
    void cleanOldAlarms(int daysToKeep = 30, const std::string& deviceName = "");
    int getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime);
   /**
    * 更新报警结束时间
    * @param id 报警ID
     * @param severityLevel 报警等级筛选条件
     * @param deviceId 设备ID
     * @param unitId 单元ID
    * @param description 报警描述
    * @param startTime 报警开始时间
    * @param newEndTime 新的报警结束时间
    * @return 成功返回true,失败返回false
    */
    bool updateAlarmEndTime(
        const std::string& id,
        const std::string& severityLevel,
        const std::string& deviceId,
        const std::string& unitId,
        const std::string& description,
        const std::string& startTime,
        const std::string& newEndTime);
    /**
     * 清理旧报警
     * @param daysToKeep 保留的天数
    * @param deviceId 设备ID
     * @param unitId 单元ID
     */
    void cleanOldAlarms(int daysToKeep = 30, const std::string& deviceId = "", const std::string& unitId = "");
    /**
    * 通过设备ID获取设备名称
    * @param deviceId 设备ID
    * @return 成功返回设备名称,失败返回空
    */
    std::string getDeviceNameById(int deviceId);
    /**
    * 通过设备ID和单元ID获取单元名称
    * @param deviceId 设备ID
    * @param unitId 单元ID
    * @return 成功返回单元名称,失败返回空
    */
    std::string getUnitNameById(int deviceId, int unitId);
    /**
    * 获取最近插入的 alarm_event_id
    * @return 失败返回-1,成功返回最近插入的 alarm_event_id
    */
    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 nDeviceId, int nUnitId, const std::string& endTime);
   /**
    * 读取报警文件
    * @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();
    // 禁止拷贝和赋值
    // 禁止拷贝和赋值
    AlarmManager(const AlarmManager&) = delete;
    AlarmManager& operator=(const AlarmManager&) = delete;
    BL::Database* m_pDB;
    AlarmInfoMap m_mapAlarm;
    AlarmDataMap m_mapCache;
    static std::mutex m_mutex;
};