managerplan.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. #include "managerplan.h"
  2. #include "ui_managerplan.h"
  3. #include <QMouseEvent>
  4. #include <QDesktopWidget>
  5. #include <QScreen>
  6. #include "UIStyleManager.h"
  7. #include "OneShadowEffect.h"
  8. #include "TransmitterSwitchInfo.h"
  9. #include "warning.h"
  10. #include "tipwidget.h"
  11. #include "LHQLogAPI.h"
  12. #include "savetotemplate.h"
  13. #include "FromWebAPI.h"
  14. #include "FromSQLite.h"
  15. ManagerPlan::ManagerPlan(Enum_Mode mode, QDialog *parent) :
  16. m_mode(mode),
  17. QDialog(parent),
  18. ui(new Ui::ManagerPlan)
  19. {
  20. ui->setupUi(this);
  21. /* 设置隐藏边框 */
  22. this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
  23. /* 设置底层样式表 */
  24. this->setAttribute(Qt::WA_TranslucentBackground);
  25. /* 创建阴影 */
  26. auto pShadow = new OneShadowEffect(this);
  27. ui->widget_background->setGraphicsEffect(pShadow);
  28. /* 获取屏幕大小 */
  29. // auto screenRect = QApplication::desktop()->availableGeometry();
  30. auto screenRect = QGuiApplication::screenAt(QCursor::pos())->geometry();
  31. this->resize(screenRect.width(), screenRect.height());
  32. /* 设置设置区域居中显示 */
  33. ui->widget_background->move(screenRect.width() / 2 - ui->widget_background->width() / 2,
  34. screenRect.height() / 2 - ui->widget_background->height() / 2);
  35. /* 设置Card最小宽度 */
  36. ui->pCard->setMinimumWidth(300);
  37. ui->pCard->setFixedWidth(300);
  38. /* 注册事件过滤器 */
  39. ui->cBox_selectChn->installEventFilter(this);
  40. ui->pBtn_close->installEventFilter(this);
  41. /* 设置时间和日期选择Tab */
  42. setTabWidget();
  43. /* 设置默认时间和日期 */
  44. auto date = QDate::currentDate();
  45. auto time = QTime::fromString("00:00:00", "hh:mm:ss");
  46. ui->timeEdit_weekStart->setTime(time);
  47. ui->timeEdit_weekEnd->setTime(time);
  48. ui->timeEdit_specialStart->setTime(time);
  49. ui->timeEdit_specialEnd->setTime(time);
  50. ui->dateEdit_specialStart->setDisplayFormat("yy-MM-dd");
  51. ui->dateEdit_specialEnd->setDisplayFormat("yy-MM-dd");
  52. ui->dateEdit_specialStart->setDate(date);
  53. ui->dateEdit_specialEnd->setDate(date);
  54. /* 设置时间图标 */
  55. ui->timeEdit_weekStart->setIcon(":/ICON/ICON/Time.png");
  56. ui->timeEdit_weekEnd->setIcon(":/ICON/ICON/Time.png");
  57. ui->timeEdit_specialStart->setIcon(":/ICON/ICON/Time.png");
  58. ui->timeEdit_specialEnd->setIcon(":/ICON/ICON/Time.png");
  59. ui->timeEdit_weekStart->SetMainWindow(this);
  60. ui->timeEdit_weekEnd->SetMainWindow(this);
  61. ui->timeEdit_specialStart->SetMainWindow(this);
  62. ui->timeEdit_specialEnd->SetMainWindow(this);
  63. /* 需要设置这个属性,qss设置的图标才会生效 */
  64. ui->dateEdit_specialStart->setCalendarPopup(true);
  65. ui->dateEdit_specialEnd->setCalendarPopup(true);
  66. /* 设置可选择的频率 */
  67. setSelectFrequency();
  68. /* 设置可选择的周几 */
  69. setWeekDay();
  70. /* 连接信号和槽 */
  71. connect(ui->pBtn_cancel, &QPushButton::clicked, this, &ManagerPlan::close);
  72. connect(ui->pBtn_close, &QPushButton::clicked, this, &ManagerPlan::close);
  73. connect(ui->cBox_selectChn, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ManagerPlan::do_selectFrequency);
  74. connect(&EPUIStyle, &UIStyleManager::signal_qssChanged, this, &ManagerPlan::do_setUIStyle);
  75. connect(ui->pBtn_addPlan, &QPushButton::clicked, this, &ManagerPlan::do_addPlanItem);
  76. connect(ui->pBtn_editPlan, &QPushButton::clicked, this, &ManagerPlan::do_modifyPlanItem);
  77. connect(ui->pBtn_deletePlan, &QPushButton::clicked, this, &ManagerPlan::do_deletePlanItem);
  78. connect(ui->pBtn_ok, &QPushButton::clicked, this, &ManagerPlan::do_pBtn_ok);
  79. connect(ui->pCard, &PlanCard::signal_clickedItem, this, &ManagerPlan::do_tableView_clicked);
  80. connect(ui->pBtn_saveTotemplate, &QPushButton::clicked, this, &ManagerPlan::do_saveTemplate);
  81. /* 设置皮肤样式 */
  82. do_setUIStyle();
  83. /* 设置下拉框阴影 */
  84. ui->cBox_selectChn->setViewShadowEffect();
  85. ui->cBox_selectWeekStart->setViewShadowEffect();
  86. ui->cBox_selectWeekEnd->setViewShadowEffect();
  87. /* 注册事件过滤器 */
  88. ui->cBox_selectChn->installEventFilter(this);
  89. ui->cBox_selectWeekStart->installEventFilter(this);
  90. ui->cBox_selectWeekEnd->installEventFilter(this);
  91. /* 默认显示周计划 */
  92. ui->tabWidget->setCurrentIndex(0);
  93. /* 设置显示模式 */
  94. setMode(mode);
  95. }
  96. ManagerPlan::~ManagerPlan()
  97. {
  98. delete ui;
  99. }
  100. /* 设置频率信息 */
  101. void ManagerPlan::setFrequencyID(ChannelInfo& info)
  102. {
  103. m_channelInfo = info;
  104. /* 设置当前频率选项 */
  105. if(ui->cBox_selectChn->count() > 0)
  106. {
  107. for(int i = 0; i < ui->cBox_selectChn->count(); i++)
  108. {
  109. if(ui->cBox_selectChn->itemData(i).toInt() == info.ChannelID)
  110. {
  111. ui->cBox_selectChn->setCurrentIndex(i);
  112. break;
  113. }
  114. }
  115. }
  116. /* 设置当前频率的计划列表 */
  117. ui->pCard->setChannelInfo(info);
  118. if((m_mode == Enum_Mode::Mode_Add) || (m_mode == Enum_Mode::Mode_Modify))
  119. {
  120. /* 设置当前频率的计划列表 */
  121. auto list = findPlanList(info.ChannelID);
  122. /* 设置计划列表 */
  123. ui->pCard->setPlanList(list);
  124. }
  125. if(ui->pCard->isPlanEmpty())
  126. {
  127. /* 没有计划,隐藏按钮 */
  128. setButtonVisible(false);
  129. }else
  130. {
  131. /* 有计划,显示按钮 */
  132. setButtonVisible(true);
  133. }
  134. }
  135. /* 设置计划列表,给修改模版使用 */
  136. void ManagerPlan::setPlanList(QList<OnePlanItemInfo>& listPlan)
  137. {
  138. /* 设置当前频率的计划列表 */
  139. ui->pCard->setPlanList(listPlan);
  140. /* 转换为PlanInfo */
  141. QList<PlanInfo> list;
  142. ui->pCard->getPlanList(list);
  143. /* 设置计划列表 */
  144. m_mapPlanInfo.insert(m_channelInfo.ChannelID, list);
  145. if(ui->pCard->isPlanEmpty())
  146. {
  147. /* 没有计划,隐藏按钮 */
  148. setButtonVisible(false);
  149. }else
  150. {
  151. /* 有计划,显示按钮 */
  152. setButtonVisible(true);
  153. }
  154. }
  155. /* 设置FromWebAPI地址,复用主窗口的WebAPI */
  156. void ManagerPlan::setFromWebAPI(FromWebAPI* fromWebAPI)
  157. {
  158. if(fromWebAPI == nullptr)
  159. {
  160. LH_WRITE_ERROR("传入的FromWebAPI指针为空");
  161. return;
  162. }
  163. m_fromWebAPI = fromWebAPI;
  164. }
  165. /* 设置FromSQLite地址,复用主窗口的SQLite */
  166. void ManagerPlan::setFromSQLite(FromSQLite* fromSQLite)
  167. {
  168. if(fromSQLite == nullptr)
  169. {
  170. LH_WRITE_ERROR("传入的FromSQLite指针为空");
  171. return;
  172. }
  173. m_fromSQLite = fromSQLite;
  174. }
  175. /* 修改UI样式 */
  176. void ManagerPlan::do_setUIStyle()
  177. {
  178. this->setStyleSheet(EPUIStyle.StrQSS_ManagerPlan);
  179. }
  180. /* 设置显示模式,需要在执行exec()之前调用 */
  181. void ManagerPlan::setMode(Enum_Mode mode)
  182. {
  183. if(mode == Enum_Mode::Mode_Add)
  184. {
  185. ui->label_title->setText("新增"); /* 修改标题 */
  186. ui->widget_background->resize(this->width(), 740); /* 修改窗口大小 */
  187. }
  188. else if(mode == Enum_Mode::Mode_Modify)
  189. {
  190. ui->widget_addPlan->setVisible(false); /* 隐藏添加计划区域 */
  191. ui->label_title->setText("编辑"); /* 修改标题 */
  192. ui->widget_background->resize(this->width(), 600); /* 修改窗口大小 */
  193. }
  194. else if(mode == Enum_Mode::Mode_ModifyTemplate)
  195. {
  196. ui->widget_addPlan->setVisible(false); /* 隐藏添加计划区域 */
  197. ui->label_title->setText("修改模板"); /* 修改标题 */
  198. ui->widget_background->resize(this->width(), 600); /* 修改窗口大小 */
  199. ui->pBtn_saveTotemplate->setVisible(false); /* 隐藏保存模版按钮 */
  200. }
  201. m_mode = mode;
  202. }
  203. /* 设置时间和日期选择Tab */
  204. void ManagerPlan::setTabWidget()
  205. {
  206. /* 设置Tab的大小 */
  207. QSize size(ui->tabWidget->width(), ui->tabWidget->height() - ui->tabWidget->tabBar()->height() - 2);
  208. /* 设置正常日的Tab */
  209. ui->tab_week->resize(size);
  210. auto vLayout1 = new QVBoxLayout(ui->tab_week);
  211. vLayout1->setContentsMargins(0, 24, 0, 0);
  212. vLayout1->setSpacing(12);
  213. ui->tab_week->setLayout(vLayout1);
  214. vLayout1->addWidget(ui->widget_weekStart);
  215. vLayout1->addWidget(ui->widget_weekEnd);
  216. /* 设置特殊日的Tab */
  217. ui->tab_special->resize(size);
  218. auto vLayout2 = new QVBoxLayout(ui->tab_special);
  219. vLayout2->setContentsMargins(0, 24, 0, 0);
  220. vLayout2->setSpacing(12);
  221. ui->tab_special->setLayout(vLayout2);
  222. vLayout2->addWidget(ui->widget_specialStart);
  223. vLayout2->addWidget(ui->widget_specialEnd);
  224. }
  225. /* 设置可选择的周几 */
  226. void ManagerPlan::setWeekDay()
  227. {
  228. ui->cBox_selectWeekStart->addItem("星期一", static_cast<int>(enum_WeekDay::WeekDay_Mon));
  229. ui->cBox_selectWeekStart->addItem("星期二", static_cast<int>(enum_WeekDay::WeekDay_Tue));
  230. ui->cBox_selectWeekStart->addItem("星期三", static_cast<int>(enum_WeekDay::WeekDay_Wed));
  231. ui->cBox_selectWeekStart->addItem("星期四", static_cast<int>(enum_WeekDay::WeekDay_Thu));
  232. ui->cBox_selectWeekStart->addItem("星期五", static_cast<int>(enum_WeekDay::WeekDay_Fri));
  233. ui->cBox_selectWeekStart->addItem("星期六", static_cast<int>(enum_WeekDay::WeekDay_Sat));
  234. ui->cBox_selectWeekStart->addItem("星期天", static_cast<int>(enum_WeekDay::WeekDay_Sun));
  235. ui->cBox_selectWeekEnd->addItem("星期一", static_cast<int>(enum_WeekDay::WeekDay_Mon));
  236. ui->cBox_selectWeekEnd->addItem("星期二", static_cast<int>(enum_WeekDay::WeekDay_Tue));
  237. ui->cBox_selectWeekEnd->addItem("星期三", static_cast<int>(enum_WeekDay::WeekDay_Wed));
  238. ui->cBox_selectWeekEnd->addItem("星期四", static_cast<int>(enum_WeekDay::WeekDay_Thu));
  239. ui->cBox_selectWeekEnd->addItem("星期五", static_cast<int>(enum_WeekDay::WeekDay_Fri));
  240. ui->cBox_selectWeekEnd->addItem("星期六", static_cast<int>(enum_WeekDay::WeekDay_Sat));
  241. ui->cBox_selectWeekEnd->addItem("星期天", static_cast<int>(enum_WeekDay::WeekDay_Sun));
  242. }
  243. /* 设置可选频率 */
  244. void ManagerPlan::setSelectFrequency()
  245. {
  246. for(const auto& chnInfo : ChnContainer.getMapChannel())
  247. {
  248. ui->cBox_selectChn->addItem(chnInfo.ChannelName, chnInfo.ChannelID);
  249. }
  250. /* 设置默认的频率 */
  251. if(ui->cBox_selectChn->count() > 0)
  252. {
  253. ui->cBox_selectChn->setCurrentIndex(0);
  254. do_selectFrequency(0);
  255. }
  256. }
  257. /* 查找本地计划列表,这个频率不存在则添加 */
  258. QList<PlanInfo>& ManagerPlan::findPlanList(const int chnID)
  259. {
  260. auto list = m_mapPlanInfo.find(chnID);
  261. /* 如果没有这个频率的计划列表,则创建一个新的列表 */
  262. if(list == m_mapPlanInfo.end())
  263. {
  264. QList<PlanInfo> listPlan;
  265. /* 如果是修改模版,则不从全局获取数据,插入一个空的即可 */
  266. if(m_mode != Enum_Mode::Mode_ModifyTemplate)
  267. {
  268. /* 将PData的计划拷贝过来 */
  269. auto pCard = PData.findPlanCard(chnID);
  270. if(pCard != nullptr)
  271. {
  272. pCard->getPlanList(listPlan);
  273. }
  274. }
  275. m_mapPlanInfo.insert(chnID, listPlan);
  276. }
  277. /* 再次查找这个频率的列表 */
  278. list = m_mapPlanInfo.find(chnID);
  279. return *list;
  280. }
  281. /* 添加计划,同时添加ui的卡片计划和计划列表 */
  282. void ManagerPlan::addPlanItem(const int chnID, const PlanInfo& info)
  283. {
  284. /* 添加到UI*/
  285. ui->pCard->addPlanItem(info);
  286. /* 添加到计划列表 */
  287. QList<PlanInfo>& list = findPlanList(chnID);
  288. list.append(info);
  289. }
  290. /* 修改容器中的计划 */
  291. void ManagerPlan::modifyPlanItem(const int chnID, const PlanInfo& nowInfo, const PlanInfo& newInfo)
  292. {
  293. auto& list = findPlanList(chnID);
  294. for(int i = 0; i < list.count(); i++)
  295. {
  296. if(list.at(i) == nowInfo)
  297. {
  298. list.replace(i, newInfo);
  299. break;
  300. }
  301. }
  302. }
  303. /**
  304. * @brief 判断开机和关机时间是否冲突
  305. *
  306. * @param info
  307. * @return true 冲突
  308. * @return false 不冲突
  309. */
  310. bool ManagerPlan::checkOnAndOffTime(const PlanInfo& info)
  311. {
  312. if(info.onWeekDay != enum_WeekDay::WeekDay_Special)
  313. {
  314. /* 正常日判断 */
  315. if(info.onWeekDay > info.offWeekDay)
  316. {
  317. /* 开机时间大于关机时间,冲突 */
  318. return true;
  319. }
  320. else if(info.onWeekDay == info.offWeekDay)
  321. {
  322. /* 开机和关机在同一天 */
  323. if(info.onDateTime.time() >= info.offDateTime.time())
  324. {
  325. /* 开机时间大于等于关机时间,冲突 */
  326. return true;
  327. }else
  328. {
  329. /* 开机时间小于关机时间,不冲突 */
  330. return false;
  331. }
  332. }
  333. return false;
  334. }
  335. else
  336. {
  337. /* 特殊日判断 */
  338. /* 开机和关机在不同天 */
  339. if(info.onDateTime.date() > info.offDateTime.date())
  340. {
  341. /* 开机时间大于关机时间,冲突 */
  342. return true;
  343. }
  344. else if(info.onDateTime.date() == info.offDateTime.date())
  345. {
  346. /* 开机和关机在同一天 */
  347. if(info.onDateTime.time() >= info.offDateTime.time())
  348. {
  349. /* 开机时间大于等于关机时间,冲突 */
  350. return true;
  351. }else
  352. {
  353. /* 开机时间小于关机时间,不冲突 */
  354. return false;
  355. }
  356. }
  357. return false;
  358. }
  359. }
  360. /**
  361. * @brief 比较两个时间点的大小,正常日和特殊日都可以比较
  362. *
  363. * @param info1
  364. * @param info2
  365. * @return true info1 > info2
  366. * @return false info1 < info2
  367. */
  368. bool ManagerPlan::timeIsGerater(const enum_WeekDay weekDay1, const QDateTime& time1,
  369. const enum_WeekDay weekDay2, const QDateTime& time2)
  370. {
  371. /* 正常日 */
  372. if(weekDay1 != enum_WeekDay::WeekDay_Special)
  373. {
  374. /* 先比较日期 */
  375. if(weekDay1 > weekDay2)
  376. {
  377. return true;
  378. }
  379. else if(weekDay1 == weekDay2)
  380. {
  381. /* 日期相同,比较时间 */
  382. if(time1.time() > time2.time())
  383. {
  384. return true;
  385. }else
  386. {
  387. return false;
  388. }
  389. }
  390. return false;
  391. }
  392. else /* 特殊日 */
  393. {
  394. /* 先比较日期 */
  395. if(time1.date() > time2.date())
  396. {
  397. return true;
  398. }
  399. else if(time1.date() == time2.date())
  400. {
  401. /* 日期相同,比较时间 */
  402. if(time1.time() > time2.time())
  403. {
  404. return true;
  405. }else
  406. {
  407. return false;
  408. }
  409. }
  410. return false;
  411. }
  412. }
  413. /**
  414. * @brief 判断计划时间和列表中的时间是否冲突
  415. * 判断规则是只要时间段不和任何一个时间段重合就不冲突
  416. *
  417. * @param chnID
  418. * @param info
  419. * @return true 时间冲突
  420. * @return false 时间不冲突
  421. */
  422. bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& info)
  423. {
  424. QList<PlanInfo>& list = findPlanList(chnID);
  425. bool isConflict = false;
  426. int weekDayStart = static_cast<int>(info.onWeekDay);
  427. int weekDayEnd = static_cast<int>(info.offWeekDay);
  428. for(const auto& it : list)
  429. {
  430. /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
  431. bool isLess = timeIsGerater(it.onWeekDay, it.onDateTime, info.offWeekDay, info.offDateTime);
  432. bool isGreater = timeIsGerater(info.onWeekDay, info.onDateTime, it.offWeekDay, it.offDateTime);
  433. if(isLess || isGreater)
  434. {
  435. /* 时间不冲突 */
  436. continue;
  437. }
  438. isConflict = true; /* 时间冲突 */
  439. break;
  440. }
  441. return isConflict;
  442. }
  443. /* 判断计划时间和列表中的时间是否冲突,排除原有的日期,用于比较修改的计划 */
  444. bool ManagerPlan::checkPlanTimeConflict(const int chnID, const PlanInfo& newInfo, const PlanInfo& exInfo)
  445. {
  446. /* 这里采用拷贝的方式获取,后续不需要再把排除的项放回去 */
  447. QList<PlanInfo> list = findPlanList(chnID);
  448. /* 先去掉需要排除的项 */
  449. list.removeOne(exInfo);
  450. bool isConflict = false;
  451. int weekDayStart = static_cast<int>(newInfo.onWeekDay);
  452. int weekDayEnd = static_cast<int>(newInfo.offWeekDay);
  453. for(const auto& it : list)
  454. {
  455. /* info结束时间小于开始时间,或者info开始时间大于结束时间,就不冲突 */
  456. bool isLess = timeIsGerater(it.onWeekDay, it.onDateTime, newInfo.offWeekDay, newInfo.offDateTime);
  457. bool isGreater = timeIsGerater(newInfo.onWeekDay, newInfo.onDateTime, it.offWeekDay, it.offDateTime);
  458. if(isLess || isGreater)
  459. {
  460. /* 时间不冲突 */
  461. continue;
  462. }
  463. isConflict = true; /* 时间冲突 */
  464. break;
  465. }
  466. return isConflict;
  467. }
  468. /* 设置按钮显示或隐藏 */
  469. void ManagerPlan::setButtonVisible(bool isVisible)
  470. {
  471. if(isVisible)
  472. {
  473. ui->pBtn_editPlan->show();
  474. ui->pBtn_deletePlan->show();
  475. }else
  476. {
  477. ui->pBtn_editPlan->hide();
  478. ui->pBtn_deletePlan->hide();
  479. }
  480. }
  481. /* 保存模版 */
  482. void ManagerPlan::saveTemplateToEQM()
  483. {
  484. if(m_fromWebAPI == nullptr && m_fromSQLite == nullptr)
  485. {
  486. LH_WRITE_ERROR("没有初始化FromWebAPI或FromSQLite");
  487. return;
  488. }
  489. auto chnInfo = ui->pCard->getChannelInfo();
  490. /* 获取所有的模板名称 */
  491. QList<OneTemplateInfo> list;
  492. if(!m_fromWebAPI->getTemplateList(chnInfo.ChannelID, list))
  493. {
  494. LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(chnInfo.ChannelID));
  495. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  496. return;
  497. }
  498. /* 弹出导出页面 */
  499. std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>();
  500. stt->setQSS(EPUIStyle.getQSSPath());
  501. stt->setTemplateList(list);
  502. stt->exec();
  503. if(!stt->isOk())
  504. {
  505. return;
  506. }
  507. /* 获取一天的数据 */
  508. QList<OnePlanItemInfo> listTmp;
  509. ui->pCard->getAllPlanInfo(listTmp);
  510. /* 保存到模板 */
  511. bool isSuccess = false;
  512. if(GInfo.isOnlineDB())
  513. {
  514. isSuccess = m_fromWebAPI->saveTemplate(stt->getTemplateName(), listTmp);
  515. }else {
  516. isSuccess = m_fromSQLite->saveTemplate(stt->getTemplateName(), listTmp);
  517. }
  518. if(isSuccess)
  519. {
  520. TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
  521. }else {
  522. TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
  523. }
  524. /* 调用回调函数 */
  525. emit signal_callBack(3);
  526. }
  527. /* 选择了一个频率 */
  528. void ManagerPlan::do_selectFrequency(int index)
  529. {
  530. auto chnID = ui->cBox_selectChn->itemData(index).toInt();
  531. m_channelInfo = ChnContainer.getChannel(chnID);
  532. QList<PlanInfo>& list = findPlanList(chnID);
  533. /* 设置频率信息 */
  534. ui->pCard->setChannelInfo(ChnContainer.getChannel(chnID));
  535. /* 设置计划列表 */
  536. ui->pCard->setPlanList(list);
  537. if(list.isEmpty())
  538. {
  539. /* 没有计划,隐藏按钮 */
  540. setButtonVisible(false);
  541. }else
  542. {
  543. /* 有计划,显示按钮 */
  544. setButtonVisible(true);
  545. }
  546. }
  547. /* 点击了添加按钮 */
  548. void ManagerPlan::do_addPlanItem()
  549. {
  550. int chnID = ui->pCard->getChannelInfo().ChannelID;
  551. PlanInfo one;
  552. /* 判断是正常日还是特殊日 */
  553. if(ui->tabWidget->currentIndex() == 0)
  554. {
  555. /* 正常日 */
  556. one.onWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekStart->itemData(ui->cBox_selectWeekStart->currentIndex()).toInt());
  557. one.onDateTime.setTime(ui->timeEdit_weekStart->getTime());
  558. one.offWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekEnd->itemData(ui->cBox_selectWeekEnd->currentIndex()).toInt());
  559. one.offDateTime.setTime(ui->timeEdit_weekEnd->getTime());
  560. }else {
  561. /* 特殊日 */
  562. one.onWeekDay = enum_WeekDay::WeekDay_Special;
  563. one.onDateTime.setDate(ui->dateEdit_specialStart->date());
  564. one.onDateTime.setTime(ui->timeEdit_specialStart->getTime());
  565. one.offWeekDay = enum_WeekDay::WeekDay_Special;
  566. one.offDateTime.setDate(ui->dateEdit_specialEnd->date());
  567. one.offDateTime.setTime(ui->timeEdit_specialEnd->getTime());
  568. }
  569. /* 先判断开机时间和关机时间是否冲突 */
  570. if(checkOnAndOffTime(one))
  571. {
  572. /* 开始和结束时间冲突 */
  573. TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间早于或等于关机时间!", this);
  574. return;
  575. }
  576. /* 判断时间段是否和历史时间段冲突 */
  577. if(checkPlanTimeConflict(chnID, one))
  578. {
  579. /* 时间段冲突 */
  580. TipWidget::display(TipWidget::OPERATOR_WARN, "时间段冲突!", this);
  581. return;
  582. }
  583. /* 添加计划 */
  584. addPlanItem(chnID, one);
  585. setButtonVisible(true); /* 显示按钮 */
  586. }
  587. /* 点击修改按钮 */
  588. void ManagerPlan::do_modifyPlanItem()
  589. {
  590. int chnID = ui->pCard->getChannelInfo().ChannelID;
  591. auto& list = findPlanList(chnID);
  592. /* 获取选中的行 */
  593. auto slectRow = ui->pCard->getSelectedRow();
  594. if(slectRow < 0 || slectRow >= list.size())
  595. {
  596. /* 没有选中行 */
  597. TipWidget::display(TipWidget::OPERATOR_WARN, "没有选中行!", this);
  598. return;
  599. }
  600. // LH_WRITE_LOG_DEBUG(QString("修改行: %1").arg(index));
  601. /* 获取修改后的日期 */
  602. PlanInfo one;
  603. if(ui->tabWidget->currentIndex() == 0)
  604. {
  605. /* 正常日 */
  606. one.onWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekStart->itemData(ui->cBox_selectWeekStart->currentIndex()).toInt());
  607. one.onDateTime.setTime(ui->timeEdit_weekStart->getTime());
  608. one.offWeekDay = static_cast<enum_WeekDay>(ui->cBox_selectWeekEnd->itemData(ui->cBox_selectWeekEnd->currentIndex()).toInt());
  609. one.offDateTime.setTime(ui->timeEdit_weekEnd->getTime());
  610. }else {
  611. /* 特殊日 */
  612. one.onWeekDay = enum_WeekDay::WeekDay_Special;
  613. one.onDateTime.setDate(ui->dateEdit_specialStart->date());
  614. one.onDateTime.setTime(ui->timeEdit_specialStart->getTime());
  615. one.offWeekDay = enum_WeekDay::WeekDay_Special;
  616. one.offDateTime.setDate(ui->dateEdit_specialEnd->date());
  617. one.offDateTime.setTime(ui->timeEdit_specialEnd->getTime());
  618. }
  619. /* 先判断设置的时间是否和当前选中的行的时间相同 */
  620. auto nowPlan = ui->pCard->getSelectedPlan();
  621. if(nowPlan == one)
  622. {
  623. return;
  624. }
  625. /* 先判断开机时间和关机时间是否冲突 */
  626. if(checkOnAndOffTime(one))
  627. {
  628. /* 开始和结束时间冲突 */
  629. TipWidget::display(TipWidget::OPERATOR_WARN, "开机时间早于或等于关机时间!", this);
  630. return;
  631. }
  632. auto exPlan = ui->pCard->getSelectedPlan();
  633. /* 判断时间段是否和历史时间段冲突 */
  634. if(checkPlanTimeConflict(chnID, one, exPlan))
  635. {
  636. /* 时间段冲突 */
  637. TipWidget::display(TipWidget::OPERATOR_WARN, "时间段冲突!", this);
  638. return;
  639. }
  640. /* 修改选中的行 */
  641. auto oldPlan = ui->pCard->modifyPlanItem(slectRow, one);
  642. /* 修改数据容器中的计划 */
  643. modifyPlanItem(chnID, oldPlan, one);
  644. }
  645. /* 点击了删除按钮 */
  646. void ManagerPlan::do_deletePlanItem()
  647. {
  648. int chnID = ui->pCard->getChannelInfo().ChannelID;
  649. auto& list = findPlanList(chnID);
  650. /* 获取选中的行 */
  651. auto row = ui->pCard->getSelectedRow();
  652. if(row < 0 || row >= list.size())
  653. {
  654. /* 没有选中行 */
  655. TipWidget::display(TipWidget::OPERATOR_WARN, "没有选中行!", this);
  656. return;
  657. }
  658. LH_WRITE_LOG_DEBUG(QString("删除行: %1").arg(row));
  659. /* 删除选中的行 */
  660. auto plan = ui->pCard->deletePlanItem(row);
  661. /* 删除UI的计划 */
  662. list.removeOne(plan);
  663. /* 判断删除后是否还有计划,没有就隐藏修改和删除按钮 */
  664. if(list.isEmpty())
  665. {
  666. /* 没有计划,隐藏按钮 */
  667. setButtonVisible(false);
  668. }
  669. }
  670. /* 点击了保存模版按钮 */
  671. void ManagerPlan::do_saveTemplate()
  672. {
  673. /* 判断卡片有没有计划 */
  674. if(ui->pCard->isPlanEmpty())
  675. {
  676. /* 没有计划 */
  677. TipWidget::display(TipWidget::OPERATOR_WARN, "该频率没有计划!", this);
  678. return;
  679. }
  680. saveTemplateToEQM();
  681. }
  682. /* 点击了OK按钮 */
  683. void ManagerPlan::do_pBtn_ok()
  684. {
  685. m_isOK = true;
  686. this->close();
  687. }
  688. /* 选中了一项,回显到编辑页面 */
  689. void ManagerPlan::do_tableView_clicked(PlanInfo& info)
  690. {
  691. /* 设置时间和日期 */
  692. if(info.onWeekDay != enum_WeekDay::WeekDay_Special)
  693. {
  694. /* 正常日 */
  695. ui->cBox_selectWeekStart->setCurrentIndex(static_cast<int>(info.onWeekDay) - 1);
  696. ui->timeEdit_weekStart->setTime(info.onDateTime.time());
  697. ui->cBox_selectWeekEnd->setCurrentIndex(static_cast<int>(info.offWeekDay) - 1);
  698. ui->timeEdit_weekEnd->setTime(info.offDateTime.time());
  699. }else
  700. {
  701. /* 特殊日 */
  702. ui->dateEdit_specialStart->setDate(info.onDateTime.date());
  703. ui->timeEdit_specialStart->setTime(info.onDateTime.time());
  704. ui->dateEdit_specialEnd->setDate(info.offDateTime.date());
  705. ui->timeEdit_specialEnd->setTime(info.offDateTime.time());
  706. }
  707. /* 判断是正常日还是特殊日,自动切换显示的页面 */
  708. if(info.onWeekDay != enum_WeekDay::WeekDay_Special)
  709. {
  710. /* 正常日 */
  711. ui->tabWidget->setCurrentIndex(0);
  712. }else {
  713. /* 特殊日 */
  714. ui->tabWidget->setCurrentIndex(1);
  715. }
  716. }
  717. /* 鼠标点击事件 */
  718. void ManagerPlan::mousePressEvent(QMouseEvent *event)
  719. {
  720. m_lastPos = event->globalPos();
  721. event->accept();
  722. }
  723. /* 鼠标移动事件 */
  724. void ManagerPlan::mouseMoveEvent(QMouseEvent *event)
  725. {
  726. auto point = ui->widget_top->mapToGlobal(QPoint(0, 0));
  727. QRect rect(point, ui->widget_top->size());
  728. if(!rect.contains(m_lastPos))
  729. {
  730. event->accept();
  731. return;
  732. }
  733. int dx = event->globalX() - m_lastPos.x();
  734. int dy = event->globalY() - m_lastPos.y();
  735. ui->widget_background->move(ui->widget_background->x() + dx, ui->widget_background->y() + dy);
  736. m_lastPos = event->globalPos();
  737. event->accept();
  738. }
  739. /* 鼠标释放事件 */
  740. void ManagerPlan::mouseReleaseEvent(QMouseEvent *event)
  741. {
  742. event->accept();
  743. }
  744. /* 事件过滤器 */
  745. bool ManagerPlan::eventFilter(QObject *watched, QEvent *event)
  746. {
  747. if(watched == ui->cBox_selectChn)
  748. {
  749. if(event->type() == QEvent::Wheel)
  750. {
  751. return true;
  752. }
  753. }
  754. else if(watched == ui->cBox_selectChn)
  755. {
  756. if(event->type() == QEvent::Wheel)
  757. {
  758. return true;
  759. }
  760. }
  761. else if(watched == ui->cBox_selectWeekStart)
  762. {
  763. if(event->type() == QEvent::Wheel)
  764. {
  765. return true;
  766. }
  767. }
  768. else if(watched == ui->cBox_selectWeekEnd)
  769. {
  770. if(event->type() == QEvent::Wheel)
  771. {
  772. return true;
  773. }
  774. }
  775. else if(watched == ui->pBtn_close)
  776. {
  777. if(event->type() == QEvent::Enter)
  778. {
  779. ui->pBtn_close->setProperty("Hover", true);
  780. ui->pBtn_close->style()->unpolish(ui->pBtn_close);
  781. ui->pBtn_close->style()->polish(ui->pBtn_close);
  782. return true;
  783. }else if(event->type() == QEvent::Leave)
  784. {
  785. ui->pBtn_close->setProperty("Hover", false);
  786. ui->pBtn_close->style()->unpolish(ui->pBtn_close);
  787. ui->pBtn_close->style()->polish(ui->pBtn_close);
  788. return true;
  789. }
  790. }
  791. return QDialog::eventFilter(watched, event);
  792. }