#include "blastprojectpage.h" #include "ui_blastprojectpage.h" #include #include "global.h" #include #include "databasemanager.h" BlastProjectPage::BlastProjectPage(QWidget *parent) : QWidget(parent), ui(new Ui::BlastProjectPage), dao(DatabaseManager::getInstance().getDatabase()) { ui->setupUi(this); pageWidget= new PageWidget; connect(pageWidget, &PageWidget::currentPageChanged, this, &BlastProjectPage::PageChanged); connect(pageWidget->getComboBox(), QOverload::of(&QComboBox::currentIndexChanged), this, &BlastProjectPage::onComboBoxIndexChanged); ui->verticalLayout_4->addWidget(pageWidget);; pageSize = 10; currentPage = 1; RefreshData(); m_httpClient = new HttpClient(this); QUrl localUrl("person/type"); QUrl fullUrl = g_url.resolved(localUrl); m_httpClient->sendHttpGetRequest(fullUrl); QUrl addressLocalUrl("h-address/pc"); QUrl addressFullUrl = g_url.resolved(addressLocalUrl); m_httpClient->sendHttpGetAddress(addressFullUrl); // 获取用户信息 connect(m_httpClient, &HttpClient::httpGetFinished, [this](const QJsonDocument &data,const QUrl url) { QString relativePath = url.toString().remove(0, g_url.toString().length()); if (relativePath == "person/type") { this->personOptionsByType(data); } else if (relativePath == "h-address/pc") { this->addressOptions(data); } qDebug() << "relativePath:" << relativePath; }); dialog = new ProjectDialog(this); connect(dialog, &ProjectDialog::validateDetNum, this, &BlastProjectPage::insertPlan); connect(dialog, &ProjectDialog::validateDetNumUpdate, this, &BlastProjectPage::updateProject); } void BlastProjectPage::RefreshData() { loadDataFromSource(currentPage,pageSize); } void BlastProjectPage::loadDataFromSource(int currentPage, int pageSize) { PaginatedHProjectResult result =dao.getAllHProjects(currentPage,pageSize); QList> projectList = result.projects; totalCount = result.totalCount; pageWidget->setMaxPage(ceil(static_cast(totalCount)/pageSize)); QStandardItemModel *model; model = new QStandardItemModel(this); // 定义表头信息 QList headers = { {"工程名称", "name"}, {"操作员", "operatorName"}, {"爆破员", "blasterName"}, {"井下地址", "addressUuid"}, {"雷管数量", "detSum"}, {"起爆状态", "blastStatus"}, {"操作",""}, }; // 获取表头的长度 int headerCount = headers.size(); // 设置表头 QStringList headerLabels; QMap propMap; // 用于存储表头的 prop 属性 for (int i = 0; i < headers.size(); ++i) { headerLabels << headers[i].label; propMap[i] = headers[i].prop; } model->setHorizontalHeaderLabels(headerLabels); // // 填充数据 for (int row = 0; row < projectList.size(); ++row) { HProject& HProject = *projectList.at(row).data(); for (int col = 0; col < headers.size(); ++col) { QString prop = propMap[col]; QStandardItem* item = nullptr; // 根据 prop 获取 SysApi 对象的属性值 if (!prop.isEmpty()) { QMetaProperty metaProp = HProject.metaObject()->property(HProject.metaObject()->indexOfProperty(prop.toUtf8())); QVariant value = metaProp.read(&HProject); item = new QStandardItem(value.toString()); } else { item = new QStandardItem("操作"); } if (item) { item->setTextAlignment(Qt::AlignCenter); // 设置文本居中对齐 model->setItem(row, col, item); } } } // 设置 QTableView 的 model ui->tableView->setModel(model); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 创建并设置自定义委托 ButtonDelegate *delegate = new ButtonDelegate(headerCount-1,this); QObject::connect(delegate, &ButtonDelegate::buttonClicked, [=](int row, int column) { qDebug() << "Button clicked at row:" << row << "column:" << column; // 获取 HPlan 引用 HProject& HPlanDeleteOrUpdate = *projectList.at(row).data(); updateId = HPlanDeleteOrUpdate.getId(); if(column == 1){ deleteButtonClicked(HPlanDeleteOrUpdate); } if(column == 2){ updateButtonClicked(HPlanDeleteOrUpdate); } QStringList rowData; for (int col = 0; col < model->columnCount(); ++col) { QModelIndex index = model->index(row, col); rowData << index.data() .toString(); QVariant data = model->data(index); rowData += QString("Column %1: %2 | ").arg(col).arg(data.toString()); } // qDebug() << "Row data:" << rowData; }); ui->tableView->setItemDelegateForColumn(headerCount-1, delegate); } // 切换页数 void BlastProjectPage::PageChanged(int page) { currentPage = page; loadDataFromSource(currentPage,pageSize); } void BlastProjectPage::onComboBoxIndexChanged(int index) { // 获取当前选中的文本 QVariant variant = pageWidget->getComboBox()->itemData(index); int value = variant.toInt(); pageSize = value; currentPage = 1; loadDataFromSource(currentPage,pageSize); } void BlastProjectPage::personOptionsByType(const QJsonDocument &jsonDoc) { parseJsonString(jsonDoc); // 定义两个新的 QJsonArray 用于存储分组后的数据 QJsonArray bapoYuanArray; QJsonArray anQuanYuanArray; for (const QJsonValue &value : dataArray) { if (value.isObject()) { QJsonObject obj = value.toObject(); if (obj.contains("personTypeName")) { QString personTypeName = obj["personTypeName"].toString(); // 按 personType 分组 if (personTypeName == "爆破员") { bapoYuanArray.append(obj); } else if (personTypeName == "安全员") { anQuanYuanArray.append(obj); } } } } // 将分组后的数据填充到对应的 QComboBox 中 dialog->SetComboBoxBlast(bapoYuanArray); dialog->SetComboBoxOperator(anQuanYuanArray); } void BlastProjectPage::addressOptions(const QJsonDocument &jsonDoc) { parseJsonStringAddress(jsonDoc); QJsonArray parentOptions; for (const QJsonValue &item : dataArrayAddress) { parentOptions.append(item.toObject()["name"].toString()); } dialog->SetComboBoxAddress(parentOptions); dialog->setChildOptions(dataArrayAddress); // qDebug()<<"parentOptions data"<setModal(false); dialog->setOperationStatus(0); int ref = dialog->exec(); if (ref==QDialog::Accepted){ qDebug()<<"新增对话框关闭"; }; } void BlastProjectPage::insertPlan(const QMap &data) { qDebug() << "Inserting project *****************:"; HProject project; project.setName(data.value("name")); project.setDetSum(data.value("detNum")); project.setBlasterName(data.value("blasterName")); project.setOperatorName(data.value("operatorName")); project.setAddressUuid(data.value("addressUuid")); project.setBlasterIdentity(data.value("blasterIdentity")); project.setOperatorIdentity(data.value("operatorIdentity")); // 生成 32 位的 UUID QString uuidString = QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-")); project.setUuid(uuidString); // 假设 HProject 类有 setUuid 方法 if(dao.addHProject(project)){ RefreshData(); qDebug() << "Inserting MqttClient"; MqttClient* client = MqttClient::getInstance(); // 将 project 对象转换为 JSON QByteArray jsonData = project.ProjectToJson(project); qDebug() << "JSON from HProject: " << jsonData; // 发送消息到 testtopic client->sendMessage("testtopic", jsonData); } } void BlastProjectPage::updateButtonClicked(const HProject &project){ dialog->setModal(false); dialog->setOperationStatus(1); dialog->setFormData(project); int ref = dialog->exec(); if (ref==QDialog::Accepted){ qDebug()<<"aaa"; }; } void BlastProjectPage::updateProject(const QMap &data){ QString detNum = data.value("detNum"); QString name = data.value("name"); QString operaName = data.value("operatorName"); qDebug() << "updateProject with detNum:" << detNum << "name:" << name << "operaName:" << operaName; HProject project; project.setId(updateId); project.setName(data.value("name")); project.setDetSum(data.value("detNum")); project.setBlasterName(data.value("blasterName")); project.setOperatorName(data.value("operatorName")); project.setAddressUuid(data.value("addressUuid")); project.setBlasterIdentity(data.value("blasterIdentity")); project.setOperatorIdentity(data.value("operatorIdentity")); if(dao.updateHProject(project)){ qDebug() << "updateHProject"; RefreshData(); } } void BlastProjectPage::deleteButtonClicked(const HProject &project){ if(dao.deleteHProject(project)){ RefreshData(); } } BlastProjectPage::~BlastProjectPage() { delete ui; }