Explorar o código

V0.2.5
1、完成了对比项的增删改查功能
2、完成了部分的读写数据库功能

Apple hai 3 semanas
pai
achega
55af97cc97
Modificáronse 44 ficheiros con 1915 adicións e 82 borrados
  1. 1 1
      CMakeLists.txt
  2. 20 3
      SQL/ACASetting.sql
  3. 86 0
      SQL/ACASetting.sqlbook
  4. 4 2
      SettingLibrary/CMakeLists.txt
  5. 23 0
      SettingLibrary/DataBase/GlobalInfo.cpp
  6. 46 0
      SettingLibrary/DataBase/GlobalInfo.h
  7. 3 3
      SettingLibrary/DataBase/GlobalVariable.cpp
  8. 4 4
      SettingLibrary/DataBase/GlobalVariable.h
  9. 27 0
      SettingLibrary/DataManager/CompareItemData.cpp
  10. 3 0
      SettingLibrary/DataManager/CompareItemData.h
  11. 15 0
      SettingLibrary/DialogBase/DialogBase.cpp
  12. 4 0
      SettingLibrary/DialogBase/DialogBase.h
  13. 42 6
      SettingLibrary/Modules/Basic/basicwidget.cpp
  14. 17 0
      SettingLibrary/Modules/Basic/basicwidget.h
  15. 188 22
      SettingLibrary/Modules/Basic/compareitemdialog.cpp
  16. 18 3
      SettingLibrary/Modules/Basic/compareitemdialog.h
  17. 127 25
      SettingLibrary/Modules/Basic/compareitemlistdialog.cpp
  18. 7 1
      SettingLibrary/Modules/Basic/compareitemlistdialog.h
  19. 31 0
      SettingLibrary/Modules/Basic/singlecompareroadwidget.cpp
  20. 5 0
      SettingLibrary/Modules/Basic/singlecompareroadwidget.h
  21. 213 0
      SettingLibrary/Modules/warning/warning.cpp
  22. 61 0
      SettingLibrary/Modules/warning/warning.h
  23. 137 0
      SettingLibrary/Modules/warning/warning.ui
  24. 122 0
      SettingLibrary/Modules/warning/warning_dark.qss
  25. 120 0
      SettingLibrary/Modules/warning/warning_light.qss
  26. 85 0
      SettingLibrary/Network/FromWebAPI.cpp
  27. 20 2
      SettingLibrary/Network/FromWebAPI.h
  28. 1 0
      SettingLibrary/Resources/QSS.qrc
  29. 4 0
      SettingLibrary/Resources/Resources.qrc
  30. BIN=BIN
      SettingLibrary/Resources/Tip/Complete2x.png
  31. BIN=BIN
      SettingLibrary/Resources/Tip/Failed2x.png
  32. BIN=BIN
      SettingLibrary/Resources/Tip/Tips2x.png
  33. BIN=BIN
      SettingLibrary/Resources/Tip/Wait2x.png
  34. 6 0
      SettingLibrary/Resources/qss/white/compareitemwidget.qss
  35. 80 1
      SettingLibrary/Resources/qss/white/setinfowidget.qss
  36. 5 0
      SettingLibrary/Resources/qss/white/singlecompareroadwidget.qss
  37. 114 0
      SettingLibrary/Resources/qss/white/warning.qss
  38. 1 0
      SettingLibrary/acaserversetinfo.cpp
  39. 112 4
      SettingLibrary/setinfomanager.cpp
  40. 21 3
      SettingLibrary/setinfomanager.h
  41. 58 0
      SettingLibrary/setinfowidget.cpp
  42. 17 1
      SettingLibrary/setinfowidget.h
  43. 66 0
      SettingLibrary/setinfowidget.ui
  44. 1 1
      show2/CMakeLists.txt

+ 1 - 1
CMakeLists.txt

@@ -100,7 +100,7 @@ endif()
 if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
 #    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
 #    #添加编译参数,这个参数会应用到全局,C和C++都会生效
-   add_compile_options(-Wall -g -O0)
+   add_compile_options(-Wall -g -O0 -Werror=return-type)
 #    add_compile_options(-O2)
     #添加GCC的宏定义
     add_compile_definitions(GCC)

+ 20 - 3
SQL/ACASetting.sql

@@ -2,12 +2,29 @@
 
 
 
+#对比项通道关联表
+SELECT *
+FROM tACACompareItemRoad;
+
+
+SELECT *
+FROM tServiceSetInfo;
+
 
 #对比项表
 SELECT *
-FROM tACACompareItem;
+FROM tACACompareItems;
+
+#获取所有的对比项信息
+SELECT *
+FROM tACACompareItems
+LEFT JOIN tACACompareItemRoad ON tACACompareItems.ItemID = tACACompareItemRoad.ItemID;
+
+#只获取对比项信息
+SELECT *
+FROM tACACompareItems;
 
-#声卡通道表
+#获取对比项的通道信息
 SELECT *
-FROM tACARoad;
+FROM tACACompareItemRoad;
 

+ 86 - 0
SQL/ACASetting.sqlbook

@@ -0,0 +1,86 @@
+-- SQLBook: Code
+-- Active: 1751960213665@@192.1.2.61@5236@EQM_CESHI
+
+#存储对比项的表格 tACACompareItems
+#对比项的对比通道表 tACACompareItemRoad
+
+#创建 tACACompareItems
+-- 创建表
+CREATE TABLE tACACompareItems
+(
+    ItemID INT PRIMARY KEY,
+    ItemName VARCHAR(64) NOT NULL,
+    ItemEnable BIT NOT NULL DEFAULT 1,
+    RoadCount INT DEFAULT 0,
+    SilentEnable BIT NOT NULL DEFAULT 0,
+    SilentThreshold INT DEFAULT 0,
+    SilentDuration INT DEFAULT 0,
+    SilentSensitivity INT DEFAULT 0,
+    OverloadEnable BIT NOT NULL DEFAULT 0,
+    OverloadThreshold INT DEFAULT 0,
+    OverloadDuration INT DEFAULT 0,
+    OverloadSensitivity INT DEFAULT 0,
+    PhaseEnable BIT NOT NULL DEFAULT 0,
+    PhaseThreshold DOUBLE DEFAULT 0,
+    PhaseDuration INT DEFAULT 0,
+    PhaseSensitivity INT DEFAULT 0
+);
+-- 表注释
+COMMENT ON TABLE tACACompareItems IS 'ACA对比项表';
+-- 字段注释
+COMMENT ON COLUMN tACACompareItems.ItemID IS '对比项ID';
+COMMENT ON COLUMN tACACompareItems.ItemName IS '对比项名称';
+COMMENT ON COLUMN tACACompareItems.ItemEnable IS '对比项是否启用';
+COMMENT ON COLUMN tACACompareItems.RoadCount IS '对比通道数';
+COMMENT ON COLUMN tACACompareItems.SilentEnable IS '是否启用静音';
+COMMENT ON COLUMN tACACompareItems.SilentThreshold IS '静音阈值';
+COMMENT ON COLUMN tACACompareItems.SilentDuration IS '静音持续时间';
+COMMENT ON COLUMN tACACompareItems.SilentSensitivity IS '静音灵敏度';
+COMMENT ON COLUMN tACACompareItems.OverloadEnable IS '是否启用过载';
+COMMENT ON COLUMN tACACompareItems.OverloadThreshold IS '过载阈值';
+COMMENT ON COLUMN tACACompareItems.OverloadDuration IS '过载持续时间';
+COMMENT ON COLUMN tACACompareItems.OverloadSensitivity IS '过载灵敏度';
+COMMENT ON COLUMN tACACompareItems.PhaseEnable IS '是否启用反相';
+COMMENT ON COLUMN tACACompareItems.PhaseThreshold IS '反相阈值';
+COMMENT ON COLUMN tACACompareItems.PhaseDuration IS '反相持续时间';
+COMMENT ON COLUMN tACACompareItems.PhaseSensitivity IS '反相灵敏度';
+-- 创建索引
+-- CREATE INDEX idx_tACACompareItems_ItemName ON tACACompareItems (ItemName);
+
+-- SQLBook: Code
+#删除 tACACompareItems
+DROP TABLE IF EXISTS "EQM_CESHI".tACACompareItems;
+-- SQLBook: Code
+
+#创建 tACACompareItemRoad
+#这里设置了级联删除,当 tACACompareItems 表中的某个对比项被删除时,tACACompareItemRoad 中对应的通道也会被删除。
+CREATE TABLE tACACompareItemRoad
+(
+    ItemID INT NOT NULL,
+    RoadNum INT NOT NULL,
+    RoadName VARCHAR(64) NOT NULL,
+    RoadRecordEnable BIT NOT NULL DEFAULT 1,
+    SoundCardNum INT NOT NULL DEFAULT 0,
+    SoundCardID VARCHAR(64),
+    SoundCardName VARCHAR(64),
+    SoundCardRoadNum INT NOT NULL DEFAULT 0,
+    ChannelID INT,
+    ChannelName VARCHAR(64),
+    PRIMARY KEY (ItemID, RoadNum),
+    FOREIGN KEY (ItemID) REFERENCES tACACompareItems(ItemID)
+        ON DELETE CASCADE
+);
+
+-- 表注释
+COMMENT ON TABLE tACACompareItemRoad IS '对比项通道表';
+-- 字段注释
+COMMENT ON COLUMN tACACompareItemRoad.ItemID IS '对比项ID';
+COMMENT ON COLUMN tACACompareItemRoad.RoadNum IS '通道编号,1是主通道,其他对比通道依次向后排';
+COMMENT ON COLUMN tACACompareItemRoad.RoadName IS '通道名称';
+COMMENT ON COLUMN tACACompareItemRoad.RoadRecordEnable IS '通道录音是否启用';
+COMMENT ON COLUMN tACACompareItemRoad.SoundCardNum IS '声卡编号,在系统中的编号';
+COMMENT ON COLUMN tACACompareItemRoad.SoundCardID IS '声卡ID,可以使用声卡ID来打开声卡';
+COMMENT ON COLUMN tACACompareItemRoad.SoundCardName IS '声卡名称';
+COMMENT ON COLUMN tACACompareItemRoad.SoundCardRoadNum IS '声卡通道编号,使用声卡编号和声卡通道编号开始录音';
+COMMENT ON COLUMN tACACompareItemRoad.ChannelID IS '频道ID';
+COMMENT ON COLUMN tACACompareItemRoad.ChannelName IS '频道名称';

+ 4 - 2
SettingLibrary/CMakeLists.txt

@@ -27,6 +27,7 @@ file(GLOB LOCAL_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/CheckPeriod/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/Database/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/Noise/*.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/Modules/warning/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/UIStyle/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/DialogBase/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/common/LHLog/*.cpp
@@ -60,8 +61,6 @@ add_library(${libName} SHARED
 #添加头文件
 target_include_directories(${libName} PRIVATE
 
-    ${CMAKE_CURRENT_SOURCE_DIR}
-
     ${CMAKE_SOURCE_DIR}/External/common
     ${CMAKE_SOURCE_DIR}/External/common/Shadow
     ${CMAKE_SOURCE_DIR}/External/common/WebAPI
@@ -70,8 +69,10 @@ target_include_directories(${libName} PRIVATE
     ${CMAKE_SOURCE_DIR}/External/common/TipWidget
     ${CMAKE_SOURCE_DIR}/External/module
     ${CMAKE_SOURCE_DIR}/External/module/mqtt
+    ${CMAKE_SOURCE_DIR}/External/module/nlohmann
 
 
+    ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMAKE_CURRENT_SOURCE_DIR}/DataBase
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/AICompare
@@ -79,6 +80,7 @@ target_include_directories(${libName} PRIVATE
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/CheckPeriod
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/Database
     ${CMAKE_CURRENT_SOURCE_DIR}/Modules/Noise
+    ${CMAKE_CURRENT_SOURCE_DIR}/Modules/warning
     ${CMAKE_CURRENT_SOURCE_DIR}/UIStyle
     ${CMAKE_CURRENT_SOURCE_DIR}/DialogBase
     ${CMAKE_CURRENT_SOURCE_DIR}/common/LHLog

+ 23 - 0
SettingLibrary/DataBase/GlobalInfo.cpp

@@ -0,0 +1,23 @@
+#include "GlobalInfo.h"
+
+
+GlobalInfo::~GlobalInfo()
+{
+
+}
+
+
+/* 初始化全局信息 */
+bool GlobalInfo::initGlobalInfo()
+{
+    
+    return true;
+}
+
+/* 设置对比项默认的参数 */
+void GlobalInfo::setDefaultCompareItem(const CompareItemInfo_t& item)
+{
+    m_defaultCompareItem = item;
+}
+
+

+ 46 - 0
SettingLibrary/DataBase/GlobalInfo.h

@@ -0,0 +1,46 @@
+#ifndef __GLOBALINFO_H__
+#define __GLOBALINFO_H__
+
+#include "GlobalVariable.h"
+
+
+/**
+ * @brief 全局信息类
+ * 
+ */
+
+#define GInfo GlobalInfo::instance()
+class GlobalInfo
+{
+    GlobalInfo() = default;
+    GlobalInfo(const GlobalInfo&) = delete;
+    GlobalInfo& operator=(const GlobalInfo&) = delete;
+public:
+    ~GlobalInfo();
+    static GlobalInfo& instance()
+    {
+        static GlobalInfo instance;
+        return instance;
+    }
+
+    /* 初始化全局信息 */
+    bool initGlobalInfo();
+
+    /* 获取默认的对比项参数 */
+    const CompareItemInfo_t& getDefaultCompareItem() const {return m_defaultCompareItem; }
+    /* 设置对比项默认的参数 */
+    void setDefaultCompareItem(const CompareItemInfo_t& item);
+    
+
+private:
+
+    
+
+private:
+    /* 对比项默认参数 */
+    CompareItemInfo_t m_defaultCompareItem;
+
+
+};
+
+#endif // __GLOBALINFO_H__

+ 3 - 3
SettingLibrary/DataBase/GlobalVariable.cpp

@@ -35,8 +35,8 @@ CompareItemInfo_t& CompareItemInfo_t::operator=(const CompareItemInfo_t &other)
     strName = other.strName;
     isEnable = other.isEnable;
     listRoads = other.listRoads;
-    muteParam = other.muteParam;
-    overloadParam = other.overloadParam;
-    phaseParam = other.phaseParam;
+    paramMute = other.paramMute;
+    paramOverload = other.paramOverload;
+    paramPhase = other.paramPhase;
     return *this;
 }

+ 4 - 4
SettingLibrary/DataBase/GlobalVariable.h

@@ -62,7 +62,7 @@ Q_DECLARE_METATYPE(SoundCardRoadInfo_t)
  */
 struct CompareItemTableItem_t
 {
-    int nSerialNum;             /* 序号 */
+    int nSerialNum;             /* 序号,在表格中的序号 */
     int nID;                    /* 对比项ID */
     QString strName;            /* 对比项名称 */
     bool isEnable;              /* 对比项状态,是否启用 */
@@ -114,9 +114,9 @@ struct CompareItemInfo_t
     QString strName;                            /* 对比项名称 */
     bool isEnable = false;                      /* 对比项状态,是否启用 */
     QList<CompareItemRoadInfo_t> listRoads;     /* 通道信息列表 */
-    CompareItemDetectParam_t muteParam;         /* 静音检测参数 */
-    CompareItemDetectParam_t overloadParam;     /* 过载检测参数 */
-    CompareItemDetectParam_t phaseParam;        /* 反相检测参数 */
+    CompareItemDetectParam_t paramMute;         /* 静音检测参数 */
+    CompareItemDetectParam_t paramOverload;     /* 过载检测参数 */
+    CompareItemDetectParam_t paramPhase;        /* 反相检测参数 */
 
     CompareItemInfo_t() = default;
     CompareItemInfo_t(const CompareItemInfo_t &other);

+ 27 - 0
SettingLibrary/DataManager/CompareItemData.cpp

@@ -23,6 +23,11 @@ bool CompareItemDataManager::init()
 /* 添加一个对比项 */
 bool CompareItemDataManager::addCompareItem(const CompareItemInfo_t& item)
 {
+    if(item.nID <= 0)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 无效,无法添加", item.nID);
+        return false;
+    }
     if(isCompareItemExist(item.nID))
     {
         SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 已经存在,无法添加", item.nID);
@@ -101,3 +106,25 @@ int CompareItemDataManager::getUnusedCompareItemID() const
     return nID;
 }
 
+/* 获取表格需要的对比项数据 */
+QList<CompareItemTableItem_t> CompareItemDataManager::getCompareItemTableData() const
+{
+    QList<CompareItemTableItem_t> result;
+    int nSerialNum = 1; // 序号从1开始
+    for(const auto& compareItem : m_listCompareItems)
+    {
+        CompareItemTableItem_t tableItem;
+        tableItem.nSerialNum = nSerialNum;
+        tableItem.nID = compareItem.nID;
+        tableItem.strName = compareItem.strName;
+        tableItem.isEnable = compareItem.isEnable;
+        tableItem.nChannelCount = compareItem.listRoads.size(); // 通道数
+        // 添加到结果列表
+        result.append(tableItem);
+        // 序号自增
+        nSerialNum++;
+    }
+
+    return result;
+}
+

+ 3 - 0
SettingLibrary/DataManager/CompareItemData.h

@@ -38,6 +38,9 @@ public:
     /* 获取一个未使用的对比项ID */
     int getUnusedCompareItemID() const;
 
+    /* 获取表格需要的对比项数据 */
+    QList<CompareItemTableItem_t> getCompareItemTableData() const;
+
 private:
     std::shared_ptr<spdlog::logger> m_logger = nullptr;
     /* 对比项列表 */

+ 15 - 0
SettingLibrary/DialogBase/DialogBase.cpp

@@ -112,6 +112,21 @@ bool DialogBase::isOKClicked()
     return true;
 }
 
+/* 设置一个控件报警,边框显示红色
+ * 注意:这个功能需要在qss里设置属性[Warn=true],并实现相应的报警样式 */
+void DialogBase::setWarn(QWidget* widget, bool isWarn)
+{
+    if(widget == nullptr)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "设置控件报警失败,widget为nullptr");
+        return;
+    }
+    widget->setProperty("Warn", isWarn);
+    widget->style()->unpolish(widget);
+    widget->style()->polish(widget);
+    widget->update();
+}
+
 /* 初始化UI */
 void DialogBase::initUI()
 {

+ 4 - 0
SettingLibrary/DialogBase/DialogBase.h

@@ -52,6 +52,10 @@ protected:
     /* 点击确定按钮之前执行的操作 */
     virtual bool isOKClicked();
 
+    /* 设置一个控件报警,边框显示红色
+     * 注意:这个功能需要在qss里设置属性[Warn=true],并实现相应的报警样式 */
+    void setWarn(QWidget* widget, bool isWarn = true);
+
 protected:
     /* 初始化UI */
     virtual void initUI();

+ 42 - 6
SettingLibrary/Modules/Basic/basicwidget.cpp

@@ -5,6 +5,7 @@
 #include "DialogBase.h"
 #include "UIStyleManager.h"
 #include "customcombobox.h"
+#include "CompareItemData.h"
 
 
 BasicWidget::BasicWidget(QWidget *parent) :
@@ -13,8 +14,12 @@ BasicWidget::BasicWidget(QWidget *parent) :
 {
     ui->setupUi(this);
 
-    
-
+    m_logger = spdlog::get("ACASetting");
+    if(m_logger == nullptr)
+    {
+        fmt::print("BasicWidget: Logger ACASetting not found\n");
+        return;
+    }
 
 
     connect(ui->pBtn_compareItem, &QPushButton::clicked, this, &BasicWidget::do_pBtn_CompareItemClicked);
@@ -37,12 +42,43 @@ BasicWidget::~BasicWidget()
     delete ui;
 }
 
+/* 保存数据 */
+void BasicWidget::saveBasicInfo()
+{
+    /* 保存基础信息 */
+    saveBasicSettingInfo();
+    /* 保存对比项信息 */
+    saveCompareItemInfo();
+}
+
 void BasicWidget::do_pBtn_CompareItemClicked()
 {
     CompareItemListDialog dlg;
+    /* 设置已有的对比项列表 */
+    dlg.setCompareItemList(CIData.getCompareItemTableData());
     dlg.exec();
-    // DialogBase dlg;
-    // dlg.setTitle("测试标题");
-    // dlg.resize(400, 300);
-    // dlg.exec();
 }
+
+/* 保存基础信息 */
+void BasicWidget::saveBasicSettingInfo()
+{
+
+}
+
+/* 保存对比项信息
+ * 先获取数据库中的对比项信息,和现有的进行对比一下,找出新增、修改、删除的对比项。
+ * 新增的对比项直接添加到数据库中,修改的对比项更新到数据库中,删除的对比项从数据库中删除。
+ */
+void BasicWidget::saveCompareItemInfo()
+{
+    if(m_fromWebAPI == nullptr)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "WebAPI 未设置指针,无法保存对比项信息");
+        return;
+    }
+
+    /* 先获取数据库中的对比项信息 */
+    QList<CompareItemInfo_t> dbCompareItems;
+}
+
+

+ 17 - 0
SettingLibrary/Modules/Basic/basicwidget.h

@@ -2,6 +2,8 @@
 #define BASICWIDGET_H
 
 #include <QWidget>
+#include "FromWebAPI.h"
+#include "spdlog/spdlog.h"
 
 namespace Ui {
 class BasicWidget;
@@ -20,12 +22,27 @@ public:
     explicit BasicWidget(QWidget *parent = nullptr);
     ~BasicWidget();
 
+    /* 保存数据 */
+    void saveBasicInfo();
+    /* 设置WebAPI指针 */
+    void setWebAPI(FromWebAPI* api) { m_fromWebAPI = api; }
+
 private slots:
     /* 对比项配置 */
     void do_pBtn_CompareItemClicked();
 
+private:
+    /* 保存基础信息 */
+    void saveBasicSettingInfo();
+    /* 保存对比项信息 */
+    void saveCompareItemInfo();
+
+
 private:
     Ui::BasicWidget *ui;
+    std::shared_ptr<spdlog::logger> m_logger = nullptr;
+
+    FromWebAPI* m_fromWebAPI = nullptr;
 };
 
 #endif // BASICWIDGET_H

+ 188 - 22
SettingLibrary/Modules/Basic/compareitemdialog.cpp

@@ -5,6 +5,8 @@
 #include "SoundCardData.h"
 #include "tipwidget.h"
 
+#include <QIntValidator>
+
 
 CompareItemDialog::CompareItemDialog(QWidget *parent)
     : DialogBase(parent)
@@ -18,12 +20,8 @@ CompareItemDialog::CompareItemDialog(QWidget *parent)
     /* 设置标题 */
     setTitle("对比项信息", QSize(120, 18));
 
-    /* 连接信号和槽 */
-    connect(ui->pBtn_add, &QPushButton::clicked, this, &CompareItemDialog::do_pBtn_add_clicked);
-    /* 连接静音、过载、反相三个按钮的开关 */
-    connect(ui->checkBoxMute, &QCheckBox::clicked, this, &CompareItemDialog::do_checkBox_MOP_clicked);
-    connect(ui->checkBoxOverload, &QCheckBox::clicked, this, &CompareItemDialog::do_checkBox_MOP_clicked);
-    connect(ui->checkBoxPhase, &QCheckBox::clicked, this, &CompareItemDialog::do_checkBox_MOP_clicked);
+    /* 对输入做一些限制 */
+    setDetectParamInputOnlyNumber();
 
     /* 设置默认开启 */
     ui->checkBoxMute->setChecked(true);
@@ -34,6 +32,15 @@ CompareItemDialog::CompareItemDialog(QWidget *parent)
     ui->widget_mainRoad->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
     ui->widget_secondRoad->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
 
+
+    /* 连接信号和槽 */
+    connect(ui->pBtn_add, &QPushButton::clicked, this, &CompareItemDialog::do_pBtn_add_clicked);
+    /* 连接静音、过载、反相三个按钮的开关 */
+    connect(ui->checkBoxMute, &QCheckBox::clicked, this, &CompareItemDialog::do_checkBox_MOP_clicked);
+    connect(ui->checkBoxOverload, &QCheckBox::clicked, this, &CompareItemDialog::do_checkBox_MOP_clicked);
+    connect(ui->checkBoxPhase, &QCheckBox::clicked, this, &CompareItemDialog::do_checkBox_MOP_clicked);
+
+
     /* 设置样式 */
     setQSS();
 }
@@ -43,6 +50,63 @@ CompareItemDialog::~CompareItemDialog()
     delete ui;
 }
 
+
+/* 设置默认的参数 */
+void CompareItemDialog::setDefaultParams(const CompareItemInfo_t& item)
+{
+    m_compareItemInfo = item; // 保存对比项信息
+    /* 设置对比项名称 */
+    ui->lineEdit_compareItmName->setText(item.strName);
+    /* 设置对比项状态 */
+    ui->checkBox_enable->setChecked(item.isEnable);
+
+    /* 设置静音检测参数 */
+    ui->checkBoxMute->setChecked(item.paramMute.isEnable);
+    ui->lineEditMuteLen->setText(QString::number(item.paramMute.nLen));
+    ui->lineEditMuteSensibility->setText(QString::number(item.paramMute.nSensibility));
+    ui->lineEditMuteThreshold->setText(QString::number(item.paramMute.threshold.nThreshold));
+
+    /* 设置过载检测参数 */
+    ui->checkBoxOverload->setChecked(item.paramOverload.isEnable);
+    ui->lineEditOverloadLen->setText(QString::number(item.paramOverload.nLen));
+    ui->lineEditOverloadSensibility->setText(QString::number(item.paramOverload.nSensibility));
+    ui->lineEditOverloadThreshold->setText(QString::number(item.paramOverload.threshold.nThreshold));
+
+    /* 设置反相检测参数 */
+    ui->checkBoxPhase->setChecked(item.paramPhase.isEnable);
+    ui->lineEditPhaseLen->setText(QString::number(item.paramPhase.nLen));
+    ui->lineEditPhaseSensibility->setText(QString::number(item.paramPhase.nSensibility));
+    ui->lineEditPhaseThreshold->setText(QString::number(item.paramPhase.threshold.dThreshold));
+
+    /* 先设置主通道和第二通道 */
+    for(const auto& road : item.listRoads)
+    {
+        if(road.nCompareRoadNum == 1) // 主通道
+        {
+            ui->widget_mainRoad->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
+            ui->widget_mainRoad->setDefaultParams(road);
+        }
+        else if(road.nCompareRoadNum == 2) // 第二通道
+        {
+            ui->widget_secondRoad->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
+            ui->widget_secondRoad->setDefaultParams(road);
+        }
+    }
+    /* 设置其他通道 */
+    for(const auto& road : item.listRoads)
+    {
+        if(road.nCompareRoadNum > 2) // 其他通道
+        {
+            SingleCompareRoadWidget *pWgt = addOneRoadWidget(road.nCompareRoadNum, true);
+            pWgt->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
+            pWgt->setDefaultParams(road);
+            m_listOtherRoadWgt.append(pWgt);
+        }
+    }
+}
+
+
+
 /* 获取生成的对比项信息 */
 CompareItemInfo_t& CompareItemDialog::getCompareItemInfo()
 {
@@ -54,19 +118,9 @@ CompareItemInfo_t& CompareItemDialog::getCompareItemInfo()
 /* 新增通道 */
 void CompareItemDialog::do_pBtn_add_clicked()
 {
-    QVBoxLayout* pLayout = qobject_cast<QVBoxLayout*>(ui->scrollAreaWidgetContents->layout());
-    if(pLayout)
-    {
-        SingleCompareRoadWidget *pWgt = new SingleCompareRoadWidget(this);
-        connect(pWgt, &SingleCompareRoadWidget::deleted, this, &CompareItemDialog::do_CompareRoadWgtDeleted);
-        pWgt->setIndex(m_listOtherRoadWgt.size() + 3);
-        pWgt->setDelBtnVisible(true);
-        /* 设置可选通道列表 */
-        pWgt->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
-        pWgt->setStyleSheet(m_qssRecordRoad);
-        pLayout->insertWidget(m_listOtherRoadWgt.size(), pWgt);
-        m_listOtherRoadWgt.append(pWgt);
-    }
+    /* 从3开始编号,1是主通道,2是第二通道 */
+    int index = m_listOtherRoadWgt.size() + 3;
+    addOneRoadWidget(index, true);
 }
 
 /* 删除通道 */
@@ -187,9 +241,53 @@ void CompareItemDialog::setMOPEditable(EDBType type, bool editable)
     }
 }
 
+/* 设置检测参数输入栏只能输入数字 */
+void CompareItemDialog::setDetectParamInputOnlyNumber()
+{
+    // 静音参数,只允许输入1~1000的整数
+    ui->lineEditMuteThreshold->setValidator(new QIntValidator(40, 84, this));
+    ui->lineEditMuteLen->setValidator(new QIntValidator(2, 90, this));
+    ui->lineEditMuteSensibility->setValidator(new QIntValidator(22, 100, this));
+
+    // 过载参数
+    ui->lineEditOverloadThreshold->setValidator(new QIntValidator(0, 40, this));
+    ui->lineEditOverloadLen->setValidator(new QIntValidator(2, 90, this));
+    ui->lineEditOverloadSensibility->setValidator(new QIntValidator(22, 100, this));
+
+    // 反相参数,阈值为浮点数,范围0.0~100.0
+    ui->lineEditPhaseThreshold->setValidator(new QDoubleValidator(0.0, 0.99, 2, this));
+    ui->lineEditPhaseLen->setValidator(new QIntValidator(10, 90, this));
+    ui->lineEditPhaseSensibility->setValidator(new QIntValidator(20, 99, this));
+
+}
+
+/* 新增一个通道 */
+SingleCompareRoadWidget* CompareItemDialog::addOneRoadWidget(int nIndex, bool bDelBtnVisible)
+{
+    QVBoxLayout* pLayout = qobject_cast<QVBoxLayout*>(ui->scrollAreaWidgetContents->layout());
+    if(pLayout == nullptr)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "滚动区域内容布局未设置,无法添加通道");
+        return nullptr;
+    }
+    SingleCompareRoadWidget *pWgt = new SingleCompareRoadWidget(this);
+    connect(pWgt, &SingleCompareRoadWidget::deleted, this, &CompareItemDialog::do_CompareRoadWgtDeleted);
+    pWgt->setIndex(nIndex);
+    pWgt->setDelBtnVisible(bDelBtnVisible);
+    /* 设置可选通道列表 */
+    pWgt->setSoundCardRoadList(SoundCards.getSoundCardRoadList());
+    pWgt->setStyleSheet(m_qssRecordRoad);
+    pLayout->insertWidget(m_listOtherRoadWgt.size(), pWgt);
+    m_listOtherRoadWgt.append(pWgt);
+    
+    return pWgt;
+}
+
 /* 重载按下关闭按钮之前的操作 */
 bool CompareItemDialog::isOKClicked()
 {
+    /* 先取消所有的报警 */
+    cancelAllWarn();
     /* 获取对比项的信息 */
     if(!getCompareItemBaseInfo(m_compareItemInfo))
     {
@@ -203,6 +301,10 @@ bool CompareItemDialog::isOKClicked()
     }
 
     /* 获取音频检测信息 */
+    if(!getAudioDetectInfo(m_compareItemInfo))
+    {
+        return false;
+    }
 
     return true;
 }
@@ -212,7 +314,8 @@ bool CompareItemDialog::getCompareItemBaseInfo(CompareItemInfo_t& compareItemInf
 {
     if(ui->lineEdit_compareItmName->text().isEmpty())
     {
-        TipWidget::display(TipWidget::OPERATOR_WARN, "对比项名称不能为空");
+        setWarn(ui->lineEdit_compareItmName, true);
+        TipWidget::display(TipWidget::OPERATOR_WARN, "对比项名称不能为空", this);
         return false;
     }
     compareItemInfo.strName = ui->lineEdit_compareItmName->text();
@@ -227,13 +330,47 @@ bool CompareItemDialog::getCompareRoadInfo(CompareItemInfo_t& compareItemInfo)
     compareItemInfo.listRoads.clear();
     /* 获取主通道信息 */
     CompareItemRoadInfo_t mainRoadInfo;
-    mainRoadInfo.nCompareRoadNum = 1;
     mainRoadInfo.strCompareRoadName = ui->widget_mainRoad->getRoadName();
+    mainRoadInfo.nCompareRoadNum = ui->widget_mainRoad->getIndex();
+    mainRoadInfo.isEnableRecord = ui->widget_mainRoad->isRecordEnabled();
+    mainRoadInfo.scRoadInfo = ui->widget_mainRoad->getSoundCardRoadInfo();
     if(mainRoadInfo.strCompareRoadName.isEmpty())
     {
-        TipWidget::display(TipWidget::OPERATOR_WARN, "主通道名称不能为空");
+        ui->widget_mainRoad->setRoadNameWarn(true);
+        TipWidget::display(TipWidget::OPERATOR_WARN, "主通道名称不能为空", this);
+        return false;
+    }
+    compareItemInfo.listRoads.append(mainRoadInfo);
+    /* 获取第二通道信息 */
+    CompareItemRoadInfo_t secondRoadInfo;
+    secondRoadInfo.strCompareRoadName = ui->widget_secondRoad->getRoadName();
+    secondRoadInfo.nCompareRoadNum = ui->widget_secondRoad->getIndex();
+    secondRoadInfo.isEnableRecord = ui->widget_secondRoad->isRecordEnabled();
+    secondRoadInfo.scRoadInfo = ui->widget_secondRoad->getSoundCardRoadInfo();
+    if(secondRoadInfo.strCompareRoadName.isEmpty())
+    {
+        ui->widget_secondRoad->setRoadNameWarn(true);
+        TipWidget::display(TipWidget::OPERATOR_WARN, "第二通道名称不能为空", this);
         return false;
     }
+    compareItemInfo.listRoads.append(secondRoadInfo);
+
+    /* 获取其他通道信息 */
+    for(SingleCompareRoadWidget* roadWgt : m_listOtherRoadWgt)
+    {
+        CompareItemRoadInfo_t otherRoadInfo;
+        otherRoadInfo.strCompareRoadName = roadWgt->getRoadName();
+        otherRoadInfo.nCompareRoadNum = roadWgt->getIndex();
+        otherRoadInfo.isEnableRecord = roadWgt->isRecordEnabled();
+        otherRoadInfo.scRoadInfo = roadWgt->getSoundCardRoadInfo();
+        if(otherRoadInfo.strCompareRoadName.isEmpty())
+        {
+            roadWgt->setRoadNameWarn(true);
+            TipWidget::display(TipWidget::OPERATOR_WARN, QString("第%1通道名称不能为空").arg(otherRoadInfo.nCompareRoadNum), this);
+            return false;
+        }
+        compareItemInfo.listRoads.append(otherRoadInfo);
+    }
 
     return true;
 }
@@ -241,8 +378,37 @@ bool CompareItemDialog::getCompareRoadInfo(CompareItemInfo_t& compareItemInfo)
 /* 获取音频检测信息 */
 bool CompareItemDialog::getAudioDetectInfo(CompareItemInfo_t& compareItemInfo)
 {
+    /* 静音检测 */
+    compareItemInfo.paramMute.isEnable = ui->checkBoxMute->isChecked();
+    compareItemInfo.paramMute.threshold.nThreshold = ui->lineEditMuteThreshold->text().toULongLong();
+    compareItemInfo.paramMute.nLen = ui->lineEditMuteLen->text().toInt();
+    compareItemInfo.paramMute.nSensibility = ui->lineEditMuteSensibility->text().toInt();
+
+    /* 过载检测 */
+    compareItemInfo.paramOverload.isEnable = ui->checkBoxOverload->isChecked();
+    compareItemInfo.paramOverload.threshold.nThreshold = ui->lineEditOverloadThreshold->text().toULongLong();
+    compareItemInfo.paramOverload.nLen = ui->lineEditOverloadLen->text().toInt();
+    compareItemInfo.paramOverload.nSensibility = ui->lineEditOverloadSensibility->text().toInt();
+
+    /* 反相检测 */
+    compareItemInfo.paramPhase.isEnable = ui->checkBoxPhase->isChecked();
+    compareItemInfo.paramPhase.threshold.dThreshold = ui->lineEditPhaseThreshold->text().toDouble();
+    compareItemInfo.paramPhase.nLen = ui->lineEditPhaseLen->text().toInt();
+    compareItemInfo.paramPhase.nSensibility = ui->lineEditPhaseSensibility->text().toInt();
 
     return true;
 }
 
+/* 取消所有的报警 */
+void CompareItemDialog::cancelAllWarn()
+{
+    setWarn(ui->lineEdit_compareItmName, false);
+    ui->widget_mainRoad->setRoadNameWarn(false);
+    ui->widget_secondRoad->setRoadNameWarn(false);
+    for(SingleCompareRoadWidget* roadWgt : m_listOtherRoadWgt)
+    {
+        roadWgt->setRoadNameWarn(false);
+    }
+}
+
 

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

@@ -21,7 +21,10 @@ enum class EDBType
 
 
 
-
+/**
+ * @brief 对比项设置页面
+ * 
+ */
 class CompareItemDialog : public DialogBase
 {
     Q_OBJECT
@@ -30,6 +33,9 @@ public:
     explicit CompareItemDialog(QWidget *parent = nullptr);
     ~CompareItemDialog();
 
+    /* 设置默认的参数 */
+    void setDefaultParams(const CompareItemInfo_t& item);
+
     /* 获取生成的对比项信息 */
     CompareItemInfo_t& getCompareItemInfo();
 
@@ -48,8 +54,12 @@ private:
     void setQSS();
     /* 设置静音过载反相可编辑 */
     void setMOPEditable(EDBType type, bool editable);
-    
-    /* 重载按下关闭按钮之前的操作 */
+    /* 设置检测参数输入栏只能输入数字 */
+    void setDetectParamInputOnlyNumber();
+
+    /* 新增一个通道 */
+    SingleCompareRoadWidget* addOneRoadWidget(int nIndex, bool bDelBtnVisible = true);
+    /* 重载按下关闭按钮之后,弹窗关闭之前的操作,在这里更新成员变量对比项信息 */
     bool isOKClicked() override;
     /* 获取对比项的基础信息 */
     bool getCompareItemBaseInfo(CompareItemInfo_t& compareItemInfo);
@@ -58,6 +68,11 @@ private:
     /* 获取音频检测信息 */
     bool getAudioDetectInfo(CompareItemInfo_t& compareItemInfo);
 
+    /* 取消所有的报警 */
+    void cancelAllWarn();
+
+
+
 private:
     Ui::CompareItemWidget *ui;
     QList<SingleCompareRoadWidget*> m_listOtherRoadWgt;

+ 127 - 25
SettingLibrary/Modules/Basic/compareitemlistdialog.cpp

@@ -1,13 +1,16 @@
 #include "compareitemlistdialog.h"
 #include "ui_compareitemlistwidget.h"
-#include "compareitemdialog.h"
-
-#include "UIStyleManager.h"
-#include <qwidget.h>
 
 
 
+#include <QWidget>
 
+#include "compareitemdialog.h"
+#include "UIStyleManager.h"
+#include "CompareItemData.h"
+#include "GlobalInfo.h"
+#include "tipwidget.h"
+#include "warning.h"
 
 
 /* 重载比较函数 */
@@ -82,6 +85,16 @@ CompareItemListDialog::~CompareItemListDialog()
     delete ui;
 }
 
+/* 设置已有的对比项数据 */
+void CompareItemListDialog::setCompareItemList(const QList<CompareItemTableItem_t>& list)
+{
+    for(const CompareItemTableItem_t& item : list)
+    {
+        /* 添加到表格中 */
+        addRow(item);
+    }
+}
+
 /* 点击了关闭按钮 */
 void CompareItemListDialog::do_pBtn_close_Clicked()
 {
@@ -92,19 +105,106 @@ void CompareItemListDialog::do_pBtn_close_Clicked()
 void CompareItemListDialog::do_pBtn_add_Clicked()
 {
     CompareItemDialog dlg;
+    /* 设置默认参数 */
+    dlg.setDefaultParams(GInfo.getDefaultCompareItem());
     dlg.exec();
+    /* 判断是否按下了确定按钮 */
+    if(!dlg.isOK())
+    {
+        return; /* 如果没有按下确定按钮,直接返回 */
+    }
+
+    /* 获取对比项信息 */
+    CompareItemInfo_t ciInfo = dlg.getCompareItemInfo();
+    /* 获取一个未使用的对比项ID */
+    int id = CIData.getUnusedCompareItemID();
+    /* 添加到全局对比项数据中 */
+    ciInfo.nID = id; /* 设置对比项ID */
+    CIData.addCompareItem(ciInfo);
+    /* 添加到表格中 */
+    CompareItemTableItem_t tableItem;
+    tableItem.nSerialNum = m_model->rowCount() + 1; /* 序号 */
+    tableItem.nID = ciInfo.nID; /* 对比项ID */
+    tableItem.strName = ciInfo.strName; /* 对比项名称 */
+    tableItem.isEnable = ciInfo.isEnable; /* 对比项状态 */
+    tableItem.nChannelCount = ciInfo.listRoads.size(); /* 通道数 */
+
+    addRow(tableItem);
+    
 }
 
 /* 点击了删除按钮 */
 void CompareItemListDialog::do_pBtn_delete_Clicked()
 {
-
+    /* 获取是否有选中的行 */
+    QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
+    if(selectedRows.isEmpty())
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要删除的对比项", this);
+        return;
+    }
+    /* 确认删除 */
+    Warning w;
+    w.setTitle("删除对比项");
+    w.setText("是否确认删除选中的对比项?");
+    w.exec();
+    if(!w.isOk())
+    {
+        return; /* 如果没有按下确定按钮,直接返回 */
+    }
+    /* 删除选中的行 */
+    for(const QModelIndex& index : selectedRows)
+    {
+        /* 获取对比项ID */
+        int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
+        /* 从全局对比项数据中删除 */
+        CIData.removeCompareItem(nID);
+        /* 从表格模型中删除 */
+        m_model->removeRow(index.row());
+    }
 }
 
 /* 点击了编辑按钮 */
 void CompareItemListDialog::do_pBtn_edit_Clicked()
 {
-
+    /* 获取是否有选中的行 */
+    QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
+    if(selectedRows.isEmpty())
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要编辑的对比项", this);
+        return;
+    }
+    /* 只取出第一个 */
+    QModelIndex index = selectedRows.first();
+    /* 获取对比项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, "对比项不存在,无法编辑", this);
+        SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法编辑", nID);
+        return;
+    }
+    /* 打开对比项编辑对话框 */
+    CompareItemDialog dlg;
+    /* 设置默认参数 */
+    dlg.setDefaultParams(ciInfo);
+    dlg.exec();
+    /* 判断是否按下了确定按钮 */
+    if(!dlg.isOK())
+    {
+        return; /* 如果没有按下确定按钮,直接返回 */
+    }
+    /* 获取对比项信息 */
+    CompareItemInfo_t newCiInfo = dlg.getCompareItemInfo();
+    /* 修改全局对比项数据 */
+    if(!CIData.modifyCompareItem(newCiInfo))
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "对比项修改失败,请稍后重试", this);
+        SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 修改失败", nID);
+        return;
+    }
 }
 
 /* 初始化表格 */
@@ -164,36 +264,38 @@ void CompareItemListDialog::initTable()
     ui->tableView->setColumnWidth(4, 96);   /* 第五列宽度 */
 
     /* 测试用,加入两列数据 */
-    for(int i = 0; i < 10; ++i)
-    {
-        CompareItemTableItem_t item;
-        item.nSerialNum = i + 1; /* 序号 */
-        item.nID = i + 1000; /* 对比项ID */
-        item.strName = QString("对比项%1").arg(i + 1); /* 对比项名称 */
-        item.isEnable = (i % 2 == 0); /* 偶数启用,奇数未启用 */
-        item.nChannelCount = i + 1; /* 通道数 */
-
-        addRow(item);
-    }
+    // for(int i = 0; i < 10; ++i)
+    // {
+    //     CompareItemTableItem_t item;
+    //     item.nSerialNum = i + 1; /* 序号 */
+    //     item.nID = i + 1000; /* 对比项ID */
+    //     item.strName = QString("对比项%1").arg(i + 1); /* 对比项名称 */
+    //     item.isEnable = (i % 2 == 0); /* 偶数启用,奇数未启用 */
+    //     item.nChannelCount = i + 1; /* 通道数 */
+
+    //     addRow(item);
+    // }
 }
 
 
 /* 添加一行 */
-void CompareItemListDialog::addRow(CompareItemTableItem_t item)
+void CompareItemListDialog::addRow(CompareItemTableItem_t tableItem)
 {
     QList<QStandardItem*> items;
     /* 序号 */
-    QStandardItem* item1 = new QStandardItem(QString::number(item.nSerialNum));
-    item1->setCheckable(true);
-    item1->setCheckState(Qt::Unchecked);
-    items.append(item1); 
+    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 = item.isEnable ? "启用" : "未启用";
+    QString status = tableItem.isEnable ? "启用" : "未启用";
     items.append(new QStandardItem(status));
     /* 对比项 */
-    items.append(new QStandardItem(item.strName));
+    items.append(new QStandardItem(tableItem.strName));
     /* 通道数 */
-    items.append(new QStandardItem(QString::number(item.nChannelCount)));
+    items.append(new QStandardItem(QString::number(tableItem.nChannelCount)));
     /* 操作 */
     items.append(new QStandardItem("详情"));
 

+ 7 - 1
SettingLibrary/Modules/Basic/compareitemlistdialog.h

@@ -30,6 +30,7 @@ protected:
 
 /**
  * @brief 对比项列表弹窗
+ *        1、对比项具体数据在全局变量中存储,表格中主要存储对比项的ID,用这个ID去查找对比项的具体数据
  * 
  */
 namespace Ui {
@@ -44,6 +45,9 @@ public:
     explicit CompareItemListDialog(QWidget *parent = nullptr);
     ~CompareItemListDialog() override;
 
+    /* 设置已有的对比项数据 */
+    void setCompareItemList(const QList<CompareItemTableItem_t>& list);
+
 private slots:
     /* 点击了关闭按钮 */
     void do_pBtn_close_Clicked();
@@ -59,7 +63,7 @@ private:
     /* 初始化表格 */
     void initTable();
     /* 添加一行 */
-    void addRow(CompareItemTableItem_t item);
+    void addRow(CompareItemTableItem_t tableItem);
 
 private:
     Ui::CompareItemListWidget *ui;
@@ -68,6 +72,8 @@ private:
     QStandardItemModel* m_model;    /* 表格模型,存储数据 */
     CSortModel* m_sortModel;        /* 排序模型 */
 
+    const int m_userRole_CompareItemID = Qt::UserRole + 1;  /* 自定义角色,用于存储对比项ID */
+
 };
 
 #endif // COMPAREITEMLISTDIALOG_H

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

@@ -39,6 +39,26 @@ void SingleCompareRoadWidget::setSoundCardRoadList(const QList<SoundCardRoadInfo
     }
 }
 
+/* 设置默认参数,设置之前需要先设置完成声卡可选通道列表 */
+void SingleCompareRoadWidget::setDefaultParams(const CompareItemRoadInfo_t& roadInfo)
+{
+    ui->lineEditRoadName->setText(roadInfo.strCompareRoadName);
+    ui->checkBox->setChecked(roadInfo.isEnableRecord);
+    // setIndex(roadInfo.nCompareRoadNum);  /* 通道编号不需要设置 */
+    /* 先清空选择,再设置当前选项 */
+    ui->comboBox_soundCardNum->setCurrentIndex(-1);
+    for(int i = 0; i < ui->comboBox_soundCardNum->count(); ++i)
+    {
+        SoundCardRoadInfo_t road = ui->comboBox_soundCardNum->itemData(i).value<SoundCardRoadInfo_t>();
+        if(road.roadInfo.nRoadNum == roadInfo.scRoadInfo.roadInfo.nRoadNum &&
+           road.nSoundCardNum == roadInfo.scRoadInfo.nSoundCardNum)
+        {
+            ui->comboBox_soundCardNum->setCurrentIndex(i);
+            break;
+        }
+    }
+}
+
 int SingleCompareRoadWidget::getIndex() const
 {
     return m_nIndex;
@@ -75,3 +95,14 @@ bool SingleCompareRoadWidget::isRecordEnabled() const
     return ui->checkBox->isChecked();
 }
 
+/* 设置通道名称报警 */
+void SingleCompareRoadWidget::setRoadNameWarn(bool isWarn)
+{
+    ui->lineEditRoadName->setProperty("Warn", isWarn);
+    ui->lineEditRoadName->style()->unpolish(ui->lineEditRoadName);
+    ui->lineEditRoadName->style()->polish(ui->lineEditRoadName);
+    ui->lineEditRoadName->update();
+}
+
+
+

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

@@ -26,6 +26,8 @@ public:
 
     /* 设置声卡通道列表 */
     void setSoundCardRoadList(const QList<SoundCardRoadInfo_t>& listRoad);
+    /* 设置默认参数,设置之前需要先设置完成声卡可选通道列表 */
+    void setDefaultParams(const CompareItemRoadInfo_t& roadInfo);
 
     /* 获取设置编号 */
     int getIndex() const;
@@ -37,6 +39,9 @@ public:
     /* 是否开启录音 */
     bool isRecordEnabled() const;
 
+    /* 设置通道名称报警 */
+    void setRoadNameWarn(bool isWarn);
+
 signals:
     void deleted(int nIndex);
 

+ 213 - 0
SettingLibrary/Modules/warning/warning.cpp

@@ -0,0 +1,213 @@
+#include "warning.h"
+#include "ui_warning.h"
+
+#include <QPainter>
+#include <QLayout>
+#include <QDebug>
+#include <QFile>
+#include <QStyle>
+#include <QMouseEvent>
+
+#include "OneShadowEffect.h"
+#include "UIStyleManager.h"
+#include "spdlog/spdlog.h"
+
+
+Warning::Warning(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::Warning)
+{
+    ui->setupUi(this);
+    /* 设置无边框和背景透明 */
+    this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
+    this->setAttribute(Qt::WA_TranslucentBackground);
+
+    /* 加载QSS */
+    // QFile file(":/QSS/QSS/warning_light.qss");
+    // if(file.open(QFile::ReadOnly))
+    // {
+    //     QString styleSheet = file.readAll();
+    //     this->setStyleSheet(styleSheet);
+    //     file.close();
+    // }
+
+    /* 设置文字自动换行 */
+    ui->label_Warn->setWordWrap(true);
+    /* 设置文本居中 */
+    // ui->label_Warn->setAlignment(Qt::AlignCenter);
+    ui->label_Warn->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+    /* 加载警告图标 */
+    // ui->label_warnIcon->setStyleSheet(R"(border-image: url(:/ESM-8C_ICON/Tip/Tips2x.png);)");
+
+    /* 阴影宽度是16 */
+    this->layout()->setMargin(SHADOW_W);
+    // m_shadow = new OneShadow(QSize(width() - SHADOW_W*2, height() - SHADOW_W*2),SHADOW_W);
+    auto pShadow = new OneShadowEffect(this);
+    this->setGraphicsEffect(pShadow);
+
+    connect(ui->pBtn_close,SIGNAL(clicked()),this,SLOT(close()));
+    connect(ui->pBtn_cancel,SIGNAL(clicked()),this,SLOT(close()));
+    connect(ui->pBtn_ok,SIGNAL(clicked()),this,SLOT(do_ok()));
+    /* 注册事件过滤器 */
+    ui->pBtn_close->installEventFilter(this);
+
+    /* 设置皮肤 */
+    setQSS(UIStyle.getQSSPath());
+}
+
+Warning::~Warning()
+{
+    delete ui;
+}
+
+/* 设置标题 */
+void Warning::setTitle(const QString& title, const QSize& size)
+{
+    ui->label_title->setText(title);
+    ui->label_title->setFixedWidth(size.width());
+}
+
+void Warning::setText(const QString &text)
+{
+    /* 根据文本大小设置高度 */
+    ui->label_Warn->setText(text);
+    /* 重新设置位置 */
+    resetLabelSize();
+    moveWarnICON();
+}
+
+/* 只有一个确定按钮 */
+void Warning::setTextWithOneButton(const QString &text)
+{
+    ui->pBtn_cancel->hide();
+    // ui->pBtn_ok->move(ui->pBtn_cancel->x(),ui->pBtn_cancel->y());
+    ui->label_Warn->setText(text);
+    /* 重新设置位置 */
+    resetLabelSize();
+    moveWarnICON();
+}
+
+/* 设置QSS */
+void Warning::setQSS(const QString& qssPath)
+{
+    QString qssFile = qssPath + "/warning.qss";
+    QFile file(qssFile);
+    if(file.open(QIODevice::ReadOnly))
+    {
+        QString stylesheet = file.readAll();
+        this->setStyleSheet(stylesheet);
+        file.close();
+    } else
+    {
+        SPDLOG_ERROR("打开文件失败: {}", file.fileName().toStdString());
+    }
+}
+
+// void Warning::paintEvent(QPaintEvent *event)
+// {
+//     QPainter painter(this);
+//     painter.setRenderHint(QPainter::Antialiasing);
+//     /* 绘制阴影 */
+//     painter.drawImage(QPoint(0,0),m_shadow->image());
+// }
+
+/* 事件过滤器 */
+bool Warning::eventFilter(QObject *watched, QEvent *event)
+{
+    if(watched == ui->pBtn_close)
+    {
+        if(event->type() == QEvent::Enter)
+        {
+            ui->pBtn_close->setProperty("Hover", true);
+            ui->pBtn_close->style()->unpolish(ui->pBtn_close);
+            ui->pBtn_close->style()->polish(ui->pBtn_close);
+            return true;
+        }else if(event->type() == QEvent::Leave)
+        {
+            ui->pBtn_close->setProperty("Hover", false);
+            ui->pBtn_close->style()->unpolish(ui->pBtn_close);
+            ui->pBtn_close->style()->polish(ui->pBtn_close);
+
+            return true;
+        }
+    }
+    return QWidget::eventFilter(watched,event);
+}
+
+
+/* 鼠标点击事件 */
+void Warning::mousePressEvent(QMouseEvent *event)
+{
+    m_lastPos = event->globalPos();
+    event->accept();
+}
+
+/* 鼠标移动事件 */
+void Warning::mouseMoveEvent(QMouseEvent *event)
+{
+    // QRect rect = this->geometry();
+    // rect.setBottom(rect.top()+50);
+    auto point = ui->widget_Top->mapToGlobal(QPoint(0, 0));
+    QRect rect(point, ui->widget_Top->size());
+
+    if(!rect.contains(m_lastPos))
+    {
+        event->accept();
+        return;
+    }
+
+    int dx = event->globalX() - m_lastPos.x();
+    int dy = event->globalY() - m_lastPos.y();
+    move(x()+dx, y()+dy);
+    m_lastPos = event->globalPos();
+    event->accept();
+}
+
+/* 鼠标释放事件 */
+void Warning::mouseReleaseEvent(QMouseEvent *event)
+{
+    event->accept();
+}
+
+
+
+void Warning::do_ok()
+{
+    emit signal_ok();
+    m_isOk = true;
+    this->close();
+}
+
+/**
+ * @brief 重新设置显示文字的区域大小,主要是设置宽度,为计算出左侧的图标位置
+ *        字号是18,每个汉字的宽度、高度都是18,行高是27。
+ *        文字显示区域最大宽度是306,显示17个汉字。
+ *        阴影宽度是16,需要加上阴影宽度的坐标。
+ * 
+ */
+void Warning::resetLabelSize()
+{
+    int TextCount = ui->label_Warn->text().count();
+    int width = TextCount * 18;
+    if(width > 306)
+    {
+        width = 306;
+    }
+    // ui->label_Warn->setFixedWidth(width);
+    ui->label_Warn->resize(width, ui->label_Warn->height());
+    /* ui->widget是布局确定的大小,获取它的大小不准确 */
+    int widgetWidth = this->width();
+    int x = (widgetWidth - width) / 2;
+    // int x = (widgetWidth - width - ui->label_warnIcon->width() - 12) / 2;
+    // x = x + ui->label_warnIcon->width() + 12; /* 加上图标的宽度,和图标之间的间距 */
+    ui->label_Warn->move(x, ui->label_Warn->y());
+}
+
+
+/* 移动警告图标 */
+void Warning::moveWarnICON()
+{
+    int x = ui->label_Warn->x() - ui->label_warnIcon->width() - 12;
+    int y = ui->label_Warn->y() + ui->label_Warn->height() / 2 - ui->label_warnIcon->height() / 2;
+    ui->label_warnIcon->move(x,y);
+}

+ 61 - 0
SettingLibrary/Modules/warning/warning.h

@@ -0,0 +1,61 @@
+#ifndef WARNING_H
+#define WARNING_H
+
+#include <QDialog>
+
+class OneShadow;
+
+namespace Ui {
+class Warning;
+}
+
+class Warning : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit Warning(QWidget *parent = nullptr);
+    ~Warning();
+
+    /* 设置标题 */
+    void setTitle(const QString& title, const QSize& size = QSize(120, 18));
+    void setText(const QString& text);
+    void setTextWithOneButton(const QString& text);     /* 只有一个确定按钮 */
+    bool isOk() const { return m_isOk; }
+    /* 设置QSS */
+    void setQSS(const QString& qssPath);
+
+signals:
+    void signal_ok();
+
+protected:
+    // void paintEvent(QPaintEvent *event) override;
+    /* 事件过滤器 */
+    bool eventFilter(QObject *watched, QEvent *event) override;
+    /* 鼠标点击事件 */
+    void mousePressEvent(QMouseEvent *event) override;
+    /* 鼠标移动事件 */
+    void mouseMoveEvent(QMouseEvent *event) override;
+    /* 鼠标释放事件 */
+    void mouseReleaseEvent(QMouseEvent *event) override;
+
+private slots:
+    void do_ok();
+
+private:
+    /* 重新设置显示文字的区域大小 */
+    void resetLabelSize();
+    /* 移动警告图标 */
+    void moveWarnICON();
+
+private:
+    Ui::Warning *ui;
+
+    // OneShadow* m_shadow = nullptr;
+    const int SHADOW_W = 16;                /* 阴影的大小 */
+    bool m_isOk = false;
+
+    QPoint m_lastPos;
+};
+
+#endif // WARNING_H

+ 137 - 0
SettingLibrary/Modules/warning/warning.ui

@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Warning</class>
+ <widget class="QDialog" name="Warning">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>440</width>
+    <height>302</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">QDialog#Warning
+{
+background:transparent;
+}</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>16</number>
+   </property>
+   <property name="topMargin">
+    <number>16</number>
+   </property>
+   <property name="rightMargin">
+    <number>16</number>
+   </property>
+   <property name="bottomMargin">
+    <number>16</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="widget" native="true">
+     <property name="styleSheet">
+      <string notr="true"/>
+     </property>
+     <widget class="QLabel" name="label_Warn">
+      <property name="geometry">
+       <rect>
+        <x>50</x>
+        <y>78</y>
+        <width>308</width>
+        <height>120</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>删除该设备,“执行计划”中与之对应的计划也会删除!</string>
+      </property>
+     </widget>
+     <widget class="QPushButton" name="pBtn_cancel">
+      <property name="geometry">
+       <rect>
+        <x>248</x>
+        <y>216</y>
+        <width>60</width>
+        <height>32</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>取消</string>
+      </property>
+     </widget>
+     <widget class="QPushButton" name="pBtn_ok">
+      <property name="geometry">
+       <rect>
+        <x>324</x>
+        <y>216</y>
+        <width>60</width>
+        <height>32</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>确定</string>
+      </property>
+     </widget>
+     <widget class="QLabel" name="label_warnIcon">
+      <property name="geometry">
+       <rect>
+        <x>10</x>
+        <y>130</y>
+        <width>20</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string/>
+      </property>
+     </widget>
+     <widget class="QWidget" name="widget_Top" native="true">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>408</width>
+        <height>56</height>
+       </rect>
+      </property>
+      <widget class="QPushButton" name="pBtn_close">
+       <property name="geometry">
+        <rect>
+         <x>368</x>
+         <y>12</y>
+         <width>32</width>
+         <height>32</height>
+        </rect>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+      <widget class="QLabel" name="label_title">
+       <property name="geometry">
+        <rect>
+         <x>32</x>
+         <y>18</y>
+         <width>90</width>
+         <height>18</height>
+        </rect>
+       </property>
+       <property name="text">
+        <string>提示</string>
+       </property>
+      </widget>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 122 - 0
SettingLibrary/Modules/warning/warning_dark.qss

@@ -0,0 +1,122 @@
+QWidget
+{
+    background: transparent;
+    /* font-family: 思源黑体R; */
+    /* font-weight: 400; */
+    font-size: 18px;
+    color: #D2D2D2;
+    line-height: 21px;
+    text-align: left;
+    font-style: normal;
+}
+
+QWidget#widget
+{
+    background: #464649;
+    border-radius: 8px 8px 8px 8px;
+}
+
+QWidget#widget_Top
+{
+    background: transparent;
+    border-top-left-radius: 8px;
+    border-top-right-radius: 8px;
+    border-bottom-left-radius: 0px;
+    border-bottom-right-radius: 0px;
+
+    border-bottom: 1px solid rgba(255,255,255,0.15);
+}
+
+QLabel#label_title
+{
+    /* font-family: 思源黑体M; */
+    /* font-weight: normal; */
+    font-size: 18px;
+    color: #D2D2D2;
+    line-height: 27px;
+    text-transform: uppercase;
+}
+
+QLabel#label_line
+{
+    background: #E6E9F4;
+}
+
+/* 设置图标 */
+QLabel#label_warnIcon
+{
+    border-image: url(:/ICON/Tip/Tips2x.png);
+}
+
+QLabel#label_Warn
+{
+	/* font-family: 思源黑体R; */
+	/* font-weight: 400; */
+	font-size: 18px;
+	color: #D2D2D2;
+	line-height: 27px;
+}
+
+/*设置图片居中 */
+QPushButton#pBtn_close
+{
+    background: transparent;
+	/* border-image: url(:/ICON/ICON/Dialog_close.png); */
+    background: transparent;
+    border-radius: 4px;
+    qproperty-icon: url(:/ICON/ICON/Close_Dark.png);
+    qproperty-iconSize: 20px 20px;
+
+    padding-left: 0px;
+}
+QPushButton#pBtn_close[Hover = true]
+{
+    background: transparent;
+	/* border-image: url(:/ICON/ICON/Dialog_close2.png); */
+    background: transparent;
+    border-radius: 4px;
+    qproperty-icon: url(:/ICON/ICON/Close_pass.png);
+    qproperty-iconSize: 20px 20px;
+    padding-left: 0px;
+    border: 1px solid #438EFF;
+}
+
+QPushButton
+{
+	background: #FFFFFF;
+	/* border: 1px solid #E6E9F4; */
+	text-align: center;
+}
+
+
+/********* 普通方框按钮三种状态效果 *********/
+QPushButton#pBtn_cancel:enabled
+{
+    color: #EBEBEB;
+    border: 1px solid rgba(255,255,255,0.25);
+    border-radius: 16px;
+    background: transparent;
+}
+QPushButton#pBtn_cancel:hover
+{
+    color: #EBEBEB;
+    border: 1px solid rgba(255,255,255,0.25);
+    border-radius: 16px;
+    background: rgba(0,0,0,0.15);
+}
+
+
+/********* 带有底色按钮三种状态效果 *********/
+QPushButton#pBtn_ok
+{
+    color:white;
+    background: #438EFF;
+    border-radius: 16px;
+}
+
+QPushButton#pBtn_ok:hover
+{
+    color:white;
+    background: #5F9EFF;
+    border-radius: 16px;
+}

+ 120 - 0
SettingLibrary/Modules/warning/warning_light.qss

@@ -0,0 +1,120 @@
+QWidget
+{
+    background: transparent;
+    border-radius: 8px;
+    /* font-family: 思源黑体R; */
+    /* font-weight: 400; */
+    font-size: 18px;
+    color: #3A3F63;
+    line-height: 21px;
+    text-align: left;
+    font-style: normal;
+}
+
+QWidget#widget
+{
+    background: #FFFFFF;
+}
+
+QWidget#widget_Top
+{
+    background: #FFFFFF;
+    border-top-left-radius: 8px;
+    border-top-right-radius: 8px;
+    border-bottom-left-radius: 0px;
+    border-bottom-right-radius: 0px;
+    border-bottom: 1px solid #E6E9F4;
+}
+
+QLabel#label_title
+{
+    /* font-family: 思源黑体M; */
+    /* font-weight: normal; */
+    font-size: 18px;
+    color: #3A3F63;
+    line-height: 27px;
+    text-transform: uppercase;
+}
+
+QLabel#label_line
+{
+    background: #E6E9F4;
+}
+
+/* 设置图标 */
+QLabel#label_warnIcon
+{
+    border-image: url(:/ICON/Tip/Tips2x.png);
+}
+
+QLabel#label_Warn
+{
+	/* font-family: 思源黑体R; */
+	/* font-weight: 400; */
+	font-size: 18px;
+	color: #3A3F63;
+	line-height: 27px;
+}
+
+QPushButton#pBtn_close{
+	/* border-image: url(:/ICON/ICON/Dialog_close.png); */
+    background: transparent;
+    border-radius: 4px;
+    qproperty-icon: url(:/ICON/ICON/Close_Light.png);
+    qproperty-iconSize: 20px 20px;
+    padding-left: 0px;
+    border: 0px solid #E6E9F4;
+}
+QPushButton#pBtn_close[Hover = true]
+{
+	
+	/* border-image: url(:/ICON/ICON/Dialog_close2.png); */
+    background: transparent;
+    border-radius: 4px;
+    qproperty-icon: url(:/ICON/ICON/Close_pass.png);
+    qproperty-iconSize: 20px 20px;
+    padding-left: 0px;
+    border: 1px solid #438EFF;
+}
+
+QPushButton
+{
+	background: #FFFFFF;
+	border: 1px solid #E6E9F4;
+	text-align: center;
+}
+
+
+/********* 普通方框按钮三种状态效果 *********/
+QPushButton#pBtn_cancel
+{
+    background: #FFFFFF;
+    border-radius: 16px;
+    border: 1px solid #E6E9F4;
+    color: #3A3F63;
+}
+QPushButton#pBtn_cancel:hover
+{
+
+    background: #FFFFFF;
+    border-radius: 16px;
+    border: 1px solid #4458FE;
+    color: #4458FE;
+}
+
+/********* 带有底色按钮三种状态效果 *********/
+QPushButton#pBtn_ok
+{
+
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:1 #4F8AFF,stop:0 #4B5EFF);
+    border-radius: 16px;
+}
+
+QPushButton#pBtn_ok:hover
+{
+
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:0 #5D73FF,stop:1 #6092FF);
+    border-radius: 16px;
+}

+ 85 - 0
SettingLibrary/Network/FromWebAPI.cpp

@@ -0,0 +1,85 @@
+#include "FromWebAPI.h"
+
+#include "commonDefine.h"
+#include <QString>
+
+
+FromWebAPI::FromWebAPI()
+{
+    m_logger = spdlog::get("FromWebAPI");
+    if(m_logger == nullptr)
+    {
+        fmt::print("FromWebAPI: Logger FromWebAPI not found\n");
+        return;
+    }
+}
+
+FromWebAPI::~FromWebAPI()
+{
+
+}
+
+/* 获取数据库中的对比项信息 */
+bool FromWebAPI::getCompareItemInfo(QList<CompareItemInfo_t>& listItems)
+{
+    /* 先获取对比项信息 */
+    nJson json0;
+    json0["opName"] = "ACAS_GetCompareItem";
+    QString strCmd1 = QString::fromStdString(json0.dump());
+    QString strRet1;
+    int ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_Select, strCmd1, strRet1);
+    if(ret != 0)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "获取对比项信息失败,错误码: {}, 错误信息: {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+        return false;
+    }
+
+    /* 再获取对比项的通道信息 */
+    nJson json1;
+    json1["opName"] = "ACAS_GetCompareItemRoad";
+    QString strCmd2 = QString::fromStdString(json1.dump());
+    QString strRet2;
+    ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_Select, strCmd2, strRet2);
+    if(ret != 0)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "获取对比项通道信息失败,错误码: {}, 错误信息: {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+        return false;
+    }
+
+
+    /* 将json的key全部转换成小写 */
+    nJson jsonCompareItem;
+    if(!convertJsonKeyToLower(nJson::parse(strRet1.toStdString()), jsonCompareItem))
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "转换JSON键名为小写失败");
+        return false;
+    }
+    /* 解析数据 */
+    try
+    {
+
+    }nJsonCatch
+
+    return true;
+}
+
+/* 添加对比项信息 */
+bool FromWebAPI::insertCompareItem(const QList<CompareItemInfo_t>& listItems)
+{
+
+    return true;
+}
+
+/* 修改对比项信息 */
+bool FromWebAPI::updateCompareItem(const QList<CompareItemInfo_t>& listItems)
+{
+
+    return true;
+}
+
+/* 删除对比项信息 */
+bool FromWebAPI::deleteCompareItem(QList<int> listIDs)
+{
+
+    return true;
+}

+ 20 - 2
SettingLibrary/Network/FromWebAPI.h

@@ -1,14 +1,32 @@
-#include "WebAPIBase.h"
+#ifndef __FROMWEBAPI_H_
+#define __FROMWEBAPI_H_
 
+#include "spdlog/spdlog.h"
+#include "WebAPIBase.h"
+#include "GlobalVariable.h"
 
 
 class FromWebAPI : public WebAPIBase
 {
+
 public:
     FromWebAPI();
     ~FromWebAPI() override;
 
+    /* 获取数据库中的对比项信息 */
+    bool getCompareItemInfo(QList<CompareItemInfo_t>& listItems);
+    /* 添加对比项信息 */
+    bool insertCompareItem(const QList<CompareItemInfo_t>& listItems);
+    /* 修改对比项信息 */
+    bool updateCompareItem(const QList<CompareItemInfo_t>& listItems);
+    /* 删除对比项信息 */
+    bool deleteCompareItem(QList<int> listIDs);
+    
 
 private:
+    std::shared_ptr<spdlog::logger> m_logger = nullptr;
+
+};
+
 
-};
+#endif // __FROMWEBAPI_H_

+ 1 - 0
SettingLibrary/Resources/QSS.qrc

@@ -6,5 +6,6 @@
         <file>qss/white/compareitemlistwidget.qss</file>
         <file>qss/white/compareitemwidget.qss</file>
         <file>qss/white/singlecompareroadwidget.qss</file>
+        <file>qss/white/warning.qss</file>
     </qresource>
 </RCC>

+ 4 - 0
SettingLibrary/Resources/Resources.qrc

@@ -12,5 +12,9 @@
         <file>icon/onswitch.png</file>
         <file>icon/down_arrow.png</file>
         <file>icon/tip.png</file>
+        <file>Tip/Wait2x.png</file>
+        <file>Tip/Tips2x.png</file>
+        <file>Tip/Failed2x.png</file>
+        <file>Tip/Complete2x.png</file>
     </qresource>
 </RCC>

BIN=BIN
SettingLibrary/Resources/Tip/Complete2x.png


BIN=BIN
SettingLibrary/Resources/Tip/Failed2x.png


BIN=BIN
SettingLibrary/Resources/Tip/Tips2x.png


BIN=BIN
SettingLibrary/Resources/Tip/Wait2x.png


+ 6 - 0
SettingLibrary/Resources/qss/white/compareitemwidget.qss

@@ -68,11 +68,17 @@ QLineEdit
 	font-size: 14px;
 	color: #3A3F63;
 }
+
 QLineEdit:hover,QLineEdit:focus
 {
 	border: 1px solid #4458FE;
 }
 
+QLineEdit:enabled[Warn=true]
+{
+    border: 1px solid #D21F21;
+}
+
 /* ==========================================================
  *  QCheckBox开关类型
  * ========================================================== */

+ 80 - 1
SettingLibrary/Resources/qss/white/setinfowidget.qss

@@ -42,4 +42,83 @@ QTabBar QToolButton::right-arrow
 }	
 QTabBar QToolButton::left-arrow
 {
-}	
+}	
+
+
+
+/* ==========================================================
+ *  QPushButton
+ * ========================================================== */
+
+QPushButton
+{
+	font-weight: 500;
+	font-size: 14px;
+	text-align: center;
+}
+
+
+/********* 普通椭圆按钮三种状态效果 *********/
+/* QPushButton#pBtn_Cancel
+{
+    background: transparent;
+    color: #3A3F63;
+	border: 1px solid #E6E9F4;
+	border-radius: 16px;
+}
+QPushButton#pBtn_Cancel:hover
+{
+    background: transparent;
+	color: #4458FE;
+	border: 1px solid #4458FE;
+    border-radius: 16px;
+}
+ */
+
+/********* 带有底色椭圆按钮三种状态效果 *********/
+/* QPushButton#pBtn_OK
+{
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:1 #4F8AFF,stop:0 #4B5EFF);
+    border-radius: 16px;
+}
+
+QPushButton#pBtn_OK:hover
+{
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:0 #5D73FF,stop:1 #6092FF);
+    border-radius: 16px;
+} */
+/* ------------------------------------------------------- */
+/********* 普通方框按钮三种状态效果 *********/
+QPushButton#pBtn_cancel
+{
+    background: transparent;
+    color: #3A3F63;
+	border: 1px solid #E6E9F4;
+    border-radius: 4px;
+}
+QPushButton#pBtn_cancel:hover
+{
+    background: transparent;
+    color: #4458FE;
+	border: 1px solid #4458FE;
+    border-radius: 4px;
+}
+
+
+/********* 带有底色方框按钮三种状态效果 *********/
+QPushButton#pBtn_save
+{
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:1 #4F8AFF,stop:0 #4B5EFF);
+    border-radius: 4px;
+}
+
+QPushButton#pBtn_save:hover
+{
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:0 #5D73FF,stop:1 #6092FF);
+    border-radius: 4px;
+}
+

+ 5 - 0
SettingLibrary/Resources/qss/white/singlecompareroadwidget.qss

@@ -24,6 +24,11 @@ QLineEdit:hover,QLineEdit:focus
 	border: 1px solid #4458FE;
 }
 
+QLineEdit:enabled[Warn=true]
+{
+    border: 1px solid #D21F21;
+}
+
 
 QPushButton#btnDel
 {

+ 114 - 0
SettingLibrary/Resources/qss/white/warning.qss

@@ -0,0 +1,114 @@
+QWidget
+{
+    background: transparent;
+    border-radius: 8px;
+    font-size: 18px;
+    color: #3A3F63;
+    line-height: 21px;
+    text-align: left;
+    font-style: normal;
+}
+
+QWidget#widget
+{
+    background: #FFFFFF;
+}
+
+QWidget#widget_Top
+{
+    background: #FFFFFF;
+    border-top-left-radius: 8px;
+    border-top-right-radius: 8px;
+    border-bottom-left-radius: 0px;
+    border-bottom-right-radius: 0px;
+    border-bottom: 1px solid #E6E9F4;
+}
+
+QLabel#label_title
+{
+    font-size: 18px;
+    color: #3A3F63;
+    line-height: 27px;
+    text-transform: uppercase;
+}
+
+QLabel#label_line
+{
+    background: #E6E9F4;
+}
+
+/* 设置图标 */
+QLabel#label_warnIcon
+{
+    border-image: url(:/Tip/Tips2x.png);
+}
+
+QLabel#label_Warn
+{
+	font-size: 18px;
+	color: #3A3F63;
+	line-height: 27px;
+}
+
+QPushButton#pBtn_close
+{
+    background: transparent;
+    border-radius: 4px;
+    qproperty-icon: url(:/icon/close.png);
+    qproperty-iconSize: 32px 32px;
+    padding-left: 0px;
+    border: 0px solid #E6E9F4;
+}
+QPushButton#pBtn_close[Hover = true]
+{
+	
+	/* border-image: url(:/ICON/ICON/Dialog_close2.png); */
+    background: transparent;
+    border-radius: 4px;
+    qproperty-icon: url(:/icon/close.png);
+    qproperty-iconSize: 32px 32px;
+    padding-left: 0px;
+    border: 1px solid #438EFF;
+}
+
+QPushButton
+{
+	background: #FFFFFF;
+	border: 1px solid #E6E9F4;
+	text-align: center;
+}
+
+
+/********* 普通方框按钮三种状态效果 *********/
+QPushButton#pBtn_cancel
+{
+    background: #FFFFFF;
+    border-radius: 16px;
+    border: 1px solid #E6E9F4;
+    color: #3A3F63;
+}
+QPushButton#pBtn_cancel:hover
+{
+
+    background: #FFFFFF;
+    border-radius: 16px;
+    border: 1px solid #4458FE;
+    color: #4458FE;
+}
+
+/********* 带有底色按钮三种状态效果 *********/
+QPushButton#pBtn_ok
+{
+
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:1 #4F8AFF,stop:0 #4B5EFF);
+    border-radius: 16px;
+}
+
+QPushButton#pBtn_ok:hover
+{
+
+    color:white;
+    background: qlineargradient( x0:1,x1:1,y1:0,y2:0,stop:0 #5D73FF,stop:1 #6092FF);
+    border-radius: 16px;
+}

+ 1 - 0
SettingLibrary/acaserversetinfo.cpp

@@ -35,5 +35,6 @@ int DoSave(int nServiceID)
 
 int DoRelease()
 {
+    g_managerObj.Release();
     return 0;
 }

+ 112 - 4
SettingLibrary/setinfomanager.cpp

@@ -2,10 +2,17 @@
 
 #include <QLayout>
 
-#include "entities.h"
 #include "LHLogInit.h"
 #include "LHQLogAPI.h"
 
+#include "FromWebAPI.h"
+
+#include "spdlog/spdlog.h"
+#include "GlobalInfo.h"
+#include "GlobalVariable.h"
+#include "CompareItemData.h"
+#include "setinfowidget.h"
+
 SetInfoManager::SetInfoManager(QObject *parent)
     : QObject(parent)
     , m_pWgtSet(nullptr)
@@ -15,13 +22,30 @@ SetInfoManager::SetInfoManager(QObject *parent)
 
 SetInfoManager::~SetInfoManager()
 {
-
+    
 }
 
-/* 初始化,主要是初始化日志库 */
+/* 初始化,初始化所有参数变量 */
 int SetInfoManager::Init(const stInitData* pData)
 {
+    m_initData = *pData;
     initLog("ACAServerSetting", g_apiLhQLog);
+    /* 初始化默认对比项参数 */
+    setDefaultCompareItem();
+
+    /* 初始化对比项数据管理器 */
+    if(!CIData.init())
+    {
+        SPDLOG_ERROR("对比项数据初始化失败");
+        return -1;
+    }
+
+    /* 初始化webAPI */
+    if(!initWebAPI())
+    {
+        return -1;
+    }
+
 
     return 0;
 }
@@ -32,13 +56,14 @@ int SetInfoManager::CreateWindow(int nSkinType, QWidget* parent)
 //    LHStyleManager::Instance()->SetSkinStyle(nSkinType);
 
     // 创建配置界面
-    if(!m_pWgtSet)
+    if(m_pWgtSet == nullptr)
     {
         m_pWgtSet = new SetInfoWidget(parent);
         if(parent->layout())
         {
             parent->layout()->addWidget(m_pWgtSet);
         }
+        m_pWgtSet->setWebAPI(m_fromWebAPI);
     }
     return 0;
 }
@@ -60,3 +85,86 @@ int SetInfoManager::ShowWindow(int nSkinType, int nServiceID, bool bShowWindow)
     }
     return 0;
 }
+
+/* 释放内存 */
+int SetInfoManager::Release()
+{
+    if(m_pWgtSet)
+    {
+        m_pWgtSet->deleteLater();
+        m_pWgtSet = nullptr;
+    }
+
+    if(m_fromWebAPI)
+    {
+        delete m_fromWebAPI;
+        m_fromWebAPI = nullptr;
+    }
+
+    return 0;
+}
+
+/* 生成默认的对比项参数 */
+void SetInfoManager::setDefaultCompareItem()
+{
+    CompareItemInfo_t defaultItem;
+    /* 对比项名称不需要设置 */
+
+    /* 是否启用该对比项 */
+    defaultItem.isEnable = true;
+    /* 设置主通道和第二通道信息 */
+    CompareItemRoadInfo_t mainRoad;
+    mainRoad.isEnableRecord = true; // 主通道默认开启录音
+    mainRoad.nCompareRoadNum = 1; // 主通道编号为1
+    mainRoad.strCompareRoadName = "主通道"; // 主通道名称
+    mainRoad.scRoadInfo.nSoundCardNum = 0; // 默认声卡编号为0
+    mainRoad.scRoadInfo.roadInfo.nRoadNum = 0; // 默认通道编号为0
+    defaultItem.listRoads.append(mainRoad);
+
+    CompareItemRoadInfo_t secondRoad;
+    secondRoad.isEnableRecord = true; // 第二通道默认开启录音
+    secondRoad.nCompareRoadNum = 2; // 第二通道编号为2
+    secondRoad.strCompareRoadName = "第2通道"; // 第二通道名称
+    secondRoad.scRoadInfo.nSoundCardNum = 0; // 默认声卡编号为0
+    secondRoad.scRoadInfo.roadInfo.nRoadNum = 1; // 默认通道编号为1
+    
+    defaultItem.listRoads.append(secondRoad);
+
+    /* 初始化静音、过载、反相参数 */
+    defaultItem.paramMute.isEnable = true;              // 静音检测默认开启
+    defaultItem.paramMute.threshold.nThreshold = 64;    // 静音检测默认阈值
+    defaultItem.paramMute.nLen = 8;                     // 静音检测默认长度
+    defaultItem.paramMute.nSensibility = 80;            // 静音检测默认灵敏度
+
+    defaultItem.paramOverload.isEnable = true;          // 过载检测默认开启
+    defaultItem.paramOverload.threshold.nThreshold = 4; // 过载检测默认
+    defaultItem.paramOverload.nLen = 30;                // 过载检测默认长度
+    defaultItem.paramOverload.nSensibility = 20;        // 过载检测
+
+    defaultItem.paramPhase.isEnable = true;             // 反相检测默认开启
+    defaultItem.paramPhase.threshold.dThreshold = 0.75; // 反相检测默认阈值
+    defaultItem.paramPhase.nLen = 60;                   // 反相检测默认长度
+    defaultItem.paramPhase.nSensibility = 60;           // 反相检测默认灵敏度
+
+    /* 设置全局默认对比项 */
+    GInfo.setDefaultCompareItem(defaultItem);
+}
+
+/* 初始化WebAPI */
+bool SetInfoManager::initWebAPI()
+{
+    if(m_fromWebAPI == nullptr)
+    {
+        m_fromWebAPI = new FromWebAPI();
+        if(!m_fromWebAPI->initWebApi(m_initData.strWebAddr, m_initData.strDBID, ""))
+        {
+            SPDLOG_ERROR("WebAPI 初始化失败");
+            delete m_fromWebAPI;
+            m_fromWebAPI = nullptr;
+            return false;
+        }
+    }
+    return true;
+}
+
+

+ 21 - 3
SettingLibrary/setinfomanager.h

@@ -2,10 +2,17 @@
 #define SETINFOMANAGER_H
 
 #include <QObject>
-#include "setinfowidget.h"
 
 
-struct stInitData;
+#include "entities.h"
+
+class FromWebAPI;
+class SetInfoWidget;
+
+/**
+ * @brief 设置管理器,从这里初始化所需要的设置界面和数据。
+ * 
+ */
 
 class SetInfoManager: public QObject
 {
@@ -14,14 +21,25 @@ public:
     explicit SetInfoManager(QObject *parent = nullptr);
     virtual ~SetInfoManager();
 
-    /* 初始化,主要是初始化日志库 */
+    /* 初始化,初始化所有参数变量 */
     int Init(const stInitData* pData);
 
     int CreateWindow(int nSkinType, QWidget* parent);
     int ShowWindow(int nSkinType, int nServiceID, bool bShowWindow);
 
+    /* 释放内存 */
+    int Release();
+
+private:
+    /* 生成默认的对比项参数 */
+    void setDefaultCompareItem();
+    /* 初始化WebAPI */
+    bool initWebAPI();
+
 private:
+    stInitData m_initData;      // 初始化数据
     SetInfoWidget* m_pWgtSet;
+    FromWebAPI* m_fromWebAPI = nullptr; // 用于从Web API获取数据
 };
 
 #endif // SETINFOMANAGER_H

+ 58 - 0
SettingLibrary/setinfowidget.cpp

@@ -22,4 +22,62 @@ SetInfoWidget::~SetInfoWidget()
     delete ui;
 }
 
+/* 设置WebAPI */
+void SetInfoWidget::setWebAPI(FromWebAPI* api)
+{
+    m_fromWebAPI = api;
+    
+    /* 设置BasicWidget的WebAPI */
+    BasicWidget* basicWidget = qobject_cast<BasicWidget*>(ui->tabWidget->widget(0));
+    if(basicWidget)
+    {
+        basicWidget->setWebAPI(m_fromWebAPI);
+    }
+}
+
+
+/* 保存按钮 */
+void SetInfoWidget::do_pBtn_save_clicked()
+{
+    saveData();
+}
+
+/* 取消按钮 */
+void SetInfoWidget::do_pBtn_cancel_clicked()
+{
+
+}
+
+/* 保存数据 */
+void SetInfoWidget::saveData()
+{
+    /* 获取当前页的编号 */
+    int currentIndex = ui->tabWidget->currentIndex();
+    QWidget* currentWidget = ui->tabWidget->currentWidget();
+    
+    switch(currentIndex)
+    {
+        case 0:     /* 基础信息 */
+            {
+                BasicWidget* widget = qobject_cast<BasicWidget*>(currentWidget);
+                if(widget)
+                {
+                    /* 保存基础信息 */
+                    widget->saveBasicInfo();
+                }
+            }
+            break;
+        case 1:     /* 对比项 */
+            break;
+        case 2:     /* 噪音检测 */
+            break;
+        case 3:     /* 数据库 */
+            break;
+        case 4:     /* 检测时段 */
+            break;
+        default:
+            break;
+    }
+}
+
 

+ 17 - 1
SettingLibrary/setinfowidget.h

@@ -1,6 +1,9 @@
 #ifndef SETINFOWIDGET_H
 #define SETINFOWIDGET_H
 
+
+#include "FromWebAPI.h"
+
 #include <QWidget>
 
 
@@ -16,11 +19,24 @@ public:
     explicit SetInfoWidget(QWidget *parent = nullptr);
     ~SetInfoWidget();
 
+    /* 设置WebAPI */
+    void setWebAPI(FromWebAPI* api);
+
 private slots:
-    
+    /* 保存按钮 */
+    void do_pBtn_save_clicked();
+    /* 取消按钮 */
+    void do_pBtn_cancel_clicked();
+
+private:
+    /* 保存数据 */
+    void saveData();
+
 
 private:
     Ui::SetInfoWidget *ui;
+
+    FromWebAPI* m_fromWebAPI = nullptr; // 用于从Web API获取数据
 };
 
 #endif // SETINFOWIDGET_H

+ 66 - 0
SettingLibrary/setinfowidget.ui

@@ -64,6 +64,72 @@
      </widget>
     </widget>
    </item>
+   <item row="1" column="0">
+    <widget class="QWidget" name="widget_bottom" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>64</height>
+      </size>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <property name="spacing">
+       <number>16</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>16</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>16</number>
+      </property>
+      <item>
+       <widget class="QPushButton" name="pBtn_save">
+        <property name="minimumSize">
+         <size>
+          <width>60</width>
+          <height>32</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>保存</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pBtn_cancel">
+        <property name="minimumSize">
+         <size>
+          <width>60</width>
+          <height>32</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>131</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
   </layout>
  </widget>
  <customwidgets>

+ 1 - 1
show2/CMakeLists.txt

@@ -32,7 +32,7 @@ target_include_directories(${this_exe} PRIVATE
 
     ${CMAKE_CURRENT_SOURCE_DIR}
 
-
+    ${CMAKE_SOURCE_DIR}
     ${CMAKE_SOURCE_DIR}/External/common
     ${CMAKE_SOURCE_DIR}/External/module
     ${CMAKE_SOURCE_DIR}/SettingLibrary