Jelajahi Sumber

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

Apple 1 bulan lalu
induk
melakukan
b27e74b9b9
1 mengubah file dengan 183 tambahan dan 49 penghapusan
  1. 183 49
      TransmitterSwitch/ManagerPlan/managerplan.cpp

+ 183 - 49
TransmitterSwitch/ManagerPlan/managerplan.cpp

@@ -594,9 +594,6 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& 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);
     for(const auto& it : list)
     {
         /* 判断是否同为正常日或者特殊日 */
@@ -609,33 +606,94 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info)
         PlanInfo tmpInfo = it;
         /* 判断是否跨周了 */
         tmpInfo.isNextWeek = isCrossWeek(tmpInfo);
+        if(tmpInfo.isNextWeek)
+        {
+            if(newInfo.isNextWeek)
+            {
+                /* 不会有两个都跨周的情况,直接返回冲突 */
+                return true;
+            }
+        }
 
-        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);
+        int tmpWeekDayOn = static_cast<int>(tmpInfo.onWeekDay);
+        int tmpWeekDayOff = static_cast<int>(tmpInfo.offWeekDay);
+        int newWeekDayOn = static_cast<int>(newInfo.onWeekDay);
+        int newWeekDayOff = static_cast<int>(newInfo.offWeekDay);
         /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
         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)
+            isLess = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff, newInfo.offDateTime, true);
+            isGreater = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, true);
+        }else 
         {
-            /* 时间不冲突 */
-            continue;
+            /* 普通日,先判断tmpInfo是否跨周了 */
+            if(tmpInfo.isNextWeek)
+            {
+                /* 拆分成两个时间段分别判断 */
+                int tmpWeekDayOn1 = tmpWeekDayOn;
+                int tmpWeekDayOff1 = 7; /* 这一周的最后一天 */
+                int tmpWeekDayOn2 = 1; /* 下一周的第一天 */
+                int tmpWeekDayOff2 = tmpWeekDayOff;
+                /* 判断两个时间段是否冲突 */
+                bool isLess1 = timeIsGerater(tmpWeekDayOn1, tmpInfo.onDateTime, newWeekDayOn, newInfo.offDateTime, false);
+                bool isGreater1 = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff1, tmpInfo.offDateTime, false);
+                if(isLess1 || isGreater1)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+
+                bool isLess2 = timeIsGerater(tmpWeekDayOn2, tmpInfo.onDateTime, newWeekDayOff, newInfo.offDateTime, false);
+                bool isGreater2 = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff2, tmpInfo.offDateTime, false);
+                if(isLess2 || isGreater2)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+            }
+            else if(newInfo.isNextWeek)
+            {
+                /* 拆分成两个时间段分别判断 */
+                int newWeekDayOn1 = newWeekDayOn;
+                int newWeekDayOff1 = 7; /* 这一周的最后一天 */
+                int newWeekDayOn2 = 1; /* 下一周的第一天 */
+                int newWeekDayOff2 = newWeekDayOff;
+                /* 判断两个时间段是否冲突 */
+                bool isLess1 = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff1, newInfo.offDateTime, false);
+                bool isGreater1 = timeIsGerater(newWeekDayOn1, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, false);
+                if(isLess1 || isGreater1)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+
+                bool isLess2 = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff2, newInfo.offDateTime, false);
+                bool isGreater2 = timeIsGerater(newWeekDayOn2, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, false);
+                if(isLess2 || isGreater2)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+            }
+            else
+            {
+                isLess = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff, newInfo.offDateTime, false);
+                isGreater = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, false);
+                if(isLess || isGreater)
+                {
+                    /* 时间不冲突 */
+                    continue;
+                }else {
+                    return true; /* 时间冲突 */
+                }
+            }
         }
-        isConflict = true; /* 时间冲突 */
-        break;
+        
     }
 
-    return isConflict;
+    return false;
 }
 
 
@@ -650,14 +708,12 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info, c
     PlanInfo newInfo = info;
     /* 判断是否跨周了 */
     newInfo.isNextWeek = isCrossWeek(newInfo);
-    bool isConflict = false;
-    // 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) )
+        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;
@@ -665,34 +721,95 @@ bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info, c
         PlanInfo tmpInfo = it;
         /* 判断是否跨周了 */
         tmpInfo.isNextWeek = isCrossWeek(tmpInfo);
+        if(tmpInfo.isNextWeek)
+        {
+            if(newInfo.isNextWeek)
+            {
+                /* 不会有两个都跨周的情况,直接返回冲突 */
+                return true;
+            }
+        }
 
-        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);
+        int tmpWeekDayOn = static_cast<int>(tmpInfo.onWeekDay);
+        int tmpWeekDayOff = static_cast<int>(tmpInfo.offWeekDay);
+        int newWeekDayOn = static_cast<int>(newInfo.onWeekDay);
+        int newWeekDayOff = static_cast<int>(newInfo.offWeekDay);
         /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
         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)
+            isLess = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff, newInfo.offDateTime, true);
+            isGreater = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, true);
+        }else 
         {
-            /* 时间不冲突 */
-            continue;
+            /* 普通日,先判断tmpInfo是否跨周了 */
+            if(tmpInfo.isNextWeek)
+            {
+                /* 拆分成两个时间段分别判断 */
+                int tmpWeekDayOn1 = tmpWeekDayOn;
+                int tmpWeekDayOff1 = 7; /* 这一周的最后一天 */
+                int tmpWeekDayOn2 = 1; /* 下一周的第一天 */
+                int tmpWeekDayOff2 = tmpWeekDayOff;
+                /* 判断两个时间段是否冲突 */
+                bool isLess1 = timeIsGerater(tmpWeekDayOn1, tmpInfo.onDateTime, newWeekDayOn, newInfo.offDateTime, false);
+                bool isGreater1 = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff1, tmpInfo.offDateTime, false);
+                if(isLess1 || isGreater1)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+
+                bool isLess2 = timeIsGerater(tmpWeekDayOn2, tmpInfo.onDateTime, newWeekDayOff, newInfo.offDateTime, false);
+                bool isGreater2 = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff2, tmpInfo.offDateTime, false);
+                if(isLess2 || isGreater2)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+            }
+            else if(newInfo.isNextWeek)
+            {
+                /* 拆分成两个时间段分别判断 */
+                int newWeekDayOn1 = newWeekDayOn;
+                int newWeekDayOff1 = 7; /* 这一周的最后一天 */
+                int newWeekDayOn2 = 1; /* 下一周的第一天 */
+                int newWeekDayOff2 = newWeekDayOff;
+                /* 判断两个时间段是否冲突 */
+                bool isLess1 = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff1, newInfo.offDateTime, false);
+                bool isGreater1 = timeIsGerater(newWeekDayOn1, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, false);
+                if(isLess1 || isGreater1)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+
+                bool isLess2 = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff2, newInfo.offDateTime, false);
+                bool isGreater2 = timeIsGerater(newWeekDayOn2, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, false);
+                if(isLess2 || isGreater2)
+                {
+                }else {
+                    return true; /* 时间冲突 */
+                }
+            }
+            else
+            {
+                isLess = timeIsGerater(tmpWeekDayOn, tmpInfo.onDateTime, newWeekDayOff, newInfo.offDateTime, false);
+                isGreater = timeIsGerater(newWeekDayOn, newInfo.onDateTime, tmpWeekDayOff, tmpInfo.offDateTime, false);
+                if(isLess || isGreater)
+                {
+                    /* 时间不冲突 */
+                    continue;
+                }else {
+                    return true; /* 时间冲突 */
+                }
+            }
         }
-        isConflict = true; /* 时间冲突 */
-        break;
+        
     }
 
 
-    return isConflict;
+    return false;
 }
 
 /**
@@ -1063,23 +1180,40 @@ void ManagerPlan::do_modifyPlanItem()
     }
     // LH_WRITE_LOG_DEBUG(QString("修改行: %1").arg(index));
 
-    /* 获取修改后的日期 */
     PlanInfo one;
+    /* 判断是正常日还是特殊日 */
     if(ui->tabWidget->currentIndex() == 0)
     {
         /* 正常日 */
         one.onWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekStart->itemData(ui->cBox_selectWeekStart->currentIndex()).toInt());
         one.onDateTime.setTime(ui->timeEdit_weekStart->getTime());
+
         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;
         one.onDateTime.setDate(ui->dateEdit_specialStart->date());
         one.onDateTime.setTime(ui->timeEdit_specialStart->getTime());
+
         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;
+        }
     }
     /* 先判断设置的时间是否和当前选中的行的时间相同 */
     auto nowPlan = ui->pCard->getSelectedPlan();
@@ -1088,12 +1222,12 @@ void ManagerPlan::do_modifyPlanItem()
         return;
     }
     /* 先判断开机时间和关机时间是否冲突 */
-    if(checkOnAndOffTime(one))
-    {
-        /* 开始和结束时间冲突 */
-        TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间早于或等于关机时间!", this);
-        return;
-    }
+    // if(checkOnAndOffTime(one))
+    // {
+    //     /* 开始和结束时间冲突 */
+    //     TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间早于或等于关机时间!", this);
+    //     return;
+    // }
     auto exPlan = ui->pCard->getSelectedPlan();
     /* 判断时间段是否和历史时间段冲突 */
     if(checkPlanTimeConflict(chnID, one, exPlan))