#ifndef __THREADWRITEDBMANAGER_H__ #define __THREADWRITEDBMANAGER_H__ /** * @file ThreadWriteDBManager.h * @author your name (you@domain.com) * @brief * @version 0.1 * @date 2025-07-19 * * @copyright Copyright (c) 2025 * * 处理报警信息 */ #include "FromWebAPI.h" #include "GlobalVariable.h" #include "spdlog/spdlog.h" #include #include #include #include /** 写数据库线程,服务写入数据库都由这里写入 1、报警信息列表分为两种,一种是静音、过载、反相、噪音等单个录音通道的报警信息,一种是一致性报警需要 两个通道的关联的报警信息,这两种分别写入数据库,不相关联。 2、录音文件也会从这里写数据库 */ #define WriteDB ThreadWriteDBManager::instance() class ThreadWriteDBManager { ThreadWriteDBManager() = default; ThreadWriteDBManager(const ThreadWriteDBManager&) = delete; ThreadWriteDBManager& operator=(const ThreadWriteDBManager&) = delete; public: ~ThreadWriteDBManager(); static ThreadWriteDBManager& instance() { static ThreadWriteDBManager instance; return instance; } /* 线程工作函数 */ void thread_task(); /* 停止线程 */ void thread_stop(); void thread_stopBlock(); /* 获取线程状态 */ EThreadState getThreadState() const { return m_threadState; } /* 添加报警内容 */ void addAlarmInfo(const AlarmInfo_t& alarmInfo); void addAlarmInfo(const std::list& listAlarm); /* 添加一致性报警信息,键为主通道信息,值为次通道信息 */ void addAlarmInfo(const AlarmInfo_t& mainAlarm, const AlarmInfo_t& subAlarm); /* 录音文件写入数据库,isNewFile = true 是插入数据库,= false是更新数据库 */ void addRecordFileInfo(std::list& listRecordFile, bool isNewFile); private: /* 线程工作函数 */ void task(); /* 初始化数据 */ bool initData(); /* 清理数据 */ void clearData(); /* 普通报警写入数据库 */ void alarmInfoToDB(); /* 一致性报警写入数据库 */ void consistencyAlarmInfoToDB(); /* 录音文件写数据库 */ void recordFileInfoToDB(); /* 处理文件路径,去掉前面的本地路径,只保留服务自己创建的文件夹及之后的路径 */ inline bool processFilePath(QString& strFilePath); private: std::shared_ptr m_logger = nullptr; /* 线程基础信息 */ std::atomic_bool m_isRunning = false; /* 线程运行标志位 */ std::atomic_bool m_isStop = false; /* 线程停止标志位 */ EThreadState m_threadState = EThreadState::State_None; /* 线程状态 */ FromWebAPI m_fromWebAPI; QString m_strRootPath; /* 本地存储的根目录,不带有服务创建的文件夹 */ /* ---------------------------- 报警信息 ---------------------------- */ /* 存储一般的报警信息 */ std::mutex m_mutexListAlarm; /* 报警信息列表的互斥锁 */ std::list m_listAlarm; /* 报警信息列表 */ /* 存储一致性报警信息 */ std::mutex m_mutexListAlarmConsistency; /* 一致性报警信息列表的互斥锁 */ /* 一致性报警信息列表,键是主通道信息,值是次通道信息 */ std::list> m_listAlarmConsistency; /* ---------------------------- 报警信息 ---------------------------- */ /* 存储录音文件信息 */ std::mutex m_mutexListRecordFile; /* 录音文件信息列表的互斥锁 */ std::list m_listRecordFile; std::atomic_bool m_isRecordFileInsert = false; /* 录音文件信息是否是插入数据库 */ }; #endif // __THREADWRITEDBMANAGER_H__