checkperiodwidget.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. #include "checkperiodwidget.h"
  2. #include "GlobalVariable.h"
  3. #include "checkperiodfunc.h"
  4. #include "onedetectplan.h"
  5. #include "ui_checkperiodwidget.h"
  6. #include "addperioddialog.h"
  7. #include "UIStyleManager.h"
  8. #include "customcombobox.h"
  9. #include <QFile>
  10. #include <algorithm>
  11. #include <cmath>
  12. #include <qboxlayout.h>
  13. #include "checkperiodfunc.h"
  14. #include "tipwidget.h"
  15. #include "GlobalInfo.h"
  16. #include "timewidget.h"
  17. #include "SystemConfig.h"
  18. CheckPeriodWidget::CheckPeriodWidget(QWidget *parent) :
  19. QWidget(parent),
  20. ui(new Ui::CheckPeriodWidget)
  21. {
  22. ui->setupUi(this);
  23. m_logger = spdlog::get("ACASetting");
  24. if(m_logger == nullptr)
  25. {
  26. fmt::print("CheckPeriodWidget: Logger ACASetting not found\n");
  27. return;
  28. }
  29. /* 下拉框设置阴影 */
  30. ui->comboBox_selectCompareItem->setViewShadowEffect();
  31. /* 获取计划容器的布局指针 */
  32. m_layoutDetectPlans = qobject_cast<QVBoxLayout*>(ui->scrollArea_detectPlans->layout());
  33. m_layoutNoDetectPlans = qobject_cast<QVBoxLayout*>(ui->scrollArea_noDetectPlans->layout());
  34. connect(ui->pBtn_addDetectPlan, &QPushButton::clicked, this, &CheckPeriodWidget::do_pBtn_addDetectPlan_clicked);
  35. connect(ui->pBtn_addNoDetectPlan, &QPushButton::clicked, this, &CheckPeriodWidget::do_pBtn_addNoDetectPlan_clicked);
  36. connect(ui->comboBox_selectCompareItem, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CheckPeriodWidget::do_comboBox_selectCompareItem_currentIndexChanged);
  37. connect(ui->checkBox_applySlient, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
  38. connect(ui->checkBox_applyOverload, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
  39. connect(ui->checkBox_applyPhase, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
  40. connect(ui->checkBox_applyNoise, &QCheckBox::clicked, this, &CheckPeriodWidget::do_checkBox_clicked);
  41. /* 设置UI */
  42. UIStyle.registerWidget(this);
  43. QString qssPath = UIStyle.getQSSPath() + "/onedetectplan.qss";
  44. QFile file(qssPath);
  45. if(file.open(QFile::ReadOnly))
  46. {
  47. m_qssPlan = file.readAll();
  48. file.close();
  49. } else
  50. {
  51. SPDLOG_LOGGER_WARN(m_logger, "打开QSS文件失败: {}", qssPath.toStdString());
  52. }
  53. /* 初始化列表 */
  54. initListWidget();
  55. }
  56. CheckPeriodWidget::~CheckPeriodWidget()
  57. {
  58. UIStyle.unregisterWidget(this);
  59. delete ui;
  60. }
  61. /* 更新可选的对比项列表 */
  62. void CheckPeriodWidget::updateCompareItemList(const QList<CompareItemInfo_t>& compareItemList)
  63. {
  64. /* 先获取当前选择的列表项 */
  65. int id = ui->comboBox_selectCompareItem->currentData().value<int>();
  66. /* 屏蔽comboBox信号 */
  67. ui->comboBox_selectCompareItem->blockSignals(true);
  68. ui->comboBox_selectCompareItem->clear();
  69. m_pListcurrDetect = nullptr;
  70. for(const auto& item : compareItemList)
  71. {
  72. /* 添加到下拉框 */
  73. ui->comboBox_selectCompareItem->addItem(item.strName, item.nID);
  74. }
  75. /* 设置当前选择的对比项 */
  76. if(id != 0)
  77. {
  78. /* 屏蔽comboBox信号 */
  79. ui->comboBox_selectCompareItem->blockSignals(true);
  80. for(int i = 0; i < ui->comboBox_selectCompareItem->count(); ++i)
  81. {
  82. if(ui->comboBox_selectCompareItem->itemData(i).value<int>() == id)
  83. {
  84. ui->comboBox_selectCompareItem->setCurrentIndex(i);
  85. break;
  86. }
  87. }
  88. } else
  89. {
  90. ui->comboBox_selectCompareItem->setCurrentIndex(0);
  91. }
  92. /* 恢复comboBox信号 */
  93. ui->comboBox_selectCompareItem->blockSignals(false);
  94. /* 手动切换当前的列表 */
  95. do_comboBox_selectCompareItem_currentIndexChanged(ui->comboBox_selectCompareItem->currentIndex());
  96. }
  97. /* 保存设置 */
  98. bool CheckPeriodWidget::saveSettings()
  99. {
  100. /* 更新静音过载反相的设置 */
  101. m_mapNoDetectApply[m_currNoDetectApply.nID] = m_currNoDetectApply;
  102. /* 生成按照对比项相关的设置计划 */
  103. QMap<int, DetectPeriodConfig_t> mapDetectConfig;
  104. updateCompareItemDetectPeriod(mapDetectConfig);
  105. /* 和已有的对比,只有有修改的地方,直接删除这个对比项ID所有计划,然后插入 */
  106. const auto& oldMap = SysConfig.getDetectPeriodConfig();
  107. QMap<int, DetectPeriodConfig_t> insertMap;
  108. QList<int> deleteList;
  109. /* 先找出需要插入的 */
  110. for(auto it = mapDetectConfig.cbegin(); it != mapDetectConfig.cend(); ++it)
  111. {
  112. int id = it.key();
  113. if(oldMap.contains(id))
  114. {
  115. /* 如果有修改,就删除原来的 */
  116. if(oldMap[id] == it.value())
  117. {
  118. continue;
  119. }else
  120. {
  121. deleteList.append(id);
  122. }
  123. }
  124. /* 无论是没有还是修改了,都需要重新插入 */
  125. insertMap.insert(id, it.value());
  126. }
  127. /* 先删除,再插入新数据 */
  128. if(!deleteList.isEmpty())
  129. {
  130. if(!m_fromWebAPI->deleteDetectPeriodConfig(deleteList))
  131. {
  132. SPDLOG_LOGGER_ERROR(m_logger, "删除对比项检测时段配置失败");
  133. TipWidget::display(TipWidget::OPERATOR_WARN, "删除对比项检测时段配置失败", GInfo.getTopWindow());
  134. return false;
  135. }
  136. }
  137. if(!insertMap.isEmpty())
  138. {
  139. if(!m_fromWebAPI->insertDetectPeriodConfig(insertMap))
  140. {
  141. SPDLOG_LOGGER_ERROR(m_logger, "插入对比项检测时段配置失败");
  142. TipWidget::display(TipWidget::OPERATOR_WARN, "插入对比项检测时段配置失败", GInfo.getTopWindow());
  143. return false;
  144. }
  145. }
  146. /* 更新系统配置 */
  147. SysConfig.setDetectPeriodConfig(mapDetectConfig);
  148. return true;
  149. }
  150. /* 选择了一个对比项,id是新对比项的id */
  151. void CheckPeriodWidget::do_comboBox_selectCompareItem_currentIndexChanged(int index)
  152. {
  153. /* 获取当前选择的对比项id */
  154. int id = ui->comboBox_selectCompareItem->itemData(index).value<int>();
  155. if(id == 0)
  156. {
  157. m_pListcurrDetect = nullptr;
  158. SPDLOG_LOGGER_WARN(m_logger, "对比项ID为0,无法获取检测计划列表");
  159. return;
  160. }
  161. /* 如果已经有了,就不需要重新创建 */
  162. if(m_mapDetectPlanList.contains(id))
  163. {
  164. m_pListcurrDetect = m_mapDetectPlanList.value(id);
  165. }else
  166. {
  167. /* 创建一个新的列表 */
  168. m_pListcurrDetect = new QList<OneDetectPlan*>();
  169. m_mapDetectPlanList.insert(id, m_pListcurrDetect);
  170. }
  171. if(m_mapNoDetectPlanList.contains(id))
  172. {
  173. m_pListcurrNoDetect = m_mapNoDetectPlanList.value(id);
  174. } else
  175. {
  176. /* 创建一个新的列表 */
  177. m_pListcurrNoDetect = new QList<OneDetectPlan*>();
  178. m_mapNoDetectPlanList.insert(id, m_pListcurrNoDetect);
  179. }
  180. /* 应用项目需要先保存当前的设置到对应的对比项ID中,然后再切换 */
  181. m_currNoDetectApply.isApplySlient = ui->checkBox_applySlient->isChecked();
  182. m_currNoDetectApply.isApplyOverload = ui->checkBox_applyOverload->isChecked();
  183. m_currNoDetectApply.isApplyPhase = ui->checkBox_applyPhase->isChecked();
  184. m_currNoDetectApply.isApplyNoise = ui->checkBox_applyNoise->isChecked();
  185. /* 这里多次检测,是防止第一次进入这个页面,没有保存好的设置 */
  186. if(m_currNoDetectApply.nID > 0)
  187. {
  188. if(m_mapNoDetectApply.contains(m_currNoDetectApply.nID))
  189. {
  190. m_mapNoDetectApply[m_currNoDetectApply.nID] = m_currNoDetectApply;
  191. } else
  192. {
  193. m_mapNoDetectApply.insert(m_currNoDetectApply.nID, m_currNoDetectApply);
  194. }
  195. }
  196. if(m_mapNoDetectApply.contains(id))
  197. {
  198. m_currNoDetectApply = m_mapNoDetectApply.value(id);
  199. } else
  200. {
  201. /* 清空设置 */
  202. m_currNoDetectApply = NoDetectPlanApply_t();
  203. m_currNoDetectApply.nID = id;
  204. m_mapNoDetectApply.insert(id, m_currNoDetectApply);
  205. }
  206. ui->checkBox_applySlient->setChecked(m_currNoDetectApply.isApplySlient);
  207. ui->checkBox_applyOverload->setChecked(m_currNoDetectApply.isApplyOverload);
  208. ui->checkBox_applyPhase->setChecked(m_currNoDetectApply.isApplyPhase);
  209. ui->checkBox_applyNoise->setChecked(m_currNoDetectApply.isApplyNoise);
  210. /* 清空当前的布局 */
  211. removeAllDetectPlanWidgets();
  212. removeAllNoDetectPlanWidgets();
  213. addDetectPlanToLayout();
  214. addNoDetectPlanToLayout();
  215. }
  216. /* 添加一个检测计划 */
  217. void CheckPeriodWidget::do_pBtn_addDetectPlan_clicked()
  218. {
  219. /* 检查当前有没有对比项选择 */
  220. int id = ui->comboBox_selectCompareItem->currentData().value<int>();
  221. if(id <= 0)
  222. {
  223. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择一个对比项", GInfo.getTopWindow());
  224. SPDLOG_LOGGER_WARN(m_logger, "没有选择对比项,无法添加检测计划");
  225. return;
  226. }
  227. AddPeriodDialog dlg(PERIOD_WEEK);
  228. /* 更新计划列表 */
  229. updateDetectPlanList(1);
  230. /* 设置计划列表 */
  231. dlg.setPlanList(m_currentPlanList);
  232. dlg.exec();
  233. if(!dlg.isOK())
  234. {
  235. return;
  236. }
  237. OnePlan_t plan = dlg.getPlan();
  238. addDetectPlan(plan);
  239. }
  240. /* 添加一个不检测计划 */
  241. void CheckPeriodWidget::do_pBtn_addNoDetectPlan_clicked()
  242. {
  243. /* 检查当前有没有对比项选择 */
  244. int id = ui->comboBox_selectCompareItem->currentData().value<int>();
  245. if(id <= 0)
  246. {
  247. TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择一个对比项", GInfo.getTopWindow());
  248. SPDLOG_LOGGER_WARN(m_logger, "没有选择对比项,无法添加检测计划");
  249. return;
  250. }
  251. AddPeriodDialog dlg(PERIOD_DATE);
  252. dlg.exec();
  253. if(!dlg.isOK())
  254. {
  255. return;
  256. }
  257. OnePlan_t plan = dlg.getPlan();
  258. addNoDetectPlan(plan);
  259. }
  260. /* 删除一个检测计划 */
  261. void CheckPeriodWidget::do_pBtn_deleteDetectPlan_clicked()
  262. {
  263. /* 获取信号发送者 */
  264. OneDetectPlan *pDetect = qobject_cast<OneDetectPlan*>(sender());
  265. if(pDetect == nullptr)
  266. {
  267. return;
  268. }
  269. m_layoutDetectPlans->removeWidget(pDetect);
  270. m_pListcurrDetect->removeAll(pDetect);
  271. delete pDetect;
  272. /* 重新排序 */
  273. // sortDetectPlanList();
  274. }
  275. /* 删除一个不检测计划 */
  276. void CheckPeriodWidget::do_pBtn_deleteNoDetectPlan_clicked()
  277. {
  278. /* 获取信号发送者 */
  279. OneDetectPlan *pDetect = qobject_cast<OneDetectPlan*>(sender());
  280. if(pDetect == nullptr)
  281. {
  282. return;
  283. }
  284. m_layoutNoDetectPlans->removeWidget(pDetect);
  285. m_pListcurrNoDetect->removeAll(pDetect);
  286. delete pDetect;
  287. /* 重新排序 */
  288. // sortNoDetectPlanList();
  289. }
  290. /* 修改了日期或周几,检测是否冲突 */
  291. void CheckPeriodWidget::do_detectPlanModifiedWeek(OnePlan_t formerPlan, OnePlan_t newPlan)
  292. {
  293. OneDetectPlan *pDetect = qobject_cast<OneDetectPlan*>(sender());
  294. /* 更新计划 */
  295. updateDetectPlanList(1);
  296. /* 检测是否冲突 */
  297. if(isWeekPlanDuplicate(m_currentPlanList, newPlan, newPlan))
  298. {
  299. /* 弹出提示 */
  300. TipWidget::display(TipWidget::OPERATOR_WARN, "与已有计划冲突,请重新修改", GInfo.getTopWindow());
  301. SPDLOG_LOGGER_WARN(m_logger, "检测计划冲突");
  302. /* 恢复原计划 */
  303. pDetect->setPlan(formerPlan);
  304. return;
  305. }
  306. /* 重新排序 */
  307. sortDetectPlanList();
  308. }
  309. /* 点击了检测计划的时间按钮,在这里修改时间 */
  310. void CheckPeriodWidget::do_detectPlanModifiedTime(QPoint pBtnSize, bool isStartTime)
  311. {
  312. /* 获取信号发送者 */
  313. auto one = qobject_cast<OneDetectPlan*>(sender());
  314. OnePlan_t plan = one->getPlan();
  315. /* 创建时间选择控件 */
  316. std::shared_ptr<TimeWidget> tw = std::make_shared<TimeWidget>(this, TimeWidget::ShowType::Dialog);
  317. /* 设置样式表 */
  318. tw->setStyleSheet(m_qssPlan);
  319. /* 设置图标 */
  320. tw->setIcon(":/icon/time.png");
  321. tw->setIconShow(true);
  322. tw->setIconSize(16, 16);
  323. /* 重新设置大小 */
  324. tw->setEditLine(112, 32);
  325. /* 设置选择框大小 */
  326. tw->setTimeAreaWidth(140);
  327. /* 移动位置,覆盖显示时间的按钮,获取的坐标是相对于Dialog的位置 */
  328. auto pos = this->mapFromGlobal(pBtnSize);
  329. // pos.setX(pos.x() - 1); /* 去掉阴影的宽度 */
  330. // pos.setY(pos.y()); /* 去掉阴影的高度 */
  331. tw->move(pos);
  332. // SPDLOG_LOGGER_DEBUG(m_logger, "移动前位置: {}, {}", pBtnSize.x(), pBtnSize.y());
  333. // SPDLOG_LOGGER_DEBUG(m_logger, "移动后位置: {}, {}", pos.x(), pos.y());
  334. /* 设置默认的时间 */
  335. if(isStartTime)
  336. {
  337. tw->setTime(plan.timeStart);
  338. } else
  339. {
  340. tw->setTime(plan.timeEnd);
  341. }
  342. tw->execShow();
  343. auto time = tw->getTime();
  344. /* 判断时间有没有修改 */
  345. if(isStartTime)
  346. {
  347. if(time == plan.timeStart)
  348. {
  349. return; // 没有修改
  350. }
  351. } else
  352. {
  353. if(time == plan.timeEnd)
  354. {
  355. return; // 没有修改
  356. }
  357. }
  358. SPDLOG_LOGGER_DEBUG(m_logger, "修改时间: {}, {}", time.toString("hh:mm:ss").toStdString(), isStartTime ? "开始时间" : "结束时间");
  359. OnePlan_t newPlan = plan;
  360. if(isStartTime)
  361. {
  362. newPlan.timeStart = time;
  363. } else
  364. {
  365. newPlan.timeEnd = time;
  366. }
  367. /* 判断时间是否重复 */
  368. updateDetectPlanList(1);
  369. if(isWeekPlanDuplicate(m_currentPlanList, newPlan, plan))
  370. {
  371. /* 设置时间报警 */
  372. TipWidget::display(TipWidget::OPERATOR_WARN, "与已有计划冲突,请重新修改", GInfo.getTopWindow());
  373. SPDLOG_LOGGER_WARN(m_logger, "检测计划冲突");
  374. return;
  375. }
  376. /* 设置时间 */
  377. one->setPlan(newPlan);
  378. /* 重新排序 */
  379. sortDetectPlanList();
  380. }
  381. /* 修改了静音、反相、过载相关的设置 */
  382. void CheckPeriodWidget::do_checkBox_clicked()
  383. {
  384. m_currNoDetectApply.isApplySlient = ui->checkBox_applySlient->isChecked();
  385. m_currNoDetectApply.isApplyOverload = ui->checkBox_applyOverload->isChecked();
  386. m_currNoDetectApply.isApplyPhase = ui->checkBox_applyPhase->isChecked();
  387. m_currNoDetectApply.isApplyNoise = ui->checkBox_applyNoise->isChecked();
  388. }
  389. /* 初始化QListWidget */
  390. void CheckPeriodWidget::initListWidget()
  391. {
  392. /* 获取读取到的检测计划 */
  393. const auto& mapDetectConfig = SysConfig.getDetectPeriodConfig();
  394. /* 将计划转换成列表组件 */
  395. for(auto it = mapDetectConfig.cbegin(); it != mapDetectConfig.cend(); ++it)
  396. {
  397. int id = it.key();
  398. const DetectPeriodConfig_t& config = it.value();
  399. /* 如果已经有了,就不需要重新创建 */
  400. if(m_mapDetectPlanList.contains(id))
  401. {
  402. m_pListcurrDetect = m_mapDetectPlanList.value(id);
  403. }else
  404. {
  405. /* 创建一个新的列表 */
  406. m_pListcurrDetect = new QList<OneDetectPlan*>();
  407. m_mapDetectPlanList.insert(id, m_pListcurrDetect);
  408. }
  409. if(m_mapNoDetectPlanList.contains(id))
  410. {
  411. m_pListcurrNoDetect = m_mapNoDetectPlanList.value(id);
  412. } else
  413. {
  414. /* 创建一个新的列表 */
  415. m_pListcurrNoDetect = new QList<OneDetectPlan*>();
  416. m_mapNoDetectPlanList.insert(id, m_pListcurrNoDetect);
  417. }
  418. /* 添加检测计划 */
  419. for(const auto& plan : config.listDetect)
  420. {
  421. addDetectPlan(plan);
  422. }
  423. /* 添加非检测计划 */
  424. for(const auto& plan : config.listNoDetect)
  425. {
  426. addNoDetectPlan(plan);
  427. }
  428. /* 设置应用配置 */
  429. NoDetectPlanApply_t apply;
  430. apply.nID = id;
  431. apply.isApplySlient = config.isApplySlient;
  432. apply.isApplyOverload = config.isApplyOverload;
  433. apply.isApplyPhase = config.isApplyPhase;
  434. apply.isApplyNoise = config.isApplyNoise;
  435. m_mapNoDetectApply[id] = apply;
  436. }
  437. }
  438. /* 添加一个检测计划 */
  439. void CheckPeriodWidget::addDetectPlan(const OnePlan_t& plan)
  440. {
  441. /* 传入的日期类型,不是特殊日就可以 */
  442. OneDetectPlan *detectPlan = new OneDetectPlan(eWeekType::Week_Monday, this);
  443. /* 删除日期选择框 */
  444. detectPlan->setQSS(m_qssPlan);
  445. detectPlan->setPlan(plan);
  446. connect(detectPlan, &OneDetectPlan::signal_oneDetectPlanCloseClicked, this, &CheckPeriodWidget::do_pBtn_deleteDetectPlan_clicked);
  447. connect(detectPlan, &OneDetectPlan::signal_planModifiedWeek, this, &CheckPeriodWidget::do_detectPlanModifiedWeek);
  448. connect(detectPlan, &OneDetectPlan::signal_timeButtonClicked, this, &CheckPeriodWidget::do_detectPlanModifiedTime);
  449. /* 将数据插入到列表中,在排序的时候会将新增加的插入到里面 */
  450. m_pListcurrDetect->append(detectPlan);
  451. /* 排序 */
  452. sortDetectPlanList();
  453. }
  454. /* 添加一个非检测计划 */
  455. void CheckPeriodWidget::addNoDetectPlan(const OnePlan_t& plan)
  456. {
  457. /* 传入特殊日的日期类型 */
  458. OneDetectPlan *detectPlan = new OneDetectPlan(eWeekType::Week_Special, this);
  459. detectPlan->setQSS(m_qssPlan);
  460. detectPlan->setPlan(plan);
  461. connect(detectPlan, &OneDetectPlan::signal_oneDetectPlanCloseClicked, this, &CheckPeriodWidget::do_pBtn_deleteNoDetectPlan_clicked);
  462. m_pListcurrNoDetect->append(detectPlan);
  463. /* 排序并显示 */
  464. sortNoDetectPlanList();
  465. }
  466. /* 重新排序检测计划 */
  467. void CheckPeriodWidget::sortDetectPlanList()
  468. {
  469. /* 清空列表 */
  470. removeAllDetectPlanWidgets();
  471. /* 排序 */
  472. std::sort(m_pListcurrDetect->begin(), m_pListcurrDetect->end(), [](OneDetectPlan *a, OneDetectPlan *b)
  473. {
  474. const OnePlan_t &planA = a->getPlan();
  475. const OnePlan_t &planB = b->getPlan();
  476. /* 按时间从小到大升序 */
  477. return weekTimeIsGerater(planB.weekType, planB.timeStart, planA.weekType, planA.timeStart);
  478. });
  479. /* 重新插入 */
  480. addDetectPlanToLayout();
  481. update();
  482. }
  483. /* 排序非检测日期列表 */
  484. void CheckPeriodWidget::sortNoDetectPlanList()
  485. {
  486. /* 清空列表 */
  487. removeAllNoDetectPlanWidgets();
  488. /* 排序 */
  489. std::sort(m_pListcurrDetect->begin(), m_pListcurrDetect->end(), [](OneDetectPlan *a, OneDetectPlan *b)
  490. {
  491. const OnePlan_t &planA = a->getPlan();
  492. const OnePlan_t &planB = b->getPlan();
  493. /* 按时间从小到大升序 */
  494. return dateTimeIsGerater(planB.date, planB.timeStart, planA.date, planA.timeStart);
  495. });
  496. /* 重新插入 */
  497. addNoDetectPlanToLayout();
  498. update();
  499. }
  500. /* 获取计划列表 */
  501. QList<OnePlan_t> CheckPeriodWidget::updateDetectPlanList(int id)
  502. {
  503. m_currentPlanList.clear();
  504. for(auto& pDetect : *m_pListcurrDetect)
  505. {
  506. OnePlan_t plan = pDetect->getPlan();
  507. m_currentPlanList.append(plan);
  508. }
  509. return m_currentPlanList;
  510. }
  511. /* 清空当前检测计划布局中的控件 */
  512. void CheckPeriodWidget::removeAllDetectPlanWidgets()
  513. {
  514. /* 清空布局中的所有控件,只剩一个弹簧 */
  515. while (m_layoutDetectPlans->count() > 1)
  516. {
  517. QWidget *widget = m_layoutDetectPlans->itemAt(0)->widget();
  518. if(widget)
  519. {
  520. m_layoutDetectPlans->removeWidget(widget);
  521. widget->hide();
  522. }
  523. }
  524. }
  525. /* 清空当前非检测计划布局中的控件 */
  526. void CheckPeriodWidget::removeAllNoDetectPlanWidgets()
  527. {
  528. /* 清空所有的非检测计划日期 */
  529. while( m_layoutNoDetectPlans->count() > 1)
  530. {
  531. QWidget *widget = m_layoutNoDetectPlans->itemAt(0)->widget();
  532. if(widget)
  533. {
  534. m_layoutNoDetectPlans->removeWidget(widget);
  535. widget->hide();
  536. }
  537. }
  538. }
  539. /* 从当前列表中添加控件到布局 */
  540. void CheckPeriodWidget::addDetectPlanToLayout()
  541. {
  542. for(auto& pDetect : *m_pListcurrDetect)
  543. {
  544. pDetect->show();
  545. /* 添加到布局中 */
  546. m_layoutDetectPlans->insertWidget(m_layoutDetectPlans->count() - 1, pDetect);
  547. }
  548. }
  549. /* 从当前列表中添加非检测计划控件到布局 */
  550. void CheckPeriodWidget::addNoDetectPlanToLayout()
  551. {
  552. for(auto& pDetect : *m_pListcurrNoDetect)
  553. {
  554. pDetect->show();
  555. /* 添加到布局中 */
  556. m_layoutNoDetectPlans->insertWidget(m_layoutNoDetectPlans->count() - 1, pDetect);
  557. }
  558. }
  559. /* 更新所有对比项的计划周期 */
  560. void CheckPeriodWidget::updateCompareItemDetectPeriod(QMap<int, DetectPeriodConfig_t>& mapDetectConfig)
  561. {
  562. /* 先更新检测计划 */
  563. for(auto it = m_mapDetectPlanList.cbegin(); it != m_mapDetectPlanList.cend(); ++it)
  564. {
  565. int id = it.key();
  566. QList<OneDetectPlan*>* pList = it.value();
  567. DetectPeriodConfig_t config;
  568. config.nID = id;
  569. /* 更新检测计划 */
  570. for(auto& pDetect : *pList)
  571. {
  572. OnePlan_t plan = pDetect->getPlan();
  573. config.listDetect.append(plan);
  574. }
  575. auto apply = m_mapNoDetectApply.find(id);
  576. if(apply != m_mapNoDetectApply.cend())
  577. {
  578. config.isApplySlient = apply->isApplySlient;
  579. config.isApplyOverload = apply->isApplyOverload;
  580. config.isApplyPhase = apply->isApplyPhase;
  581. config.isApplyNoise = apply->isApplyNoise;
  582. } else
  583. {
  584. config.isApplySlient = false;
  585. config.isApplyOverload = false;
  586. config.isApplyPhase = false;
  587. config.isApplyNoise = false;
  588. }
  589. mapDetectConfig.insert(id, config);
  590. }
  591. /* 更新非检测计划 */
  592. for(auto it = m_mapNoDetectPlanList.cbegin(); it != m_mapNoDetectPlanList.cend(); ++it)
  593. {
  594. int id = it.key();
  595. QList<OneDetectPlan*>* pList = it.value();
  596. /* 查找的时候,如果没有,会自动插入一个key为id的值 */
  597. DetectPeriodConfig_t& config = mapDetectConfig[id];
  598. config.nID = id;
  599. /* 更新非检测计划 */
  600. for(auto& pDetect : *pList)
  601. {
  602. OnePlan_t plan = pDetect->getPlan();
  603. config.listNoDetect.append(plan);
  604. }
  605. /* 这里再查找一遍应用信息是因为防止没有检测计划,只有非检测计划 */
  606. auto apply = m_mapNoDetectApply.find(id);
  607. if(apply != m_mapNoDetectApply.cend())
  608. {
  609. config.isApplySlient = apply->isApplySlient;
  610. config.isApplyOverload = apply->isApplyOverload;
  611. config.isApplyPhase = apply->isApplyPhase;
  612. config.isApplyNoise = apply->isApplyNoise;
  613. } else
  614. {
  615. config.isApplySlient = false;
  616. config.isApplyOverload = false;
  617. config.isApplyPhase = false;
  618. config.isApplyNoise = false;
  619. }
  620. }
  621. }