Procházet zdrojové kódy

V0.3.8
1、修复了设置动态库对比项下拉框显示的问题
2、新增了显示对比项详情的弹窗
3、添加了检测检测时段功能

Apple před 2 dny
rodič
revize
e56165f30c
28 změnil soubory, kde provedl 840 přidání a 430 odebrání
  1. 37 34
      JSON/音量包信息.json
  2. 1 29
      SQL/ACAServer.sql
  3. 3 0
      SQL/ACASetting.sqlbook
  4. 2 2
      Server/GlobalInfo/GlobalInfo.h
  5. 88 0
      Server/ThreadCalculate/CompareItemThread.cpp
  6. 15 12
      Server/ThreadCalculate/CompareItemThread.h
  7. 1 1
      Server/ThreadManager/ThreadAlarmManager.cpp
  8. 8 4
      Server/ThreadManager/ThreadAlarmManager.h
  9. 76 22
      Server/ThreadManager/ThreadCompareItemManager.cpp
  10. 31 6
      Server/ThreadManager/ThreadCompareItemManager.h
  11. 138 0
      SettingLibrary/Modules/Basic/compareitemdetailwidget.cpp
  12. 34 0
      SettingLibrary/Modules/Basic/compareitemdetailwidget.h
  13. 114 0
      SettingLibrary/Modules/Basic/compareitemdetailwidget.ui
  14. 3 2
      SettingLibrary/Modules/Basic/compareitemdialog.h
  15. 47 7
      SettingLibrary/Modules/Basic/compareitemlistdialog.cpp
  16. 5 0
      SettingLibrary/Modules/Basic/compareitemlistdialog.h
  17. 0 19
      SettingLibrary/Modules/Basic/compareitmedetaildialog.cpp
  18. 0 22
      SettingLibrary/Modules/Basic/compareitmedetaildialog.h
  19. 0 231
      SettingLibrary/Modules/Basic/compareitmedetaildialog.ui
  20. 4 0
      SettingLibrary/Modules/Basic/singlecompareroadwidget.cpp
  21. 3 3
      SettingLibrary/Modules/CheckPeriod/addperioddialog.cpp
  22. 39 24
      SettingLibrary/Modules/CheckPeriod/checkperiodwidget.ui
  23. 1 0
      SettingLibrary/Resources/QSS.qrc
  24. 4 1
      SettingLibrary/Resources/qss/white/checkperiodwidget.qss
  25. 167 0
      SettingLibrary/Resources/qss/white/compareitemdetailwidget.qss
  26. 1 1
      SettingLibrary/Resources/qss/white/compareitemlistwidget.qss
  27. 4 4
      common/GlobalInfo/GlobalVariable.h
  28. 14 6
      common/Network/FromWebAPI.cpp

+ 37 - 34
JSON/音量包信息.json

@@ -1,41 +1,44 @@
 {
     "compareItem_id": 1,
-    "compareItem_name": "音量包信息1号",
-    "notConsistencyWarning" : true,
-    "clientAlarm" : true,
-    "dateTime" : "2025-07-01 12:00:00",
-    "volumes" : [
+    "compareItem_name": "one",
+    "date_time": "2025-07-23 10:13:43",
+    "is_client_alarm": false,
+    "road_volumes": [
         {
-            "recordRoad_id" : 1,
-            "recordRoad_name": "录音通道1号",
-            "recordRoad_num": 1,
-            "similarity" : 0.99,
-            "isConsistency" : false,
-            "isSilence" : true,
-            "isOverload" : true,
-            "isReversed" : false,
-            "isNoise" : false,
-            "isNoiseWaring" : true,
-            "leftDBRealTime" : 85,
-            "rightDBRealTime" : 90,
-            "leftDBArray" : [80, 82, 84, 85, 86],
-            "rightDBArray" : [88, 89, 90, 91, 92]
+            "is_consistency": true,
+            "is_noise": false,
+            "is_noise_warning": false,
+            "is_not_consistency_warning": false,
+            "is_overload": false,
+            "is_reversed": false,
+            "is_silence": false,
+            "item_road_name": "主通道",
+            "item_road_num": 1,
+            "left_db_array": [-90,-90,-90,-90,-90,-90,-90,65446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+            "left_real_time_db": 0,
+            "right_db_array": [-90,-90,-90,-90,-90,-90,-90,65446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+            "right_real_time_db": 0,
+            "similarity": 0.0,
+            "soundCard_id": "AudioPCI",
+            "soundCard_road_id": 0
         },
         {
-            "recordRoad_id" : 2,
-            "recordRoad_name": "录音通道2号",
-            "recordRoad_num": 2,
-            "similarity" : 0.99,
-            "isConsistency" : true,
-            "isSilence" : false,
-            "isOverload" : false,
-            "isReversed" : false,
-            "isNoise" : false,
-            "isNoiseWaring" : false,
-            "leftDBRealTime" : 75,
-            "rightDBRealTime" : 78,
-            "leftDBArray" : [70, 72, 74, 75, 76],
-            "rightDBArray" : [76, 77, 78, 79, 80]
+            "is_consistency": true,
+            "is_noise": false,
+            "is_noise_warning": false,
+            "is_not_consistency_warning": false,
+            "is_overload": false,
+            "is_reversed": false,
+            "is_silence": false,
+            "item_road_name": "第2通道",
+            "item_road_num": 2,
+            "left_db_array": [-90,-90,-90,-90,-90,-90,-90,65446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+            "left_real_time_db": 0,
+            "right_db_array": [-90,-90,-90,-90,-90,-90,-90,65446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
+            "right_real_time_db": 0,
+            "similarity": 0.0,
+            "soundCard_id": "AudioPCI",
+            "soundCard_road_id": 0
         }
     ]
-}
+}

+ 1 - 29
SQL/ACAServer.sql

@@ -1,4 +1,4 @@
--- Active: 1751960213665@@192.1.2.61@5236@EQM_CESHI
+-- Active: 1752718919967@@192.1.2.61@5236@EQM_CESHI
 
 
 #对比项
@@ -33,34 +33,6 @@ FROM tACAAlarmInfo;
 DELETE FROM tACAAlarmInfo;
 
 
-
-#记录日志
-SELECT *
-FROM tACARecordLog;
-
-#报警信息
-SELECT *
-FROM tACAAlarmLog;
-
-#报警文件
-SELECT *
-FROM tACAAlarmFile;
-
-SELECT *
-FROM TEQMSETUP;
-
-SELECT *
-FROM tCheckSystemInfo;
-
-
-#报警信息
-SELECT *
-FROM tACAAlarmLog
-
-#报警文件信息
-SELECT *
-FROM tACAAlarmFile;
-
 #插入报警信息
 INSERT INTO tACAAlarmInfo (
     ItemID, ItemName, AlarmType, SoundCardNum, SoundCardName, SoundCardRoadNum, CompareRoadNum, CompareRoadName, CompareRoadType, 

+ 3 - 0
SQL/ACASetting.sqlbook

@@ -161,6 +161,8 @@ CREATE TABLE tACAAlarmInfo
     AlarmDuration INT, -- 报警持续时间(秒数)
     AlarmFilePath VARCHAR(256), -- 报警录音文件路径
     FileAlarmStartPos int -- 在报警录音文件中报警开始的时间
+    MainRoadPKID INT, -- 主通道的PKID
+    FOREIGN KEY (ItemID) REFERENCES tACACompareItems(ItemID)
 )
 
 -- 表注释
@@ -181,6 +183,7 @@ COMMENT ON COLUMN tACAAlarmInfo.AlarmEndTime IS '报警结束时间 (格式:YY
 COMMENT ON COLUMN tACAAlarmInfo.AlarmDuration IS '报警持续时间(秒数)';
 COMMENT ON COLUMN tACAAlarmInfo.AlarmFilePath IS '报警录音文件路径';
 COMMENT ON COLUMN tACAAlarmInfo.FileAlarmStartPos IS '在报警录音文件中报警开始的时间';
+COMMENT ON COLUMN tACAAlarmInfo.MainRoadPKID IS '对比项主通道报警信息的PKID';
 -- 创建索引
 CREATE INDEX idx_tACAAlarmInfo_ItemID ON tACAAlarmInfo (ItemID);
 CREATE INDEX idx_tACAAlarmInfo_AlarmType ON tACAAlarmInfo (AlarmType);

+ 2 - 2
Server/GlobalInfo/GlobalInfo.h

@@ -56,7 +56,7 @@ public:
     /* 获取WebAPI信息 */
     QString webAPIUrl() const {return m_webAPIUrl;}
     QString webAPIID() const {return m_webAPIID;}
-    QString appType() const {return m_appType;}
+    QString webApiAppType() const {return m_webAPIAppType;}
     void setWebAPIInfo(const QString& url, const QString& id);
 
 public:
@@ -146,7 +146,7 @@ private:
     /* WebAPI地址 */
     QString m_webAPIUrl;               /* WebAPI地址 */
     QString m_webAPIID;                /* WebAPI ID */
-    const QString m_appType = "ACAWatch"; /* 应用类型 */
+    const QString m_webAPIAppType = "ACAWatch"; /* 应用类型 */
     QString m_mqttPublishTopic = "LH_ACAServer"; /* MQTT发布主题 */
     QString m_pubTopicDB = "LH_ACAServer/DB"; /* 音量包发布主题 */
 

+ 88 - 0
Server/ThreadCalculate/CompareItemThread.cpp

@@ -9,6 +9,8 @@
 #include "ThreadPool.h"
 #include "commonDefine.h"
 #include "ThreadAlarmManager.h"
+#include "spdlog.h"
+#include <qdatetime.h>
 
 
 
@@ -104,6 +106,19 @@ void CompareItemThread::stopThreadBlock()
     }
 }
 
+/* 设置检测时段 */
+void CompareItemThread::setDetectPeriod(const DetectPeriodConfig_t& detectPeriod)
+{
+    std::lock_guard<std::mutex> lock(m_mutexDetectPeriod);
+    if(detectPeriod.nID != m_detectPeriod.nID)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "{} 设置检测时段失败,ID不匹配: {}, 当前ID: {}", m_logBase, detectPeriod.nID, m_detectPeriod.nID);
+        return;
+    }
+    m_detectPeriod = detectPeriod;
+    // m_isDetectPeriodUpdated = true; // 标记检测时段已更新
+}
+
 
 
 /* 线程功能函数 */
@@ -184,6 +199,14 @@ void CompareItemThread::timerTask()
         initData();
         SPDLOG_LOGGER_INFO(m_logger, "{} 更新对比项信息完成,继续检测对比");
     }
+
+    /* 判断检测时段 */
+    if(!checkDetectPeriod())
+    {
+        // 不在检测时段内,不进行对比检测
+        // SPDLOG_LOGGER_WARN(m_logger, "{} 当前不在检测时段内,停止对比检测", m_logBase);
+        return;
+    }
     /* -------------------------------------------------------------------------------------
      * 更新数据
      * ------------------------------------------------------------------------------------- */
@@ -724,3 +747,68 @@ bool CompareItemThread::generateMQTTJsonData(const CompareResult_t& compareResul
 }
 
 
+/* 检查是否在检测时间段内,返回false,不开启检测 */
+bool CompareItemThread::checkDetectPeriod()
+{
+    std::lock_guard<std::mutex> lock(m_mutexDetectPeriod);
+    
+    /* 先判断是否启用了该对比项,这个设置在对比项中设置 */
+    if(!m_threadInfo.compareItemInfo.isEnable)
+    {
+        return false; // 对比项未启用,不进行检测
+    }
+
+    QDateTime currentTime = QDateTime::currentDateTime();
+    int currentWeekday = currentTime.date().dayOfWeek(); // 获取当前星期几,1-7表示周日到周六
+    /* 判断时段 */
+    bool isInDetectPeriod = false;
+    for(const auto& period : m_detectPeriod.listDetect)
+    {
+        /* 先判断是否有符合的周几 */
+        if(static_cast<int>(period.weekType) == currentWeekday)
+        {
+            /* 判断当前时间是否在检测时段内 */
+            if(currentTime.time() >= period.timeStart && currentTime.time() <= period.timeEnd)
+            {
+                isInDetectPeriod = true;
+                break;
+            }
+        }
+    }
+
+    /* 再判断是否在非检测时间段内 */
+    for(const auto& period : m_detectPeriod.listNoDetect)
+    {
+        /* 先判断日期 */
+        if(period.date == currentTime.date())
+        {
+            /* 判断当前时间是否在非检测时段内 */
+            if(currentTime.time() >= period.timeStart && currentTime.time() <= period.timeEnd)
+            {
+                isInDetectPeriod = false; // 在非检测时段内,不进行检测
+                break;
+            }
+        }
+    }
+
+    /* 判断是否应用于噪音、过载、反相、噪声检测 */
+    if(m_detectPeriod.isApplySlient)
+    {
+
+    }
+    if(m_detectPeriod.isApplyOverload)
+    {
+
+    }
+    if(m_detectPeriod.isApplyPhase)
+    {
+
+    }
+    if(m_detectPeriod.isApplyNoise)
+    {
+
+    }
+
+    return true;
+}
+

+ 15 - 12
Server/ThreadCalculate/CompareItemThread.h

@@ -9,7 +9,6 @@
 #include "BaseCalculateThread.h"
 #include "CompareResult.h"
 #include "FromMQTT.h"
-// #include "mqtt_client_cpp.hpp"
 
 
 class CalculateDBThread;
@@ -22,7 +21,7 @@ class CompareDoubleThread;
         功能:
             1、对比两个录音通道的数据,通道1是主通道,和其他通道挨个对比
             2、从这里开启各个比对线程,获取比对结果信息,获取噪音检测结果,获取计算出的音量包信息,
-               组合成一个对比项的结果,发送到MQTT中
+               组合成一个对比项的结果,发送到MQTT中,MQTT订阅主题: LH_ACAServer/DB/0
             3、静音、过载、反相的报警信息从计算音量的线程中计算得出,并直接写入数据库,不再经过这里
                一致性报警信息从两两对比线程中计算得出,直接写入数据库
                噪音报警信息从噪音检测线程中计算得出,直接写入数据库
@@ -31,6 +30,10 @@ class CompareDoubleThread;
         其他说明:
             1、这个线程由于需要使用qmqtt发布数据,需要使用到Qt的事件循环,所以多继承了 QObject,
                线程的使用权会交给 Qt 的事件循环来管理,通过定时器定时调用 task() 函数
+        
+       检测时间段说明
+            1、在这里判断是否是检测时间段,如果不是某一项的检测时间段,则设置对应的线程为非检测时间段,对应的检测线程
+                输出的结果会做对应的处理(如噪音检测会设置为非噪音,一致性检测设置为一致)
  
  */
 class CompareItemThread : public QObject, public BaseCalculateThread
@@ -47,6 +50,9 @@ public:
     void stopThread() override;
     void stopThreadBlock() override;
 
+    /* 设置检测时段 */
+    void setDetectPeriod(const DetectPeriodConfig_t& detectPeriod);
+
 protected:
     /* 线程功能函数,未使用这个函数 */
     void task() override;
@@ -93,6 +99,9 @@ private:
     /* 生成发送至MQTT的JSON数据 */
     bool generateMQTTJsonData(const CompareResult_t& compareResult, QByteArray& jsonData);
 
+    /* 检查是否在检测时间段内,返回false,不开启检测 */
+    bool checkDetectPeriod();
+
 private:
     /* 事件循环 */
     QEventLoop m_eventLoop;
@@ -116,17 +125,11 @@ private:
     /* 计算的数据结果 */
     CompareResult_t m_compareResult;
 
-    /* 存储报警信息,int是对比项中的通道编号 */
-    // std::map<int, AlarmInfo_t> m_mapAlarmSilence;           /* 静音报警信息 */
-    // std::map<int, AlarmInfo_t> m_mapAlarmOverload;          /* 过载报警信息 */
-    // std::map<int, AlarmInfo_t> m_mapAlarmPhase;             /* 反相报警信息 */
-
-    // std::map<int, AlarmInfo_t> m_mapAlarmSilenceLast;       /* 上一次静音报警信息 */
-    // std::map<int, AlarmInfo_t> m_mapAlarmOverloadLast;      /* 上一次过载报警信息 */
-    // std::map<int, AlarmInfo_t> m_mapAlarmPhaseLast;         /* 上一次反相报警信息 */
+    /* ---------------------- 检测时段 ---------------------- */
+    std::mutex m_mutexDetectPeriod;         /* 检测时段互斥锁 */
+    // std::atomic_bool m_isDetectPeriodUpdated = false; /* 检测时段更新标志 */
+    DetectPeriodConfig_t m_detectPeriod;    /* 检测时段配置 */
 
-    /* 要写入到数据库的报警信息 */
-    // std::list<AlarmInfo_t> m_listWriteAlarm;;
 };
 
 

+ 1 - 1
Server/ThreadManager/ThreadAlarmManager.cpp

@@ -114,7 +114,7 @@ bool ThreadAlarmManager::initData()
     }
 
     /* 登陆WebAPI */
-    if(!m_fromWebAPI.initWebApi(GInfo.webAPIUrl(), GInfo.webAPIID(), GInfo.appType()))
+    if(!m_fromWebAPI.initWebApi(GInfo.webAPIUrl(), GInfo.webAPIID(), GInfo.webApiAppType()))
     {
         SPDLOG_LOGGER_ERROR(m_logger, "报警信息处理线程登录WebAPI失败");
         return false;

+ 8 - 4
Server/ThreadManager/ThreadAlarmManager.h

@@ -22,9 +22,13 @@
 #include <memory>
 #include <mutex>
 
+
+
 /**
- * @brief 处理报警信息,所有的报警信息都由这个线程写入数据库
- * 
+    处理报警信息,所有的报警信息都由这个线程写入数据库
+    
+    1、报警信息列表分为两种,一种是静音、过载、反相、噪音等单个录音通道的报警信息,一种是一致性报警需要
+        两个通道的关联的报警信息,这两种分别写入数据库,不相关联。
  */
 
 
@@ -77,11 +81,11 @@ private:
 
     FromWebAPI m_fromWebAPI;
 
-    /* 存储报警信息 */
+    /* 存储一般的报警信息 */
     std::mutex m_mutexListAlarm;                    /* 报警信息列表的互斥锁 */
     std::list<AlarmInfo_t> m_listAlarm;                 /* 报警信息列表 */
     
-
+    /* 存储一致性报警信息 */
     
 
 };

+ 76 - 22
Server/ThreadManager/ThreadCompareItemManager.cpp

@@ -51,8 +51,8 @@ void ThreadCompareItemManager::thread_CompareItemManager()
     /* 初始化webapi */
     m_webAPIUrl = GInfo.webAPIUrl();
     m_webAPIID = GInfo.webAPIID();
-    m_appType = GInfo.appType();
-    if(!m_fromWebAPI.initWebApi(m_webAPIUrl, m_webAPIID, m_appType))
+    m_webAPIAppType = GInfo.webApiAppType();
+    if(!m_fromWebAPI.initWebApi(m_webAPIUrl, m_webAPIID, m_webAPIAppType))
     {
         SPDLOG_LOGGER_ERROR(m_logger, "ThreadCompareItemManager: 初始化WebAPI失败");
         return;
@@ -60,9 +60,6 @@ void ThreadCompareItemManager::thread_CompareItemManager()
 
     /* 创建一些变量 */
     int threadSleepTime = 2; // 线程休眠时间,单位秒
-    QList<CompareItemInfo_t> listCreateItems; // 新创建的对比项列表
-    QList<CompareItemInfo_t> listUpdateItems; // 更新的对比项列表
-    QList<int> listDeleteItems; // 删除的对比项列表
 
     /* 获取基础配置,目前只获取一次 */
     updateBaseSettings();
@@ -76,25 +73,15 @@ void ThreadCompareItemManager::thread_CompareItemManager()
             /* 线程睡眠时间恢复为10秒 */
             threadSleepTime = 10;
         }
-        /* ------------------------------ 处理对比项信息 ------------------------------ */
-        /* 获取对比项信息 */
-        if(!m_fromWebAPI.getCompareItemInfo(m_listNewItems))
-        {
-            SPDLOG_LOGGER_DEBUG(m_logger, "ThreadCompareItemManager: 获取对比项失败");
-            continue;
-        }
+        /* ------------------------------------------------------------------
+         * 处理对比项信息
+         * ------------------------------------------------------------------ */
+        processCompareItemInfo();
         
-        processCompareItemInfo(listCreateItems, listUpdateItems, listDeleteItems);
+        /* ------------------------------ 更新检测时段 ------------------------------ */
+
 
-        SPDLOG_LOGGER_DEBUG(m_logger, "要退出的对比项个数: {}, 要更新的对比项个数: {}, 要创建的对比项个数: {}",
-            listDeleteItems.size(), listUpdateItems.size(), listCreateItems.size());
 
-        /* 先删除已消失的对比项信息 */
-        processDeleteCompareItemThreads(listDeleteItems);
-        /* 更新需要更新的线程 */
-        updateRunningThreads(listUpdateItems);
-        /* 再创建新的对比项线程 */
-        createNewCompareItemThreads(listCreateItems);
     }
 
     SPDLOG_LOGGER_INFO(m_logger, "ThreadCompareItemManager: 线程结束");
@@ -170,6 +157,29 @@ bool ThreadCompareItemManager::updateBaseSettings()
     return true;
 }
 
+/* 对比项信息处理函数 */
+void ThreadCompareItemManager::processCompareItemInfo()
+{
+    /* 获取对比项信息 */
+        if(!m_fromWebAPI.getCompareItemInfo(m_listNewItems))
+        {
+            SPDLOG_LOGGER_DEBUG(m_logger, "ThreadCompareItemManager: 获取对比项失败");
+            return;;
+        }
+        
+        checkCompareItemInfo(m_listCreateItems, m_listUpdateItems, m_listDeleteItems);
+
+        SPDLOG_LOGGER_DEBUG(m_logger, "要退出的对比项个数: {}, 要更新的对比项个数: {}, 要创建的对比项个数: {}",
+            m_listDeleteItems.size(), m_listUpdateItems.size(), m_listCreateItems.size());
+
+        /* 先删除已消失的对比项信息 */
+        processDeleteCompareItemThreads(m_listDeleteItems);
+        /* 更新需要更新的线程 */
+        updateRunningThreads(m_listUpdateItems);
+        /* 再创建新的对比项线程 */
+        createNewCompareItemThreads(m_listCreateItems);
+}
+
 
 /**
  * @brief 处理对比项信息,新获取的和已有的对比
@@ -178,7 +188,7 @@ bool ThreadCompareItemManager::updateBaseSettings()
  * @param updateList 更新列表,根据对比项ID进行更新信息
  * @param deleteList 删除列表
  */
-void ThreadCompareItemManager::processCompareItemInfo(QList<CompareItemInfo_t>& createList, QList<CompareItemInfo_t>& updateList, QList<int>& deleteList)
+void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& createList, QList<CompareItemInfo_t>& updateList, QList<int>& deleteList)
 {
     createList.clear();
     updateList.clear();
@@ -356,3 +366,47 @@ bool ThreadCompareItemManager::createNewCompareItemThreads(const QList<CompareIt
     return true;
 }
 
+
+/* 处理检测时段信息 */
+void ThreadCompareItemManager::processDetectPeriodInfo()
+{
+    /* 获取计划信息 */
+    QMap<int, DetectPeriodConfig_t> mapNewDetectConfig;
+    if(!m_fromWebAPI.getDetectPeriodConfig(mapNewDetectConfig))
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "获取检测时段配置失败");
+        return;
+    }
+
+    QMap<int, DetectPeriodConfig_t> mapUpdateDetectConfig;
+    checkDetectPeriodInfo(mapNewDetectConfig, mapUpdateDetectConfig);
+}
+
+/* 检查获取出更新的对比项信息 */
+void ThreadCompareItemManager::checkDetectPeriodInfo(QMap<int, DetectPeriodConfig_t> newDetectInfo, QMap<int, DetectPeriodConfig_t>& updateList)
+{
+    for(const auto& it : newDetectInfo)
+    {
+        int compareItemID = it.nID;
+
+        for(const auto& existingItem : m_mapDetectPeriod)
+        {
+            if(existingItem.nID == compareItemID)
+            {
+                /* 已经存在的对比项,检查是否需要更新 */
+                if(existingItem == it)
+                {
+                    /* 对比项信息相同,不需要更新 */
+                    continue;
+                } else
+                {
+                    /* 对比项信息不同,需要更新 */
+                    updateList.insert(compareItemID, it);
+                }
+                return;
+            }
+        }
+    }
+}
+
+

+ 31 - 6
Server/ThreadManager/ThreadCompareItemManager.h

@@ -7,7 +7,14 @@
 #include "CompareItemThread.h"
 
 
-
+/**
+    对比项管理线程
+    1、这个线程类定时获取数据库中对比项的信息,与正在运行的对比项线程对比,
+       找出需要新增的对比项、需要更新的对比项和需要删除的对比项。
+    2、在创建对比项线程的时候套了一层壳,在 thread_compareItem 函数中创建新的对比项线程实例,
+       这样可以避免 Qt 报线程归属权错误。
+    3、这个线程也会定时获取计划信息,更新给对比项
+ */
 
 
 #define CompareItemManager ThreadCompareItemManager::instance()
@@ -24,7 +31,7 @@ public:
         return instance;
     }
 
-    /* 线程函数 */
+    /* 对比项管理器线程函数 */
     void thread_CompareItemManager();
     /* 添加对比项实例 */
     void addCompareItemThread(CompareItemThread* pThread);
@@ -32,15 +39,19 @@ public:
     SoundCardRoadInfo_t getSoundCardRoadInfo(int compareItemID, int roadNum);
     
 
-    /*  给对比项套一层壳,这个函数就是新的线程,在里面new出新的对比项实例,防止Qt报线程归属权错误
+    /*  给对比项套一层壳,这个函数就是新的线程,在里面new出新的对比项实例,防止Qt报线程归属权错误
         在函数中将对比项实例插入到线程管理器中 */
     static void thread_compareItem(CalculateThreadInfo_t threadInfo);
 
 private:
     /* 更新基础设置信息,如数据库设置,噪音参数等 */
     bool updateBaseSettings();
+
+    /* ---------------------- 对比项信息 ---------------------- */
+    /* 更新对比项信息 */
+    void processCompareItemInfo();
     /* 处理对比项信息,新获取的和已有的对比 */
-    void processCompareItemInfo(QList<CompareItemInfo_t>& createList,
+    void checkCompareItemInfo(QList<CompareItemInfo_t>& createList,
                                 QList<CompareItemInfo_t>& updateList,
                                 QList<int>& deleteList);
 
@@ -51,18 +62,32 @@ private:
     /* 创建新的线程 */
     bool createNewCompareItemThreads(const QList<CompareItemInfo_t>& createList);
 
+    /* ---------------------- 检测时段信息 ---------------------- */
+    /* 处理检测时段信息 */
+    void processDetectPeriodInfo();
+    /* 检查获取出更新的对比项信息 */
+    void checkDetectPeriodInfo(QMap<int, DetectPeriodConfig_t> newDetectInfo, QMap<int, DetectPeriodConfig_t>& updateList);
+
 private:
     std::shared_ptr<spdlog::logger> m_logger = nullptr;
     FromWebAPI m_fromWebAPI;                /* WebAPI处理类 */
     QString m_webAPIUrl;                    /* WebAPI地址 */
     QString m_webAPIID;                     /* WebAPI ID */
-    QString m_appType;                      /* 应用类型 */
-
+    QString m_webAPIAppType;                      /* WebAPI应用类型 */
 
+    /* ---------------------- 对比项信息 ---------------------- */
     std::mutex m_mutexCompareItemThreads;       /* 对比项线程的互斥锁 */
     QList<CompareItemInfo_t> m_listNewItems;    /* 对比项列表,从数据库获取到的新的列表 */
     QMap<int, CompareItemThread*> m_mapThreads; /* 对比项线程列表,key是对比项ID,value是对应的线程指针 */
 
+    /* 临时变量 */
+    QList<CompareItemInfo_t> m_listCreateItems; // 新创建的对比项列表
+    QList<CompareItemInfo_t> m_listUpdateItems; // 更新的对比项列表
+    QList<int> m_listDeleteItems; // 删除的对比项列表
+
+    /* ---------------------- 检测时段信息 ---------------------- */
+    /* 检测时段,int是对比项ID */
+    QMap<int, DetectPeriodConfig_t> m_mapDetectPeriod;
 };
 
 

+ 138 - 0
SettingLibrary/Modules/Basic/compareitemdetailwidget.cpp

@@ -0,0 +1,138 @@
+#include "compareitemdetailwidget.h"
+#include "ui_compareitemdetailwidget.h"
+
+
+#include "UIStyleManager.h"
+
+
+CompareItemDetailWidget::CompareItemDetailWidget(QWidget *parent) :
+    DialogBase(parent),
+    ui(new Ui::CompareItemDetailWidget)
+{
+    QWidget* contentWidget = new QWidget(this);
+    ui->setupUi(contentWidget);
+    /* 设置内容到弹窗中 */
+    setContentWidget(contentWidget);
+    /* 设置标题 */
+    setTitle(tr("对比项详情"));
+
+    /* 底栏 */
+    removeBottomWidget();
+
+    /* 设置提示文本 */
+    ui->label_tip->setText("备注: 其他通道都同主通道进行信号对比");
+
+    /* 设置QSS */
+    setQSS();
+
+    /* 初始化表格,需要在设置QSS之后再初始化 */
+    initTable();
+}
+
+CompareItemDetailWidget::~CompareItemDetailWidget()
+{
+    delete ui;
+}
+
+
+/* 设置对比项信息 */
+void CompareItemDetailWidget::setCompareItemInfo(const CompareItemInfo_t& info)
+{
+    /* 设置对比项名称 */
+    ui->label_compareItemName->setText(info.strName);
+    /* 设置是否启用对比项 */
+    ui->label_compareItemEnable->setText(info.isEnable ? "启用" : "未启用");
+
+    for(const auto& it : info.mapRoad)
+    {
+        /* 添加一行 */
+        QList<QTableWidgetItem*> items;
+        /* 序号 */
+        items.append(new QTableWidgetItem(QString::number(it.nCompareRoadNum)));
+        /* 通道 */
+        QString roadName = it.nCompareRoadNum == 1 ? "主通道" : QString("%1通道").arg(it.nCompareRoadNum);
+        items.append(new QTableWidgetItem(roadName));
+        /* 通道名称 */
+        items.append(new QTableWidgetItem(it.strCompareRoadName));
+        /* 通道声卡设备编号 */
+        QString soundCardRoad = QString("%1:%2").arg(it.scRoadInfo.strSoundCardName, QString::number(it.scRoadInfo.roadInfo.nRoadNum));
+        items.append(new QTableWidgetItem(soundCardRoad));
+
+        int row = ui->tableWidget->rowCount();
+        ui->tableWidget->insertRow(row);
+        ui->tableWidget->setItem(row, 0, items[0]);
+        ui->tableWidget->setItem(row, 1, items[1]);
+        ui->tableWidget->setItem(row, 2, items[2]);
+        ui->tableWidget->setItem(row, 3, items[3]);
+        /* 设置表格行高 */
+        ui->tableWidget->setRowHeight(row, 48);
+    }
+}
+
+
+/* 设置QSS */
+void CompareItemDetailWidget::setQSS()
+{
+    QString qssPath = UIStyle.getQSSPath() + "/compareitemdetailwidget.qss";
+    QFile file(qssPath);
+    if(file.open(QFile::ReadOnly))
+    {
+        QString qss = file.readAll();
+        getContentWidget()->setStyleSheet(qss);
+        file.close();
+    }else {
+        SPDLOG_LOGGER_ERROR(m_logger, "Failed to open QSS file: {}", qssPath.toStdString());
+    }
+}
+
+
+/* 初始化表格 */
+void CompareItemDetailWidget::initTable()
+{
+    /* 设置表格属性 */
+    /* 设置单元格不可编辑 */
+    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
+    /* 选择整行 */
+    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+    /* 单选模式 */
+    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+    /* 不显示网格线 */
+    ui->tableWidget->setShowGrid(false);
+    /* 取消选中项的虚线 */
+    // ui->tableWidget->setAlternatingRowColors(true);
+
+
+    /* 禁止显示横向滚动条 */
+    ui->tableWidget->horizontalHeader()->setStretchLastSection(true); /* 设置最后一列拉伸 */
+
+    /* 设置表格头部不可点击 */
+    ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
+    /* 设置表格头部不可拖动 */
+    ui->tableWidget->horizontalHeader()->setSectionsMovable(false);
+    /* 设置表格头部不可调整大小 */
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
+    
+    /* 设置不显示行表头 */
+    ui->tableWidget->verticalHeader()->setVisible(false);
+    /* 设置表格高度 */
+    ui->tableWidget->verticalHeader()->setMinimumHeight(48);
+    /* 设置表格头部高度 */
+    ui->tableWidget->horizontalHeader()->setMinimumHeight(48);
+    /* 设置表格头部对齐方式 */
+    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+    
+    /* 设置表格列数 */
+    ui->tableWidget->setColumnCount(4);
+    /* 添加标题 */
+    QStringList headers;
+    headers << "序号" << "通道" << "通道名称" << "通道声卡设备编号";
+    ui->tableWidget->setHorizontalHeaderLabels(headers);
+
+    /* 设置表格列宽度 */
+    ui->tableWidget->setColumnWidth(0, 60);     /* 序号 */
+    ui->tableWidget->setColumnWidth(1, 160);    /* 通道 */
+    ui->tableWidget->setColumnWidth(2, 240);    /* 通道名称 */
+    ui->tableWidget->setColumnWidth(3, 240);    /* 通道声卡设备编号 */
+}
+
+

+ 34 - 0
SettingLibrary/Modules/Basic/compareitemdetailwidget.h

@@ -0,0 +1,34 @@
+#ifndef COMPAREITEMDETAILWIDGET_H
+#define COMPAREITEMDETAILWIDGET_H
+
+#include <QWidget>
+#include "DialogBase.h"
+#include "GlobalVariable.h"
+
+namespace Ui {
+class CompareItemDetailWidget;
+}
+
+class CompareItemDetailWidget : public DialogBase
+{
+    Q_OBJECT
+
+public:
+    explicit CompareItemDetailWidget(QWidget *parent = nullptr);
+    ~CompareItemDetailWidget();
+
+    /* 设置对比项信息 */
+    void setCompareItemInfo(const CompareItemInfo_t& info);
+
+private:
+    /* 设置QSS */
+    void setQSS();
+    /* 初始化表格 */
+    void initTable();
+
+
+private:
+    Ui::CompareItemDetailWidget *ui;
+};
+
+#endif // COMPAREITEMDETAILWIDGET_H

+ 114 - 0
SettingLibrary/Modules/Basic/compareitemdetailwidget.ui

@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CompareItemDetailWidget</class>
+ <widget class="QWidget" name="CompareItemDetailWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>800</width>
+    <height>600</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>24</number>
+   </property>
+   <property name="leftMargin">
+    <number>32</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>32</number>
+   </property>
+   <property name="bottomMargin">
+    <number>32</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="widget_compareItem" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>64</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>64</height>
+      </size>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout" stretch="3,1,4">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>32</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="label_compareItemName">
+        <property name="minimumSize">
+         <size>
+          <width>236</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>236</width>
+          <height>16777215</height>
+         </size>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="label_compareItemEnable">
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="label_tip">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTableWidget" name="tableWidget"/>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 3 - 2
SettingLibrary/Modules/Basic/compareitemdialog.h

@@ -43,6 +43,8 @@ public:
     /* 获取生成的对比项信息 */
     CompareItemInfo_t& getCompareItemInfo();
 
+    /* 设置样式表 */
+    void setQSS();
 
 private slots:
     /* 新增通道 */
@@ -53,9 +55,8 @@ private slots:
     /* 静音、过载、反相检测条件开关 */
     void do_checkBox_MOP_clicked(bool checked);
     
+
 private:
-    /* 设置样式表 */
-    void setQSS();
     /* 设置静音过载反相可编辑 */
     void setMOPEditable(EDBType type, bool editable);
     /* 设置检测参数输入栏只能输入数字 */

+ 47 - 7
SettingLibrary/Modules/Basic/compareitemlistdialog.cpp

@@ -11,6 +11,7 @@
 #include "GlobalInfo.h"
 #include "tipwidget.h"
 #include "warning.h"
+#include "compareitemdetailwidget.h"
 
 
 /* 重载比较函数 */
@@ -62,9 +63,9 @@ CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
 
     /* 设置标题 */
     setTitle("对比项列表", QSize(120, 18));
-    
 
     UIStyle.registerWidget(widgetContent);
+    
 
     // SPDLOG_LOGGER_DEBUG(m_logger, "ObjectName: {}", widgetContent->objectName().toStdString());
     this->resize(1000 + 40, 800 + 40); /* 设置对话框大小,包含阴影的宽度 */
@@ -77,8 +78,12 @@ CompareItemListDialog::CompareItemListDialog(QWidget *parent) :
     connect(ui->pBtn_enableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_enable_Clicked);
     connect(ui->pBtn_disableCPItem, &QPushButton::clicked, this, &CompareItemListDialog::do_pBtn_disable_Clicked);
 
+    connect(ui->tableView, &QTableView::doubleClicked, this, &CompareItemListDialog::do_tableView_doubleClicked);
+
     /* 初始化表格 */
     initTable();
+
+    
 }
 
 CompareItemListDialog::~CompareItemListDialog()
@@ -295,6 +300,35 @@ void CompareItemListDialog::do_pBtn_disable_Clicked()
     m_model->setData(m_model->index(index.row(), 1), "未启用");
 }
 
+
+/* 显示详情 */
+void CompareItemListDialog::do_tableView_doubleClicked(const QModelIndex &index)
+{
+    /* 判断是不是第4列 */
+    if(index.column() != 4)
+    {
+        /* 如果不是第4列,直接返回 */
+        return;
+    }
+    /* 获取对比项ID */
+    int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
+    /* 查找对比项信息 */
+    CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
+    if(ciInfo.nID < 0)
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "对比项不存在,无法查看详情", GInfo.getTopWindow());
+        SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法查看详情", nID);
+        return;
+    }
+
+    /* 打开弹窗 */
+    CompareItemDetailWidget* detailWidget = new CompareItemDetailWidget(GInfo.getTopWindow());
+    /* 设置对比项信息 */
+    detailWidget->setCompareItemInfo(ciInfo);
+    detailWidget->exec();
+}
+
+
 /* 初始化表格 */
 void CompareItemListDialog::initTable()
 {
@@ -370,24 +404,30 @@ void CompareItemListDialog::initTable()
 void CompareItemListDialog::addRow(CompareItemTableItem_t tableItem)
 {
     QList<QStandardItem*> items;
-    /* 序号 */
+    /* -------------------- 序号 -------------------- */
     QStandardItem* item0 = new QStandardItem(QString::number(tableItem.nSerialNum));
     item0->setCheckable(true);
     item0->setCheckState(Qt::Unchecked);
     items.append(item0); 
     /* 保存这个对比项的ID */
     item0->setData(tableItem.nID, m_userRole_CompareItemID);
-    /* 状态 */
+    /* -------------------- 状态 -------------------- */
     QString status = tableItem.isEnable ? "启用" : "未启用";
     items.append(new QStandardItem(status));
-    /* 对比项 */
+    /* -------------------- 对比项 -------------------- */
     items.append(new QStandardItem(tableItem.strName));
-    /* 通道数 */
+    /* -------------------- 通道数 -------------------- */
     items.append(new QStandardItem(QString::number(tableItem.nChannelCount)));
-    /* 操作 */
-    items.append(new QStandardItem("详情"));
+
+    /* -------------------- 详情 -------------------- */
+    QStandardItem* item4 = new QStandardItem("详情");
+    /* 这个字体设置为蓝色 */
+    item4->setForeground(QBrush("#438EFF"));
+    items.append(item4);
+    
 
     m_model->appendRow(items);
 }
 
 
+

+ 5 - 0
SettingLibrary/Modules/Basic/compareitemlistdialog.h

@@ -64,12 +64,17 @@ private slots:
     /* 禁用对比项 */
     void do_pBtn_disable_Clicked();
 
+    /* 显示详情 */
+    void do_tableView_doubleClicked(const QModelIndex &index);
+
 private:
     /* 初始化表格 */
     void initTable();
     /* 添加一行 */
     void addRow(CompareItemTableItem_t tableItem);
 
+
+
 private:
     Ui::CompareItemListWidget *ui;
 

+ 0 - 19
SettingLibrary/Modules/Basic/compareitmedetaildialog.cpp

@@ -1,19 +0,0 @@
-#include "compareitmedetaildialog.h"
-#include "ui_compareitmedetaildialog.h"
-
-CompareItmeDetailDialog::CompareItmeDetailDialog(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::CompareItmeDetailDialog)
-{
-    ui->setupUi(this);
-
-    setWindowFlag(Qt::FramelessWindowHint);
-    setAttribute(Qt::WA_TranslucentBackground);
-
-    connect(ui->btnClose, &QPushButton::clicked, this, &CompareItmeDetailDialog::close);
-}
-
-CompareItmeDetailDialog::~CompareItmeDetailDialog()
-{
-    delete ui;
-}

+ 0 - 22
SettingLibrary/Modules/Basic/compareitmedetaildialog.h

@@ -1,22 +0,0 @@
-#ifndef COMPAREITMEDETAILDIALOG_H
-#define COMPAREITMEDETAILDIALOG_H
-
-#include <QDialog>
-
-namespace Ui {
-class CompareItmeDetailDialog;
-}
-
-class CompareItmeDetailDialog : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit CompareItmeDetailDialog(QWidget *parent = nullptr);
-    ~CompareItmeDetailDialog();
-
-private:
-    Ui::CompareItmeDetailDialog *ui;
-};
-
-#endif // COMPAREITMEDETAILDIALOG_H

+ 0 - 231
SettingLibrary/Modules/Basic/compareitmedetaildialog.ui

@@ -1,231 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>CompareItmeDetailDialog</class>
- <widget class="QDialog" name="CompareItmeDetailDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>856</width>
-    <height>680</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Dialog</string>
-  </property>
-  <property name="styleSheet">
-   <string notr="true">QWidget#widgetBackground
-{
-	background: #FFFFFF;
-	border-radius: 8px;
-}
-QWidget#widgetTop
-{
-	border-bottom: 1px solid #E6E9F4;
-}
-
-QLabel
-{
-	font-weight: 400;
-	font-size: 14px;
-	color: #3A3F63;
-}
-QLabel#labelTitle
-{
-	font-weight: 500;
-	font-size: 18px;
-}
-
-QPushButton#btnClose
-{
-	border-image: url(:/close.png);
-}
-QPushButton#btnClose:hover
-{
-	border-image: url(:/close_hover.png);
-}
-
-QTableView
-{
-	background: transparent;
-	border: none;
-}</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <property name="spacing">
-    <number>0</number>
-   </property>
-   <item row="0" column="0">
-    <widget class="QWidget" name="widgetBackground" native="true">
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <property name="spacing">
-       <number>0</number>
-      </property>
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <property name="topMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>0</number>
-      </property>
-      <property name="bottomMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QWidget" name="widgetTop" native="true">
-        <property name="minimumSize">
-         <size>
-          <width>0</width>
-          <height>57</height>
-         </size>
-        </property>
-        <property name="maximumSize">
-         <size>
-          <width>16777215</width>
-          <height>57</height>
-         </size>
-        </property>
-        <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <property name="spacing">
-          <number>0</number>
-         </property>
-         <property name="leftMargin">
-          <number>32</number>
-         </property>
-         <property name="topMargin">
-          <number>0</number>
-         </property>
-         <property name="rightMargin">
-          <number>16</number>
-         </property>
-         <property name="bottomMargin">
-          <number>0</number>
-         </property>
-         <item>
-          <widget class="QLabel" name="labelTitle">
-           <property name="text">
-            <string>对比项详情</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="btnClose">
-           <property name="minimumSize">
-            <size>
-             <width>32</width>
-             <height>32</height>
-            </size>
-           </property>
-           <property name="maximumSize">
-            <size>
-             <width>32</width>
-             <height>32</height>
-            </size>
-           </property>
-           <property name="text">
-            <string/>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </item>
-      <item>
-       <widget class="QWidget" name="widgetContent" native="true">
-        <layout class="QVBoxLayout" name="verticalLayout_2">
-         <property name="spacing">
-          <number>16</number>
-         </property>
-         <property name="leftMargin">
-          <number>32</number>
-         </property>
-         <property name="topMargin">
-          <number>32</number>
-         </property>
-         <property name="rightMargin">
-          <number>32</number>
-         </property>
-         <property name="bottomMargin">
-          <number>32</number>
-         </property>
-         <item>
-          <widget class="QWidget" name="widget" native="true">
-           <layout class="QHBoxLayout" name="horizontalLayout">
-            <property name="spacing">
-             <number>16</number>
-            </property>
-            <property name="leftMargin">
-             <number>0</number>
-            </property>
-            <property name="topMargin">
-             <number>0</number>
-            </property>
-            <property name="rightMargin">
-             <number>0</number>
-            </property>
-            <property name="bottomMargin">
-             <number>0</number>
-            </property>
-            <item>
-             <widget class="QLabel" name="labelItemName">
-              <property name="minimumSize">
-               <size>
-                <width>0</width>
-                <height>16</height>
-               </size>
-              </property>
-              <property name="maximumSize">
-               <size>
-                <width>16777215</width>
-                <height>16</height>
-               </size>
-              </property>
-              <property name="text">
-               <string>对比项名称</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <spacer name="horizontalSpacer">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-           </layout>
-          </widget>
-         </item>
-         <item>
-          <widget class="QTableView" name="tableView"/>
-         </item>
-        </layout>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>

+ 4 - 0
SettingLibrary/Modules/Basic/singlecompareroadwidget.cpp

@@ -2,6 +2,7 @@
 #include "ui_singlecompareroadwidget.h"
 #include "customcombobox.h"
 
+#include "spdlog/spdlog.h"
 
 SingleCompareRoadWidget::SingleCompareRoadWidget(QWidget *parent)
     : QWidget(parent)
@@ -127,8 +128,11 @@ void SingleCompareRoadWidget::setRoadNameWarn(bool isWarn)
 void SingleCompareRoadWidget::setQSS(QString strStyle)
 {
     this->setStyleSheet(strStyle);
+    ui->comboBox_soundCardNum->setStyleSheet(strStyle);
     /* 设置下拉框阴影 */
     ui->comboBox_soundCardNum->setViewShadowEffect();
+
+    // SPDLOG_INFO("ui->comboBox_soundCardNum 样式表: {}", ui->comboBox_soundCardNum->styleSheet().toStdString());
 }
 
 

+ 3 - 3
SettingLibrary/Modules/CheckPeriod/addperioddialog.cpp

@@ -37,7 +37,7 @@ AddPeriodDialog::AddPeriodDialog(ePeriodType type, QWidget *parent) :
     ui->comboBox->setViewShadowEffect();
     /* 设置时间框默认时间 */
     ui->timeEdit_start->setTime(QTime(0, 0, 0));
-    ui->timeEdit_end->setTime(QTime(23, 59, 59));
+    ui->timeEdit_end->setTime(QTime(0, 0, 0));
 
     ui->timeEdit_start->SetMainWindow(this);
     ui->timeEdit_end->SetMainWindow(this);
@@ -104,9 +104,9 @@ bool AddPeriodDialog::isOKClicked()
     updatePlan();
 
     /* 先检查时间是否相等,前后冲突 */
-    if(m_plan.timeStart >= m_plan.timeEnd)
+    if(m_plan.timeStart > m_plan.timeEnd)
     {
-        TipWidget::display(TipWidget::OPERATOR_WARN, "开始时间不能大于或等于结束时间!", this);
+        TipWidget::display(TipWidget::OPERATOR_WARN, "结束时间不能先于开始时间!", this);
         return false;
     }
 

+ 39 - 24
SettingLibrary/Modules/CheckPeriod/checkperiodwidget.ui

@@ -18,7 +18,7 @@
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_4">
    <property name="spacing">
-    <number>24</number>
+    <number>16</number>
    </property>
    <property name="leftMargin">
     <number>0</number>
@@ -132,7 +132,7 @@
        <number>0</number>
       </property>
       <property name="bottomMargin">
-       <number>24</number>
+       <number>12</number>
       </property>
       <item>
        <layout class="QHBoxLayout" name="horizontalLayout_3">
@@ -184,7 +184,7 @@
            <x>0</x>
            <y>0</y>
            <width>358</width>
-           <height>220</height>
+           <height>232</height>
           </rect>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_5">
@@ -291,7 +291,7 @@
            <x>0</x>
            <y>0</y>
            <width>358</width>
-           <height>110</height>
+           <height>128</height>
           </rect>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_7">
@@ -327,39 +327,57 @@
         </widget>
        </widget>
       </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QWidget" name="widge_asOthrer" native="true">
+     <layout class="QVBoxLayout" name="verticalLayout_8">
+      <property name="spacing">
+       <number>12</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
       <item>
        <layout class="QGridLayout" name="gridLayout">
-        <property name="horizontalSpacing">
-         <number>0</number>
-        </property>
         <property name="verticalSpacing">
-         <number>16</number>
+         <number>12</number>
         </property>
-        <item row="0" column="1">
-         <widget class="QCheckBox" name="checkBox_applyOverload">
+        <item row="0" column="0">
+         <widget class="QCheckBox" name="checkBox_applySlient">
           <property name="text">
-           <string>应用于过载检测</string>
+           <string>应用于静音检测</string>
           </property>
          </widget>
         </item>
-        <item row="1" column="1">
-         <widget class="QCheckBox" name="checkBox_applyNoise">
+        <item row="0" column="1">
+         <widget class="QCheckBox" name="checkBox_applyOverload">
           <property name="text">
-           <string>应用于噪音检测</string>
+           <string>应用于过载检测</string>
           </property>
          </widget>
         </item>
-        <item row="0" column="0">
-         <widget class="QCheckBox" name="checkBox_applySlient">
+        <item row="1" column="0">
+         <widget class="QCheckBox" name="checkBox_applyPhase">
           <property name="text">
-           <string>应用于静音检测</string>
+           <string>应用于反相检测</string>
           </property>
          </widget>
         </item>
-        <item row="1" column="0">
-         <widget class="QCheckBox" name="checkBox_applyPhase">
+        <item row="1" column="1">
+         <widget class="QCheckBox" name="checkBox_applyNoise">
           <property name="text">
-           <string>应用于反相检测</string>
+           <string>应用于噪音检测</string>
           </property>
          </widget>
         </item>
@@ -367,9 +385,6 @@
       </item>
       <item>
        <layout class="QHBoxLayout" name="horizontalLayout">
-        <property name="spacing">
-         <number>4</number>
-        </property>
         <item>
          <widget class="QLabel" name="label_tipIcon2">
           <property name="minimumSize">
@@ -381,7 +396,7 @@
           <property name="maximumSize">
            <size>
             <width>16</width>
-            <height>16</height>
+            <height>16777215</height>
            </size>
           </property>
           <property name="text">

+ 1 - 0
SettingLibrary/Resources/QSS.qrc

@@ -14,5 +14,6 @@
         <file>qss/white/checkperiodwidget.qss</file>
         <file>qss/white/onedetectplan.qss</file>
         <file>qss/white/addperiodwidget.qss</file>
+        <file>qss/white/compareitemdetailwidget.qss</file>
     </qresource>
 </RCC>

+ 4 - 1
SettingLibrary/Resources/qss/white/checkperiodwidget.qss

@@ -5,10 +5,13 @@ QWidget#widget_top, #widget_detectPlan, #widget_noDetectPlan
 }
 
 
-QWidget#widget_detectPlan, #widget_noDetectPlan
+QWidget#widget_detectPlan, #widget_noDetectPlan, #widge_asOthrer
 {
 	border-bottom: 1px solid #E9E9E9;
 }
+
+
+
 QWidget#widget_bottom
 {
     border-top: none;

+ 167 - 0
SettingLibrary/Resources/qss/white/compareitemdetailwidget.qss

@@ -0,0 +1,167 @@
+
+QWidget#CompareItemDetailWidget
+{
+    background: #FFFFFF;
+}
+
+/* ==========================================================
+ *  QLabel
+ * ========================================================== */
+
+QLabel#label_compareItemEnable, #label_compareItemName
+{
+    font-weight: 400;
+    font-size: 22px;
+    color: #3A3F63;
+    line-height: 28px;
+    text-align: left;
+    font-style: normal;
+}
+
+QLabel#label_tip
+{
+    font-weight: 400;
+    font-size: 14px;
+    color: #3A3F63;
+    line-height: 21px;
+    text-align: left;
+    font-style: normal;
+    text-transform: none;
+}
+
+
+/* ==========================================================
+ *  QTableWidget
+ * ========================================================== */
+
+
+/* ==========================================================
+ *  QTableWidget
+ * ========================================================== */
+
+QTableWidget
+{
+    background: transparent;
+    /* padding-left: 16px; */
+    border: 0px solid #E6E9F4;
+    text-align: left;
+    outline: none;
+}
+
+/* 设置标题栏,如果不生效,可能是在UI里面设置了样式表,导致冲突了 */
+QTableWidget QHeaderView
+{
+    background: transparent;
+}
+
+QTableWidget QHeaderView::section
+{
+    background: transparent;
+    padding-left: 16px;
+    font-weight: 400;
+    font-size: 14px;
+    
+    border: 0px solid #E6E9F4;
+    border-top: 1px solid #E6E9F4;
+    border-bottom: 1px solid #E6E9F4;
+}
+
+
+QTableWidget::item
+{
+    background: transparent;
+
+    padding-left: 16px;
+    padding-right: 0px;
+    padding-top: 0px;
+    padding-bottom: 0px;
+
+    margin: 0px;
+
+    text-align: left;
+
+    border: 0px solid #E6E9F4;
+}
+
+QTableWidget::item:selected
+{
+    color: #FFFFFF;
+    background: #bdbbf5;
+}
+
+
+
+/* QTableWidget::item:editable
+{
+    color: #464649;
+    background: #438EFF;
+}
+
+QTableWidget::item:focus
+{
+    color: #464649;
+    background: #438EFF;
+} */
+
+/* QCheckBox::indicator
+{
+    width: 16px;
+    height: 16px;
+    border-radius: 4px;
+    background: #B3C0E7;
+} */
+
+
+/*===============================================================
+ * QScrollBar 滚动条
+ ================================================================*/
+
+/* 设置 QTableWidget 的水平和垂直滚动条的基础样式。 */
+QTableWidget QScrollBar:horizontal, QTableWidget QScrollBar:vertical
+{
+    border:none;
+    /* background-color: rgba(255, 255, 255, 0); */
+    background: transparent;
+    margin: 0px 0px 0px 0px;
+}
+QTableWidget QScrollBar:horizontal
+{
+    height: 12px;
+}
+QTableWidget QScrollBar:vertical
+{
+    width: 6px;
+}
+
+/* 定义滚动条滑块的样式,包括颜色、圆角和最小宽度/高度 */
+QTableWidget QScrollBar::handle:horizontal,QScrollBar::handle:vertical
+{
+    background: #E2E2E2;
+    /* background: #505357; */
+    border-radius: 3px;
+    min-width: 8px;
+}
+QTableWidget QScrollBar::handle:horizontal
+{
+    min-width: 8px;
+}
+QTableWidget QScrollBar::handle:vertical
+{
+    min-height: 113px;
+}
+
+/* 定义滚动条的上下箭头的样式,包括背景颜色和边框 */
+QTableWidget QScrollBar::add-line:horizontal, QTableWidget QScrollBar::sub-line:horizontal,
+QTableWidget QScrollBar::add-line:vertical, QTableWidget QScrollBar::sub-line:vertical
+{
+    background-color: transparent;
+    border: none;
+}
+
+/* 定义滚动条的上下箭头的样式,包括背景颜色和边框 */
+QTableWidget QScrollBar::add-page:horizontal, QTableWidget QScrollBar::sub-page:horizontal,
+QTableWidget QScrollBar::add-page:vertical, QTableWidget QScrollBar::sub-page:vertical
+{
+    background-color: transparent;
+    background: none;
+}

+ 1 - 1
SettingLibrary/Resources/qss/white/compareitemlistwidget.qss

@@ -145,7 +145,7 @@ QTableView::item
 {
     font-weight: 400;
     font-size: 14px;
-    color: #3A3F63;
+    /* color: #3A3F63; */
     background: transparent;
 
     border: none;

+ 4 - 4
common/GlobalInfo/GlobalVariable.h

@@ -239,10 +239,10 @@ struct CompareItemInfo_t
 struct DetectPeriodConfig_t
 {
     int nID = 0;                            /* ID */
-    bool isApplySlient = false;             /* 非检测计划日期是否应用静音 */
-    bool isApplyOverload = false;           /* 非检测计划日期是否应用超载 */
-    bool isApplyPhase = false;              /* 非检测计划日期是否应用反相 */
-    bool isApplyNoise = false;              /* 非检测计划日期是否应用噪音 */
+    bool isApplySlient = false;             /* 计划日期是否应用静音 */
+    bool isApplyOverload = false;           /* 计划日期是否应用超载 */
+    bool isApplyPhase = false;              /* 计划日期是否应用反相 */
+    bool isApplyNoise = false;              /* 计划日期是否应用噪音 */
     QList<OnePlan_t> listDetect;            /* 检测计划列表 */
     QList<OnePlan_t> listNoDetect;          /* 非检测计划列表 */
 

+ 14 - 6
common/Network/FromWebAPI.cpp

@@ -576,6 +576,7 @@ bool FromWebAPI::getDetectPeriodConfig(QMap<int, DetectPeriodConfig_t>& mapDetec
         }
         nJson jsonResult = jsonRet["result"];
         mapDetectConfig.clear();
+        bool isOnceAsOthrer = true;
         for(const auto& it : jsonResult)
         {
             int id = it["itemid"].get<int>();
@@ -602,10 +603,17 @@ bool FromWebAPI::getDetectPeriodConfig(QMap<int, DetectPeriodConfig_t>& mapDetec
 
                 detectConfig.listNoDetect.append(plan);
 
+                
+            }
+            /* 获取计划是否应用于静音、过载、反相、噪音检测 */
+            if(isOnceAsOthrer)
+            {
                 detectConfig.isApplySlient = it["applyslient"].get<bool>();
                 detectConfig.isApplyOverload = it["applyoverload"].get<bool>();
                 detectConfig.isApplyPhase = it["applyphase"].get<bool>();
                 detectConfig.isApplyNoise = it["applynoise"].get<bool>();
+
+                isOnceAsOthrer = false; // 只需要获取一次就行了
             }
         }
 
@@ -638,11 +646,11 @@ bool FromWebAPI::insertDetectPeriodConfig(const QMap<int, DetectPeriodConfig_t>&
                 jsonPlan["timeStart"] = plan.timeStart.toString("HH:mm:ss").toStdString();
                 jsonPlan["timeEnd"] = plan.timeEnd.toString("HH:mm:ss").toStdString();
 
-                /* 检测计划这些全设置为false */
-                jsonPlan["applySlient"] = false;
-                jsonPlan["applyOverload"] = false;
-                jsonPlan["applyPhase"] = false;
-                jsonPlan["applyNoise"] = false;
+                /* 设置是否应用于其它检测 */
+                jsonPlan["applySlient"] = it.value().isApplySlient;
+                jsonPlan["applyOverload"] = it.value().isApplyOverload;
+                jsonPlan["applyPhase"] = it.value().isApplyPhase;
+                jsonPlan["applyNoise"] = it.value().isApplyNoise;
 
                 json1["paramList"] = jsonPlan;
                 jsonArray.push_back(json1);
@@ -662,7 +670,7 @@ bool FromWebAPI::insertDetectPeriodConfig(const QMap<int, DetectPeriodConfig_t>&
                 jsonPlan["timeStart"] = plan.timeStart.toString("HH:mm:ss").toStdString();
                 jsonPlan["timeEnd"] = plan.timeEnd.toString("HH:mm:ss").toStdString();
 
-                /* 非检测计划这些按照实际设置来 */
+                /* 设置是否应用于其它检测 */
                 jsonPlan["applySlient"] = it.value().isApplySlient;
                 jsonPlan["applyOverload"] = it.value().isApplyOverload;
                 jsonPlan["applyPhase"] = it.value().isApplyPhase;