Browse Source

V0.4
1、基础功能基本完成了

Apple 2 weeks ago
parent
commit
599350a1a9

+ 12 - 0
SQL/ACASetting.sql

@@ -161,3 +161,15 @@ FROM tACASystemConfig;
 DELETE FROM tACASystemConfig
 WHERE PKID = 1;
 
+
+#获取检测时段
+SELECT *
+FROM tACADetectPeriod;
+
+#插入检测时段
+INSERT INTO tACADetectPeriod (ItemID, IsDetect, WeekType, CDate, TimeStart, TimeEnd, ApplySlient, ApplyOverload, ApplyPhase, ApplyNoise)
+VALUES (@itemID, @isDetect, @weekType, @cDate, @timeStart, @timeEnd, @applySlient, @applyOverload, @applyPhase, @applyNoise);
+
+#删除检测时段
+DELETE FROM tACADetectPeriod
+WHERE ItemID = @itemID;

+ 33 - 1
SQL/ACASetting.sqlbook

@@ -108,4 +108,36 @@ COMMENT ON COLUMN tACASystemConfig.PKID IS '主键ID';
 COMMENT ON COLUMN tACASystemConfig.ConfigKey IS '配置键';
 COMMENT ON COLUMN tACASystemConfig.ConfigValue IS '配置值,存储为JSON字符串';
 COMMENT ON COLUMN tACASystemConfig.UpdateTime IS '配置更新时间';
-COMMENT ON COLUMN tACASystemConfig.ConfigDesc IS '配置描述';
+COMMENT ON COLUMN tACASystemConfig.ConfigDesc IS '配置描述';
+-- SQLBook: Code
+#创建检测计划表格
+CREATE TABLE tACADetectPeriod
+(
+    ItemID INT NOT NULL,
+    IsDetect BIT NOT NULL DEFAULT 1, -- 是否检测
+    WeekType INT NOT NULL,
+    CDate VARCHAR(32),
+    TimeStart VARCHAR(32) NOT NULL,
+    TimeEnd VARCHAR(32) NOT NULL,
+    ApplySlient BIT NOT NULL DEFAULT 0,  -- 是否应用静音
+    ApplyOverload BIT NOT NULL DEFAULT 0, -- 是否应用超载
+    ApplyPhase BIT NOT NULL DEFAULT 0,   -- 是否应用反相
+    ApplyNoise BIT NOT NULL DEFAULT 0,   -- 是否应用噪音
+    FOREIGN KEY (ItemID) REFERENCES tACACompareItems(ItemID)
+        ON DELETE CASCADE
+);
+-- 表注释
+COMMENT ON TABLE tACADetectPeriod IS '检测计划表';
+-- 字段注释
+COMMENT ON COLUMN tACADetectPeriod.ItemID IS '对比项ID';
+COMMENT ON COLUMN tACADetectPeriod.IsDetect IS '是否检测,1表示检测日期,0表示非检测日期';
+COMMENT ON COLUMN tACADetectPeriod.WeekType IS '检测计划的星期,1-7表示周一到周日,8表示特殊日期,也就是非检测日';
+COMMENT ON COLUMN tACADetectPeriod.CDate IS '检测计划的日期';
+COMMENT ON COLUMN tACADetectPeriod.TimeStart IS '检测计划的开始时间';
+COMMENT ON COLUMN tACADetectPeriod.TimeEnd IS '检测计划的结束时间';
+COMMENT ON COLUMN tACADetectPeriod.ApplySlient IS '是否应用静音检测';
+COMMENT ON COLUMN tACADetectPeriod.ApplyOverload IS '是否应用超载检测';
+COMMENT ON COLUMN tACADetectPeriod.ApplyPhase IS '是否应用反相检测';
+COMMENT ON COLUMN tACADetectPeriod.ApplyNoise IS '是否应用噪音检测';
+-- 创建索引
+CREATE INDEX idx_tACADetectPeriod_ItemID ON tACADetectPeriod (ItemID);

+ 82 - 0
SettingLibrary/DataBase/GlobalVariable.cpp

@@ -121,3 +121,85 @@ bool CompareItemInfo_t::isEqualRoads(const CompareItemInfo_t &other) const
     return true;
 }
 
+
+bool DetectPeriodConfig_t::operator==(const DetectPeriodConfig_t &other) const
+{
+    if(&other == this)
+    {
+        return true; // 自身比较
+    }
+
+    if( nID != other.nID ||
+        isApplySlient != other.isApplySlient ||
+        isApplyOverload != other.isApplyOverload ||
+        isApplyPhase != other.isApplyPhase ||
+        isApplyNoise != other.isApplyNoise ||
+        listDetect.size() != other.listDetect.size() ||
+        listNoDetect.size() != other.listNoDetect.size())
+    {
+        return false;
+    }
+
+    /* 详细对比列表中的每一项 */
+    for(int i = 0; i < listDetect.size(); ++i)
+    {
+        const OnePlan_t& plan1 = listDetect.at(i);
+        bool found = false;
+        for(int j = 0; j < other.listDetect.size(); ++j)
+        {
+            const OnePlan_t& plan2 = other.listDetect.at(j);
+            if(plan1 == plan2)
+            {
+                found = true;
+                break; // 找到相同的计划
+            }
+        }
+        if(!found)
+        {
+            return false; // 在other中找不到相同的检测计划
+        }
+    }
+
+    /* 对比非检测计划 */
+    for(int i = 0; i < listNoDetect.size(); ++i)
+    {
+        const OnePlan_t& plan1 = listNoDetect.at(i);
+        bool found = false;
+        for(int j = 0; j < other.listNoDetect.size(); ++j)
+        {
+            const OnePlan_t& plan2 = other.listNoDetect.at(j);
+            if(plan1 == plan2)
+            {
+                found = true;
+                break; // 找到相同的计划
+            }
+        }
+        if(!found)
+        {
+            return false; // 在other中找不到相同的非检测计划
+        }
+    }
+
+    return true;
+}
+
+/* 判断基础信息是否更改 */
+bool DetectPeriodConfig_t::isBaseInfoChanged(const DetectPeriodConfig_t &other) const
+{
+    if(&other == this)
+    {
+        return false; // 自身比较
+    }
+
+    if(nID == other.nID &&
+       isApplySlient == other.isApplySlient &&
+       isApplyOverload == other.isApplyOverload &&
+       isApplyPhase == other.isApplyPhase &&
+       isApplyNoise == other.isApplyNoise)
+    {
+        return false;
+    }
+
+    return true;
+}
+

+ 44 - 0
SettingLibrary/DataBase/GlobalVariable.h

@@ -50,6 +50,14 @@ struct OnePlan_t
     QTime timeStart;        /* 时间,格式为HH:mm:ss */
     QTime timeEnd;          /* 时间,格式为HH:mm:ss */
 
+    bool operator==(const OnePlan_t &other) const
+    {
+        return (weekType == other.weekType) && (date == other.date) && (timeStart == other.timeStart) && (timeEnd == other.timeEnd);
+    }
+    bool operator!=(const OnePlan_t &other) const
+    {
+        return !(*this == other);
+    }
 };
 
 
@@ -176,6 +184,42 @@ struct CompareItemInfo_t
     bool isEqualRoads(const CompareItemInfo_t &other) const;
 };
 
+/* =============================================================================
+ * 检测时段配置
+ * ============================================================================= */
+
+/**
+ * @brief 一个对比项的检测计划
+ * 
+ */
+struct DetectPeriodConfig_t
+{
+    int nID = 0;                            /* ID */
+    bool isApplySlient = false;             /* 非检测计划日期是否应用静音 */
+    bool isApplyOverload = false;           /* 非检测计划日期是否应用超载 */
+    bool isApplyPhase = false;              /* 非检测计划日期是否应用反相 */
+    bool isApplyNoise = false;              /* 非检测计划日期是否应用噪音 */
+    QList<OnePlan_t> listDetect;            /* 检测计划列表 */
+    QList<OnePlan_t> listNoDetect;          /* 非检测计划列表 */
+
+    bool operator==(const DetectPeriodConfig_t &other) const;
+    /* 判断基础信息是否更改 */
+    bool isBaseInfoChanged(const DetectPeriodConfig_t &other) const;
+    
+};
+
+/**
+ * @brief 非检测计划应用清空
+ * 
+ */
+struct NoDetectPlanApply_t
+{
+    int nID = 0;                            /* ID */
+    bool isApplySlient = false;             /* 非检测计划日期是否应用静音 */
+    bool isApplyOverload = false;           /* 非检测计划日期是否应用超载 */
+    bool isApplyPhase = false;              /* 非检测计划日期是否应用反相 */
+    bool isApplyNoise = false;              /* 非检测计划日期是否应用噪音 */
+};
 
 
 

+ 8 - 0
SettingLibrary/DataManager/SystemConfig.cpp

@@ -220,3 +220,11 @@ bool SystemConfigInfo::setDatabaseConfigToJson(const DatabaseConfig_t& databaseC
 }
 
 
+/* 设置检测时段配置 */
+void SystemConfigInfo::setDetectPeriodConfig(const QMap<int, DetectPeriodConfig_t>& config)
+{
+    m_mapDetectConfig.clear();
+    m_mapDetectConfig = config;
+}
+
+

+ 7 - 0
SettingLibrary/DataManager/SystemConfig.h

@@ -106,6 +106,11 @@ public:
     /* 将数据库设置转换成json */
     bool setDatabaseConfigToJson(const DatabaseConfig_t& databaseConfig, std::string& strJson) const;
 
+    /*-------------------------------------------------------------------------------------*/
+    const QMap<int, DetectPeriodConfig_t>& getDetectPeriodConfig() const { return m_mapDetectConfig; }
+    /* 设置检测时段配置 */
+    void setDetectPeriodConfig(const QMap<int, DetectPeriodConfig_t>& config);
+
 public:
     
 
@@ -121,6 +126,8 @@ private:
     /* 数据库设置 */
     DatabaseConfig_t m_databaseConfig;
 
+    /* 计划周期配置,key为对比项ID */
+    QMap<int, DetectPeriodConfig_t> m_mapDetectConfig;
 };
 
 

+ 3 - 0
SettingLibrary/DataManager/SystemConfigStruct.h

@@ -5,6 +5,8 @@
 #include <QString>
 #include <QMap>
 
+#include "GlobalVariable.h"
+
 
 /* =============================================================================
  * 基础配置结构体
@@ -113,4 +115,5 @@ struct DatabaseConfig_t
 
 
 
+
 #endif // __SYSTEMCONFIGSTRUCT_H__

+ 4 - 0
SettingLibrary/Modules/CheckPeriod/addperioddialog.cpp

@@ -42,6 +42,10 @@ AddPeriodDialog::AddPeriodDialog(ePeriodType type, QWidget *parent) :
     ui->timeEdit_start->SetMainWindow(this);
     ui->timeEdit_end->SetMainWindow(this);
 
+    /* 设置日期格式,设置默认日期 */
+    ui->dateEdit->setDisplayFormat("yyyy-MM-dd");
+    ui->dateEdit->setDate(QDate::currentDate());
+
     /* 禁用comboBox滚动修改 */
     ui->comboBox->setWheelDisabled(true);
 

+ 8 - 1
SettingLibrary/Modules/CheckPeriod/addperiodwidget.ui

@@ -118,7 +118,14 @@
           </widget>
          </item>
          <item>
-          <widget class="CalendarDTEdit" name="dateEdit"/>
+          <widget class="CalendarDTEdit" name="dateEdit">
+           <property name="minimumSize">
+            <size>
+             <width>0</width>
+             <height>32</height>
+            </size>
+           </property>
+          </widget>
          </item>
         </layout>
        </widget>

+ 326 - 29
SettingLibrary/Modules/CheckPeriod/checkperiodwidget.cpp

@@ -17,6 +17,7 @@
 #include "tipwidget.h"
 #include "GlobalInfo.h"
 #include "timewidget.h"
+#include "SystemConfig.h"
 
 
 
@@ -39,13 +40,19 @@ CheckPeriodWidget::CheckPeriodWidget(QWidget *parent) :
     /* 下拉框设置阴影 */
     ui->comboBox_selectCompareItem->setViewShadowEffect();
     
-    /* 初始化检测计划容器 */
+    /* 获取计划容器的布局指针 */
     m_layoutDetectPlans = qobject_cast<QVBoxLayout*>(ui->scrollArea_detectPlans->layout());
+    m_layoutNoDetectPlans = qobject_cast<QVBoxLayout*>(ui->scrollArea_noDetectPlans->layout());
 
     connect(ui->pBtn_addDetectPlan, &QPushButton::clicked, this, &CheckPeriodWidget::do_pBtn_addDetectPlan_clicked);
     connect(ui->pBtn_addNoDetectPlan, &QPushButton::clicked, this, &CheckPeriodWidget::do_pBtn_addNoDetectPlan_clicked);
     connect(ui->comboBox_selectCompareItem, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CheckPeriodWidget::do_comboBox_selectCompareItem_currentIndexChanged);
 
+    connect(ui->checkBox_applySlient, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
+    connect(ui->checkBox_applyOverload, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
+    connect(ui->checkBox_applyPhase, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
+    connect(ui->checkBox_applyNoise, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
+
     /* 设置UI */
     UIStyle.registerWidget(this);
     QString qssPath = UIStyle.getQSSPath() + "/onedetectplan.qss";
@@ -76,14 +83,14 @@ void CheckPeriodWidget::updateCompareItemList(const QList<CompareItemInfo_t>& co
 {
     /* 先获取当前选择的列表项 */
     int id = ui->comboBox_selectCompareItem->currentData().value<int>();
-    ui->comboBox_selectCompareItem->clear();
-    m_pListcurrDetect = nullptr;
     /* 屏蔽comboBox信号 */
     ui->comboBox_selectCompareItem->blockSignals(true);
+    ui->comboBox_selectCompareItem->clear();
+    m_pListcurrDetect = nullptr;
     for(const auto& item : compareItemList)
     {
         /* 添加到下拉框 */
-        ui->comboBox_selectCompareItem->addItem(item.strName, QVariant::fromValue(item.nID));
+        ui->comboBox_selectCompareItem->addItem(item.strName, item.nID);
     }
 
     /* 设置当前选择的对比项 */
@@ -111,23 +118,72 @@ void CheckPeriodWidget::updateCompareItemList(const QList<CompareItemInfo_t>& co
 }
 
 
-/* 设置计划列表 */
-void CheckPeriodWidget::setDetectPlanList(const QList<OnePlan_t>& planList)
+/* 保存设置 */
+bool CheckPeriodWidget::saveSettings()
 {
-    m_currentPlanList = planList;
-    removeAllDetectPlanWidgets();
+    /* 更新静音过载反相的设置 */
+    m_mapNoDetectApply[m_currNoDetectApply.nID] = m_currNoDetectApply;
+
+    /* 生成按照对比项相关的设置计划 */
+    QMap<int, DetectPeriodConfig_t> mapDetectConfig;
+    updateCompareItemDetectPeriod(mapDetectConfig);
+    
+    /* 和已有的对比,只有有修改的地方,直接删除这个对比项ID所有计划,然后插入 */
+    const auto& oldMap = SysConfig.getDetectPeriodConfig();
+    QMap<int, DetectPeriodConfig_t> insertMap;
+    QList<int>  deleteList;
 
-    for(const auto& plan : m_currentPlanList)
+    /* 先找出需要插入的 */
+    for(auto it = mapDetectConfig.cbegin(); it != mapDetectConfig.cend(); ++it)
     {
-        addDetectPlan(plan);
+        int id = it.key();
+        if(oldMap.contains(id))
+        {
+            /* 如果有修改,就删除原来的 */
+            if(oldMap[id] == it.value())
+            {
+                continue;
+            }else 
+            {
+                deleteList.append(id);
+            }
+        }
+        /* 无论是没有还是修改了,都需要重新插入 */
+        insertMap.insert(id, it.value());
     }
+
+    /* 先删除,再插入新数据 */
+    if(!deleteList.isEmpty())
+    {
+        if(!m_fromWebAPI->deleteDetectPeriodConfig(deleteList))
+        {
+            SPDLOG_LOGGER_ERROR(m_logger, "删除对比项检测时段配置失败");
+            TipWidget::display(TipWidget::OPERATOR_WARN, "删除对比项检测时段配置失败", GInfo.getTopWindow());
+            return false;
+        }
+    }
+
+    if(!insertMap.isEmpty())
+    {
+        if(!m_fromWebAPI->insertDetectPeriodConfig(insertMap))
+        {
+            SPDLOG_LOGGER_ERROR(m_logger, "插入对比项检测时段配置失败");
+            TipWidget::display(TipWidget::OPERATOR_WARN, "插入对比项检测时段配置失败", GInfo.getTopWindow());
+            return false;
+        }
+    }
+
+    /* 更新系统配置 */
+    SysConfig.setDetectPeriodConfig(mapDetectConfig);
+
+    return true;
 }
 
-/* 选择了一个对比项 */
+/* 选择了一个对比项,id是新对比项的id */
 void CheckPeriodWidget::do_comboBox_selectCompareItem_currentIndexChanged(int index)
 {
     /* 获取当前选择的对比项id */
-    int id = ui->comboBox_selectCompareItem->currentData().value<int>();
+    int id = ui->comboBox_selectCompareItem->itemData(index).value<int>();
     if(id == 0)
     {
         m_pListcurrDetect = nullptr;
@@ -146,10 +202,54 @@ void CheckPeriodWidget::do_comboBox_selectCompareItem_currentIndexChanged(int in
         m_mapDetectPlanList.insert(id, m_pListcurrDetect);
     }
 
+    if(m_mapNoDetectPlanList.contains(id))
+    {
+        m_pListcurrNoDetect = m_mapNoDetectPlanList.value(id);
+    } else
+    {
+        /* 创建一个新的列表 */
+        m_pListcurrNoDetect = new QList<OneDetectPlan*>();
+        m_mapNoDetectPlanList.insert(id, m_pListcurrNoDetect);
+    }
+
+    /* 应用项目需要先保存当前的设置到对应的对比项ID中,然后再切换 */
+    m_currNoDetectApply.isApplySlient = ui->checkBox_applySlient->isChecked();
+    m_currNoDetectApply.isApplyOverload = ui->checkBox_applyOverload->isChecked();
+    m_currNoDetectApply.isApplyPhase = ui->checkBox_applyPhase->isChecked();
+    m_currNoDetectApply.isApplyNoise = ui->checkBox_applyNoise->isChecked();
+
+    /* 这里多次检测,是防止第一次进入这个页面,没有保存好的设置 */
+    if(m_currNoDetectApply.nID > 0)
+    {
+        if(m_mapNoDetectApply.contains(m_currNoDetectApply.nID))
+        {
+            m_mapNoDetectApply[m_currNoDetectApply.nID] = m_currNoDetectApply;
+        } else
+        {
+            m_mapNoDetectApply.insert(m_currNoDetectApply.nID, m_currNoDetectApply);
+        }
+    }
+    if(m_mapNoDetectApply.contains(id))
+    {
+        m_currNoDetectApply = m_mapNoDetectApply.value(id);
+    } else
+    {
+        /* 清空设置 */
+        m_currNoDetectApply = NoDetectPlanApply_t();
+        m_currNoDetectApply.nID = id;
+        m_mapNoDetectApply.insert(id, m_currNoDetectApply);
+    }
+    ui->checkBox_applySlient->setChecked(m_currNoDetectApply.isApplySlient);
+    ui->checkBox_applyOverload->setChecked(m_currNoDetectApply.isApplyOverload);
+    ui->checkBox_applyPhase->setChecked(m_currNoDetectApply.isApplyPhase);
+    ui->checkBox_applyNoise->setChecked(m_currNoDetectApply.isApplyNoise);
+
     /* 清空当前的布局 */
     removeAllDetectPlanWidgets();
+    removeAllNoDetectPlanWidgets();
     
     addDetectPlanToLayout();
+    addNoDetectPlanToLayout();
 }
 
 
@@ -184,15 +284,22 @@ void CheckPeriodWidget::do_pBtn_addNoDetectPlan_clicked()
 {
     /* 检查当前有没有对比项选择 */
     int id = ui->comboBox_selectCompareItem->currentData().value<int>();
-    // if(id <= 0)
-    // {
-    //     TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择一个对比项", GInfo.getTopWindow());
-    //     SPDLOG_LOGGER_WARN(m_logger, "没有选择对比项,无法添加检测计划");
-    //     return;
-    // }
+    if(id <= 0)
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择一个对比项", GInfo.getTopWindow());
+        SPDLOG_LOGGER_WARN(m_logger, "没有选择对比项,无法添加检测计划");
+        return;
+    }
 
     AddPeriodDialog dlg(PERIOD_DATE);
     dlg.exec();
+
+    if(!dlg.isOK())
+    {
+        return;
+    }
+    OnePlan_t plan = dlg.getPlan();
+    addNoDetectPlan(plan);
 }
 
 /* 删除一个检测计划 */
@@ -215,7 +322,18 @@ void CheckPeriodWidget::do_pBtn_deleteDetectPlan_clicked()
 /* 删除一个不检测计划 */
 void CheckPeriodWidget::do_pBtn_deleteNoDetectPlan_clicked()
 {
+    /* 获取信号发送者 */
+    OneDetectPlan *pDetect = qobject_cast<OneDetectPlan*>(sender());
+    if(pDetect == nullptr)
+    {
+        return;
+    }
+    m_layoutNoDetectPlans->removeWidget(pDetect);
+    m_pListcurrNoDetect->removeAll(pDetect);
 
+    delete pDetect;
+    /* 重新排序 */
+    // sortNoDetectPlanList();
 }
 
 
@@ -320,24 +438,74 @@ void CheckPeriodWidget::do_detectPlanModifiedTime(QPoint pBtnSize, bool isStartT
     
 }
 
+/* 修改了静音、反相、过载相关的设置 */
+void CheckPeriodWidget::do_checkBox_clicked()
+{
+    m_currNoDetectApply.isApplySlient = ui->checkBox_applySlient->isChecked();
+    m_currNoDetectApply.isApplyOverload = ui->checkBox_applyOverload->isChecked();
+    m_currNoDetectApply.isApplyPhase = ui->checkBox_applyPhase->isChecked();
+    m_currNoDetectApply.isApplyNoise = ui->checkBox_applyNoise->isChecked();
+}
+
 
 /* 初始化QListWidget */
 void CheckPeriodWidget::initListWidget()
 {
+    /* 获取读取到的检测计划 */
+    const auto& mapDetectConfig = SysConfig.getDetectPeriodConfig();
+    /* 将计划转换成列表组件 */
+    for(auto it = mapDetectConfig.cbegin(); it != mapDetectConfig.cend(); ++it)
+    {
+        int id = it.key();
+        const DetectPeriodConfig_t& config = it.value();
 
-    ui->listWidget_noDetectPlan->clear();
-
-    /* 禁用横向滚动条 */
-    
-
-    /* 设置行间距为16 */
+        /* 如果已经有了,就不需要重新创建 */
+        if(m_mapDetectPlanList.contains(id))
+        {
+            m_pListcurrDetect = m_mapDetectPlanList.value(id);
+        }else 
+        {
+            /* 创建一个新的列表 */
+            m_pListcurrDetect = new QList<OneDetectPlan*>();
+            m_mapDetectPlanList.insert(id, m_pListcurrDetect);
+        }
 
+        if(m_mapNoDetectPlanList.contains(id))
+        {
+            m_pListcurrNoDetect = m_mapNoDetectPlanList.value(id);
+        } else
+        {
+            /* 创建一个新的列表 */
+            m_pListcurrNoDetect = new QList<OneDetectPlan*>();
+            m_mapNoDetectPlanList.insert(id, m_pListcurrNoDetect);
+        }
+        
+        /* 添加检测计划 */
+        for(const auto& plan : config.listDetect)
+        {
+            addDetectPlan(plan);
+        }
+        /* 添加非检测计划 */
+        for(const auto& plan : config.listNoDetect)
+        {
+            addNoDetectPlan(plan);
+        }
+        /* 设置应用配置 */
+        NoDetectPlanApply_t apply;
+        apply.nID = id;
+        apply.isApplySlient = config.isApplySlient;
+        apply.isApplyOverload = config.isApplyOverload;
+        apply.isApplyPhase = config.isApplyPhase;
+        apply.isApplyNoise = config.isApplyNoise;
+        m_mapNoDetectApply[id] = apply;
+    }
 
 }
 
 /* 添加一个检测计划 */
 void CheckPeriodWidget::addDetectPlan(const OnePlan_t& plan)
 {
+    /* 传入的日期类型,不是特殊日就可以 */
     OneDetectPlan *detectPlan = new OneDetectPlan(eWeekType::Week_Monday, this);
     /* 删除日期选择框 */
     
@@ -355,6 +523,22 @@ void CheckPeriodWidget::addDetectPlan(const OnePlan_t& plan)
     sortDetectPlanList();
 }
 
+/* 添加一个非检测计划 */
+void CheckPeriodWidget::addNoDetectPlan(const OnePlan_t& plan)
+{
+    /* 传入特殊日的日期类型 */
+    OneDetectPlan *detectPlan = new OneDetectPlan(eWeekType::Week_Special, this);
+    
+    detectPlan->setQSS(m_qssPlan);
+    detectPlan->setPlan(plan);
+
+    connect(detectPlan, &OneDetectPlan::signal_oneDetectPlanCloseClicked, this, &CheckPeriodWidget::do_pBtn_deleteNoDetectPlan_clicked);
+
+    m_pListcurrNoDetect->append(detectPlan);
+    /* 排序并显示 */
+    sortNoDetectPlanList();
+}
+
 
 /* 重新排序检测计划 */
 void CheckPeriodWidget::sortDetectPlanList()
@@ -374,6 +558,30 @@ void CheckPeriodWidget::sortDetectPlanList()
 
     /* 重新插入 */
     addDetectPlanToLayout();
+
+    update();
+}
+
+/* 排序非检测日期列表 */
+void CheckPeriodWidget::sortNoDetectPlanList()
+{
+    /* 清空列表 */
+    removeAllNoDetectPlanWidgets();
+    
+    /* 排序 */
+    std::sort(m_pListcurrDetect->begin(), m_pListcurrDetect->end(), [](OneDetectPlan *a, OneDetectPlan *b) 
+    {
+        const OnePlan_t &planA = a->getPlan();
+        const OnePlan_t &planB = b->getPlan();
+        /* 按时间从小到大升序 */
+        return dateTimeIsGerater(planB.date, planB.timeStart, planA.date, planA.timeStart);
+    });
+
+
+    /* 重新插入 */
+    addNoDetectPlanToLayout();
+
+    update();
 }
 
 
@@ -395,10 +603,6 @@ QList<OnePlan_t> CheckPeriodWidget::updateDetectPlanList(int id)
 void CheckPeriodWidget::removeAllDetectPlanWidgets()
 {
     /* 清空布局中的所有控件,只剩一个弹簧 */
-    // for(auto& pDetect : *m_pListcurrDetect)
-    // {
-    //     m_layoutDetectPlans->removeWidget(pDetect);
-    // }
     while (m_layoutDetectPlans->count() > 1)
     {
         QWidget *widget = m_layoutDetectPlans->itemAt(0)->widget();
@@ -409,7 +613,22 @@ void CheckPeriodWidget::removeAllDetectPlanWidgets()
         }
     
     }
-    update();
+
+}
+
+/* 清空当前非检测计划布局中的控件 */
+void CheckPeriodWidget::removeAllNoDetectPlanWidgets()
+{
+    /* 清空所有的非检测计划日期 */
+    while( m_layoutNoDetectPlans->count() > 1)
+    {
+        QWidget *widget = m_layoutNoDetectPlans->itemAt(0)->widget();
+        if(widget)
+        {
+            m_layoutNoDetectPlans->removeWidget(widget);
+            widget->hide();
+        }
+    }
 }
 
 /* 从当前列表中添加控件到布局 */
@@ -423,4 +642,82 @@ void CheckPeriodWidget::addDetectPlanToLayout()
     }
 }
 
+/* 从当前列表中添加非检测计划控件到布局 */
+void CheckPeriodWidget::addNoDetectPlanToLayout()
+{
+    for(auto& pDetect : *m_pListcurrNoDetect)
+    {
+        pDetect->show();
+        /* 添加到布局中 */
+        m_layoutNoDetectPlans->insertWidget(m_layoutNoDetectPlans->count() - 1, pDetect);
+    }
+}
+
+/* 更新所有对比项的计划周期 */
+void CheckPeriodWidget::updateCompareItemDetectPeriod(QMap<int, DetectPeriodConfig_t>& mapDetectConfig)
+{
+    /* 先更新检测计划 */
+    for(auto it = m_mapDetectPlanList.cbegin(); it != m_mapDetectPlanList.cend(); ++it)
+    {
+        int id = it.key();
+        QList<OneDetectPlan*>* pList = it.value();
+        DetectPeriodConfig_t config;
+        config.nID = id;
+        /* 更新检测计划 */
+        for(auto& pDetect : *pList)
+        {
+            OnePlan_t plan = pDetect->getPlan();
+            config.listDetect.append(plan);
+        }
+        auto apply = m_mapNoDetectApply.find(id);
+        if(apply != m_mapNoDetectApply.cend())
+        {
+            config.isApplySlient = apply->isApplySlient;
+            config.isApplyOverload = apply->isApplyOverload;
+            config.isApplyPhase = apply->isApplyPhase;
+            config.isApplyNoise = apply->isApplyNoise;
+        } else
+        {
+            config.isApplySlient = false;
+            config.isApplyOverload = false;
+            config.isApplyPhase = false;
+            config.isApplyNoise = false;
+        }
+
+        mapDetectConfig.insert(id, config);
+    }
+
+    /* 更新非检测计划 */
+    for(auto it = m_mapNoDetectPlanList.cbegin(); it != m_mapNoDetectPlanList.cend(); ++it)
+    {
+        int id = it.key();
+        QList<OneDetectPlan*>* pList = it.value();
+        /* 查找的时候,如果没有,会自动插入一个key为id的值 */
+        DetectPeriodConfig_t& config = mapDetectConfig[id];
+
+        config.nID = id;
+        /* 更新非检测计划 */
+        for(auto& pDetect : *pList)
+        {
+            OnePlan_t plan = pDetect->getPlan();
+            config.listNoDetect.append(plan);
+        }
+        /* 这里再查找一遍应用信息是因为防止没有检测计划,只有非检测计划 */
+        auto apply = m_mapNoDetectApply.find(id);
+        if(apply != m_mapNoDetectApply.cend())
+        {
+            config.isApplySlient = apply->isApplySlient;
+            config.isApplyOverload = apply->isApplyOverload;
+            config.isApplyPhase = apply->isApplyPhase;
+            config.isApplyNoise = apply->isApplyNoise;
+        } else
+        {
+            config.isApplySlient = false;
+            config.isApplyOverload = false;
+            config.isApplyPhase = false;
+            config.isApplyNoise = false;
+        }
+    }
+}
+
 

+ 35 - 11
SettingLibrary/Modules/CheckPeriod/checkperiodwidget.h

@@ -10,7 +10,7 @@
 #include "GlobalVariable.h"
 #include "onedetectplan.h"
 #include "CompareItemData.h"
-
+#include "FromWebAPI.h"
 
 
 namespace Ui {
@@ -34,8 +34,10 @@ public:
 
     /* 更新可选的对比项列表 */
     void updateCompareItemList(const QList<CompareItemInfo_t>& compareItemList);
-    /* 设置计划列表 */
-    void setDetectPlanList(const QList<OnePlan_t>& planList);
+    /* 保存设置 */
+    bool saveSettings();
+    /* 设置WebAPI指针 */
+    void setWebAPI(FromWebAPI* api) { m_fromWebAPI = api; }
 
 private slots:
     /* 选择了一个对比项 */
@@ -55,33 +57,55 @@ private slots:
     /* 点击了检测计划的时间按钮,在这里修改时间 */
     void do_detectPlanModifiedTime(QPoint pBtnSize, bool isStartTime);
 
+    /* 修改了静音、反相、过载相关的设置 */
+    void do_checkBox_clicked();
+
 
 private:
     /* 初始化QListWidget */
     void initListWidget();
     /* 添加一个检测计划 */
     void addDetectPlan(const OnePlan_t& plan);
+    /* 添加一个非检测计划 */
+    void addNoDetectPlan(const OnePlan_t& plan);
     /* 重新排序检测计划 */
     void sortDetectPlanList();
+    /* 排序非检测日期列表 */
+    void sortNoDetectPlanList();
     /* 更新当前的检测计划列表 */
     QList<OnePlan_t> updateDetectPlanList(int id);
     /* 清空当前检测计划布局中的控件 */
     void removeAllDetectPlanWidgets();
+    /* 清空当前非检测计划布局中的控件 */
+    void removeAllNoDetectPlanWidgets();
     /* 从当前列表中添加控件到布局 */
     void addDetectPlanToLayout();
+    /* 从当前列表中添加非检测计划控件到布局 */
+    void addNoDetectPlanToLayout();
 
+    /* 更新所有对比项的计划周期 */
+    void updateCompareItemDetectPeriod(QMap<int, DetectPeriodConfig_t>& mapDetectConfig);
 
 private:
     Ui::CheckPeriodWidget *ui;
     std::shared_ptr<spdlog::logger> m_logger = nullptr;
-    QVBoxLayout* m_layoutDetectPlans;                   /* 检测计划的布局,计划控件都在这里面 */
-    QString m_qssPlan;                                  /* 一条计划的样式表 */
-
-    QList<OnePlan_t> m_currentPlanList;                 /* 当前的计划列表 */
-    QList<OneDetectPlan*>* m_pListcurrDetect = nullptr; /* 当前的检测计划列表 */
-    QMap<int, QList<OneDetectPlan*>*> m_mapDetectPlanList;   /* 检测计划列表,key为对比项id,value为计划列表 */
-
-    
+    QString m_qssPlan;                                      /* 一条计划的样式表 */
+    FromWebAPI* m_fromWebAPI = nullptr;                     /* 用于从Web API获取数据 */
+
+    /* 检测计划 */
+    QVBoxLayout* m_layoutDetectPlans;                       /* 检测计划的布局,计划控件都在这里面 */
+    QList<OnePlan_t> m_currentPlanList;                     /* 当前的计划列表 */
+    QList<OneDetectPlan*>* m_pListcurrDetect = nullptr;     /* 当前的检测计划列表 */
+    QMap<int, QList<OneDetectPlan*>*> m_mapDetectPlanList;  /* 检测计划列表,key为对比项id,value为计划列表 */
+
+    /* 非检测计划 */
+    QVBoxLayout* m_layoutNoDetectPlans;                     /* 检测非检测计划日期的布局,计划控件都在这里面 */
+    QList<OneDetectPlan*>* m_pListcurrNoDetect = nullptr;   /* 当前的非检测计划日期列表 */
+    QMap<int, QList<OneDetectPlan*>*> m_mapNoDetectPlanList;/* 非检测计划列表,key为对比项id,value为计划列表 */
+
+    /* 非检测计划应用于静音、过载、反相 */
+    QMap<int, NoDetectPlanApply_t> m_mapNoDetectApply;      /* 非检测计划应用于静音、过载、反相的配置,key为对比项id */
+    NoDetectPlanApply_t m_currNoDetectApply;                /* 当前非检测计划应用配置 */
 
 };
 

+ 58 - 2
SettingLibrary/Modules/CheckPeriod/checkperiodwidget.ui

@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>360</width>
-    <height>761</height>
+    <height>812</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -169,6 +169,12 @@
       </item>
       <item>
        <widget class="QScrollArea" name="scrollArea">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>192</height>
+         </size>
+        </property>
         <property name="widgetResizable">
          <bool>true</bool>
         </property>
@@ -269,7 +275,57 @@
        </layout>
       </item>
       <item>
-       <widget class="QListWidget" name="listWidget_noDetectPlan"/>
+       <widget class="QScrollArea" name="scrollArea_3">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>96</height>
+         </size>
+        </property>
+        <property name="widgetResizable">
+         <bool>true</bool>
+        </property>
+        <widget class="QWidget" name="scrollArea_noDetectPlans">
+         <property name="geometry">
+          <rect>
+           <x>0</x>
+           <y>0</y>
+           <width>358</width>
+           <height>138</height>
+          </rect>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_7">
+          <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>
+           <spacer name="verticalSpacer_3">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>217</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </widget>
+       </widget>
       </item>
       <item>
        <layout class="QGridLayout" name="gridLayout">

+ 10 - 0
SettingLibrary/Modules/CheckPeriod/onedetectplan.cpp

@@ -4,11 +4,14 @@
 #include "timewidget.h"
 #include "customcombobox.h"
 #include "GlobalVariable.h"
+#include "calendardtedit.h"
+
 #include <qpoint.h>
 #include <qpushbutton.h>
 #include <qsize.h>
 
 
+
 OneDetectPlan::OneDetectPlan(eWeekType type, QWidget *parent) :
     QWidget(parent),
     ui(new Ui::OneDetectPlan), m_type(type)
@@ -38,6 +41,11 @@ OneDetectPlan::OneDetectPlan(eWeekType type, QWidget *parent) :
     ui->pBtn_timeStart->setText(m_timeStart.toString("hh:mm:ss"));
     ui->pBtn_timeEnd->setText(m_timeEnd.toString("hh:mm:ss"));
 
+    /* 设置默认的日期格式 */
+    ui->dateEdit->setDisplayFormat("yyyy-MM-dd");
+    /* 禁止修改日期 */
+    ui->dateEdit->setManualDisableEdit(true, true);
+
     /* 禁用comboBox滚动修改 */
     ui->comboBox->setWheelDisabled(true);
 
@@ -94,6 +102,7 @@ void OneDetectPlan::setPlan(const OnePlan_t &plan)
     m_timeEnd = plan.timeEnd;
     ui->pBtn_timeStart->setText(m_timeStart.toString("hh:mm:ss"));
     ui->pBtn_timeEnd->setText(m_timeEnd.toString("hh:mm:ss"));
+    ui->dateEdit->setDate(plan.date);
 }
 
 /* 获取计划 */
@@ -103,6 +112,7 @@ const OnePlan_t& OneDetectPlan::getPlan()
     m_plan.weekType = ui->comboBox->currentData().value<eWeekType>();
     m_plan.timeStart = m_timeStart;
     m_plan.timeEnd = m_timeEnd;
+    m_plan.date = ui->dateEdit->date();
 
     return m_plan;
 }

+ 0 - 1
SettingLibrary/Modules/CheckPeriod/onedetectplan.h

@@ -54,7 +54,6 @@ private:
     OnePlan_t m_plan;           /* 一条计划 */
     QTime m_timeStart;          /* 开始时间 */
     QTime m_timeEnd;            /* 结束时间 */
-
 };
 
 #endif // ONEDETECTPLAN_H

+ 6 - 1
SettingLibrary/Modules/CheckPeriod/onedetectplan.ui

@@ -71,7 +71,7 @@
        </size>
       </property>
      </widget>
-     <widget class="QDateEdit" name="dateEdit">
+     <widget class="CalendarDTEdit" name="dateEdit">
       <property name="geometry">
        <rect>
         <x>0</x>
@@ -225,6 +225,11 @@
    <extends>QComboBox</extends>
    <header location="global">customcombobox.h</header>
   </customwidget>
+  <customwidget>
+   <class>CalendarDTEdit</class>
+   <extends>QDateEdit</extends>
+   <header location="global">calendardtedit.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>

+ 168 - 0
SettingLibrary/Network/FromWebAPI.cpp

@@ -548,4 +548,172 @@ bool FromWebAPI::updateSystemConfig(const std::string& key, const std::string& v
     return true;
 }
 
+/* 获取检测时段配置 */
+bool FromWebAPI::getDetectPeriodConfig(QMap<int, DetectPeriodConfig_t>& mapDetectConfig)
+{
+    try
+    {
+        nJson json0;
+        json0["opName"] = "ACAS_GetDetectPeriod";
+        QString strSend = QString::fromStdString(json0.dump());
+        QString strRet;
+        int ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_Select, strSend, strRet);
+        if(ret != 0)
+        {
+            SPDLOG_LOGGER_ERROR(m_logger, "获取对比项检测时段信息失败, 错误码: {}, {}", ret, strRet.toStdString());
+            return false;
+        }
+
+        nJson jsonRet;
+        /* 将json的key全部转换成小写 */
+        convertJsonKeyToLower(nJson::parse(strRet.toStdString()), jsonRet);
+        int code = jsonRet["code"].get<int>();
+        if(code != 0)
+        {
+            SPDLOG_LOGGER_ERROR(m_logger, "获取对比项检测时段信息失败,错误码: {}, 错误信息: {}", code, jsonRet["message"].get<std::string>()); 
+            return false;
+        }
+        nJson jsonResult = jsonRet["result"];
+        mapDetectConfig.clear();
+        for(const auto& it : jsonResult)
+        {
+            int id = it["itemid"].get<int>();
+            /* 如果这个ID不存在,会默认创建一个 DetectPeriodConfig_t,以这个ID为键 */
+            DetectPeriodConfig_t& detectConfig = mapDetectConfig[id];
+            detectConfig.nID = id;
+            bool isDetect = it["isdetect"].get<bool>();
+            if(isDetect)
+            {
+                /* 是检测时段 */
+                OnePlan_t plan;
+                plan.weekType = static_cast<eWeekType>(it["weektype"].get<int>());
+                plan.timeStart = QTime::fromString(QString::fromStdString(it["timestart"].get<std::string>()), "HH:mm:ss");
+                plan.timeEnd = QTime::fromString(QString::fromStdString(it["timeend"].get<std::string>()), "HH:mm:ss");
+
+                detectConfig.listDetect.append(plan);
+            }else 
+            {
+                /* 不是检测时段 */
+                OnePlan_t plan;
+                plan.date = it["cdate"].is_null() ? QDate() : QDate::fromString(QString::fromStdString(it["cdate"].get<std::string>()), "yyyy-MM-dd");
+                plan.timeStart = QTime::fromString(QString::fromStdString(it["timestart"].get<std::string>()), "HH:mm:ss");
+                plan.timeEnd = QTime::fromString(QString::fromStdString(it["timeend"].get<std::string>()), "HH:mm:ss");
+
+                detectConfig.listNoDetect.append(plan);
+
+                detectConfig.isApplySlient = it["applyslient"].get<bool>();
+                detectConfig.isApplyOverload = it["applyoverload"].get<bool>();
+                detectConfig.isApplyPhase = it["applyphase"].get<bool>();
+                detectConfig.isApplyNoise = it["applynoise"].get<bool>();
+            }
+        }
+
+    }nJsonCatch
+
+    return true;
+}
+
+/* 插入检测时段配置 */
+bool FromWebAPI::insertDetectPeriodConfig(const QMap<int, DetectPeriodConfig_t>& mapDetectConfig)
+{
+    try
+    {
+        int Key = 1;
+        nJson jsonArray = nJson::array();
+        for(auto it = mapDetectConfig.begin(); it != mapDetectConfig.end(); ++it)
+        {
+            int itemID = it.key();
+            /* 先添加检测计划 */
+            for(auto& plan : it.value().listDetect)
+            {
+                nJson json1;
+                json1["opName"] = "ACAS_InsertDetectPeriod";
+                json1["Key"] = Key++;
+                nJson jsonPlan;
+                jsonPlan["itemID"] = itemID;
+                jsonPlan["isDetect"] = true;
+                jsonPlan["weekType"] = static_cast<int>(plan.weekType);
+                jsonPlan["cDate"] = ""; // 检测计划没有日期
+                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;
+
+                json1["paramList"] = jsonPlan;
+                jsonArray.push_back(json1);
+            }
+
+            /* 再添加非检测计划 */
+            for(auto& plan : it.value().listNoDetect)
+            {
+                nJson json1;
+                json1["opName"] = "ACAS_InsertDetectPeriod";
+                json1["Key"] = Key++;
+                nJson jsonPlan;
+                jsonPlan["itemID"] = itemID;
+                jsonPlan["isDetect"] = false;
+                jsonPlan["weekType"] = static_cast<int>(eWeekType::Week_Special);
+                jsonPlan["cDate"] = plan.date.isValid() ? plan.date.toString("yyyy-MM-dd").toStdString() : "";
+                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;
+                jsonPlan["applyNoise"] = it.value().isApplyNoise;
+
+                json1["paramList"] = jsonPlan;
+                jsonArray.push_back(json1);
+            }
+        }
+        QString strSend = QString::fromStdString(jsonArray.dump());
+        QString strRet;
+        int ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_BatchTransAction, strSend, strRet);
+        if(ret != 0)
+        {
+            SPDLOG_LOGGER_ERROR(m_logger, "写入 对比项检测计划 信息失败: {}, {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+            return false;
+        }
+    }nJsonCatch
+
+    return true;
+}
+
+/* 删除某些对比项的检测时段 */
+bool FromWebAPI::deleteDetectPeriodConfig(const QList<int>& listIDs)
+{
+    try
+    {
+        int Key = 1;
+        nJson jsonArray = nJson::array();
+        for(auto it : listIDs)
+        {
+            int itemID = it;
+            nJson json1;
+            json1["opName"] = "ACAS_DeleteDetectPeriod";
+            json1["Key"] = Key++;
+            nJson josnItem;
+            josnItem["itemID"] = itemID;
+            json1["paramList"] = josnItem;
+            
+            jsonArray.push_back(json1);
+        }
+        QString strSend = QString::fromStdString(jsonArray.dump());
+        QString strRet;
+        int ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_BatchTransAction, strSend, strRet);
+        if(ret != 0)
+        {
+            SPDLOG_LOGGER_ERROR(m_logger, "删除对比项检测时段信息失败: {}, {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+            return false;
+        }
+    }nJsonCatch
+
+    return true;
+}
+
 

+ 8 - 0
SettingLibrary/Network/FromWebAPI.h

@@ -38,6 +38,14 @@ public:
     bool getSystemConfig(QMap<std::string, std::string>& mapConfig);
     /* 更新系统配置信息  */
     bool updateSystemConfig(const std::string& key, const std::string& value, const std::string& desc = std::string());
+
+    /* ================================================================================== */
+    /* 获取检测时段配置 */
+    bool getDetectPeriodConfig(QMap<int, DetectPeriodConfig_t>& mapDetectConfig);
+    /* 插入检测时段配置 */
+    bool insertDetectPeriodConfig(const QMap<int, DetectPeriodConfig_t>& mapDetectConfig);
+    /* 删除某些对比项的检测时段 */
+    bool deleteDetectPeriodConfig(const QList<int>& listIDs);
     
 
 private:

+ 1 - 0
SettingLibrary/Resources/Resources.qrc

@@ -14,6 +14,7 @@
         <file>icon/tip.png</file>
         <file>icon/time.png</file>
         <file>icon/Date.png</file>
+        <file>icon/date_light.png</file>
         <file>Tip/Wait2x.png</file>
         <file>Tip/Tips2x.png</file>
         <file>Tip/Failed2x.png</file>

+ 42 - 0
SettingLibrary/Resources/qss/white/onedetectplan.qss

@@ -62,6 +62,48 @@ TimeWidget:hover
 	border: 1px solid #4458FE;
 }
 
+/* ==========================================================
+ *  日期选择器
+ * ========================================================== */
+
+CalendarDTEdit
+{
+	background: #FFFFFF;
+    border-radius: 4px;
+    padding-left:12px;
+    border: 1px solid #E6E9F4;
+}
+
+CalendarDTEdit:hover
+{
+	background: #FFFFFF;
+    border-radius: 4px;
+    padding-left:12px;
+    border: 1px solid #4458FE;
+}
+
+CalendarDTEdit[Warn=true]
+{
+	background: #FFFFFF;
+    border-radius: 4px;
+    padding-left:12px;
+    border: 1px solid #D21F21;
+}
+
+CalendarDTEdit:!enabled/* 或者disable */
+{
+    background: rgba(0,0,0,0.04);
+    border: 1px solid #E6E9F4;
+}
+
+CalendarDTEdit::drop-down
+{
+ 	padding-right:8px;
+	width: 16px;
+    height: 16px;
+    image: url(:/icon/date_light.png);
+}
+
 
 /* ==========================================================
  *  QComboBox(这个是在用的)

+ 9 - 0
SettingLibrary/setinfomanager.cpp

@@ -248,6 +248,15 @@ bool SetInfoManager::getSystemConfig()
         }
     }
 
+    /* 检测时段单独获取 */
+    QMap<int, DetectPeriodConfig_t> mapDetectConfig;
+    if(!m_fromWebAPI->getDetectPeriodConfig(mapDetectConfig))
+    {
+        SPDLOG_ERROR("获取对比项检测时段配置失败");
+        return false;
+    }
+    SysConfig.setDetectPeriodConfig(mapDetectConfig);
+
     return true;
 }
 

+ 14 - 0
SettingLibrary/setinfowidget.cpp

@@ -59,6 +59,12 @@ void SetInfoWidget::setWebAPI(FromWebAPI* api)
     {
         databaseWidget->setWebAPI(m_fromWebAPI);
     }
+    /* 设置检测时段的WebAPI */
+    CheckPeriodWidget* checkPeriodWidget = qobject_cast<CheckPeriodWidget*>(ui->tabWidget->widget(4));
+    if(checkPeriodWidget)
+    {
+        checkPeriodWidget->setWebAPI(m_fromWebAPI);
+    }
 }
 
 
@@ -162,6 +168,14 @@ void SetInfoWidget::saveData()
             }
             break;
         case 4:     /* 检测时段 */
+            {
+                CheckPeriodWidget* widget = qobject_cast<CheckPeriodWidget*>(currentWidget);
+                if(widget)
+                {
+                    /* 保存检测时段信息 */
+                    isSuccess = widget->saveSettings();
+                }
+            }
             break;
         default:
             break;