ThreadWriteDBManager.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #ifndef __THREADWRITEDBMANAGER_H__
  2. #define __THREADWRITEDBMANAGER_H__
  3. /**
  4. * @file ThreadWriteDBManager.h
  5. * @author your name (you@domain.com)
  6. * @brief
  7. * @version 0.1
  8. * @date 2025-07-19
  9. *
  10. * @copyright Copyright (c) 2025
  11. *
  12. * 处理报警信息
  13. */
  14. #include "FromWebAPI.h"
  15. #include "GlobalVariable.h"
  16. #include "SystemConfigStruct.h"
  17. #include "spdlog/spdlog.h"
  18. #include <list>
  19. #include <atomic>
  20. #include <memory>
  21. #include <mutex>
  22. #include <qdatetime.h>
  23. /**
  24. 写数据库线程,服务写入数据库都由这里写入
  25. 1、报警信息列表分为两种,一种是静音、过载、反相、噪音等单个录音通道的报警信息,一种是一致性报警需要
  26. 两个通道的关联的报警信息,这两种分别写入数据库,不相关联。
  27. 2、录音文件也会从这里写数据库
  28. 3、这个线程回定时删除数据库超时的录音和报警记录
  29. 4、这个线程会定时删除超过时长的报警文件和录音文件
  30. */
  31. #define WriteDB ThreadWriteDBManager::instance()
  32. class ThreadWriteDBManager
  33. {
  34. ThreadWriteDBManager() = default;
  35. ThreadWriteDBManager(const ThreadWriteDBManager&) = delete;
  36. ThreadWriteDBManager& operator=(const ThreadWriteDBManager&) = delete;
  37. public:
  38. ~ThreadWriteDBManager();
  39. static ThreadWriteDBManager& instance()
  40. {
  41. static ThreadWriteDBManager instance;
  42. return instance;
  43. }
  44. /* 线程工作函数 */
  45. void thread_task();
  46. /* 停止线程 */
  47. void thread_stop();
  48. void thread_stopBlock();
  49. /* 获取线程状态 */
  50. EThreadState getThreadState() const { return m_threadState; }
  51. /* 添加报警内容 */
  52. void addAlarmInfo(const AlarmInfo_t& alarmInfo);
  53. void addAlarmInfo(const std::list<AlarmInfo_t>& listAlarm);
  54. /* 添加一致性报警信息,键为主通道信息,值为次通道信息 */
  55. void addAlarmInfo(const AlarmInfo_t& mainAlarm, const AlarmInfo_t& subAlarm);
  56. /* 录音文件写入数据库,isNewFile = true 是插入数据库,= false是更新数据库 */
  57. void addRecordFileInfo(std::list<RecordFileInfo_t>& listRecordFile, bool isNewFile);
  58. private:
  59. /* 线程工作函数 */
  60. void task();
  61. /* 初始化数据 */
  62. bool initData();
  63. /* 清理数据 */
  64. void clearData();
  65. /* 普通报警写入数据库 */
  66. void alarmInfoToDB();
  67. /* 一致性报警写入数据库 */
  68. void consistencyAlarmInfoToDB();
  69. /* 录音文件写数据库 */
  70. void recordFileInfoToDB();
  71. /* 处理文件路径,去掉前面的本地路径,只保留服务自己创建的文件夹及之后的路径 */
  72. inline bool processFilePath(QString& strFilePath);
  73. /* 定时删除报警文件和录音文件,文件路径从数据库中获取,十分钟检查一次
  74. 注意: 这个函数需要在删除数据库记录之前执行,删除文件路径是从数据库中读取的 */
  75. void deleteTimeoutFile();
  76. /* 删除录音文件 */
  77. void deleteTimeoutRecordFile();
  78. /* 删除报警文件 */
  79. void deleteTimeoutAlarmFile();
  80. /* 删除超过时长的数据库记录信息,10分钟检查一次 */
  81. void deleteTimeoutRecordInfo();
  82. private:
  83. std::shared_ptr<spdlog::logger> m_logger = nullptr;
  84. /* 线程基础信息 */
  85. std::atomic_bool m_isRunning = false; /* 线程运行标志位 */
  86. std::atomic_bool m_isStop = false; /* 线程停止标志位 */
  87. EThreadState m_threadState = EThreadState::State_None; /* 线程状态 */
  88. FromWebAPI m_fromWebAPI;
  89. QString m_strRootPath; /* 本地存储的根目录,不带有服务创建的文件夹 */
  90. DatabaseConfig_t m_dbConfig; /* 数据库配置 */
  91. QDateTime m_currentTime; /* 当前时间,给需要使用当前时间的函数使用 */
  92. /* ---------------------------- 报警信息 ---------------------------- */
  93. /* 存储一般的报警信息 */
  94. std::mutex m_mutexListAlarm; /* 报警信息列表的互斥锁 */
  95. std::list<AlarmInfo_t> m_listAlarm; /* 报警信息列表 */
  96. /* 存储一致性报警信息 */
  97. std::mutex m_mutexListAlarmConsistency; /* 一致性报警信息列表的互斥锁 */
  98. /* 一致性报警信息列表,键是主通道信息,值是次通道信息 */
  99. std::list<std::pair<AlarmInfo_t, AlarmInfo_t>> m_listAlarmConsistency;
  100. /* ---------------------------- 录音文件信息 ---------------------------- */
  101. /* 存储录音文件信息 */
  102. std::mutex m_mutexListRecordFile; /* 录音文件信息列表的互斥锁 */
  103. std::list<RecordFileInfo_t> m_listRecordFile;
  104. std::atomic_bool m_isRecordFileInsert = false; /* 录音文件信息是否是插入数据库 */
  105. /* ---------------------------- 数据库日志 ---------------------------- */
  106. QDateTime m_lastProcessLogTime; /* 上次处理日志的时间 */
  107. QDateTime m_lastDeleteFileTime; /* 上次删除报警文件的时间 */
  108. };
  109. #endif // __THREADWRITEDBMANAGER_H__