Selaa lähdekoodia

Merge branch 'master' of http://47.99.71.219:10086/apple/ts

Apple 1 kuukausi sitten
vanhempi
commit
27e463e02b

+ 2 - 5
TransmitterSwitch/ExecPlanData/plancard.cpp

@@ -19,16 +19,13 @@ PlanInfo::PlanInfo()
 
 PlanInfo::PlanInfo(const PlanInfo& info)
 {
-    onWeekDay = info.onWeekDay;
-    onDateTime = info.onDateTime;
-
-    offWeekDay = info.offWeekDay;
-    offDateTime = info.offDateTime;
+    *this = info;
 }
 PlanInfo& PlanInfo::operator=(const PlanInfo& info)
 {
     if(this != &info)
     {
+        isNextWeek = info.isNextWeek;
         onWeekDay = info.onWeekDay;
         onDateTime = info.onDateTime;
 

+ 1 - 0
TransmitterSwitch/ExecPlanData/plancard.h

@@ -29,6 +29,7 @@ enum QtUserRole
  */
 struct PlanInfo
 {
+    bool isNextWeek = false;                    /* 关机计划时间是否是下周的计划 */
     enum_WeekDay onWeekDay;                     /* 周几 */
     QDateTime onDateTime;                       /* 时间 */
 

+ 184 - 17
TransmitterSwitch/ManagerPlan/managerplan.cpp

@@ -361,6 +361,71 @@ void ManagerPlan::modifyPlanItem(const int chnID, const PlanInfo& nowInfo, const
 }
 
 
+/* 判断开机时间和关机时间是否相等 */
+bool ManagerPlan::isEqualTime(const PlanInfo& info)
+{
+    if(info.onWeekDay != enum_WeekDay::WeekDay_Special)
+    {
+        /* 正常日判断 */
+        if(info.onWeekDay == info.offWeekDay)
+        {
+            /* 开机和关机在同一天 */
+            if(info.onDateTime.time() == info.offDateTime.time())
+            {
+                /* 开机时间等于关机时间,相等 */
+                return true;
+            }else
+            {
+                /* 开机时间小于关机时间,不相等 */
+                return false;
+            }
+        }
+        return false;
+    } 
+    else
+    {
+        /* 特殊日判断 */ 
+        /* 开机和关机在不同天 */
+        if(info.onDateTime == info.offDateTime)
+        {
+            /* 开机和关机在同一天,同一时刻 */
+            return true;
+        }
+        return false; 
+    }
+}
+
+/* 判断是否跨周了,判断方法就是开机时间比关机时间大 */
+bool ManagerPlan::isCrossWeek(const PlanInfo& info)
+{
+    if(info.onWeekDay != enum_WeekDay::WeekDay_Special)
+    {
+        /* 正常日判断 */
+        if(info.onWeekDay > info.offWeekDay)
+        {
+            /* 开机时间大于关机时间,跨周了 */
+            return true;
+        }
+        else if(info.onWeekDay == info.offWeekDay)
+        {
+            /* 开机和关机在同一天 */
+            if(info.onDateTime.time() >= info.offDateTime.time())
+            {
+                /* 开机时间大于等于关机时间,跨周了 */
+                return true;
+            }else
+            {
+                /* 开机时间小于关机时间,不跨周 */
+                return false;
+            }
+        }
+        return false;
+    }
+
+    return false;
+}
+
+
 /**
  * @brief 判断开机和关机时间是否冲突
  * 
@@ -473,6 +538,46 @@ bool ManagerPlan::timeIsGerater(const enum_WeekDay weekDay1, const QDateTime& ti
     }
 }
 
+
+/* 比较两个时间点的大小,这个兼容下一周的结束时间,下一周就顺延7天 */
+bool ManagerPlan::timeIsGerater(int weekDay1, const QDateTime& time1,
+                            int weekDay2, const QDateTime& time2, bool isSpecialDay)
+{
+    if(isSpecialDay)
+    {
+        /* 特殊日 */
+        if(time1 > time2)
+        {
+            return true;
+        }else
+        {
+            return false;
+        }
+    }else 
+    {
+        /* 正常日 */
+        if(weekDay1 > weekDay2)
+        {
+            return true;
+        }
+        else if(weekDay1 == weekDay2)
+        {
+            /* 日期相同,比较时间 */
+            if(time1.time() > time2.time())
+            {
+                return true;
+            }else
+            {
+                return false;
+            }
+        }
+    }
+
+    return false;
+}
+
+
+
 /**
  * @brief 判断计划时间和列表中的时间是否冲突
  *        判断规则是只要时间段不和任何一个时间段重合就不冲突
@@ -484,16 +589,43 @@ bool ManagerPlan::timeIsGerater(const enum_WeekDay weekDay1, const QDateTime& ti
  */
 bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info)
 {
+    PlanInfo newInfo = info;
+    /* 判断是否跨周了 */
+    newInfo.isNextWeek = isCrossWeek(newInfo);
     QList<PlanInfo>& list = findPlanList(chnID);
 
     bool isConflict = false;
-    int weekDayStart = static_cast<int>(info.onWeekDay);
-    int weekDayEnd = static_cast<int>(info.offWeekDay);
+    // int weekDayStart = static_cast<int>(info.onWeekDay);
+    // int weekDayEnd = static_cast<int>(info.offWeekDay);
     for(const auto& it : list)
     {
+        /* 判断是否同为正常日或者特殊日 */
+        if( (it.onWeekDay == enum_WeekDay::WeekDay_Special && info.onWeekDay != enum_WeekDay::WeekDay_Special) ||
+            (it.onWeekDay != enum_WeekDay::WeekDay_Special && info.onWeekDay == enum_WeekDay::WeekDay_Special) )
+        {
+            /* 一个是特殊日,一个是正常日,不冲突 */
+            continue;
+        }
+        PlanInfo tmpInfo = it;
+        /* 判断是否跨周了 */
+        tmpInfo.isNextWeek = isCrossWeek(tmpInfo);
+
+        int weekDayOn1 = static_cast<int>(tmpInfo.onWeekDay);
+        int weekDayOff1 = tmpInfo.isNextWeek ? static_cast<int>(tmpInfo.offWeekDay) + 7 : static_cast<int>(tmpInfo.offWeekDay);
+        int weekDayOn2 = static_cast<int>(newInfo.onWeekDay);
+        int weekDayOff2 = newInfo.isNextWeek ? static_cast<int>(newInfo.offWeekDay) + 7 : static_cast<int>(newInfo.offWeekDay);
         /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
-        bool isLess = timeIsGerater(it.onWeekDay, it.onDateTime, info.offWeekDay, info.offDateTime);
-        bool isGreater = timeIsGerater(info.onWeekDay, info.onDateTime, it.offWeekDay, it.offDateTime);
+        bool isLess = false;
+        bool isGreater = false;
+        if(it.onWeekDay == enum_WeekDay::WeekDay_Special)
+        {
+            isLess = timeIsGerater(weekDayOn1, it.onDateTime, weekDayOff2, newInfo.offDateTime, true);
+            isGreater = timeIsGerater(weekDayOn2, newInfo.onDateTime, weekDayOff1, it.offDateTime, true);
+        }else {
+            isLess = timeIsGerater(weekDayOn1, it.onDateTime, weekDayOff2, info.offDateTime, false);
+            isGreater = timeIsGerater(weekDayOn2, newInfo.onDateTime, weekDayOff1, it.offDateTime, false);
+        }
+        
         if(isLess || isGreater)
         {
             /* 时间不冲突 */
@@ -508,21 +640,48 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info)
 
 
 /* 判断计划时间和列表中的时间是否冲突,排除原有的日期,用于比较修改的计划 */
-bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo, const PlanInfo& exInfo)
+bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info, const PlanInfo& exInfo)
 {
     /* 这里采用拷贝的方式获取,后续不需要再把排除的项放回去 */
     QList<PlanInfo> list = findPlanList(chnID);
     /* 先去掉需要排除的项 */
     list.removeOne(exInfo);
 
+    PlanInfo newInfo = info;
+    /* 判断是否跨周了 */
+    newInfo.isNextWeek = isCrossWeek(newInfo);
     bool isConflict = false;
-    int weekDayStart = static_cast<int>(newInfo.onWeekDay);
-    int weekDayEnd = static_cast<int>(newInfo.offWeekDay);
+    // int weekDayStart = static_cast<int>(info.onWeekDay);
+    // int weekDayEnd = static_cast<int>(info.offWeekDay);
     for(const auto& it : list)
     {
+        /* 判断是否同为正常日或者特殊日 */
+        if( (it.onWeekDay == enum_WeekDay::WeekDay_Special && newInfo.onWeekDay != enum_WeekDay::WeekDay_Special) ||
+            (it.onWeekDay != enum_WeekDay::WeekDay_Special && newInfo.onWeekDay == enum_WeekDay::WeekDay_Special) )
+        {
+            /* 一个是特殊日,一个是正常日,不冲突 */
+            continue;
+        }
+        PlanInfo tmpInfo = it;
+        /* 判断是否跨周了 */
+        tmpInfo.isNextWeek = isCrossWeek(tmpInfo);
+
+        int weekDayOn1 = static_cast<int>(tmpInfo.onWeekDay);
+        int weekDayOff1 = tmpInfo.isNextWeek ? static_cast<int>(tmpInfo.offWeekDay) + 7 : static_cast<int>(tmpInfo.offWeekDay);
+        int weekDayOn2 = static_cast<int>(newInfo.onWeekDay);
+        int weekDayOff2 = newInfo.isNextWeek ? static_cast<int>(newInfo.offWeekDay) + 7 : static_cast<int>(newInfo.offWeekDay);
         /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
-        bool isLess = timeIsGerater(it.onWeekDay, it.onDateTime, newInfo.offWeekDay, newInfo.offDateTime);
-        bool isGreater = timeIsGerater(newInfo.onWeekDay, newInfo.onDateTime, it.offWeekDay, it.offDateTime);
+        bool isLess = false;
+        bool isGreater = false;
+        if(it.onWeekDay == enum_WeekDay::WeekDay_Special)
+        {
+            isLess = timeIsGerater(weekDayOn1, it.onDateTime, weekDayOff2, newInfo.offDateTime, true);
+            isGreater = timeIsGerater(weekDayOn2, newInfo.onDateTime, weekDayOff1, it.offDateTime, true);
+        }else {
+            isLess = timeIsGerater(weekDayOn1, it.onDateTime, weekDayOff2, info.offDateTime, false);
+            isGreater = timeIsGerater(weekDayOn2, newInfo.onDateTime, weekDayOff1, it.offDateTime, false);
+        }
+        
         if(isLess || isGreater)
         {
             /* 时间不冲突 */
@@ -532,6 +691,7 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo
         break;
     }
 
+
     return isConflict;
 }
 
@@ -838,6 +998,13 @@ void ManagerPlan::do_addPlanItem()
 
         one.offWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekEnd->itemData(ui->cBox_selectWeekEnd->currentIndex()).toInt());
         one.offDateTime.setTime(ui->timeEdit_weekEnd->getTime());
+        /* 判断时间是否相等 */
+        if(isEqualTime(one))
+        {
+            /* 开机时间等于关机时间,相等 */
+            TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间不能等于关机时间!", this);
+            return;
+        }
     }else {
         /* 特殊日 */
         one.onWeekDay = enum_WeekDay::WeekDay_Special;
@@ -847,16 +1014,16 @@ void ManagerPlan::do_addPlanItem()
         one.offWeekDay = enum_WeekDay::WeekDay_Special;
         one.offDateTime.setDate(ui->dateEdit_specialEnd->date());
         one.offDateTime.setTime(ui->timeEdit_specialEnd->getTime());
-    }
-    
 
-    /* 先判断开机时间和关机时间是否冲突 */
-    if(checkOnAndOffTime(one))
-    {
-        /* 开始和结束时间冲突 */
-        TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间早于或等于关机时间!", this);
-        return;
+        /* 先判断开机时间和关机时间是否冲突 */
+        if(checkOnAndOffTime(one))
+        {
+            /* 开始和结束时间冲突 */
+            TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间早于或等于关机时间!", this);
+            return;
+        }
     }
+    
 
     /* 判断时间段是否和历史时间段冲突 */
     if(checkPlanTimeConflict(chnID, one))

+ 7 - 0
TransmitterSwitch/ManagerPlan/managerplan.h

@@ -90,11 +90,18 @@ private:
     /* 修改容器中的计划 */
     void modifyPlanItem(const int chnID, const PlanInfo& nowInfo, const PlanInfo& newInfo);
 
+    /* 判断开机时间和关机时间是否相等 */
+    inline bool isEqualTime(const PlanInfo& info);
+    /* 判断是否跨周了 */
+    inline bool isCrossWeek(const PlanInfo& info);
     /* 判断开机和关机时间是否冲突 */
     inline bool checkOnAndOffTime(const PlanInfo& info);
     /* 比较两个时间点的大小 */
     inline bool timeIsGerater(const enum_WeekDay weekDay1, const QDateTime& time1,
                             const enum_WeekDay weekDay2, const QDateTime& time2);
+    /* 比较两个时间点的大小,这个兼容下一周的结束时间,下一周就顺延7天 */
+    inline bool timeIsGerater(int weekDay1, const QDateTime& time1,
+                            int weekDay2, const QDateTime& time2, bool isSpecialDay);
     /* 判断计划时间和列表中的时间是否冲突 */
     bool checkPlanTimeConflict(const int chnID, const PlanInfo& info);
     /* 判断计划时间和列表中的时间是否冲突,添加排除的计划,用于比较修改的计划 */