FuncOnAndOffJob.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #ifndef FUNCONANDOFFJOB_H
  2. #define FUNCONANDOFFJOB_H
  3. #include "FuncBase.h"
  4. /**
  5. * @brief 在岗离岗检测
  6. 1、需要从“tChannel”表中获取在岗离岗的检测规则
  7. 2、理论上一个频率只有一个直播间,直播间内只要有人,且这个人是可以被人脸算法识别到的人,就是在岗
  8. *
  9. */
  10. /**
  11. * @brief 检测信息
  12. *
  13. */
  14. struct DecCondition
  15. {
  16. int ChannelID; /* 通道ID */
  17. std::string strChannelName; /* 通道名称 */
  18. int leaveTimeMaxNum; /* 离岗时间最大个数,给一个限制 */
  19. int leaveNumOnTime; /* 一定时间内的离岗次数 */
  20. int leaveOneTime; /* 单次离开报警时间,设置为0是不启用 */
  21. DecCondition();
  22. DecCondition(const DecCondition& other);
  23. DecCondition& operator=(const DecCondition& other);
  24. };
  25. /**
  26. * @brief 房间在岗信息
  27. *
  28. */
  29. struct RoomOnWorkInfo
  30. {
  31. bool bOnWork = false; /* 是否在岗 */
  32. int PKID; /* 主键ID,主要用来判断是否已经写入数据库 */
  33. int ChannelID; /* 通道ID */
  34. int RoomID; /* 房间ID */
  35. int CameraID; /* 摄像机ID */
  36. Enum_RoomType RoomType; /* 房间类型 */
  37. std::string strRoomName; /* 房间名称 */
  38. QDateTime StartTime; /* 开始时间 */
  39. QDateTime EndTime; /* 结束时间 */
  40. std::string strImagePath; /* 图片路径 */
  41. std::list<QDateTime> listLeaveTime; /* 离岗时间 */
  42. std::list<PersonInfo> listPersonInfo; /* 人员信息 */
  43. RoomOnWorkInfo();
  44. RoomOnWorkInfo& operator=(const RoomOnWorkInfo& other);
  45. RoomOnWorkInfo(const RoomOnWorkInfo& other);
  46. void clear();
  47. /* 添加人员信息,进行查重 */
  48. void addPersonInfo(const std::list<PersonInfo>& vecInfo);
  49. /* 更新在岗时间 */
  50. void updateOnWorkTime(const QDateTime& time);
  51. /* 获取人脸ID字符串 */
  52. std::string getFaceIDListString();
  53. /* 获取人脸名称字符串 */
  54. std::string getFaceNameListString();
  55. /* 获取离岗时间字符串 */
  56. std::string getLeaveTimeString();
  57. /* 获取人员最后在岗时间字符串 */
  58. std::string getLastOnWorkTimeString();
  59. /* 添加一次离岗时间 */
  60. void addOneLeaveTime(const QDateTime& time, int maxLeaveTime);
  61. /* 对离岗时间进行查重 */
  62. bool isLeaveTimeExist(const QDateTime& time);
  63. };
  64. class FuncOnAndOffJob : public FuncBase
  65. {
  66. public:
  67. FuncOnAndOffJob();
  68. ~FuncOnAndOffJob();
  69. protected:
  70. void task() override;
  71. private:
  72. /* 获取当前频率信息 */
  73. bool getCurrentFrequencyInfo(const int ChannelID, DecCondition& info);
  74. /* 人员在岗情况 */
  75. void onWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo);
  76. /* 人员离岗情况 */
  77. void offWorkProcess(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo);
  78. /* 删除离岗人员和未知人员信息 */
  79. void deleteNoWorkPerson(std::list<PersonInfo>& listPersonInfo);
  80. /* 获取当前直播间的摄像机名称列表 */
  81. std::list<std::string> getCameraNameList(const std::map<int, std::list<std::string>>& mapCameraAction);
  82. /* 创建报警记录 */
  83. // void createAlarmInfo(RoomOnWorkInfo* pRoomOnWorkInfo, std::pair<const int, RoomCamActInfo>& roomInfo, std::string actionDes, AlarmInfo& alarmInfo);
  84. private:
  85. ListAlarmInfo* m_pListAlarm = nullptr; /* 报警信息 */
  86. // std::map<int, ListAlarmInfo*> m_mapRoomPersonCount; /* 人员计数返回的信息,int是房间ID号 */
  87. // std::map<int, ListAlarmInfo*> m_mapRoomFaceInfo; /* 人脸识别返回的信息,int是房间ID号 */
  88. std::map<int, RoomOnWorkInfo*> m_mapRoomOnWorkInfo; /* 房间在岗信息 */
  89. DecCondition m_nowChnDetecRule; /* 当前频率的在岗离岗的检测规则 */
  90. RoomOnWorkInfo m_nowRoomOnWorkInfo; /* 当前房间在岗信息 */
  91. std::string m_strBaseInfo; /* 基础信息,主要是频率ID和房间ID */
  92. QDateTime m_curTime; /* 当前时间 */
  93. };
  94. #endif /* FUNCONANDOFFJOB_H */