#include "blastprojectpage.h" #include #include #include "../backendapimanager.h" #include "../databasemanager.h" #include "../global.h" #include "ui_blastprojectpage.h" #define BLASTER_ROLE_ID 4 #define OPERATOR_ROLE_ID 7 #define SAFEGUARD_ROLE_ID 5 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; dialog = new ProjectDialog(this); QJsonArray pcs = backendAPIManager::getHAddresses(); addressOptions(pcs); QJsonArray allUsers = backendAPIManager::getSysUsers(); for (const QJsonValue &value : allUsers) { if (value.isObject()) { QJsonObject obj = value.toObject(); m_userNameById.insert(obj["identity"].toString(), obj["nickName"].toString()); } } initUserAndDialogOptions(allUsers); connect(dialog, &ProjectDialog::createProject, this, &BlastProjectPage::createProject); connect(dialog, &ProjectDialog::saveProject, this, &BlastProjectPage::updateProject); RefreshData(); } void BlastProjectPage::RefreshData() { loadDataFromSource(currentPage, pageSize); publishAllPendingBlastProjects(); } 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"}, {"安全员", "safetyInspectorIdentity"}, {"井上爆破员", "operatorIdentity"}, {"井下爆破员", "blasterIdentity"}, {"井下地址", "addressPath"}, {"雷管数量", "detSum"}, {"起爆器数量", "blastCount"}, {"起爆状态", "blastStatus"}, {"操作", ""}, }; int headerCount = headers.size(); QStringList headerLabels; QMap propMap; 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; if (!prop.isEmpty()) { QMetaProperty metaProp = hProject.metaObject()->property(hProject.metaObject()->indexOfProperty(prop.toUtf8())); QVariant value = metaProp.read(&hProject); if (prop == "blastStatus") { QString statusText; if (value.toString() == BlastStatus::Created) { statusText = "未注册"; item = new QStandardItem(statusText); item->setForeground(QColor("#e7c66b")); } else if (value.toString() == BlastStatus::Registered) { statusText = "待安全确认"; item = new QStandardItem(statusText); item->setForeground(QColor("#f3a361")); } else if (value.toString() == BlastStatus::SafeChecked) { statusText = "待起爆"; item = new QStandardItem(statusText); item->setForeground(QColor("#f3a361")); } else if (value.toString() == BlastStatus::Blasted) { statusText = "起爆完成"; item = new QStandardItem(statusText); item->setForeground(QColor("#90d543")); } else { item = new QStandardItem(value.toString()); } } else if (QStringList({"safetyInspectorIdentity", "operatorIdentity", "blasterIdentity"}) .contains(prop)) { qDebug() << "prop" << prop << value.toString().split(","); item = new QStandardItem(getUserNameByIds(value.toString().split(","))); } else { item = new QStandardItem(value.toString()); } } else { item = new QStandardItem("操作"); item->setTextAlignment(Qt::AlignCenter); item->setData(QSize(30, 30), Qt::SizeHintRole); } if (item) { item->setTextAlignment(Qt::AlignCenter); model->setItem(row, col, item); } } } ui->tableView->setModel(model); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableView->setAlternatingRowColors(true); // 创建并设置自定义委托 ButtonDelegate *delegate = new ButtonDelegate(headerCount - 1, this); QObject::connect(delegate, &ButtonDelegate::buttonClicked, [=](int row, int column) { // 获取 HPlan 引用 HProject &HPlanDeleteOrUpdate = *projectList.at(row).data(); updateId = HPlanDeleteOrUpdate.getId(); if (column == 1) { deleteButtonClicked(HPlanDeleteOrUpdate); } if (column == 2) { updateButtonClicked(HPlanDeleteOrUpdate); } }); 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::initUserAndDialogOptions(const QJsonArray &dataArray) { QJsonArray blasterDeployerArray; QJsonArray operatorArray; QJsonArray safeGuardArray; for (const QJsonValue &value : dataArray) { if (value.isObject()) { QJsonObject obj = value.toObject(); if (obj.contains("roleIds")) { QJsonArray roleIdsArray = obj["roleIds"].toArray(); // Note: 一个用户可能存在多个角色 if (roleIdsArray.contains(BLASTER_ROLE_ID)) { // 井下爆破员 blasterDeployerArray.append(obj); } if (roleIdsArray.contains(OPERATOR_ROLE_ID)) { // 井上爆破员 operatorArray.append(obj); } if (roleIdsArray.contains(SAFEGUARD_ROLE_ID)) { // 安全员 safeGuardArray.append(obj); } } } } dialog->initComboBoxBlaster(blasterDeployerArray); dialog->initComboBoxOperator(operatorArray); dialog->initComboBoxSafetyInspectors(safeGuardArray); } void BlastProjectPage::addressOptions(const QJsonArray &dataArrayAddress) { dialog->SetL1AddressOptions(dataArrayAddress); // dialog->setChildOptions(dataArrayAddress); } void BlastProjectPage::extractNames(const QJsonArray &array, QStringList &names) { for (const auto &item : array) { if (item.isObject()) { QJsonObject obj = item.toObject(); if (obj.contains("name")) { names.append(obj["name"].toString()); } if (obj.contains("children") && obj["children"].isArray()) { extractNames(obj["children"].toArray(), names); } } } } void BlastProjectPage::parseJsonString(const QJsonDocument &jsonDoc) { QJsonObject jsonObj = jsonDoc.object(); QJsonObject dataObj = jsonObj["data"].toObject(); dataArray = dataObj["list"].toArray(); } void BlastProjectPage::on_pushButton_clicked() { dialog->setModal(false); dialog->clearFormData(); dialog->setOperationType(0); int ref = dialog->exec(); if (ref == QDialog::Accepted) {}; } void BlastProjectPage::createProject(const QMap &data) { HProject project; qDebug() << "xxx: " << data.value("safetyInspectorIdentity"); project.setName(data.value("name")); project.setDetSum(data.value("detNum")); project.setAddressUuid(data.value("addressUuid")); project.setAddressPath(data.value("addressPath")); project.setBlasterIdentity(data.value("blasterIdentity")); project.setOperatorIdentity(data.value("operatorIdentity")); project.setSafetyInspectorIdentity(data.value("safetyInspectorIdentity")); project.setLevel4Address(data.value("level4Address")); project.setBlastCount(data.value("blastCount")); project.setBlastStatus("1"); project.setCompanyCode(COMPANY_CODE); project.setXmbh(data.value("xmbh")); project.setHtid(data.value("htid")); project.setUuid(QUuid::createUuid().toString(QUuid::WithoutBraces).remove(QRegularExpression("-"))); project.setCreatedAt(QDateTime::currentDateTime()); if (dao.addHProject(project)) { RefreshData(); publishAllPendingBlastProjects(); } } void BlastProjectPage::publishAllPendingBlastProjects() { QJsonArray jsonArray; QList> projectsReg = dao.getAllHProjectsReg(); for (const auto &projectPtr : projectsReg) { if (projectPtr) { QByteArray projectJson = projectPtr->ProjectToJson(*projectPtr); QJsonDocument doc = QJsonDocument::fromJson(projectJson); jsonArray.append(doc.object()); } } QJsonDocument jsonDoc(jsonArray); QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Indented); mainMqttClient->sendMessage(MQTT_TOPIC_COMPANY_PROJECTS_PUBLISH, jsonData, 2, true); }; void BlastProjectPage::updateButtonClicked(const HProject &project) { dialog->setModal(false); dialog->setOperationType(1); dialog->setFormData(project); int ref = dialog->exec(); if (ref == QDialog::Accepted) {}; } void BlastProjectPage::updateProject(const QMap &data) { HProject project; project.setId(updateId); project.setName(data.value("name")); project.setDetSum(data.value("detNum")); project.setAddressUuid(data.value("addressUuid")); project.setBlasterIdentity(data.value("blasterIdentity")); project.setOperatorIdentity(data.value("operatorIdentity")); project.setUpdatedAt(QDateTime::currentDateTime()); if (dao.updateHProject(project)) { RefreshData(); publishAllPendingBlastProjects(); } } void BlastProjectPage::deleteButtonClicked(const HProject &project) { if (dao.deleteHProject(project)) { RefreshData(); publishAllPendingBlastProjects(); } } void BlastProjectPage::messageAndTopicReceived(const QByteArray &message, const QMqttTopicName &topic) { QJsonDocument jsonDoc = QJsonDocument::fromJson(message); if (!jsonDoc.isNull() && jsonDoc.isObject()) { QJsonObject jsonObj = jsonDoc.object(); if (jsonObj.contains("uuid") && jsonObj.contains("status")) { QJsonValue uuidValue = jsonObj["uuid"]; QJsonValue statusValue = jsonObj["status"]; if (statusValue.isString() && statusValue.toString() == "1") { if (uuidValue.isNull()) { qDebug() << "uuid 的值为 null"; } else { QString uuid = uuidValue.toString(); updateProjectUUId(uuid); } } } } } void BlastProjectPage::updateProjectUUId(QString uuid) { dao.updateBlastStatusByUuid(uuid, "2"); } QString BlastProjectPage::getUserNameByIds(const QStringList &userIds) { QStringList userNames; for (const QString &userId : userIds) { if (m_userNameById.contains(userId)) { userNames.append(m_userNameById[userId]); } } return userNames.join(","); } BlastProjectPage::~BlastProjectPage() { delete ui; }