123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #include "homepage.h"
- #include <QDate>
- #include <QJsonArray>
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QList>
- #include <QPainter>
- #include <QPair>
- #include <QtCharts/QBarCategoryAxis>
- #include <QtCharts/QBarSeries>
- #include <QtCharts/QBarSet>
- #include <QtCharts/QChart>
- #include <QtCharts/QChartView>
- #include <QtCharts/QValueAxis>
- #include "backendapimanager.h"
- #include "ui_homepage.h"
- Homepage::Homepage(QWidget *parent) : QWidget(parent), ui(new Ui::homepage) {
- ui->setupUi(this);
- QJsonArray dailyCount;
- dailyCount = backendAPIManager::getDailyBlastedCount(7);
- if (dailyCount.isEmpty()) {
- ui->chartWidget->setVisible(false);
- ui->todayBlastCount->setVisible(false);
- return; // 如果没有数据,直接返回
- }
- draw(dailyCount);
- }
- Homepage::~Homepage() { delete ui; }
- QChartView *Homepage::drawDetChat(QList<QMap<QString, QVector<int>>> data) {
- QBarSet *setNormal = new QBarSet("正常");
- QBarSet *setError = new QBarSet("错误");
- QStringList categories;
- int totalCount = 0;
- for (const auto &entry : data) {
- QString dateStr = entry.keys().first();
- QVector<int> counts = entry.values().first();
- categories << dateStr.mid(5); // Extract MM-dd from yyyy-MM-dd
- *setNormal << counts[0]; // 正常数量
- *setError << counts[1]; // 错误数量
- }
- setNormal->setColor(Qt::blue); // 默认色
- setError->setColor(Qt::red); // 红色
- QBarSeries *series = new QBarSeries();
- series->append(setNormal);
- series->append(setError);
- series->setLabelsVisible(true);
- QBarSet *set = new QBarSet("");
- if (totalCount == 0) {
- set->setLabel("无爆破数据");
- } else {
- set->setLabel("总计: " + QString::number(totalCount));
- }
- // 3. Create Chart
- QChart *chart = new QChart();
- chart->addSeries(series);
- chart->setTitle("近7日已上传雷管数据统计");
- // 4. X-axis (Category with Dates)
- QBarCategoryAxis *axisX = new QBarCategoryAxis();
- axisX->append(categories);
- axisX->setTitleText("日期");
- axisX->setGridLineVisible(false);
- chart->addAxis(axisX, Qt::AlignBottom);
- series->attachAxis(axisX);
- // 5. Y-axis (Count)
- QValueAxis *axisY = new QValueAxis();
- axisY->setTitleText("数量");
- axisY->setLabelFormat("%d");
- chart->addAxis(axisY, Qt::AlignLeft);
- series->attachAxis(axisY);
- // 6. Show Chart
- QChartView *chartView = new QChartView(chart);
- chartView->setRenderHint(QPainter::Antialiasing);
- return chartView;
- }
- QChartView *Homepage::drawProjectChat(QList<QPair<QDate, int>> data) {
- // 2. Bar Set and Series
- QBarSet *set = new QBarSet("");
- QStringList categories;
- int totalCount = 0;
- for (const auto &entry : data) {
- *set << entry.second;
- categories << entry.first.toString("MM-dd");
- totalCount += entry.second;
- }
- if (totalCount == 0) {
- set->setLabel("无爆破数据");
- } else {
- set->setLabel("总计: " + QString::number(totalCount));
- }
- QBarSeries *series = new QBarSeries();
- series->append(set);
- series->setLabelsVisible(true);
- // 3. Create Chart
- QChart *chart = new QChart();
- chart->addSeries(series);
- chart->setTitle("近7日已上传爆破工程数据统计");
- // 4. X-axis (Category with Dates)
- QBarCategoryAxis *axisX = new QBarCategoryAxis();
- axisX->append(categories);
- axisX->setTitleText("日期");
- axisX->setGridLineVisible(false);
- chart->addAxis(axisX, Qt::AlignBottom);
- series->attachAxis(axisX);
- // 5. Y-axis (Count)
- QValueAxis *axisY = new QValueAxis();
- axisY->setTitleText("数量");
- axisY->setLabelFormat("%d");
- chart->addAxis(axisY, Qt::AlignLeft);
- series->attachAxis(axisY);
- // 6. Show Chart
- QChartView *chartView = new QChartView(chart);
- chartView->setRenderHint(QPainter::Antialiasing);
- return chartView;
- }
- void Homepage::draw(QJsonArray dailyCount) {
- QList<QPair<QDate, int>> projectData;
- QList<QMap<QString, QVector<int>>> detData;
- QDate today = QDate::currentDate();
- QString dateTodayStr = QDate::currentDate().toString("yyyy-MM-dd");
- // 根据today,倒退7天,检查dailyCount中date是否和日期匹配,如果匹配设置数据,不匹配则设置0
- for (int i = 0; i < 7; ++i) {
- QDate date = today.addDays(-i);
- QString dateStr = date.toString("yyyy-MM-dd");
- bool found = false;
- if (dailyCount[0].toObject().value("blast_at").toString() == dateStr) {
- if (dateStr == dateTodayStr) {
- m_todayCount = dailyCount[0].toObject().value("count").toInt();
- }
- projectData.prepend(qMakePair(date, dailyCount[0].toObject().value("count").toInt()));
- QMap<QString, QVector<int>> detCounts;
- detCounts[dateStr] = {dailyCount[0].toObject().value("reg_det_count").toInt(),
- dailyCount[0].toObject().value("error_det_count").toInt()};
- detData.prepend(detCounts);
- dailyCount.removeFirst(); // 移除已处理的元素
- } else {
- projectData.prepend(qMakePair(date, 0));
- QMap<QString, QVector<int>> detCounts;
- detCounts[dateStr] = {0, 0};
- detData.prepend(detCounts);
- }
- }
- QChartView *projectChart = drawProjectChat(projectData);
- QChartView *detailChart = drawDetChat(detData);
- QHBoxLayout *layout = new QHBoxLayout;
- layout->addWidget(projectChart, 1); // 占 1 份
- layout->addWidget(detailChart, 1);
- // Add the chart view to the widget's layout
- ui->chartWidget->setLayout(layout);
- ui->todayBlastCount->display(m_todayCount);
- }
|