Sfoglia il codice sorgente

V1.3.8
1、完成了大部分

Apple 2 settimane fa
parent
commit
b685b55bd8

+ 3 - 2
SwitchOnOff.sql

@@ -61,11 +61,12 @@ FROM TMONITORPIN;
 #删除模版
 DELETE 
 FROM tExecPlanTemplate
-WHERE TemplateName = '模版3';
+WHERE ChannelID = '2' AND TemplateName = '模版1';
 
+#删除一个频率的一个模版
 DELETE
 FROM tExecPlanTemplate
-WHERE TemplateName = :templateName;
+WHERE ChannelID = :channelID AND TemplateName = :templateName;
 
 
 #创建模版表格

+ 0 - 2
TransmitterSwitch/CMakeLists.txt

@@ -77,7 +77,6 @@ target_include_directories(${lib_name} PRIVATE
     ${CMAKE_CURRENT_SOURCE_DIR}/common/TipWidget
     ${CMAKE_CURRENT_SOURCE_DIR}/common/FlowLayout
 
-    # ${LHQLog_INCLUDE_DIRS}
     ${LHHTTPAPI_INCLUDE_DIRS}
     ${spdlog_INCLUDE_DIR}
     # ${LHQLog_INCLUDE_DIRS}
@@ -91,7 +90,6 @@ target_link_libraries(${lib_name} PRIVATE
 
 #链接外部库
 target_link_libraries(${lib_name} PRIVATE
-    # ${spdlog_LIBRARY}
     ${spdlog_STATIC_LIBRARY}
 )
 

+ 20 - 4
TransmitterSwitch/CopyToOther/copytoother.cpp

@@ -88,10 +88,11 @@ void CopyToOther::do_ok()
         if(it->isChecked())
         {
             auto chnID = it->property(m_propertyChnID.c_str()).toInt();
-            OneTemplateInfo info;
-            info.channelInfo.ChannelID = chnID;
-            info.channelInfo.ChannelName = it->text();
-            info.templateName = it->text() + QString::number(chnID);
+            ChannelInfo info;
+            info.ChannelID = chnID;
+            info.ChannelName = it->text();
+
+            m_listChannel.append(info);
         }
     }
 
@@ -167,6 +168,21 @@ void CopyToOther::createRow(const ChannelInfo& info)
     checkBox->setText(info.ChannelName);
     checkBox->setProperty(m_propertyChnID.c_str(), info.ChannelID);
     checkBox->setMinimumHeight(34);
+    checkBox->setStyleSheet(R"(
+        QCheckBox
+        {
+            background: #464649;
+
+            font-weight: 400;
+            font-size: 14px;
+            color: #B1B3B4;
+            text-align: left;
+            font-style: normal;
+            text-transform: none;
+
+            padding-left: 16px;
+        })"
+    );
     connect(checkBox, &QCheckBox::stateChanged, this, &CopyToOther::do_checkBox_stateChanged);
     /* 插入到最后一个弹簧之前 */
     m_layout->insertWidget(m_layout->count() - 1, checkBox);

+ 28 - 30
TransmitterSwitch/ExecPlanData/plancard.cpp

@@ -11,37 +11,37 @@
 PlanInfo::PlanInfo()
 {
     onWeekDay = enum_WeekDay::WeekDay_Mon;
-    onTime = QDateTime::fromString("1970-01-01 00:00:00", "yyyy-MM-dd hh:mm:ss");
+    onDateTime = QDateTime::fromString("1970-01-01 00:00:00", "yyyy-MM-dd hh:mm:ss");
 
     offWeekDay = enum_WeekDay::WeekDay_Mon;
-    offTime = QDateTime::fromString("1970-01-01 00:00:00", "yyyy-MM-dd hh:mm:ss");
+    offDateTime = QDateTime::fromString("1970-01-01 00:00:00", "yyyy-MM-dd hh:mm:ss");
 }
 
 PlanInfo::PlanInfo(const PlanInfo& info)
 {
     onWeekDay = info.onWeekDay;
-    onTime = info.onTime;
+    onDateTime = info.onDateTime;
 
     offWeekDay = info.offWeekDay;
-    offTime = info.offTime;
+    offDateTime = info.offDateTime;
 }
 PlanInfo& PlanInfo::operator=(const PlanInfo& info)
 {
     if(this != &info)
     {
         onWeekDay = info.onWeekDay;
-        onTime = info.onTime;
+        onDateTime = info.onDateTime;
 
         offWeekDay = info.offWeekDay;
-        offTime = info.offTime;
+        offDateTime = info.offDateTime;
     }
     return *this;
 }
 
 bool PlanInfo::operator==(const PlanInfo& info) const
 {
-    if(onWeekDay == info.onWeekDay && onTime == info.onTime &&
-       offWeekDay == info.offWeekDay && offTime == info.offTime)
+    if(onWeekDay == info.onWeekDay && onDateTime == info.onDateTime &&
+       offWeekDay == info.offWeekDay && offDateTime == info.offDateTime)
     {
         return true;
     }
@@ -142,19 +142,19 @@ void PlanCard::setChannelInfo(const ChannelInfo& info)
 /* 添加一项 */
 void PlanCard::addPlanItem(const PlanInfo& info)
 {
-    auto strStart = getDateString(info.onWeekDay, info.onTime);
-    auto strEnd = getDateString(info.offWeekDay, info.offTime);
+    auto strStart = getDateString(info.onWeekDay, info.onDateTime);
+    auto strEnd = getDateString(info.offWeekDay, info.offDateTime);
 
     /* 创建一个item */
     QStandardItem* itemStart = new QStandardItem();
     itemStart->setText(strStart);
     itemStart->setData(static_cast<int>(info.onWeekDay), UserRole_WeekDay);   /* 设置周几 */
-    itemStart->setData(info.onTime, UserRole_Time);                           /* 设置时间 */
+    itemStart->setData(info.onDateTime, UserRole_Time);                           /* 设置时间 */
 
     QStandardItem* itemEnd = new QStandardItem();
     itemEnd->setText(strEnd);
     itemEnd->setData(static_cast<int>(info.offWeekDay), UserRole_WeekDay);       /* 设置周几 */
-    itemEnd->setData(info.offTime, UserRole_Time);                               /* 设置时间 */
+    itemEnd->setData(info.offDateTime, UserRole_Time);                               /* 设置时间 */
 
     /* 添加一个项 */
     m_model->appendRow(QList<QStandardItem*>{itemStart, itemEnd});
@@ -200,9 +200,9 @@ PlanInfo PlanCard::deletePlanItem(const int row)
     auto item2 = m_model->item(sourceRow, 1);
     PlanInfo info;
     info.onWeekDay = static_cast<enum_WeekDay>(item1->data(UserRole_WeekDay).toInt());
-    info.onTime = item1->data(UserRole_Time).toDateTime();
+    info.onDateTime = item1->data(UserRole_Time).toDateTime();
     info.offWeekDay = static_cast<enum_WeekDay>(item2->data(UserRole_WeekDay).toInt());
-    info.offTime = item2->data(UserRole_Time).toDateTime();
+    info.offDateTime = item2->data(UserRole_Time).toDateTime();
 
     /* 删除该行 */
     m_model->removeRow(sourceRow);
@@ -231,19 +231,19 @@ PlanInfo PlanCard::modifyPlanItem(const int row, const PlanInfo& info)
 
     PlanInfo oldInfo;
     oldInfo.onWeekDay = static_cast<enum_WeekDay>(item1->data(UserRole_WeekDay).toInt());
-    oldInfo.onTime = item1->data(UserRole_Time).toDateTime();
+    oldInfo.onDateTime = item1->data(UserRole_Time).toDateTime();
     oldInfo.offWeekDay = static_cast<enum_WeekDay>(item2->data(UserRole_WeekDay).toInt());
-    oldInfo.offTime = item2->data(UserRole_Time).toDateTime();
+    oldInfo.offDateTime = item2->data(UserRole_Time).toDateTime();
 
     // LH_WRITE_LOG(QString("修改前的行: %1").arg(item1->row()));
     /* 修改该行 */
-    item1->setText(getDateString(info.onWeekDay, info.onTime));
+    item1->setText(getDateString(info.onWeekDay, info.onDateTime));
     item1->setData(static_cast<int>(info.onWeekDay), UserRole_WeekDay);   /* 设置周几 */
-    item1->setData(info.onTime, UserRole_Time);                           /* 设置时间 */
+    item1->setData(info.onDateTime, UserRole_Time);                           /* 设置时间 */
 
-    item2->setText(getDateString(info.offWeekDay, info.offTime));
+    item2->setText(getDateString(info.offWeekDay, info.offDateTime));
     item2->setData(static_cast<int>(info.offWeekDay), UserRole_WeekDay);       /* 设置周几 */
-    item2->setData(info.offTime, UserRole_Time);                               /* 设置时间 */
+    item2->setData(info.offDateTime, UserRole_Time);                               /* 设置时间 */
     
     // LH_WRITE_LOG(QString("修改后的行: %1").arg(item1->row()));
     /* 依旧选中修改完成后的行 */
@@ -307,9 +307,9 @@ void PlanCard::setPlanList(const QList<OnePlanItemInfo>& list)
         /* 添加计划 */
         PlanInfo info;
         info.onWeekDay = it.onWeekDay;
-        info.onTime = it.onDateTime;
+        info.onDateTime = it.onDateTime;
         info.offWeekDay = it.offWeekDay;
-        info.offTime = it.offDateTime;
+        info.offDateTime = it.offDateTime;
         addPlanItem(info);
     }
 }
@@ -323,12 +323,10 @@ void PlanCard::getPlanList(QList<PlanInfo>& list)
         auto item2 = m_model->item(i, 1);
         PlanInfo info;
         info.onWeekDay = static_cast<enum_WeekDay>(item1->data(UserRole_WeekDay).toInt());
-        info.onTime = item1->data(UserRole_Time).toDateTime();
-        // info.startOnOff = static_cast<enum_OnOff>(item1->data(UserRole_OnOff).toInt());
+        info.onDateTime = item1->data(UserRole_Time).toDateTime();
 
         info.offWeekDay = static_cast<enum_WeekDay>(item2->data(UserRole_WeekDay).toInt());
-        info.offTime = item2->data(UserRole_Time).toDateTime();
-        // info.endOnOff = static_cast<enum_OnOff>(item2->data(UserRole_OnOff).toInt());
+        info.offDateTime = item2->data(UserRole_Time).toDateTime();
 
         list.append(info);
     }
@@ -368,9 +366,9 @@ PlanInfo PlanCard::getSelectedPlan()
 
     PlanInfo info;
     info.onWeekDay = static_cast<enum_WeekDay>(item1->data(UserRole_WeekDay).toInt());
-    info.onTime = item1->data(UserRole_Time).toDateTime();
+    info.onDateTime = item1->data(UserRole_Time).toDateTime();
     info.offWeekDay = static_cast<enum_WeekDay>(item2->data(UserRole_WeekDay).toInt());
-    info.offTime = item2->data(UserRole_Time).toDateTime();
+    info.offDateTime = item2->data(UserRole_Time).toDateTime();
     return info;
 
 }
@@ -420,9 +418,9 @@ void PlanCard::do_tableView_clicked(const QModelIndex& index)
     auto item2 = m_model->item(index.row(), 1);
     PlanInfo info;
     info.onWeekDay = static_cast<enum_WeekDay>(item1->data(UserRole_WeekDay).toInt());
-    info.onTime = item1->data(UserRole_Time).toDateTime();
+    info.onDateTime = item1->data(UserRole_Time).toDateTime();
     info.offWeekDay = static_cast<enum_WeekDay>(item2->data(UserRole_WeekDay).toInt());
-    info.offTime = item2->data(UserRole_Time).toDateTime();
+    info.offDateTime = item2->data(UserRole_Time).toDateTime();
     emit signal_clickedItem(info); /* 发送信号 */
     // emit signal_clickedCard(m_channelInfo.ChannelID);
 }

+ 2 - 2
TransmitterSwitch/ExecPlanData/plancard.h

@@ -30,10 +30,10 @@ enum QtUserRole
 struct PlanInfo
 {
     enum_WeekDay onWeekDay;                     /* 周几 */
-    QDateTime onTime;                           /* 时间 */
+    QDateTime onDateTime;                       /* 时间 */
 
     enum_WeekDay offWeekDay;                    /* 周几 */
-    QDateTime offTime;                          /* 时间 */
+    QDateTime offDateTime;                      /* 时间 */
 
     PlanInfo();
     PlanInfo(const PlanInfo& info);

+ 106 - 52
TransmitterSwitch/ManagerPlan/managerplan.cpp

@@ -10,9 +10,11 @@
 #include "warning.h"
 #include "tipwidget.h"
 #include "LHQLogAPI.h"
+#include "savetotemplate.h"
 
 
-ManagerPlan::ManagerPlan(QDialog *parent) :
+ManagerPlan::ManagerPlan(Enum_Mode mode, QDialog *parent) :
+    m_mode(mode),
     QDialog(parent),
     ui(new Ui::ManagerPlan)
 {
@@ -89,6 +91,7 @@ ManagerPlan::ManagerPlan(QDialog *parent) :
     connect(ui->pBtn_deletePlan, &QPushButton::clicked, this, &ManagerPlan::do_deletePlanItem);
     connect(ui->pBtn_ok, &QPushButton::clicked, this, &ManagerPlan::do_pBtn_ok);
     connect(ui->pCard, &PlanCard::signal_clickedItem, this, &ManagerPlan::do_tableView_clicked);
+    connect(ui->pBtn_saveTotemplate, &QPushButton::clicked, this, &ManagerPlan::do_saveTemplate);
 
     /* 设置皮肤样式 */
     do_setUIStyle();
@@ -105,6 +108,9 @@ ManagerPlan::ManagerPlan(QDialog *parent) :
 
     /* 默认显示周计划 */
     ui->tabWidget->setCurrentIndex(0);
+
+    /* 设置显示模式 */
+    setMode(mode);
 }
 
 ManagerPlan::~ManagerPlan()
@@ -112,21 +118,6 @@ ManagerPlan::~ManagerPlan()
     delete ui;
 }
 
-/* 设置显示模式,需要在执行exec()之前调用 */
-void ManagerPlan::setMode(Enum_Mode mode)
-{
-    if(mode == Enum_Mode::Mode_Modify)
-    {
-        ui->widget_addPlan->setVisible(false); /* 隐藏添加计划区域 */
-        ui->label_title->setText("编辑"); /* 修改标题 */
-        ui->widget_background->resize(this->width(), 600); /* 修改窗口大小 */
-    }else {
-        ui->label_title->setText("新增"); /* 修改标题 */
-        ui->widget_background->resize(this->width(), 740); /* 修改窗口大小 */
-    }
-
-}
-
 /* 设置频率信息 */
 void ManagerPlan::setFrequencyID(ChannelInfo& info)
 {
@@ -145,12 +136,15 @@ void ManagerPlan::setFrequencyID(ChannelInfo& info)
     }
     /* 设置当前频率的计划列表 */
     ui->pCard->setChannelInfo(info);
-    /* 设置当前频率的计划列表 */
-    auto list = findPlanList(info.ChannelID);
-    /* 设置计划列表 */  
-    ui->pCard->setPlanList(list);
+    if((m_mode == Enum_Mode::Mode_Add) || (m_mode == Enum_Mode::Mode_Modify))
+    {
+        /* 设置当前频率的计划列表 */
+        auto list = findPlanList(info.ChannelID);
+        /* 设置计划列表 */  
+        ui->pCard->setPlanList(list);
+    }
 
-    if(list.isEmpty())
+    if(ui->pCard->isPlanEmpty())
     {
         /* 没有计划,隐藏按钮 */
         setButtonVisible(false);
@@ -161,12 +155,53 @@ void ManagerPlan::setFrequencyID(ChannelInfo& info)
     }
 }
 
+
+/* 设置计划列表,给修改模版使用 */
+void ManagerPlan::setPlanList(QList<OnePlanItemInfo>& listPlan)
+{
+    /* 设置当前频率的计划列表 */
+    ui->pCard->setPlanList(listPlan);
+    /* 转换为PlanInfo */
+    QList<PlanInfo> list;
+    ui->pCard->getPlanList(list);
+    /* 设置计划列表 */
+    m_mapPlanInfo.insert(m_channelInfo.ChannelID, list);
+}
+
+
 /* 修改UI样式 */
 void ManagerPlan::do_setUIStyle()
 {
     this->setStyleSheet(EPUIStyle.StrQSS_ManagerPlan);
 }
 
+
+/* 设置显示模式,需要在执行exec()之前调用 */
+void ManagerPlan::setMode(Enum_Mode mode)
+{
+    if(mode == Enum_Mode::Mode_Add)
+    {
+        ui->label_title->setText("新增");                   /* 修改标题 */
+        ui->widget_background->resize(this->width(), 740);  /* 修改窗口大小 */
+    }
+    else if(mode == Enum_Mode::Mode_Modify)
+    {
+        ui->widget_addPlan->setVisible(false);              /* 隐藏添加计划区域 */
+        ui->label_title->setText("编辑");                   /* 修改标题 */
+        ui->widget_background->resize(this->width(), 600);  /* 修改窗口大小 */
+    }
+    else if(mode == Enum_Mode::Mode_ModifyTemplate)
+    {
+        ui->widget_addPlan->setVisible(false);              /* 隐藏添加计划区域 */
+        ui->label_title->setText("修改模板");                /* 修改标题 */
+        ui->widget_background->resize(this->width(), 600);  /* 修改窗口大小 */
+        ui->pBtn_saveTotemplate->setVisible(false);         /* 隐藏保存模版按钮 */
+    }
+    m_mode = mode;
+
+}
+
+
 /* 设置时间和日期选择Tab */
 void ManagerPlan::setTabWidget()
 {
@@ -235,11 +270,15 @@ QList<PlanInfo>& ManagerPlan::findPlanList(const int chnID)
     if(list == m_mapPlanInfo.end())
     {
         QList<PlanInfo> listPlan;
-        /* 将PData的计划拷贝过来 */
-        auto pCard = PData.findPlanCard(chnID);
-        if(pCard != nullptr)
+        /* 如果是修改模版,则不从全局获取数据,插入一个空的即可 */
+        if(m_mode != Enum_Mode::Mode_ModifyTemplate)
         {
-            pCard->getPlanList(listPlan);
+            /* 将PData的计划拷贝过来 */
+            auto pCard = PData.findPlanCard(chnID);
+            if(pCard != nullptr)
+            {
+                pCard->getPlanList(listPlan);
+            }
         }
         m_mapPlanInfo.insert(chnID, listPlan);
     }
@@ -294,7 +333,7 @@ bool ManagerPlan::checkOnAndOffTime(const PlanInfo& info)
         else if(info.onWeekDay == info.offWeekDay)
         {
             /* 开机和关机在同一天 */
-            if(info.onTime.time() >= info.offTime.time())
+            if(info.onDateTime.time() >= info.offDateTime.time())
             {
                 /* 开机时间大于等于关机时间,冲突 */
                 return true;
@@ -310,15 +349,15 @@ bool ManagerPlan::checkOnAndOffTime(const PlanInfo& info)
     {
         /* 特殊日判断 */ 
         /* 开机和关机在不同天 */
-        if(info.onTime.date() > info.offTime.date())
+        if(info.onDateTime.date() > info.offDateTime.date())
         {
             /* 开机时间大于关机时间,冲突 */
             return true;
         }
-        else if(info.onTime.date() == info.offTime.date())
+        else if(info.onDateTime.date() == info.offDateTime.date())
         {
             /* 开机和关机在同一天 */
-            if(info.onTime.time() >= info.offTime.time())
+            if(info.onDateTime.time() >= info.offDateTime.time())
             {
                 /* 开机时间大于等于关机时间,冲突 */
                 return true;
@@ -405,8 +444,8 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info)
     for(const auto& it : list)
     {
         /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
-        bool isLess = timeIsGerater(it.onWeekDay, it.onTime, info.offWeekDay, info.offTime);
-        bool isGreater = timeIsGerater(info.onWeekDay, info.onTime, it.offWeekDay, it.offTime);
+        bool isLess = timeIsGerater(it.onWeekDay, it.onDateTime, info.offWeekDay, info.offDateTime);
+        bool isGreater = timeIsGerater(info.onWeekDay, info.onDateTime, it.offWeekDay, it.offDateTime);
         if(isLess || isGreater)
         {
             /* 时间不冲突 */
@@ -423,7 +462,7 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info)
 /* 判断计划时间和列表中的时间是否冲突,添加排除的计划,用于比较修改的计划 */
 bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo, const PlanInfo& exInfo)
 {
-    /* 这里采用拷贝的方式获取,后续不需要再把排的项放回去 */
+    /* 这里采用拷贝的方式获取,后续不需要再把排的项放回去 */
     QList<PlanInfo> list = findPlanList(chnID);
     /* 先去掉需要排除的项 */
     list.removeOne(exInfo);
@@ -434,8 +473,8 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo
     for(const auto& it : list)
     {
         /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
-        bool isLess = timeIsGerater(it.onWeekDay, it.onTime, newInfo.offWeekDay, newInfo.offTime);
-        bool isGreater = timeIsGerater(newInfo.onWeekDay, newInfo.onTime, it.offWeekDay, it.offTime);
+        bool isLess = timeIsGerater(it.onWeekDay, it.onDateTime, newInfo.offWeekDay, newInfo.offDateTime);
+        bool isGreater = timeIsGerater(newInfo.onWeekDay, newInfo.onDateTime, it.offWeekDay, it.offDateTime);
         if(isLess || isGreater)
         {
             /* 时间不冲突 */
@@ -497,19 +536,19 @@ void ManagerPlan::do_addPlanItem()
     {
         /* 正常日 */
         one.onWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekStart->itemData(ui->cBox_selectWeekStart->currentIndex()).toInt());
-        one.onTime.setTime(ui->timeEdit_weekStart->getTime());
+        one.onDateTime.setTime(ui->timeEdit_weekStart->getTime());
 
         one.offWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekEnd->itemData(ui->cBox_selectWeekEnd->currentIndex()).toInt());
-        one.offTime.setTime(ui->timeEdit_weekEnd->getTime());
+        one.offDateTime.setTime(ui->timeEdit_weekEnd->getTime());
     }else {
         /* 特殊日 */
         one.onWeekDay = enum_WeekDay::WeekDay_Special;
-        one.onTime.setDate(ui->dateEdit_specialStart->date());
-        one.onTime.setTime(ui->timeEdit_specialStart->getTime());
+        one.onDateTime.setDate(ui->dateEdit_specialStart->date());
+        one.onDateTime.setTime(ui->timeEdit_specialStart->getTime());
 
         one.offWeekDay = enum_WeekDay::WeekDay_Special;
-        one.offTime.setDate(ui->dateEdit_specialEnd->date());
-        one.offTime.setTime(ui->timeEdit_specialEnd->getTime());
+        one.offDateTime.setDate(ui->dateEdit_specialEnd->date());
+        one.offDateTime.setTime(ui->timeEdit_specialEnd->getTime());
     }
     
 
@@ -558,17 +597,17 @@ void ManagerPlan::do_modifyPlanItem()
     {
         /* 正常日 */
         one.onWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekStart->itemData(ui->cBox_selectWeekStart->currentIndex()).toInt());
-        one.onTime.setTime(ui->timeEdit_weekStart->getTime());
+        one.onDateTime.setTime(ui->timeEdit_weekStart->getTime());
         one.offWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekEnd->itemData(ui->cBox_selectWeekEnd->currentIndex()).toInt());
-        one.offTime.setTime(ui->timeEdit_weekEnd->getTime());
+        one.offDateTime.setTime(ui->timeEdit_weekEnd->getTime());
     }else {
         /* 特殊日 */
         one.onWeekDay = enum_WeekDay::WeekDay_Special;
-        one.onTime.setDate(ui->dateEdit_specialStart->date());
-        one.onTime.setTime(ui->timeEdit_specialStart->getTime());
+        one.onDateTime.setDate(ui->dateEdit_specialStart->date());
+        one.onDateTime.setTime(ui->timeEdit_specialStart->getTime());
         one.offWeekDay = enum_WeekDay::WeekDay_Special;
-        one.offTime.setDate(ui->dateEdit_specialEnd->date());
-        one.offTime.setTime(ui->timeEdit_specialEnd->getTime());
+        one.offDateTime.setDate(ui->dateEdit_specialEnd->date());
+        one.offDateTime.setTime(ui->timeEdit_specialEnd->getTime());
     }
     /* 先判断设置的时间是否和当前选中的行的时间相同 */
     auto nowPlan = ui->pCard->getSelectedPlan();
@@ -626,6 +665,21 @@ void ManagerPlan::do_deletePlanItem()
     }
 }
 
+/* 点击了保存模版按钮 */
+void ManagerPlan::do_saveTemplate()
+{
+    /* 判断卡片有没有计划 */
+    if(ui->pCard->isPlanEmpty())
+    {
+        /* 没有计划 */
+        TipWidget::display(TipWidget::OPERATOR_WARN, "该频率没有计划!", this);
+        return;
+    }
+    
+    emit signal_saveTemplate(ui->pCard->getChannelInfo());
+
+}
+
 /* 点击了OK按钮 */
 void ManagerPlan::do_pBtn_ok()
 {
@@ -641,16 +695,16 @@ void ManagerPlan::do_tableView_clicked(PlanInfo& info)
     {
         /* 正常日 */
         ui->cBox_selectWeekStart->setCurrentIndex(static_cast<int>(info.onWeekDay) - 1);
-        ui->timeEdit_weekStart->setTime(info.onTime.time());
+        ui->timeEdit_weekStart->setTime(info.onDateTime.time());
         ui->cBox_selectWeekEnd->setCurrentIndex(static_cast<int>(info.offWeekDay) - 1);
-        ui->timeEdit_weekEnd->setTime(info.offTime.time());
+        ui->timeEdit_weekEnd->setTime(info.offDateTime.time());
     }else
     {
         /* 特殊日 */
-        ui->dateEdit_specialStart->setDate(info.onTime.date());
-        ui->timeEdit_specialStart->setTime(info.onTime.time());
-        ui->dateEdit_specialEnd->setDate(info.offTime.date());
-        ui->timeEdit_specialEnd->setTime(info.offTime.time());
+        ui->dateEdit_specialStart->setDate(info.onDateTime.date());
+        ui->timeEdit_specialStart->setTime(info.onDateTime.time());
+        ui->dateEdit_specialEnd->setDate(info.offDateTime.date());
+        ui->timeEdit_specialEnd->setTime(info.offDateTime.time());
     }
 }
 

+ 14 - 4
TransmitterSwitch/ManagerPlan/managerplan.h

@@ -14,7 +14,8 @@ class ManagerPlan;
 enum class Enum_Mode
 {
     Mode_Add = 0,               /* 添加模式 */
-    Mode_Modify = 1             /* 修改模式 */
+    Mode_Modify = 1,            /* 修改模式 */
+    Mode_ModifyTemplate = 2,    /* 修改模版模式,去掉了保存为模版的按钮 */
 };
 
 /**
@@ -26,7 +27,7 @@ class ManagerPlan : public QDialog
     Q_OBJECT
 
 public:
-    explicit ManagerPlan(QDialog *parent = nullptr);
+    explicit ManagerPlan(Enum_Mode mode, QDialog *parent = nullptr);
     ~ManagerPlan();
 
     /* 获取是否点击了OK */
@@ -34,16 +35,22 @@ public:
     /* 获取计划信息 */
     QMap<int, QList<PlanInfo>>& getPlanInfo() { return m_mapPlanInfo; }
 
-    /* 设置显示模式,需要在执行exec()之前调用 */
-    void setMode(Enum_Mode mode);
     /* 设置频率信息 */
     void setFrequencyID(ChannelInfo& info);
+    /* 设置计划列表,给修改模版使用 */
+    void setPlanList(QList<OnePlanItemInfo>& listPlan);
+
+signals:
+    /* 发送保存模版信号 */
+    void signal_saveTemplate(ChannelInfo info);
 
 public slots:
     /* 修改UI样式 */
     void do_setUIStyle();
 
 private:
+    /* 设置显示模式,这个需要最先调用 */
+    void setMode(Enum_Mode mode);
     /* 设置时间和日期选择Tab */
     void setTabWidget();
     /* 设置可选择的周几 */
@@ -82,6 +89,8 @@ private slots:
     void do_modifyPlanItem();
     /* 点击了删除按钮 */
     void do_deletePlanItem();
+    /* 点击了保存模版按钮 */
+    void do_saveTemplate();
 
     /* 点击了OK按钮 */
     void do_pBtn_ok();
@@ -107,6 +116,7 @@ private:
 
     bool m_isOK = false;                        /* 是否点击了OK按钮 */
     ChannelInfo m_channelInfo;                  /* 频率信息 */
+    Enum_Mode m_mode;                           /* 显示模式 */
 
     /* 存储计划信息,修改过的频率计划,存储的是这个频率完整的计划 */
     QMap<int, QList<PlanInfo>> m_mapPlanInfo;

+ 1 - 1
TransmitterSwitch/ManagerPlan/managerplan.ui

@@ -114,7 +114,7 @@
            <widget class="QLabel" name="label_title">
             <property name="minimumSize">
              <size>
-              <width>36</width>
+              <width>88</width>
               <height>24</height>
              </size>
             </property>

+ 17 - 4
TransmitterSwitch/Resource/QSS/dark/copytoother.qss

@@ -1,7 +1,5 @@
 QWidget
 {
-    background: transparent;
-
     font-size: 14px;
     color: #D2D2D2;
     line-height: 21px;
@@ -26,6 +24,11 @@ QWidget#widget_Top
     border-bottom: 1px solid rgba(255,255,255,0.15);
 }
 
+QWidget#widget_content
+{
+    background: transparent;
+}
+
 QLabel#label_title
 {
     font-weight: 500;
@@ -107,6 +110,8 @@ QPushButton#pBtn_ok:hover
 /* 左下角和右下角是直角 */
 QCheckBox#checkBox_list
 {
+    background: transparent;
+
     font-weight: 500;
     font-size: 16px;
     color: #D2D2D2;
@@ -124,8 +129,10 @@ QCheckBox#checkBox_list
     border: 1px solid rgba(255,255,255,0.15);
 }
 
-QCheckBox
+QCheckBox#checkBox
 {
+    background: transparent;
+
     font-weight: 400;
     font-size: 14px;
     color: #B1B3B4;
@@ -141,7 +148,7 @@ QCheckBox
  ================================================================*/
 QScrollArea
 {
-	background:transparent;
+	background: #464649;
 	border-top-left-radius: 0px;
     border-top-right-radius: 0px;
     border-bottom-left-radius: 4px;
@@ -151,6 +158,12 @@ QScrollArea
     border-right: 1px solid rgba(255,255,255,0.15);
     border-bottom: 1px solid rgba(255,255,255,0.15);
 }
+
+QWidget#scrollArea
+{
+    background: transparent;
+}
+
 QScrollBar:horizontal, QScrollBar:vertical
 {
     border:none;

+ 0 - 2
TransmitterSwitch/Resource/QSS/dark/importtemplate.qss

@@ -1,7 +1,5 @@
 QWidget
 {
-    background: transparent;
-
     font-size: 14px;
     color: #D2D2D2;
     line-height: 21px;

+ 3 - 1
TransmitterSwitch/Resource/QSS/dark/plancard.qss

@@ -40,7 +40,8 @@ QLabel#label_title
 /* 表格标题 */
 QWidget#widget_tableHeader
 {
-    background-color: rgba(255, 255, 255, 0.1);
+    background-color: rgba(255, 255, 255, 25);
+    /* background: green; */
     border-radius: 0px 0px 0px 0px; 
     border: none;
 }
@@ -60,6 +61,7 @@ QLabel#label_onTime, #label_offTime
 
 QTableView
 {
+    background: transparent;
     font-weight: 400;
     font-size: 14px;
     color: #B1B3B4;

+ 167 - 0
TransmitterSwitch/Resource/QSS/dark/templatemanager.qss

@@ -0,0 +1,167 @@
+QWidget
+{
+    font-size: 14px;
+    color: #D2D2D2;
+    line-height: 21px;
+    text-align: left;
+    font-style: normal;
+}
+
+QWidget#TemplateManager
+{
+    background: transparent;
+}
+
+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-weight: 500;
+    font-size: 18px;
+    color: #D2D2D2;
+    line-height: 24px;
+    text-align: left;
+    font-style: normal;
+    text-transform: none;
+}
+
+
+QPushButton#pBtn_close
+{
+	/* 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;
+
+    text-align: center;
+}
+
+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;
+    text-align: center;
+    border: 1px solid #438EFF;
+}
+
+
+
+/********* 普通方框按钮三种状态效果 *********/
+QPushButton#pBtn_cancel:enabled
+{
+    text-align: center;
+    color: #EBEBEB;
+    border: 1px solid rgba(255,255,255,0.25);
+    border-radius: 16px;
+    background: transparent;
+}
+QPushButton#pBtn_cancel:hover
+{
+    text-align: center;
+    color: #EBEBEB;
+    border: 1px solid rgba(255,255,255,0.25);
+    border-radius: 16px;
+    background: rgba(0,0,0,0.15);
+}
+
+
+/********* 带有底色按钮三种状态效果 *********/
+QPushButton#pBtn_ok
+{
+	border-radius: 16px;
+	text-align: center;
+    color:white;
+    background: #438EFF;
+    border-radius: 16px;
+}
+
+QPushButton#pBtn_ok:hover
+{
+	border-radius: 16px;
+	text-align: center;
+    color:white;
+    background: #5F9EFF;
+    border-radius: 16px;
+}
+
+/* ==========================================================
+ *  QTableWidget
+ * ========================================================== */
+
+QTableWidget
+{
+    background: transparent;
+    /* padding-left: 16px; */
+    border: 0px solid #E6E9F4;
+    text-align: left;
+}
+
+/* 设置标题栏,如果不生效,可能是在UI里面设置了样式表,导致冲突了 */
+QTableWidget QHeaderView
+{
+    background: transparent;
+}
+
+QTableWidget QHeaderView::section
+{
+    background: transparent;
+    padding-left: 16px;
+    font-weight: 500;
+    font-size: 14px;
+    color: #D2D2D2;
+    
+    border: 0px solid #E6E9F4;
+    border-top: 1px solid rgba(255,255,255,0.15);
+    border-bottom: 1px solid rgba(255,255,255,0.15);
+}
+
+
+QTableWidget::item
+{
+    background: transparent;
+
+    padding-left: 16px;
+    padding-right: 0px;
+    padding-top: 0px;
+    padding-bottom: 0px;
+
+    margin: 0px;
+
+    text-align: left;
+
+    border: 0px solid #E6E9F4;
+}
+
+QTableWidget::item:selected
+{
+    color: #EBEBEB;
+    background: #438EFF;
+}
+
+/* QCheckBox::indicator
+{
+    width: 16px;
+    height: 16px;
+    border-radius: 4px;
+    background: #B3C0E7;
+} */
+

+ 17 - 8
TransmitterSwitch/Resource/QSS/dark/transmitterswitch.qss

@@ -4,8 +4,6 @@
 
 QWidget
 {
-    /* font-family: 思源黑体R; */
-    /* font-weight: 400; */
     font-size: 14px;
     color: #B1B3B4;
     line-height: 22px;
@@ -14,6 +12,11 @@ QWidget
     text-transform: none;
 }
 
+QWidget#TransmitterSwitch
+{
+    background: #202428;
+}
+
 /* 整体背景 */
 QWidget#widget
 {
@@ -149,11 +152,6 @@ QWidget#widget_frequency
     border: none;
 }
 
-QWidget#scrollAreaWidgetContents
-{
-    border-radius: 0px 0px 0px 0px;
-    border: 0px solid rgba(255,255,255,0.15);
-}
 
 QWidget#widget_items
 {
@@ -165,12 +163,23 @@ QWidget#widget_items
 /*===============================================================
  * QScrollBar 滚动条
  ================================================================*/
-QScrollArea
+QScrollArea#scrollArea
 {
 	background:transparent;
+    /* background: #202428; */
 	border-radius:0px;
 	border:none;
 }
+
+QWidget#scrollAreaContents_Card
+{
+    background: transparent;
+    /* background: #202428; */
+    border-radius: 0px 0px 0px 0px;
+    border: 0px solid rgba(255,255,255,0.15);
+}
+
+
 QScrollBar:horizontal, QScrollBar:vertical
 {
     border:none;

+ 1 - 0
TransmitterSwitch/Resource/TransSwitch.qrc

@@ -26,6 +26,7 @@
         <file>QSS/dark/plancard.qss</file>
         <file>QSS/dark/managerplan.qss</file>
         <file>QSS/dark/copytoother.qss</file>
+        <file>QSS/dark/templatemanager.qss</file>
     </qresource>
     <qresource prefix="/ICON">
         <file>Tip/Complete2x.png</file>

+ 2 - 2
TransmitterSwitch/Template/importtemplate.cpp

@@ -138,10 +138,10 @@ void ImportTemplate::do_checkBox_stateChanged(int state)
 void ImportTemplate::showEvent(QShowEvent *event)
 {
     /* 设置列宽度 */
-    int width = (ui->tableWidget->width() - 88) / 2;
+    int width = (ui->tableWidget->width() - 88 - 14) / 2;
     ui->tableWidget->setColumnWidth(0, width);
     ui->tableWidget->setColumnWidth(1, width);
-    ui->tableWidget->setColumnWidth(3, 88);
+    ui->tableWidget->setColumnWidth(2, 88);
 }
 
 

+ 389 - 0
TransmitterSwitch/Template/templatemanager.cpp

@@ -0,0 +1,389 @@
+#include "templatemanager.h"
+#include "ui_templatemanager.h"
+
+#include <QDebug>
+#include <QPoint>
+#include <QTableWidgetItem>
+#include <QFile>
+#include <QPainter>
+#include <QMouseEvent>
+
+#include "warning/warning.h"
+#include "LHQLogAPI.h"
+#include "OneShadowEffect.h"
+#include "TransmitterSwitchInfo.h"
+#include "UIStyleManager.h"
+#include "template.h"
+#include "managerplan.h"
+#include "FromWebAPI.h"
+#include "tipwidget.h"
+
+
+TemplateManager::TemplateManager(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::TemplateManager)
+{
+    ui->setupUi(this);
+
+    /* 设置隐藏边框 */
+    this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
+    /* 设置底层样式表 */
+    this->setAttribute(Qt::WA_TranslucentBackground);
+    /* 创建阴影 */
+    QSize size = this->size();
+    size.setWidth(size.width() - 40);
+    size.setHeight(size.height() - 40);
+
+    auto pShadow = new OneShadowEffect(this);
+    this->setGraphicsEffect(pShadow);
+
+    /* 设置列数 */
+    ui->tableWidget->horizontalHeader()->setVisible(true);
+    ui->tableWidget->setColumnCount(5);
+    /* 设置列表头 */
+    QStringList headerList = {"频率名称", "模版名称", "", "", ""};
+    ui->tableWidget->setHorizontalHeaderLabels(headerList);
+    ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
+    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+
+    /* 设置列表头高度 */
+    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(40);
+    /* 设置列宽间距,在显示事件中设置 */
+    /* 设置列宽度固定 */
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
+
+    //设置行高
+    ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
+    
+    //设置不可编辑
+    ui->tableWidget->setEditTriggers(QTableWidget::NoEditTriggers);
+    //设置选中一行
+    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+    //设置只能选中一行
+    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+    //隐藏横滚动条
+    ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    //隐藏网格线
+    ui->tableWidget->setShowGrid(false);
+    //隐藏行号
+    ui->tableWidget->verticalHeader()->setVisible(false);
+    //设置不显示选中后的虚线
+    ui->tableWidget->setFocusPolicy(Qt::NoFocus);
+
+    //开启排序功能
+//    ui->tableWidget->setSortingEnabled(true);
+
+
+    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()));
+    connect(ui->tableWidget, &QTableWidget::cellClicked, this, &TemplateManager::do_clickedItem);
+
+    /* 注册事件过滤器 */
+    ui->pBtn_close->installEventFilter(this);
+
+}
+
+TemplateManager::~TemplateManager()
+{
+    delete ui;
+}
+
+void TemplateManager::do_ok()
+{
+    /* 获取已选中的模版列表 */
+
+    m_isOk = true;
+    this->close();
+}
+
+/* 点击了一个单元格 */
+void TemplateManager::do_clickedItem(int row, int column)
+{
+    // LH_WRITE_LOG_DEBUG(QString("点击了单元格: %1, %2").arg(row).arg(column));
+    if(column < 2)
+    {
+        return;
+    }
+    /* 获取此单元格 */
+    auto item = ui->tableWidget->item(row, column);
+    if(item == nullptr)
+    {
+        return;
+    }
+    /* 判断是什么功能的单元格 */
+    if(column == 2) 
+    {
+        /* 预览 */
+    }
+    else if(column == 3)
+    {
+        /* 修改 */
+        modifyTemplate(item);
+    }
+    else if(column == 4)
+    {
+        /* 删除 */
+        deleteTemplate(item);
+    }
+    /* 强制重新绘制表格 */
+    ui->tableWidget->repaint();
+}
+
+
+/* 显示事件 */
+void TemplateManager::showEvent(QShowEvent *event)
+{
+    /* 设置列宽度 */
+    int width = (ui->tableWidget->width() - ( 66 * 3)) / 2;
+    ui->tableWidget->setColumnWidth(0, width);
+    ui->tableWidget->setColumnWidth(1, width);
+    ui->tableWidget->setColumnWidth(2, 66);
+    ui->tableWidget->setColumnWidth(3, 66);
+    ui->tableWidget->setColumnWidth(4, 66);
+}
+
+
+/* 设置模版列表 */
+void TemplateManager::setTemplateList(const QMultiMap<int, OneTemplateInfo>& mapTemplate)
+{
+    for(auto it = mapTemplate.begin(), end = mapTemplate.end(); it != end; it++)
+    {
+        createRow(it.value());
+    }
+}
+
+
+/* 设置QSS */
+void TemplateManager::setQSSPath(const QString& qssPath)
+{
+    if(qssPath.isEmpty())
+    {
+        return;
+    }
+    QString qssFile = qssPath + "/templatemanager.qss";
+    QFile file(qssFile);
+    if(file.open(QFile::ReadOnly))
+    {
+        QString styleSheet = file.readAll();
+        this->setStyleSheet(styleSheet);
+        file.close();
+    }else 
+    {
+        LH_WRITE_ERROR(QString("Open %1 failed").arg(qssFile));
+    }
+
+    // if(EPUIStyle.getUIStyle() == enum_UIStyle::UI_Dark)
+    // {
+    //     /* 手动设置表头的qss */
+    //     ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
+    // }else {
+    //     ui->tableWidget->horizontalHeader()->setStyleSheet(m_qssHeaderView_dark);
+    // }
+}
+
+
+/* 设置WebAPI指针 */
+void TemplateManager::setWebAPI(FromWebAPI* webAPI)
+{
+    if(webAPI == nullptr)
+    {
+        LH_WRITE_ERROR("WebAPI is nullptr");
+        return;
+    }
+    m_fromWebAPI = webAPI;
+}
+
+
+
+/* 添加一行 */
+void TemplateManager::createRow(const OneTemplateInfo& info)
+{
+    /* 设置表格的行数 */
+    int row = ui->tableWidget->rowCount();
+    ui->tableWidget->setRowCount(row + 1);
+    /* 设置行高 */
+    ui->tableWidget->setRowHeight(row, 40);
+
+    QTableWidgetItem* item0 = new QTableWidgetItem(info.channelInfo.ChannelName);
+    item0->setData(m_roleChnID, info.channelInfo.ChannelID);
+    ui->tableWidget->setItem(row, 0, item0);
+
+    QTableWidgetItem* item1 = new QTableWidgetItem(info.templateName, Qt::EditRole);
+    item1->setData(m_roleTemplateName, info.templateName);
+    ui->tableWidget->setItem(row, 1, item1);
+
+    /* 添加固定的三个项 */
+    auto item2 = new QTableWidgetItem("预览");
+    item2->setData(m_roleChnID, info.channelInfo.ChannelID);
+    item2->setData(m_roleTemplateName, info.templateName);
+    item2->setForeground(QBrush("#438EFF"));
+    ui->tableWidget->setItem(row, 2, item2);
+
+    auto item3 = new QTableWidgetItem("修改");
+    item3->setData(m_roleChnID, info.channelInfo.ChannelID);
+    item3->setData(m_roleTemplateName, info.templateName);
+    item3->setForeground(QBrush("#438EFF"));
+    ui->tableWidget->setItem(row, 3, item3);
+
+    auto item4 = new QTableWidgetItem("删除");
+    item4->setData(m_roleChnID, info.channelInfo.ChannelID);
+    item4->setData(m_roleTemplateName, info.templateName);
+    item4->setForeground(QBrush("#438EFF"));
+    ui->tableWidget->setItem(row, 4, item4);
+}
+
+
+/* 修改模版 */
+void TemplateManager::modifyTemplate(QTableWidgetItem* item)
+{
+    /* 获取频率 */
+    OneTemplateInfo info;
+    info.templateName = item->data(m_roleTemplateName).toString();
+    /* 获取频率名称 */
+    info.channelInfo = ChnContainer.getChannel(item->data(m_roleChnID).toInt());
+    /* 获取模版中的计划 */
+    QList<OnePlanItemInfo> nowListPlan;
+    if(!m_fromWebAPI->getExecPlanData(info.channelInfo.ChannelID, nowListPlan))
+    {
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版计划失败", this);
+        return;
+    }
+    LH_WRITE_LOG_DEBUG(QString("获取模版计划成功, 频率ID:%1, 模版名称:%2, 计划数:%3").arg(info.channelInfo.ChannelID).arg(info.templateName).arg(nowListPlan.size()));
+    /* 弹出修改模版的窗口 */
+    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_ModifyTemplate);
+    mp->setFrequencyID(info.channelInfo);
+    mp->setPlanList(nowListPlan);
+    mp->exec();
+    /* 判断是否点击了OK */
+    if(!mp->isOK())
+    {
+        return;
+    }
+    /* 获取计划信息 */
+    auto& mapPlanInfo = mp->getPlanInfo();
+    QList<OnePlanItemInfo> newListPlan;
+    /* 设置该频率的计划 */
+    for(auto it = mapPlanInfo.begin(), end = mapPlanInfo.end(); it != end; it++)
+    {
+        if(it.key() != info.channelInfo.ChannelID)
+        {
+            continue;
+        }
+        for(auto& it1 : it.value())
+        {
+            OnePlanItemInfo tmp;
+            tmp.ChannelID = info.channelInfo.ChannelID;
+            tmp.ChannelName = info.channelInfo.ChannelName;
+            tmp.onWeekDay = it1.onWeekDay;
+            tmp.onDateTime = it1.onDateTime;
+            tmp.offWeekDay = it1.offWeekDay;
+            tmp.offDateTime = it1.offDateTime;
+
+            newListPlan.append(tmp);
+        }
+    }
+    m_mapModifyTemplate.insert(info, newListPlan);
+
+    // if(m_fromWebAPI->modifyTemplate(info, newListPlan))
+    // {
+    //     TipWidget::display(TipWidget::OPERATOR_OK, "修改模版成功", this);
+    // }else {
+    //     TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版失败", this);
+    // }
+}
+
+/* 删除模版 */
+void TemplateManager::deleteTemplate(QTableWidgetItem* item)
+{
+    /* 弹出删除模版的提示框 */
+    Warning w(this);
+    w.setQSS(EPUIStyle.getQSSPath());
+    w.setText("确定删除对应频率开关机计划?");
+    w.exec();
+    if(!w.isOk())
+    {
+        return;
+    }
+    /* 删除 */
+    OneTemplateInfo info;
+    info.channelInfo.ChannelID = item->data(m_roleChnID).toInt();
+    info.templateName = item->data(m_roleTemplateName).toString();
+    /* 将模版信息添加到删除列表 */
+    m_listDeleteTemplate.append(info);
+    /* 删除当前行 */
+    ui->tableWidget->removeRow(item->row());
+
+    /* 删除模版 */
+    // if(m_fromWebAPI->deleteTemplate(info))
+    // {
+    //     TipWidget::display(TipWidget::OPERATOR_OK, "删除模版成功", this);
+    // }else {
+    //     TipWidget::display(TipWidget::OPERATOR_FAIL, "从数据库删除模版失败", this);
+    // }
+}
+
+
+
+
+
+
+/* 事件过滤器 */
+bool TemplateManager::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 TemplateManager::mousePressEvent(QMouseEvent *event)
+{
+    m_lastPos = event->globalPos();
+    event->accept();
+}
+
+/* 鼠标移动事件 */
+void TemplateManager::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 TemplateManager::mouseReleaseEvent(QMouseEvent *event)
+{
+    event->accept();
+}

+ 91 - 0
TransmitterSwitch/Template/templatemanager.h

@@ -0,0 +1,91 @@
+#ifndef TEMPLATEMANAGER_H
+#define TEMPLATEMANAGER_H
+
+#include <QDialog>
+#include <QCheckBox>
+#include <QTableWidgetItem>
+
+class TemplateItem;
+class OneTemplateInfo;
+class FromWebAPI;
+class OnePlanItemInfo;
+
+namespace Ui {
+class TemplateManager;
+}
+
+class TemplateManager : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit TemplateManager(QWidget *parent = nullptr);
+    ~TemplateManager();
+
+    /* 是否点下了OK */
+    bool isOk() const { return m_isOk; }
+    /* 获取的已删除的模板列表 */
+    QList<OneTemplateInfo>& getDeleteTemplateList() { return m_listDeleteTemplate; }
+    /* 获取已修改的模版列表 */
+    QMap<OneTemplateInfo, QList<OnePlanItemInfo>>& getModifyTemplateList() { return m_mapModifyTemplate; }
+
+    /* 设置模版列表 */
+    void setTemplateList(const QMultiMap<int, OneTemplateInfo>& mapTemplate);
+
+    /* 设置QSS */
+    void setQSSPath(const QString& qssPath);
+    /* 设置WebAPI指针 */
+    void setWebAPI(FromWebAPI* webAPI);
+
+    
+signals:
+    
+private:
+    /* 添加一行 */
+    void createRow(const OneTemplateInfo& info);
+    /* 修改模版 */
+    void modifyTemplate(QTableWidgetItem* item);
+    /* 删除模版 */
+    void deleteTemplate(QTableWidgetItem* item);
+
+private slots:
+    /* 点击了OK */
+    void do_ok();
+    /* 点击了一个单元格 */
+    void do_clickedItem(int row, int column);
+
+protected:
+    /* 显示事件 */
+    void showEvent(QShowEvent *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:
+    Ui::TemplateManager *ui;
+
+    FromWebAPI* m_fromWebAPI = nullptr;                 /* WebAPI操作类 */
+
+    bool m_isOk = false;                                /* 是否点下了OK */
+    // QString m_templateName;                             /* 模版名称 */
+    int m_type = -1;                                    /* 模版类型 */
+
+    QPoint m_lastPos;                                   /* 鼠标点击的位置 */
+    const std::string m_propertyChnID = "ChannelID";    /* 属性名称 */
+    const std::string m_propertytmpName = "TemplateName";/* 属性名称 */
+    const int m_roleChnID = Qt::UserRole + 1;            /* 角色名称 */
+    const int m_roleTemplateName = Qt::UserRole + 2;     /* 角色名称 */
+
+    QList<OneTemplateInfo> m_listTemplate;              /* 模版列表 */
+
+    QList<OneTemplateInfo> m_listDeleteTemplate;        /* 删除的模版列表 */
+    QMap<OneTemplateInfo, QList<OnePlanItemInfo>> m_mapModifyTemplate; /* 修改的模版列表 */
+
+};
+
+#endif // TEMPLATEMANAGER_H

+ 231 - 0
TransmitterSwitch/Template/templatemanager.ui

@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TemplateManager</class>
+ <widget class="QDialog" name="TemplateManager">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>840</width>
+    <height>680</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true"/>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>20</number>
+   </property>
+   <property name="topMargin">
+    <number>20</number>
+   </property>
+   <property name="rightMargin">
+    <number>20</number>
+   </property>
+   <property name="bottomMargin">
+    <number>20</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="widget" native="true">
+     <property name="styleSheet">
+      <string notr="true"/>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>32</number>
+      </property>
+      <item>
+       <widget class="QWidget" name="widget_Top" native="true">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>63</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>16777215</width>
+          <height>63</height>
+         </size>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <property name="spacing">
+          <number>0</number>
+         </property>
+         <property name="leftMargin">
+          <number>32</number>
+         </property>
+         <property name="rightMargin">
+          <number>16</number>
+         </property>
+         <item>
+          <widget class="QLabel" name="label_title">
+           <property name="minimumSize">
+            <size>
+             <width>88</width>
+             <height>24</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>536</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pBtn_close">
+           <property name="minimumSize">
+            <size>
+             <width>32</width>
+             <height>32</height>
+            </size>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QWidget" name="widget_content" native="true">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>0</height>
+         </size>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_3">
+         <property name="spacing">
+          <number>0</number>
+         </property>
+         <property name="leftMargin">
+          <number>32</number>
+         </property>
+         <property name="topMargin">
+          <number>32</number>
+         </property>
+         <property name="rightMargin">
+          <number>32</number>
+         </property>
+         <property name="bottomMargin">
+          <number>32</number>
+         </property>
+         <item>
+          <widget class="QTableWidget" name="tableWidget"/>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item>
+       <widget class="QWidget" name="widget_bottom" native="true">
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>34</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>16777215</width>
+          <height>34</height>
+         </size>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <property name="spacing">
+          <number>8</number>
+         </property>
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>32</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>463</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pBtn_cancel">
+           <property name="minimumSize">
+            <size>
+             <width>68</width>
+             <height>32</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>取消</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pBtn_ok">
+           <property name="minimumSize">
+            <size>
+             <width>68</width>
+             <height>32</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>确定</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 17 - 0
TransmitterSwitch/TransmitterSwitchInfo.cpp

@@ -285,3 +285,20 @@ OneTemplateInfo& OneTemplateInfo::operator=(const OneTemplateInfo& info)
     return *this;
 }
 
+bool OneTemplateInfo::operator<(const OneTemplateInfo& info) const
+{
+    if(this == &info)
+        return false;
+    if(channelInfo.ChannelID < info.channelInfo.ChannelID)
+    {
+        return true;
+    }else if(channelInfo.ChannelID == info.channelInfo.ChannelID)
+    {
+        if(templateName < info.templateName)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+

+ 2 - 0
TransmitterSwitch/TransmitterSwitchInfo.h

@@ -194,6 +194,7 @@ struct OnePlanItemInfo
     OnePlanItemInfo();
     OnePlanItemInfo(const OnePlanItemInfo& item);
     OnePlanItemInfo& operator=(const OnePlanItemInfo& item);
+    
 };
 
 
@@ -356,6 +357,7 @@ struct OneTemplateInfo
     OneTemplateInfo() : channelInfo(), templateName("") {}
     OneTemplateInfo(const OneTemplateInfo& info);
     OneTemplateInfo& operator=(const OneTemplateInfo& info);
+    bool operator<(const OneTemplateInfo& info) const;
 };
 
 

+ 111 - 17
TransmitterSwitch/WebAPI/FromWebAPI.cpp

@@ -33,7 +33,7 @@ bool FromWebAPI::initWebApi(const QString& url, const QString& serverID, const Q
     }
 #if defined(Q_OS_WIN)
     #ifdef QT_DEBUG
-    QString libFile = QString("%1/LHSqlWebInterface.dll").arg(QApplication::applicationDirPath());
+    QString libFile = QString("%1/LHSqlWebInterfaced.dll").arg(QApplication::applicationDirPath());
     #else
     QString libFile = QString("%1/LHSqlWebInterface.dll").arg(QApplication::applicationDirPath());
     #endif
@@ -175,13 +175,13 @@ bool FromWebAPI::getDeviceInfo(QMap<QString, DeviceInfo>& mapDevice)
 bool FromWebAPI::getChannelInfo(QMap<int, ChannelInfo>& mapFreq)
 {
     /* 测试,创建几个频率 */
-    for(int i = 0; i < 12; i++)
-    {
-        ChannelInfo freqInfo;
-        freqInfo.ChannelID = i + 1;
-        freqInfo.ChannelName = QString("频率%1").arg(freqInfo.ChannelID);
-        mapFreq.insert(freqInfo.ChannelID, freqInfo);
-    }
+    // for(int i = 0; i < 12; i++)
+    // {
+    //     ChannelInfo freqInfo;
+    //     freqInfo.ChannelID = i + 1;
+    //     freqInfo.ChannelName = QString("频率%1").arg(freqInfo.ChannelID);
+    //     mapFreq.insert(freqInfo.ChannelID, freqInfo);
+    // }
 
 
     if(m_httpApi == nullptr)
@@ -900,6 +900,19 @@ bool FromWebAPI::saveTemplate(const QString& templateName, QList<OnePlanItemInfo
 
 }
 
+
+/* 批量写入模版数据 */
+bool FromWebAPI::saveTemplateList(const QMap<OneTemplateInfo, QList<OnePlanItemInfo>>& mapTemplate)
+{
+    if(m_httpApi == nullptr)
+    {
+        LH_WRITE_ERROR("WebAPI is nullptr");
+        return false;
+    }
+
+}
+
+
 /* 获取模板内容 */
 bool FromWebAPI::getOneTemplateData(QString templateName, QList<OnePlanItemInfo>& list)
 {
@@ -978,24 +991,28 @@ bool FromWebAPI::getTemplateData(QList<OneTemplateInfo>& listTemplate, QMap<int,
         LH_WRITE_ERROR("WebAPI is nullptr");
         return false;
     }
-    nJson json0 = nJson::array();
+    nJson jsonArry = nJson::array();
     for(auto& it : listTemplate)
     {
-        nJson json1;
-        json1["opName"] = "TMS_GetExecPlanTemplateData";
-        json1["Key"] = QUuid::createUuid().toString().toStdString();
-        json1["templateName"] = it.templateName.toStdString();
-        json0.push_back(json1);
+        jsonArry.push_back(it.templateName.toStdString());
     }
+    nJson json0;
+    json0["opName"] = "TMS_GetExecPlanTemplateData";
+    nJson json1;
+    json1["templateName"] = jsonArry;
+    json0["paramList"] = json1;
+    /* 打印生成的JSON */
+    // LH_WRITE_LOG_DEBUG(QString::fromStdString(json0.dump(4)));
 
     QString strCmd = QString::fromStdString(json0.dump());
     QString strRet;
-    auto ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_BatchTransAction, strCmd, strRet, true);
+    auto ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_Select, strCmd, strRet, true);
     if(ret != 0)
     {
         LH_WRITE_ERROR(QString("获取模板失败:%1, 错误信息:%2").arg(ret).arg(m_httpApi->DoGetLastError(&ret)));
         return false;
     }
+    // LH_WRITE_LOG_DEBUG(strRet);
     /* 解析获取到的JSON数据 */
     try
     {
@@ -1051,6 +1068,8 @@ bool FromWebAPI::getTemplateData(QList<OneTemplateInfo>& listTemplate, QMap<int,
         return false;
     }
 
+    LH_WRITE_LOG_DEBUG(QString("获取多个频率模板成功,频率数目:%1").arg(mapPlan.size()));
+
     return true;
 }
 
@@ -1180,7 +1199,7 @@ bool FromWebAPI::getTemplateList(int chnID, QList<OneTemplateInfo>& listTemplate
 }
 
 /* 删除一个模板 */
-bool FromWebAPI::deleteTemplate(const QString& name)
+bool FromWebAPI::deleteTemplate(const OneTemplateInfo& info)
 {
     if(m_httpApi == nullptr)
     {
@@ -1191,7 +1210,8 @@ bool FromWebAPI::deleteTemplate(const QString& name)
     nJson json0;
     json0["opName"] = "TMS_DeleteExecPlanTemplate";
     nJson json1;
-    json1["templateName"] = name.toStdString();
+    json1["channelID"] = info.channelInfo.ChannelID;
+    json1["templateName"] = info.templateName.toStdString();
     json0["paramList"] = json1;
     QString strCmd = QString::fromStdString(json0.dump());
     QString strRet;
@@ -1205,3 +1225,77 @@ bool FromWebAPI::deleteTemplate(const QString& name)
     return true;
 }
 
+/* 一次删除多个模版 */
+bool FromWebAPI::deleteTemplateList(const QList<OneTemplateInfo>& listTemplate)
+{
+    if(m_httpApi == nullptr)
+    {
+        LH_WRITE_ERROR("WebAPI is nullptr");
+        return false;
+    }
+    nJson json0 = nJson::array();
+    for(auto& it : listTemplate)
+    {
+        nJson json1;
+        json1["opName"] = "TMS_DeleteExecPlanTemplate";
+        json1["Key"] = QUuid::createUuid().toString().toStdString();
+        nJson json2;
+        json2["channelID"] = it.channelInfo.ChannelID;
+        json2["templateName"] = it.templateName.toStdString();
+        json1["paramList"] = json2;
+        json0.push_back(json1);
+    }
+
+    /* 打印生成的JSON */
+    LH_WRITE_LOG_DEBUG(QString::fromStdString(json0.dump(4)));
+
+    QString strCmd = QString::fromStdString(json0.dump());
+    QString strRet;
+    auto ret = m_httpApi->DBDoInterface(enDBOperatorType::EDBOT_BatchTransAction, strCmd, strRet, true);
+    if(ret != 0)
+    {
+        LH_WRITE_ERROR(QString("获取模板失败:%1, 错误信息:%2").arg(ret).arg(m_httpApi->DoGetLastError(&ret)));
+        return false;
+    }
+    // LH_WRITE_LOG_DEBUG(strRet);
+
+    return true;
+}
+
+/**
+ * @brief 修改模版,先删除该频率相同名称的模版,再插入新的模版
+ * 
+ * @param info 
+ * @param list 新的模版计划
+ * @return true 
+ * @return false 
+ */
+bool FromWebAPI::modifyTemplate(const OneTemplateInfo& info, QList<OnePlanItemInfo>& list)
+{
+    if(deleteTemplate(info) == false)
+    {
+        LH_WRITE_ERROR("删除模版失败");
+        return false;
+    }
+    if(saveTemplate(info.templateName, list) == false)
+    {
+        LH_WRITE_ERROR("保存模版失败");
+        return false;
+    }
+
+    return true;
+}
+
+/* 批量修改模版 */
+bool FromWebAPI::modifyTemplateList(const QMap<OneTemplateInfo, QList<OnePlanItemInfo>>& mapTemplate)
+{
+    /* 先批量删除模版 */
+    if(deleteTemplateList(mapTemplate.keys()) == false)
+    {
+        LH_WRITE_ERROR("批量删除模版失败");
+        return false;
+    }
+    /* 再批量插入模版 */
+    
+}
+

+ 9 - 1
TransmitterSwitch/WebAPI/FromWebAPI.h

@@ -46,6 +46,8 @@ public:
 
     /* 保存到模板 */
     bool saveTemplate(const QString& templateName, QList<OnePlanItemInfo>& list);
+    /* 批量写入模版数据 */
+    bool saveTemplateList(const QMap<OneTemplateInfo, QList<OnePlanItemInfo>>& mapTemplate);
     /* 获取模板内容 */
     bool getOneTemplateData(QString templateName, QList<OnePlanItemInfo>& list);
     /* 获取多个模板的内容 */
@@ -55,7 +57,13 @@ public:
     /* 获取某个频率的模版列表 */
     bool getTemplateList(int chnID, QList<OneTemplateInfo>& listTemplate);
     /* 删除一个模板 */
-    bool deleteTemplate(const QString& name);
+    bool deleteTemplate(const OneTemplateInfo& info);
+    /* 一次删除多个模版 */
+    bool deleteTemplateList(const QList<OneTemplateInfo>& listTemplate);
+    /* 修改模版 */
+    bool modifyTemplate(const OneTemplateInfo& info, QList<OnePlanItemInfo>& list);
+    /* 批量修改模版 */
+    bool modifyTemplateList(const QMap<OneTemplateInfo, QList<OnePlanItemInfo>>& mapTemplate);
 
 private:
 

+ 37 - 0
TransmitterSwitch/common/LHHTTPAPI/src/lhhttpapi.h

@@ -48,6 +48,43 @@ enum enDBOperatorType
                                 }" */
 };
 
+/**
+ * 单个查询语句多条不同的变量,适合批量查询,paraName是变量名
+    EDBOT_Batch
+    {
+        "opName":"TMS_GetExecPlanOneTemplateList",
+        "paraName":[
+            1,
+            2,
+            3
+        ]
+    }
+
+    多个不同语句集合,适合插入数据,Key表示的是这一个语句的唯一值,用于区分插入操作的
+    EDBOT_BatchTransAction
+    [
+        {
+            "opName":"TMS_InsertExecPlanOneTemplateList",
+            "Key":"1",
+            "paramList":
+            {
+                "channelID":1,
+                "templateName":"测试模版1",
+                "templateType":0
+            }
+        },
+        {
+            "opName":"TMS_InsertExecPlanOneTemplateList",
+            "paramList":
+            {
+                "channelID":2,
+                "templateName":"测试模版2",
+                "templateType":0
+            }
+        }
+    ]
+ */
+
 
 class lhhttpapi : public QObject
 {

+ 11 - 0
TransmitterSwitch/lhtranmitterswitch.h

@@ -43,6 +43,17 @@ int LHTRANSMITTERSWITCH_EXPORT DoInit(const InitData* pData);
 //------------------------------------------------------------------------
 int LHTRANSMITTERSWITCH_EXPORT DoCreateWindow(int skintype, QWidget* parent);
 
+//------------------------------------------------------------------------
+//函    数: DoResize(int width, int height)
+//
+//说    明: 缩放窗口
+//
+//参    数: width:窗口宽度, height:窗口高度
+//
+//返 回 值:0:成功; 其他:失败(详见返回码定义)
+//------------------------------------------------------------------------
+// int LHTRANSMITTERSWITCH_EXPORT DoResize(int width, int height);
+
 
 //------------------------------------------------------------------------
 //函    数: DoShowWindow(int skintype, int serviceid, bool showWindow)

+ 112 - 15
TransmitterSwitch/transmitterswitch.cpp

@@ -23,6 +23,7 @@
 #include "managerplan.h"
 #include "importtemplate.h"
 #include "copytoother.h"
+#include "templatemanager.h"
 
 
 
@@ -31,6 +32,7 @@ TransmitterSwitch::TransmitterSwitch(QWidget *parent) :
     ui(new Ui::TransmitterSwitch)
 {
     ui->setupUi(this);
+    m_widgetParent = parent;
 
     /* 创建一个布局 */
     QVBoxLayout* layout = new QVBoxLayout(parent);
@@ -83,6 +85,7 @@ TransmitterSwitch::TransmitterSwitch(QWidget *parent) :
     connect(ui->pBtn_clearPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnClearPlan);
     connect(ui->pBtn_deletePlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnClearPlan);
     connect(ui->pBtn_cloneToOther, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnCopyToOther);
+    connect(ui->pBtn_templateManager, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnManageTemplate);
 
     /* 设置QSS */
     connect(&EPUIStyle, &UIStyleManager::signal_qssChanged, this, &TransmitterSwitch::do_setUIStyle);
@@ -341,7 +344,7 @@ void TransmitterSwitch::setTrackCallBack(trackCallBack cb)
 void TransmitterSwitch::do_pBtnAddExecPlan()
 {
     /* 创建新增窗口 */
-    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>();
+    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Add);
 
     /* 获取当前选中的窗口 */
     auto pCard = PData.getCurrentPlanCard();
@@ -352,7 +355,7 @@ void TransmitterSwitch::do_pBtnAddExecPlan()
     }else {
         mp->setFrequencyID(pCard->getChannelInfo());
     }
-
+    connect(mp.get(), &ManagerPlan::signal_saveTemplate, this, &TransmitterSwitch::do_exportDataToEQM);
     mp->exec();
 
     /* 判断是否点击了OK */
@@ -399,8 +402,7 @@ void TransmitterSwitch::do_pBtnAddExecPlan()
 void TransmitterSwitch::do_pBtnModifyExecPlan()
 {
     /* 创建新增窗口 */
-    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>();
-    mp->setMode(Enum_Mode::Mode_Modify);
+    std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Modify);
     auto pCard = PData.getCurrentPlanCard();
     if(pCard == nullptr)
     {
@@ -409,6 +411,8 @@ void TransmitterSwitch::do_pBtnModifyExecPlan()
     }
     /* 设置频率信息 */
     mp->setFrequencyID(pCard->getChannelInfo());
+    connect(mp.get(), &ManagerPlan::signal_saveTemplate, this, &TransmitterSwitch::do_exportDataToEQM);
+
     mp->exec();
 
     /* 判断是否点击了OK */
@@ -565,8 +569,8 @@ void TransmitterSwitch::do_pBtnCopyToOther()
     /* 获取选中的频率列表 */
     auto list = cto->getSelectedFrequencyList();
     /* 获取当前频率的计划列表 */
-    QList<OnePlanItemInfo> listPlan;
-    pCard->getAllPlanInfo(listPlan);
+    QList<PlanInfo> listPlan;
+    pCard->getPlanList(listPlan);
     /* 遍历所有的频率 */
     bool isSuccess = true;
     for(auto& it : list)
@@ -579,8 +583,10 @@ void TransmitterSwitch::do_pBtnCopyToOther()
         }
         /* 设置计划列表 */
         pTmpCard->setPlanList(listPlan);
+        QList<OnePlanItemInfo> tmpListPlan;
+        pTmpCard->getAllPlanInfo(tmpListPlan);
         /* 写入数据库 */
-        if(!m_fromWebAPI->insertData(it.ChannelID, listPlan))
+        if(!m_fromWebAPI->insertData(it.ChannelID, tmpListPlan))
         {
             LH_WRITE_ERROR(QString("频率ID为%1的计划写入数据库失败").arg(it.ChannelID));
             TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率<%1>计划写入数据库失败").arg(it.ChannelName), this);
@@ -594,6 +600,63 @@ void TransmitterSwitch::do_pBtnCopyToOther()
 }
 
 
+/* 点击了管理模板按钮 */
+void TransmitterSwitch::do_pBtnManageTemplate()
+{
+    QMultiMap<int, OneTemplateInfo> tabList;
+
+    /* 没有选中卡片,获取全部的频率 */
+    if(!m_fromWebAPI->getTemplateList(tabList))
+    {
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
+        return;
+    }
+    
+    /* 将模板列表添加频率信息 */
+    for(auto it = tabList.begin(), end = tabList.end(); it != end; it++)
+    {
+        auto chnInfo = ChnContainer.getChannel(it->channelInfo.ChannelID);
+        it->channelInfo = chnInfo;
+    }
+
+    std::shared_ptr<TemplateManager> tm = std::make_shared<TemplateManager>();
+    tm->setQSSPath(EPUIStyle.getQSSPath());
+    tm->setTemplateList(tabList);
+    tm->setWebAPI(m_fromWebAPI);
+    // connect(tm.get(), &TemplateManager::signal_deleteTemplate, this, &TransmitterSwitch::do_deleteTemplate);
+    tm->exec();
+
+    /* 判断是否点击了OK */
+    if(!tm->isOk())
+    {
+        return;
+    }
+    bool isSuccess = true;
+    /* 获取删除的计划列表 */
+    auto list = tm->getDeleteTemplateList();
+    if(!m_fromWebAPI->deleteTemplateList(list))
+    {
+        LH_WRITE_ERROR("删除模版失败");
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "删除模版失败", this);
+        isSuccess = false;
+    }
+
+    /* 更新模版列表 */
+    auto mapTmp = tm->getModifyTemplateList();
+    if(!m_fromWebAPI->modifyTemplateList(mapTmp))
+    {
+        LH_WRITE_ERROR("修改模版失败");
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版失败", this);
+        isSuccess = false;
+    }
+    
+    if(isSuccess)
+    {
+        TipWidget::display(TipWidget::OPERATOR_OK, "修改模版成功", this);
+    }
+}
+
+
 /* 导入数据 */
 void TransmitterSwitch::do_importData()
 {
@@ -663,9 +726,20 @@ void TransmitterSwitch::do_importData()
         }
         /* 设置计划列表 */
         pCard->setPlanList(begin.value());
+
+        /* 写入数据库 */
+        if(!m_fromWebAPI->insertData(begin.key(), begin.value()))
+        {
+            LH_WRITE_ERROR(QString("频率ID为%1的计划写入数据库失败").arg(begin.key()));
+            TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率<%1>计划写入数据库失败").arg(pCard->getChannelInfo().ChannelName), this);
+            isSuccess = false;
+        }
     }
 
-    TipWidget::display(TipWidget::OPERATOR_OK, "导入模版成功", this);
+    if(isSuccess)
+    {
+        TipWidget::display(TipWidget::OPERATOR_OK, "导入模版成功", this);
+    }
     /* 调用回调函数 */
     if(m_trackCB != nullptr)
     {
@@ -690,7 +764,21 @@ void TransmitterSwitch::do_exportData()
         TipWidget::display(TipWidget::OPERATOR_WARN, "当前频率没有计划", this);
         return;
     }
-    int chnID = pCard->getChannelInfo().ChannelID;
+    ChannelInfo info = pCard->getChannelInfo();
+    do_exportDataToEQM(info);
+    
+}
+
+/* 将模版写入数据库 */
+void TransmitterSwitch::do_exportDataToEQM(ChannelInfo info)
+{
+    auto pCard = PData.findPlanCard(info.ChannelID);
+    if(pCard == nullptr)
+    {
+        LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(info.ChannelID));
+        return;
+    }
+    int chnID = info.ChannelID;
     /* 获取所有的模板名称 */
     QList<OneTemplateInfo> list;
     if(!m_fromWebAPI->getTemplateList(chnID, list))
@@ -700,7 +788,7 @@ void TransmitterSwitch::do_exportData()
         return;
     }
     /* 弹出导出页面 */
-    std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>(this);
+    std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>();
     stt->setQSS(EPUIStyle.getQSSPath());
     stt->setTemplateList(list);
     stt->exec();
@@ -724,11 +812,6 @@ void TransmitterSwitch::do_exportData()
     }
 }
 
-/* 删除一个模板 */
-void TransmitterSwitch::do_deleteTemplate(QString name)
-{
-    m_fromWebAPI->deleteTemplate(name);
-}
 
 /* 保存计划到EQM数据库 */
 void TransmitterSwitch::do_pBtn_savePlan()
@@ -745,6 +828,19 @@ void TransmitterSwitch::do_pBtn_savePlan()
     saveExecPlanToEQM();
 }
 
+/* 删除一个模版 */
+void TransmitterSwitch::do_deleteTemplate(OneTemplateInfo info)
+{
+    /* 删除模版 */
+    if(m_fromWebAPI->deleteTemplate(info))
+    {
+        TipWidget::display(TipWidget::OPERATOR_OK, "删除模版成功", this);
+    }else {
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "从数据库删除模版失败", this);
+    }
+}
+
+
 /* 从EQM数据库获取计划 */
 void TransmitterSwitch::do_pBtn_getPlan()
 {
@@ -836,6 +932,7 @@ void TransmitterSwitch::createOneCard(const ChannelInfo& chnInfo)
 
     /* 创建卡片 */
     PlanCard* pCard = PData.createOneCard(chnInfo);
+    pCard->setParent(ui->scrollAreaContents_Card);
     m_flowlayout->addWidget(pCard);
     userData->setCard(pCard);  /* 设置按钮的卡片指针 */
     /* 排序 */

+ 8 - 3
TransmitterSwitch/transmitterswitch.h

@@ -12,7 +12,7 @@ class FromWebAPI;
 class FlowLayout;
 struct InitData;
 struct ChannelInfo;
-
+struct OneTemplateInfo;
 
 /* 回调函数 */
 using trackCallBack = void(*)(int actionID, QString strMemo);
@@ -59,13 +59,17 @@ private slots:
     void do_pBtnClearPlan();
     /* 点击了复制到其他频率按钮 */
     void do_pBtnCopyToOther();
+    /* 点击了管理模板按钮 */
+    void do_pBtnManageTemplate();
 
     /* 导入模板 */
     void do_importData();
     /* 保存为模板 */
     void do_exportData();
-    /* 删除一个模板 */
-    void do_deleteTemplate(QString name);
+    /* 将模版写入数据库 */
+    void do_exportDataToEQM(ChannelInfo info);
+    /* 删除一个模版 */
+    void do_deleteTemplate(OneTemplateInfo info);
 
     /* 保存计划到EQM数据库 */
     void do_pBtn_savePlan();
@@ -102,6 +106,7 @@ protected:
 private:
     Ui::TransmitterSwitch *ui;
 
+    QWidget* m_widgetParent = nullptr; /* 父窗口 */
     QLabel* m_tipText = nullptr;            /* 提示文本 */
     QString m_styleSheet;                   /* 样式表 */
 

+ 1 - 1
show1/widget.cpp

@@ -47,7 +47,7 @@ Widget::Widget(QWidget *parent) :
 
     m_tSwitch->DoInit(&initData);
     m_tSwitch->DoCreateWindow(1, container);
-    // m_tSwitch->DoGetExecPlanFromEQM();
+    m_tSwitch->DoGetExecPlanFromEQM();
     m_tSwitch->DoSetCallBack(trackCallBack);
 
     m_style = 1;