#include "homepage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../utils/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>> 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 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> 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> projectData; QList>> 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> 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> 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); }