|
|
@@ -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))
|