homepage.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "homepage.h"
  2. #include <QDate>
  3. #include <QJsonArray>
  4. #include <QJsonDocument>
  5. #include <QJsonObject>
  6. #include <QList>
  7. #include <QPainter>
  8. #include <QPair>
  9. #include <QtCharts/QBarCategoryAxis>
  10. #include <QtCharts/QBarSeries>
  11. #include <QtCharts/QBarSet>
  12. #include <QtCharts/QChart>
  13. #include <QtCharts/QChartView>
  14. #include <QtCharts/QValueAxis>
  15. #include "../utils/backendapimanager.h"
  16. #include "ui_homepage.h"
  17. Homepage::Homepage(QWidget *parent) : QWidget(parent), ui(new Ui::homepage) {
  18. ui->setupUi(this);
  19. QJsonArray dailyCount;
  20. dailyCount = backendAPIManager::getDailyBlastedCount(7);
  21. if (dailyCount.isEmpty()) {
  22. ui->chartWidget->setVisible(false);
  23. ui->todayBlastCount->setVisible(false);
  24. return; // 如果没有数据,直接返回
  25. }
  26. draw(dailyCount);
  27. }
  28. Homepage::~Homepage() { delete ui; }
  29. QChartView *Homepage::drawDetChat(QList<QMap<QString, QVector<int>>> data) {
  30. QBarSet *setNormal = new QBarSet("正常");
  31. QBarSet *setError = new QBarSet("错误");
  32. QStringList categories;
  33. int totalCount = 0;
  34. for (const auto &entry : data) {
  35. QString dateStr = entry.keys().first();
  36. QVector<int> counts = entry.values().first();
  37. categories << dateStr.mid(5); // Extract MM-dd from yyyy-MM-dd
  38. *setNormal << counts[0]; // 正常数量
  39. *setError << counts[1]; // 错误数量
  40. }
  41. setNormal->setColor(Qt::blue); // 默认色
  42. setError->setColor(Qt::red); // 红色
  43. QBarSeries *series = new QBarSeries();
  44. series->append(setNormal);
  45. series->append(setError);
  46. series->setLabelsVisible(true);
  47. QBarSet *set = new QBarSet("");
  48. if (totalCount == 0) {
  49. set->setLabel("无爆破数据");
  50. } else {
  51. set->setLabel("总计: " + QString::number(totalCount));
  52. }
  53. // 3. Create Chart
  54. QChart *chart = new QChart();
  55. chart->addSeries(series);
  56. chart->setTitle("近7日已上传雷管数据统计");
  57. // 4. X-axis (Category with Dates)
  58. QBarCategoryAxis *axisX = new QBarCategoryAxis();
  59. axisX->append(categories);
  60. axisX->setTitleText("日期");
  61. axisX->setGridLineVisible(false);
  62. chart->addAxis(axisX, Qt::AlignBottom);
  63. series->attachAxis(axisX);
  64. // 5. Y-axis (Count)
  65. QValueAxis *axisY = new QValueAxis();
  66. axisY->setTitleText("数量");
  67. axisY->setLabelFormat("%d");
  68. chart->addAxis(axisY, Qt::AlignLeft);
  69. series->attachAxis(axisY);
  70. // 6. Show Chart
  71. QChartView *chartView = new QChartView(chart);
  72. chartView->setRenderHint(QPainter::Antialiasing);
  73. return chartView;
  74. }
  75. QChartView *Homepage::drawProjectChat(QList<QPair<QDate, int>> data) {
  76. // 2. Bar Set and Series
  77. QBarSet *set = new QBarSet("");
  78. QStringList categories;
  79. int totalCount = 0;
  80. for (const auto &entry : data) {
  81. *set << entry.second;
  82. categories << entry.first.toString("MM-dd");
  83. totalCount += entry.second;
  84. }
  85. if (totalCount == 0) {
  86. set->setLabel("无爆破数据");
  87. } else {
  88. set->setLabel("总计: " + QString::number(totalCount));
  89. }
  90. QBarSeries *series = new QBarSeries();
  91. series->append(set);
  92. series->setLabelsVisible(true);
  93. // 3. Create Chart
  94. QChart *chart = new QChart();
  95. chart->addSeries(series);
  96. chart->setTitle("近7日已上传爆破工程数据统计");
  97. // 4. X-axis (Category with Dates)
  98. QBarCategoryAxis *axisX = new QBarCategoryAxis();
  99. axisX->append(categories);
  100. axisX->setTitleText("日期");
  101. axisX->setGridLineVisible(false);
  102. chart->addAxis(axisX, Qt::AlignBottom);
  103. series->attachAxis(axisX);
  104. // 5. Y-axis (Count)
  105. QValueAxis *axisY = new QValueAxis();
  106. axisY->setTitleText("数量");
  107. axisY->setLabelFormat("%d");
  108. chart->addAxis(axisY, Qt::AlignLeft);
  109. series->attachAxis(axisY);
  110. // 6. Show Chart
  111. QChartView *chartView = new QChartView(chart);
  112. chartView->setRenderHint(QPainter::Antialiasing);
  113. return chartView;
  114. }
  115. void Homepage::draw(QJsonArray dailyCount) {
  116. QList<QPair<QDate, int>> projectData;
  117. QList<QMap<QString, QVector<int>>> detData;
  118. QDate today = QDate::currentDate();
  119. QString dateTodayStr = QDate::currentDate().toString("yyyy-MM-dd");
  120. // 根据today,倒退7天,检查dailyCount中date是否和日期匹配,如果匹配设置数据,不匹配则设置0
  121. for (int i = 0; i < 7; ++i) {
  122. QDate date = today.addDays(-i);
  123. QString dateStr = date.toString("yyyy-MM-dd");
  124. bool found = false;
  125. if (dailyCount[0].toObject().value("blast_at").toString() == dateStr) {
  126. if (dateStr == dateTodayStr) {
  127. m_todayCount = dailyCount[0].toObject().value("count").toInt();
  128. }
  129. projectData.prepend(qMakePair(date, dailyCount[0].toObject().value("count").toInt()));
  130. QMap<QString, QVector<int>> detCounts;
  131. detCounts[dateStr] = {dailyCount[0].toObject().value("reg_det_count").toInt(),
  132. dailyCount[0].toObject().value("error_det_count").toInt()};
  133. detData.prepend(detCounts);
  134. dailyCount.removeFirst(); // 移除已处理的元素
  135. } else {
  136. projectData.prepend(qMakePair(date, 0));
  137. QMap<QString, QVector<int>> detCounts;
  138. detCounts[dateStr] = {0, 0};
  139. detData.prepend(detCounts);
  140. }
  141. }
  142. QChartView *projectChart = drawProjectChat(projectData);
  143. QChartView *detailChart = drawDetChat(detData);
  144. QHBoxLayout *layout = new QHBoxLayout;
  145. layout->addWidget(projectChart, 1); // 占 1 份
  146. layout->addWidget(detailChart, 1);
  147. // Add the chart view to the widget's layout
  148. ui->chartWidget->setLayout(layout);
  149. ui->todayBlastCount->display(m_todayCount);
  150. }