车辆管理系统 - 销售统计模块设计与实现

基于Qt的车辆管理系统的销售统计模块的实现 这个系统将包含销售数据管理、统计分析和可视化展示功能。

系统概述

功能:

  • 车辆信息管理
  • 销售记录管理
  • 销售统计分析
  • 数据可视化展示

核心类设计

1. 销售记录类 (SalesRecord)

class SalesRecord {
public:
    SalesRecord();
    SalesRecord(int id, QString vehicleModel, QDate saleDate, 
                double salePrice, QString salesperson);
    
    // Getter和Setter方法
    int getId() const;
    QString getVehicleModel() const;
    QDate getSaleDate() const;
    double getSalePrice() const;
    QString getSalesperson() const;
    
    void setVehicleModel(const QString &model);
    void setSaleDate(const QDate &date);
    void setSalePrice(double price);
    void setSalesperson(const QString &name);
    
private:
    int m_id;
    QString m_vehicleModel;
    QDate m_saleDate;
    double m_salePrice;
    QString m_salesperson;
};

2. 销售统计类 (SalesStatistics)

class SalesStatistics {
public:
    SalesStatistics(const QList<SalesRecord> &records);
    
    // 统计方法
    double totalRevenue() const;
    double averageSalePrice() const;
    int totalUnitsSold() const;
    
    // 按时间统计
    QMap<QString, double> revenueByMonth() const;
    QMap<QString, double> revenueByQuarter() const;
    QMap<QString, double> revenueByYear() const;
    
    // 按车型统计
    QMap<QString, double> revenueByModel() const;
    QMap<QString, int> unitsSoldByModel() const;
    
    // 按销售人员统计
    QMap<QString, double> revenueBySalesperson() const;
    QMap<QString, int> unitsSoldBySalesperson() const;
    
    // 趋势分析
    QMap<QString, double> monthlyTrend() const;
    
private:
    QList<SalesRecord> m_records;
};

3. 主窗口类 (MainWindow)

class MainWindow : public QMainWindow {
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
private slots:
    void addSaleRecord();
    void editSaleRecord();
    void deleteSaleRecord();
    void generateReport();
    void updateCharts();
    void exportToExcel();
    
private:
    void setupUI();
    void setupCharts();
    void loadData();
    void saveData();
    
    QTableView *m_tableView;
    QStandardItemModel *m_model;
    QChartView *m_chartView;
    QComboBox *m_chartTypeCombo;
    
    QList<SalesRecord> m_salesRecords;
    SalesStatistics *m_statistics;
};

界面设计

系统将包含以下主要界面元素:

  1. 销售数据表格视图
  2. 统计图表展示区
  3. 筛选控件(按时间范围、车型、销售人员)
  4. 报表生成和导出按钮
  5. 数据操作按钮(添加、编辑、删除)

实现代码

主窗口实现

#include <QtWidgets>
#include <QtCharts>
#include "salesrecord.h"
#include "salesstatistics.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), m_statistics(nullptr) {
    setupUI();
    loadData();
    updateCharts();
}

MainWindow::~MainWindow() {
    saveData();
    delete m_statistics;
}

void MainWindow::setupUI() {
    // 创建中央部件和主布局
    QWidget *centralWidget = new QWidget(this);
    QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
    
    // 创建工具栏
    QToolBar *toolBar = new QToolBar(this);
    toolBar->addAction("添加记录", this, &MainWindow::addSaleRecord);
    toolBar->addAction("编辑记录", this, &MainWindow::editSaleRecord);
    toolBar->addAction("删除记录", this, &MainWindow::deleteSaleRecord);
    toolBar->addAction("生成报表", this, &MainWindow::generateReport);
    toolBar->addAction("导出Excel", this, &MainWindow::exportToExcel);
    addToolBar(toolBar);
    
    // 创建筛选控件
    QHBoxLayout *filterLayout = new QHBoxLayout();
    QLabel *filterLabel = new QLabel("筛选条件:", this);
    QComboBox *timeFilter = new QComboBox(this);
    timeFilter->addItems({"全部", "本月", "本季度", "本年", "自定义"});
    QComboBox *modelFilter = new QComboBox(this);
    modelFilter->addItem("全部车型");
    // 这里应该从数据库加载车型列表
    
    filterLayout->addWidget(filterLabel);
    filterLayout->addWidget(timeFilter);
    filterLayout->addWidget(modelFilter);
    filterLayout->addStretch();
    
    // 创建图表类型选择
    QLabel *chartLabel = new QLabel("图表类型:", this);
    m_chartTypeCombo = new QComboBox(this);
    m_chartTypeCombo->addItems({"月度收入", "车型销量", "销售人员业绩", "趋势分析"});
    connect(m_chartTypeCombo, SIGNAL(currentIndexChanged(int)), 
            this, SLOT(updateCharts()));
    
    filterLayout->addWidget(chartLabel);
    filterLayout->addWidget(m_chartTypeCombo);
    
    // 创建表格视图
    m_tableView = new QTableView(this);
    m_model = new QStandardItemModel(this);
    m_model->setHorizontalHeaderLabels({"ID", "车型", "销售日期", "销售价格", "销售人员"});
    m_tableView->setModel(m_model);
    
    // 创建图表视图
    m_chartView = new QChartView(this);
    m_chartView->setRenderHint(QPainter::Antialiasing);
    
    // 分割窗口:上方表格,下方图表
    QSplitter *splitter = new QSplitter(Qt::Vertical, this);
    splitter->addWidget(m_tableView);
    splitter->addWidget(m_chartView);
    splitter->setSizes({300, 200});
    
    // 添加到主布局
    mainLayout->addLayout(filterLayout);
    mainLayout->addWidget(splitter);
    
    setCentralWidget(centralWidget);
    setWindowTitle("车辆销售管理系统");
    resize(1000, 700);
}

void MainWindow::loadData() {
    // 这里应该从数据库或文件加载数据
    // 简化示例:添加一些测试数据
    m_salesRecords.append(SalesRecord(1, "Model S", QDate(2023, 1, 15), 89990, "张三"));
    m_salesRecords.append(SalesRecord(2, "Model 3", QDate(2023, 1, 20), 42990, "李四"));
    m_salesRecords.append(SalesRecord(3, "Model X", QDate(2023, 2, 5), 99990, "王五"));
    m_salesRecords.append(SalesRecord(4, "Model Y", QDate(2023, 2, 10), 54990, "张三"));
    m_salesRecords.append(SalesRecord(5, "Model S", QDate(2023, 3, 15), 90990, "李四"));
    
    // 更新表格
    m_model->setRowCount(m_salesRecords.size());
    for (int i = 0; i < m_salesRecords.size(); ++i) {
        const SalesRecord &record = m_salesRecords[i];
        m_model->setItem(i, 0, new QStandardItem(QString::number(record.getId())));
        m_model->setItem(i, 1, new QStandardItem(record.getVehicleModel()));
        m_model->setItem(i, 2, new QStandardItem(record.getSaleDate().toString("yyyy-MM-dd")));
        m_model->setItem(i, 3, new QStandardItem(QString::number(record.getSalePrice(), 'f', 2)));
        m_model->setItem(i, 4, new QStandardItem(record.getSalesperson()));
    }
    
    // 创建统计对象
    if (m_statistics) delete m_statistics;
    m_statistics = new SalesStatistics(m_salesRecords);
}

void MainWindow::saveData() {
    // 这里应该将数据保存到数据库或文件
}

void MainWindow::updateCharts() {
    if (!m_statistics) return;
    
    QChart *chart = new QChart();
    chart->setTitle("销售统计");
    
    QString chartType = m_chartTypeCombo->currentText();
    
    if (chartType == "月度收入") {
        QMap<QString, double> monthlyRevenue = m_statistics->revenueByMonth();
        
        QBarSeries *series = new QBarSeries();
        QBarSet *set = new QBarSet("月度收入");
        
        for (const auto &value : monthlyRevenue) {
            *set << value;
        }
        
        series->append(set);
        chart->addSeries(series);
        
        QBarCategoryAxis *axisX = new QBarCategoryAxis();
        axisX->append(monthlyRevenue.keys());
        chart->addAxis(axisX, Qt::AlignBottom);
        series->attachAxis(axisX);
        
        QValueAxis *axisY = new QValueAxis();
        chart->addAxis(axisY, Qt::AlignLeft);
        series->attachAxis(axisY);
        
    } else if (chartType == "车型销量") {
        QMap<QString, int> unitsByModel = m_statistics->unitsSoldByModel();
        
        QPieSeries *series = new QPieSeries();
        for (auto it = unitsByModel.begin(); it != unitsByModel.end(); ++it) {
            series->append(it.key(), it.value());
        }
        
        chart->addSeries(series);
        
    } else if (chartType == "销售人员业绩") {
        QMap<QString, double> revenueBySalesperson = m_statistics->revenueBySalesperson();
        
        QBarSeries *series = new QBarSeries();
        QBarSet *set = new QBarSet("销售业绩");
        
        for (const auto &value : revenueBySalesperson) {
            *set << value;
        }
        
        series->append(set);
        chart->addSeries(series);
        
        QBarCategoryAxis *axisX = new QBarCategoryAxis();
        axisX->append(revenueBySalesperson.keys());
        chart->addAxis(axisX, Qt::AlignBottom);
        series->attachAxis(axisX);
        
        QValueAxis *axisY = new QValueAxis();
        chart->addAxis(axisY, Qt::AlignLeft);
        series->attachAxis(axisY);
        
    } else if (chartType == "趋势分析") {
        QMap<QString, double> trend = m_statistics->monthlyTrend();
        
        QLineSeries *series = new QLineSeries();
        int i = 0;
        for (const auto &value : trend) {
            series->append(i++, value);
        }
        
        chart->addSeries(series);
        
        QValueAxis *axisX = new QValueAxis();
        axisX->setTitleText("月份");
        chart->addAxis(axisX, Qt::AlignBottom);
        series->attachAxis(axisX);
        
        QValueAxis *axisY = new QValueAxis();
        axisY->setTitleText("销售额");
        chart->addAxis(axisY, Qt::AlignLeft);
        series->attachAxis(axisY);
    }
    
    m_chartView->setChart(chart);
}

void MainWindow::addSaleRecord() {
    // 实现添加销售记录对话框
    // 简化示例:直接添加一条测试记录
    int newId = m_salesRecords.isEmpty() ? 1 : m_salesRecords.last().getId() + 1;
    SalesRecord newRecord(newId, "New Model", QDate::currentDate(), 50000, "New Salesperson");
    m_salesRecords.append(newRecord);
    
    // 更新表格和图表
    loadData();
    updateCharts();
}

void MainWindow::editSaleRecord() {
    // 实现编辑销售记录功能
}

void MainWindow::deleteSaleRecord() {
    // 实现删除销售记录功能
}

void MainWindow::generateReport() {
    // 实现生成报表功能
    if (!m_statistics) return;
    
    QString report = QString("销售统计报表\n\n"
                           "总销售额: %1\n"
                           "平均售价: %2\n"
                           "总销售数量: %3\n")
                   .arg(m_statistics->totalRevenue())
                   .arg(m_statistics->averageSalePrice())
                   .arg(m_statistics->totalUnitsSold());
    
    QMessageBox::information(this, "销售报表", report);
}

void MainWindow::exportToExcel() {
    // 实现导出到Excel功能
    QString fileName = QFileDialog::getSaveFileName(this, "导出Excel", "", "Excel文件 (*.xlsx)");
    if (fileName.isEmpty()) return;
    
    // 使用QXlsx或其他库实现Excel导出
    // 这里仅显示提示信息
    QMessageBox::information(this, "导出成功", "数据已成功导出到: " + fileName);
}

参考项目代码 用QT编写的车辆管理系统 能够进行销售统计 www.youwenfan.com/contentcsh/103052.html

销售统计类实现

#include "salesstatistics.h"
#include <QDate>
#include <algorithm>

SalesStatistics::SalesStatistics(const QList<SalesRecord> &records)
    : m_records(records) {
}

double SalesStatistics::totalRevenue() const {
    double total = 0.0;
    for (const auto &record : m_records) {
        total += record.getSalePrice();
    }
    return total;
}

double SalesStatistics::averageSalePrice() const {
    if (m_records.isEmpty()) return 0.0;
    return totalRevenue() / m_records.size();
}

int SalesStatistics::totalUnitsSold() const {
    return m_records.size();
}

QMap<QString, double> SalesStatistics::revenueByMonth() const {
    QMap<QString, double> result;
    
    for (const auto &record : m_records) {
        QString monthKey = record.getSaleDate().toString("yyyy-MM");
        result[monthKey] += record.getSalePrice();
    }
    
    return result;
}

QMap<QString, double> SalesStatistics::revenueByQuarter() const {
    QMap<QString, double> result;
    
    for (const auto &record : m_records) {
        int quarter = (record.getSaleDate().month() - 1) / 3 + 1;
        QString quarterKey = QString("%1-Q%2").arg(record.getSaleDate().year()).arg(quarter);
        result[quarterKey] += record.getSalePrice();
    }
    
    return result;
}

QMap<QString, double> SalesStatistics::revenueByYear() const {
    QMap<QString, double> result;
    
    for (const auto &record : m_records) {
        QString yearKey = QString::number(record.getSaleDate().year());
        result[yearKey] += record.getSalePrice();
    }
    
    return result;
}

QMap<QString, double> SalesStatistics::revenueByModel() const {
    QMap<QString, double> result;
    
    for (const auto &record : m_records) {
        result[record.getVehicleModel()] += record.getSalePrice();
    }
    
    return result;
}

QMap<QString, int> SalesStatistics::unitsSoldByModel() const {
    QMap<QString, int> result;
    
    for (const auto &record : m_records) {
        result[record.getVehicleModel()]++;
    }
    
    return result;
}

QMap<QString, double> SalesStatistics::revenueBySalesperson() const {
    QMap<QString, double> result;
    
    for (const auto &record : m_records) {
        result[record.getSalesperson()] += record.getSalePrice();
    }
    
    return result;
}

QMap<QString, int> SalesStatistics::unitsSoldBySalesperson() const {
    QMap<QString, int> result;
    
    for (const auto &record : m_records) {
        result[record.getSalesperson()]++;
    }
    
    return result;
}

QMap<QString, double> SalesStatistics::monthlyTrend() const {
    // 首先按月份分组
    QMap<QString, double> monthlyData = revenueByMonth();
    
    // 如果数据不足12个月,可能需要补全缺失的月份
    // 这里简化处理,直接返回月度数据
    return monthlyData;
}

项目文件 (CMakeLists.txt 或 .pro 文件)

Qt项目文件 (.pro)

QT       += core gui charts printsupport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp \
    salesrecord.cpp \
    salesstatistics.cpp

HEADERS += \
    mainwindow.h \
    salesrecord.h \
    salesstatistics.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

功能扩展建议

  1. 数据持久化:添加数据库支持(SQLite、MySQL等)
  2. 用户权限管理:不同角色的用户有不同的操作权限
  3. 高级筛选:支持多条件组合筛选
  4. 预测分析:基于历史数据的销售预测
  5. 库存管理:集成库存管理功能
  6. 客户管理:记录客户信息和购买历史
  7. 移动端支持:开发移动端应用或响应式界面

总结

这个车辆管理系统销售统计模块提供了完整的销售数据管理和分析功能。通过Qt的图表模块,实现了数据的可视化展示,帮助用户更直观地理解销售情况。系统采用了MVC设计模式,将数据、业务逻辑和界面分离,提高了代码的可维护性和可扩展性。

实际部署时,需要根据具体需求进一步完善功能,如添加数据库支持、用户认证、更复杂的统计指标等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值