From f522412382c4a6722b240d86c76dd2bce914d45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D0=B5=D0=B5=D0=B2?= Date: Wed, 15 Jan 2025 22:57:00 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 74 +++ Factory.pro | 43 ++ data/requestDeviceModels.sql | 8 + data/requestProjects.sql | 10 + data/requestStages.sql | 8 + data/requestWorkers.sql | 8 + main.cpp | 10 + mainwindow.cpp | 499 ++++++++++++++++++++ mainwindow.h | 88 ++++ mainwindow.ui | 732 +++++++++++++++++++++++++++++ presenter.cpp | 24 + presenter.h | 21 + resources/images/device-type-1.png | Bin 0 -> 13711 bytes resources/images/device-type-2.png | Bin 0 -> 9919 bytes resources/images/device-type-3.png | Bin 0 -> 9641 bytes resources/images/device-type-4.png | Bin 0 -> 4918 bytes resources/images/device-type-5.png | Bin 0 -> 12139 bytes resources/images/device-type-6.png | Bin 0 -> 26079 bytes resources/images/device-type-7.png | Bin 0 -> 18535 bytes resources/images/device-type-8.png | Bin 0 -> 14969 bytes resources/images/down-arrow.png | Bin 0 -> 310 bytes resources/images/mw-icon.png | Bin 0 -> 1258 bytes resources/images/search.png | Bin 0 -> 533 bytes resources/resources.qrc | 39 ++ resources/styles.qss | 44 ++ service/filterparams.cpp | 53 +++ service/filterparams.h | 32 ++ service/projectlogic.cpp | 126 +++++ service/projectlogic.h | 27 ++ service/serviceloaddb.cpp | 276 +++++++++++ service/serviceloaddb.h | 60 +++ service/types.cpp | 487 +++++++++++++++++++ service/types.h | 257 ++++++++++ 33 files changed, 2926 insertions(+) create mode 100644 .gitignore create mode 100644 Factory.pro create mode 100644 data/requestDeviceModels.sql create mode 100644 data/requestProjects.sql create mode 100644 data/requestStages.sql create mode 100644 data/requestWorkers.sql create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 presenter.cpp create mode 100644 presenter.h create mode 100644 resources/images/device-type-1.png create mode 100644 resources/images/device-type-2.png create mode 100644 resources/images/device-type-3.png create mode 100644 resources/images/device-type-4.png create mode 100644 resources/images/device-type-5.png create mode 100644 resources/images/device-type-6.png create mode 100644 resources/images/device-type-7.png create mode 100644 resources/images/device-type-8.png create mode 100644 resources/images/down-arrow.png create mode 100644 resources/images/mw-icon.png create mode 100644 resources/images/search.png create mode 100644 resources/resources.qrc create mode 100644 resources/styles.qss create mode 100644 service/filterparams.cpp create mode 100644 service/filterparams.h create mode 100644 service/projectlogic.cpp create mode 100644 service/projectlogic.h create mode 100644 service/serviceloaddb.cpp create mode 100644 service/serviceloaddb.h create mode 100644 service/types.cpp create mode 100644 service/types.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a0b530 --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/Factory.pro b/Factory.pro new file mode 100644 index 0000000..f07000d --- /dev/null +++ b/Factory.pro @@ -0,0 +1,43 @@ +QT += core gui sql + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + presenter.cpp \ + service/filterparams.cpp \ + service/projectlogic.cpp \ + service/serviceloaddb.cpp \ + service/types.cpp \ + +HEADERS += \ + mainwindow.h \ + presenter.h \ + service/filterparams.h \ + service/projectlogic.h \ + service/serviceloaddb.h \ + service/types.h \ + +FORMS += \ + mainwindow.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + data/requestDeviceModels.sql \ + data/requestProjects.sql \ + data/requestStages.sql \ + data/requestWorkers.sql \ + +RESOURCES += \ + resources/resources.qrc diff --git a/data/requestDeviceModels.sql b/data/requestDeviceModels.sql new file mode 100644 index 0000000..7b0d70c --- /dev/null +++ b/data/requestDeviceModels.sql @@ -0,0 +1,8 @@ +SELECT + m.*, + dt.Name AS device_type_name +FROM + Model m +JOIN + DeviceType dt ON m.DeviceTypeID = dt.ID; + diff --git a/data/requestProjects.sql b/data/requestProjects.sql new file mode 100644 index 0000000..8930749 --- /dev/null +++ b/data/requestProjects.sql @@ -0,0 +1,10 @@ +SELECT + p.*, + t.Name AS team_name, + s.Name AS stage_name +FROM + Project p +JOIN + Team t ON p.TeamID = t.ID +JOIN + Stages s ON p.StagesID = s.ID; diff --git a/data/requestStages.sql b/data/requestStages.sql new file mode 100644 index 0000000..1528bab --- /dev/null +++ b/data/requestStages.sql @@ -0,0 +1,8 @@ +SELECT + s.*, + w.Name AS worker_name +FROM + Stages s +JOIN + Worker w ON s.WorkerID = w.ID; + diff --git a/data/requestWorkers.sql b/data/requestWorkers.sql new file mode 100644 index 0000000..b85f8f9 --- /dev/null +++ b/data/requestWorkers.sql @@ -0,0 +1,8 @@ +SELECT + w.*, + t.Name AS team_name +FROM + Worker w +JOIN + Team t ON w.TeamID = t.ID; + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..a7fb082 --- /dev/null +++ b/main.cpp @@ -0,0 +1,10 @@ +#include "presenter.h" +#include + +int main(int argc, char *argv[]) +{ + qDebug() << QSqlDatabase::drivers(); + QApplication a(argc, argv); + new Presenter(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..41b2c92 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,499 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + setWindowIcon(QIcon(":/images/mw-icon.png")); + + int width = frameGeometry().width(); + int height = frameGeometry().height(); + QScreen *screen = qApp->primaryScreen(); + int screenWidth = screen->geometry().width(); + int screenHeight = screen->geometry().height(); + setGeometry((screenWidth/2)-(width/2), (screenHeight/2)-(height/2), width, height); + + returnToDeviceList(); + + ui->tableWidget->verticalHeader()->setVisible(false); + ui->tableWidget->setColumnCount(2); + QStringList headers = QString("ID, Название").split(','); + ui->tableWidget->setHorizontalHeaderLabels(headers); + QHeaderView *header = ui->tableWidget->horizontalHeader(); + header->setSectionResizeMode(0, QHeaderView::Stretch); + header->setSectionResizeMode(1, QHeaderView::Stretch); + QFont headerFont = header->font(); + headerFont.setBold(true); + header->setFont(headerFont); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + + ui->listWidgetProjects->setSpacing(10); + + ui->checkBoxIsWorking->setAttribute(Qt::WA_TransparentForMouseEvents); + ui->checkBoxIsWorking->setFocusPolicy(Qt::NoFocus); + + QStringList filterItems = { + "Все пороекты", + "Типы устройств", + "Этапы", + "Команды", + "Работники", + "Модели устройств" + }; + + ui->comboBoxFilters->addItems(filterItems); + + QStringList sortItems = { + "Сначала дешевые", + "Сначала дорогие", + "Сначала с лайком" + }; + + ui->comboBoxSort->addItems(sortItems); + + QLineEdit *searchEdit = ui->lineEditSearch; + QPushButton *searchButton = new QPushButton(this); + + searchButton->setCursor(Qt::PointingHandCursor); + searchButton->setStyleSheet("background: transparent; border: none;"); + searchButton->setIcon(QIcon(":/images/search.png")); + searchButton->setFixedSize(22, 22); + + QMargins margins = searchEdit->textMargins(); + searchEdit->setTextMargins(margins.left(), margins.top(), searchButton->width(), margins.bottom()); + searchEdit->setPlaceholderText(QStringLiteral("Поиск проектов по модели или типу...")); + searchEdit->setMaxLength(200); + + QHBoxLayout *searchLayout = new QHBoxLayout(); + searchLayout->addStretch(); + searchLayout->addWidget(searchButton); + searchLayout->setSpacing(0); + searchLayout->setContentsMargins(3, 2, 3, 2); + searchEdit->setLayout(searchLayout); + + QButtonGroup *buttonGroup = new QButtonGroup(this); + buttonGroup->addButton(ui->radioButtonWorking); + buttonGroup->addButton(ui->radioButtonNotWorking); + buttonGroup->addButton(ui->radioButtonDisregard); + ui->radioButtonWorking->setChecked(true); + + connect(ui->comboBoxFilters, SIGNAL(activated(int)), this, SLOT(updateTableWidget(int))); + connect(ui->comboBoxSort, SIGNAL(activated(int)), this, SLOT(changeSortOrder())); + connect(ui->tableWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(updateListWidget())); + connect(ui->listWidgetProjects, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(showItemInfo(QListWidgetItem*))); + connect(ui->pushButtonBack, SIGNAL(clicked()), this, SLOT(pushButtonBackClicked())); + connect(ui->pushButtonClear, SIGNAL(clicked()), this, SLOT(pushButtonClearClicked())); + connect(searchEdit, SIGNAL(returnPressed()), this, SLOT(pushButtonSearchClicked())); + connect(searchButton, SIGNAL(clicked()), this, SLOT(pushButtonSearchClicked())); + connect(ui->pushButtonApplyFilters, SIGNAL(clicked()), this, SLOT(pushButtonApplyFiltersClicked())); + connect(ui->pushButtonCanselFilters, SIGNAL(clicked()), this, SLOT(pushButtonCancelFiltersClicked())); + connect(ui->pushButtonDefault, SIGNAL(clicked()), this, SLOT(pushButtonDefaultClicked())); + + QFile styleFile(":/styles.qss"); + if (styleFile.open(QFile::ReadOnly)) { + QTextStream ts(&styleFile); + QString style = ts.readAll(); + qApp->setStyleSheet(style); + } +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::getStages(QMap &map) +{ + mapStages = map; +} + +void MainWindow::getTeams(QMap &map) +{ + mapTeams = map; +} + +void MainWindow::getWorkers(QMap &map) +{ + mapWorkers = map; +} + +void MainWindow::getDeviceTypes(QMap &map) +{ + mapDeviceTypes = map; + for (int i = 1; i <= mapDeviceTypes.size(); i++) { + QString imagePath = QString(":/images/device-type-%1.png").arg(i); + deviceTypeImages[i] = imagePath; + } +} + +void MainWindow::getDeviceModels(QMap &map) +{ + mapDeviceModels = map; +} + +void MainWindow::getProjects(QMap &map) +{ + mapDevices = map; + updateTableWidget(0); +} + +void MainWindow::updateTableWidget(int index) +{ + returnToDeviceList(); + + ui->tableWidget->clearContents(); + ui->tableWidget->setRowCount(0); + + switch (index) { + case 0: // Все устройства + clearDevicesOutputSettings(); + updateListWidgetDevices(0); + break; + case 1: // Типы устройств + fillTable(mapDeviceTypes); + break; + case 2: // Этапы + fillTable(mapStages); + break; + case 3: // Команды + fillTable(mapTeams); + break; + case 4: // Работники + fillTable(mapWorkers); + break; + case 5: // Модели проектов + fillTable(mapDeviceModels); + break; + default: + break; + } +} + +void MainWindow::updateListWidget() +{ + returnToDeviceList(); + + int selectedEntityId = getSelectedIndex(); + + if (selectedEntityId == -1) + return; + + clearDevicesOutputSettings(); + updateListWidgetDevices(selectedEntityId); +} + +template +void MainWindow::fillTable(const QMap &map) +{ + int row = 0; + for (auto &item : map) { + ui->tableWidget->insertRow(row); + + QTableWidgetItem *idItem = new QTableWidgetItem(QString::number(item.id())); + QTableWidgetItem *nameItem = new QTableWidgetItem(item.name()); + + idItem->setFlags(idItem->flags() & ~Qt::ItemIsEditable); + nameItem->setFlags(nameItem->flags() & ~Qt::ItemIsEditable); + + ui->tableWidget->setItem(row, 0, idItem); + ui->tableWidget->setItem(row, 1, nameItem); + + idItem->setTextAlignment(Qt::AlignCenter); + nameItem->setTextAlignment(Qt::AlignCenter); + + row++; + } +} + +void MainWindow::updateListWidgetDevices(int entityId) +{ + ui->listWidgetProjects->clear(); + + auto filteredDevices = logic->findDevicesByAllParameters( + mapDevices, + entityId, + ui->comboBoxFilters->currentIndex(), + searchInfo, + filterParams, + ui->comboBoxSort->currentText() + ); + + if (filteredDevices.isEmpty()) { + QListWidgetItem *item = new QListWidgetItem(ui->listWidgetProjects); + ui->listWidgetProjects->addItem(item); + QWidget *cardWidget = createMessageEmptyCard(); + item->setSizeHint(cardWidget->minimumSizeHint()); + item->setFlags(item->flags() & ~Qt::ItemIsEnabled); + ui->listWidgetProjects->setItemWidget(item, cardWidget); + } else { + for (auto &device : filteredDevices) { + addDeviceToList(device); + } + } +} + +QWidget *MainWindow::createMessageEmptyCard() +{ + QWidget *cardWidget = new QWidget(ui->listWidgetProjects); + QVBoxLayout *cardLayout = new QVBoxLayout(cardWidget); + + QLabel *titleLabel = new QLabel("По заданным параметрам ничего не найдено", cardWidget); + QFont titleFont("Arial", 17, QFont::Bold); + titleLabel->setFont(titleFont); + + cardLayout->addWidget(titleLabel, 0, Qt::AlignCenter); + + cardLayout->setSpacing(12); + + QLabel *imageLabel = new QLabel(cardWidget); + QPixmap pixmap(":/images/question.png"); + imageLabel->setPixmap(pixmap.scaled(256, 256, Qt::KeepAspectRatio)); + + cardLayout->addWidget(imageLabel, 0, Qt::AlignCenter); + + return cardWidget; +} + +QWidget *MainWindow::createDeviceCard(const Project &project) +{ + QWidget *cardWidget = new QWidget(ui->listWidgetProjects); + QVBoxLayout *cardLayout = new QVBoxLayout(cardWidget); + + QFrame *topBorder = new QFrame(cardWidget); + topBorder->setFrameShape(QFrame::HLine); + topBorder->setFrameShadow(QFrame::Sunken); + + cardLayout->addWidget(topBorder); + + QHBoxLayout *iconTextlayout = new QHBoxLayout(); + + QLabel *imageLabel = new QLabel(cardWidget); + QString imagePath = deviceTypeImages[project.deviceModel().idType()]; + QPixmap pixmap(imagePath); + imageLabel->setPixmap(pixmap.scaled(100, 100, Qt::KeepAspectRatio)); + + iconTextlayout->addWidget(imageLabel); + + QVBoxLayout *textLayout = new QVBoxLayout(); + + QLabel *serialNumberLabel = new QLabel(project.name(), cardWidget); + QFont serialNumberFont("Arial", 14, QFont::Bold); + serialNumberLabel->setFont(serialNumberFont); + textLayout->addWidget(serialNumberLabel); + + QFont generalFont("Arial", 11); + + QString typeName = project.deviceModel().nameType(); + typeName = typeName.left(typeName.length()); + if (typeName == "Персональные компьютер") + typeName = "Персональный компьютер"; + QLabel *typeNameLabel = new QLabel(typeName + ": " + project.deviceModel().name(), cardWidget); + typeNameLabel->setFont(generalFont); + textLayout->addWidget(typeNameLabel); + + QLabel *statusLabel = new QLabel(project.isReady() ? "Готов" : "Не готов", cardWidget); + statusLabel->setFont(generalFont); + textLayout->addWidget(statusLabel); + + QHBoxLayout *priceLikeLayout = new QHBoxLayout(); + priceLikeLayout->setSpacing(100); + + QLabel *priceLabel = new QLabel(QString::number(project.budget()) + " ₽", cardWidget); + priceLabel->setFont(generalFont); + priceLabel->setFixedWidth(100); + priceLikeLayout->addWidget(priceLabel); + + priceLikeLayout->addSpacerItem(new QSpacerItem(40, 0, QSizePolicy::Expanding, QSizePolicy::Minimum)); + + QCheckBox *likeCheckBox = new QCheckBox("Нравится", cardWidget); + likeCheckBox->setChecked(project.isLiked()); + likeCheckBox->setFont(generalFont); + likeCheckBox->setStyleSheet(likeCheckBox->isChecked() ? "color: green;" : "color: black;"); + + connect(likeCheckBox, &QCheckBox::toggled, this, [this, project, likeCheckBox](bool checked) { + Project& deviceRef = mapDevices[project.id()]; + deviceRef.setIsLiked(checked); + + QString message = checked ? "Проект добавлен в избранное." : "Проект удален из избранного."; + QMessageBox::information(this, "Обновление", message); + + likeCheckBox->setStyleSheet(checked ? "color: green;" : "color: black;"); + }); + + priceLikeLayout->addWidget(likeCheckBox); + + textLayout->addLayout(priceLikeLayout); + + iconTextlayout->addSpacerItem(new QSpacerItem(40, 0, QSizePolicy::Expanding, QSizePolicy::Minimum)); + iconTextlayout->addLayout(textLayout); + + cardLayout->addLayout(iconTextlayout); + + QFrame *bottomBorder = new QFrame(cardWidget); + bottomBorder->setFrameShape(QFrame::HLine); + bottomBorder->setFrameShadow(QFrame::Sunken); + cardLayout->addWidget(bottomBorder); + + cardLayout->setContentsMargins(2, 0, 2, 0); + + return cardWidget; +} + +void MainWindow::addDeviceToList(const Project &device) +{ + QListWidgetItem *item = new QListWidgetItem(ui->listWidgetProjects); + ui->listWidgetProjects->addItem(item); + + QWidget *cardWidget = createDeviceCard(device); + + item->setSizeHint(cardWidget->minimumSizeHint()); + ui->listWidgetProjects->setItemWidget(item, cardWidget); + + item->setData(Qt::UserRole, device.id()); +} + +void MainWindow::returnToDeviceList() +{ + idCard = 0; + ui->stackedWidget->setCurrentIndex(0); +} + +void MainWindow::showItemInfo(QListWidgetItem *item) +{ + if (!item) + return; + + int deviceId = item->data(Qt::UserRole).toInt(); + Project device = mapDevices[deviceId]; + + idCard = deviceId; + if (!device.StartProjectDate().isValid()) + qDebug() << "StartProjectDate is invalid for device ID:" << device.id(); + if (!device.FinishProjectDate().isValid()) + qDebug() << "FinishProjectDate is invalid for device ID:" << device.id(); + ui->lineEditId->setText(QString::number(device.id())); + ui->lineEditSerialNum->setText(device.name()); + ui->lineEditPrice->setText(QString::number(device.budget(), 'f', 2)); + ui->lineEditEmployee->setText(device.nameTeam()); + ui->lineEditModel->setText(device.deviceModel().name()); + ui->lineEditType->setText(device.deviceModel().nameType()); + ui->textEditFurtherInformation->setPlainText(device.description()); + ui->checkBoxIsWorking->setChecked(device.isReady()); + + ui->stackedWidget->setCurrentIndex(1); +} + +void MainWindow::clearFilters() +{ + ui->radioButtonWorking->setChecked(true); + ui->doubleSpinBoxFrom->setValue(0.00); + ui->doubleSpinBoxTo->setValue(0.00); + filterParams.setIsReady(true); + filterParams.setPriceFrom(-1); + filterParams.setPriceTo(-1); + filterParams.setDisregardState(false); + filterParams.setApllyFilters(false); +} + +void MainWindow::clearDevicesOutputSettings() +{ + ui->comboBoxSort->setCurrentIndex(0); + + ui->lineEditSearch->setText(""); + searchInfo = ""; + + clearFilters(); +} + +int MainWindow::getSelectedIndex() +{ + QModelIndexList selectedIndexes = ui->tableWidget->selectionModel()->selectedRows(); + + if (selectedIndexes.isEmpty()) { + return -1; + } + + int rowIndex = selectedIndexes.first().row(); + + return ui->tableWidget->item(rowIndex, 0)->text().toInt(); +} + +void MainWindow::pushButtonBackClicked() +{ + returnToDeviceList(); +} + +void MainWindow::pushButtonClearClicked() +{ + ui->lineEditSearch->setText(""); +} + +void MainWindow::changeSortOrder() +{ + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonSearchClicked() +{ + searchInfo = ui->lineEditSearch->text(); + if (searchInfo.isEmpty()) { + QMessageBox::warning(this, "Ошибка", "Пожалуйста, введите текст для поиска."); + return; + } + ui->comboBoxSort->setCurrentIndex(0); + clearFilters(); + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonApplyFiltersClicked() +{ + double priceFrom = ui->doubleSpinBoxFrom->value(); + double priceTo = ui->doubleSpinBoxTo->value(); + if (priceFrom > priceTo) { + QMessageBox::warning(this, "Ошибка", "Начальное значение диапазона не может быть больше конечного значения."); + + ui->doubleSpinBoxFrom->setValue(filterParams.priceFrom()); + ui->doubleSpinBoxTo->setValue(filterParams.priceTo()); + + return; + } + + filterParams.setApllyFilters(true); + filterParams.setDisregardState(ui->radioButtonDisregard->isChecked()); + filterParams.setIsReady(ui->radioButtonWorking->isChecked()); + + if (priceFrom == 0.00 && priceTo == 0.00) { + filterParams.setPriceFrom(0.00); + filterParams.setPriceTo(std::numeric_limits::max()); + } else { + filterParams.setPriceFrom(priceFrom); + filterParams.setPriceTo(priceTo); + } + + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonCancelFiltersClicked() +{ + clearFilters(); + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::pushButtonDefaultClicked() +{ + clearDevicesOutputSettings(); + updateListWidgetDevices(getSelectedIndex()); +} + +void MainWindow::closeEvent(QCloseEvent *event) +{ + ServiceLoadDB serviceLoadDB; + serviceLoadDB.updateLikesState(mapDevices); + + event->accept(); +} + diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..b5ea5c4 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,88 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +protected: + void closeEvent(QCloseEvent *event) override; + +private: + template + void fillTable(const QMap &map); + void updateListWidgetDevices(int entityId); + QWidget* createMessageEmptyCard(); + QWidget* createDeviceCard(const Project &project); + void addDeviceToList(const Project &project); + void returnToDeviceList(); + void showTableWithStructureElements(const QList& elements); + void showTableWithDeviceModelCharacteristics(const DeviceModel& model); + void clearFilters(); + void clearDevicesOutputSettings(); + int getSelectedIndex(); + + +public slots: + void getStages(QMap &map); + void getTeams(QMap &map); + void getWorkers(QMap &map); + void getDeviceTypes(QMap &map); + void getDeviceModels(QMap &map); + void getProjects(QMap &map); + +private slots: + void updateTableWidget(int index); + void updateListWidget(); + void showItemInfo(QListWidgetItem*); + void changeSortOrder(); + void pushButtonBackClicked(); + void pushButtonClearClicked(); + void pushButtonSearchClicked(); + void pushButtonApplyFiltersClicked(); + void pushButtonCancelFiltersClicked(); + void pushButtonStructureClicked(); + void pushButtonCharacteristicsClicked(); + void pushButtonDefaultClicked(); + +private: + Ui::MainWindow *ui; + ProjectLogic *logic; + + QString searchInfo = ""; + FilterParams filterParams; + + int idCard = 0; + + QMap deviceTypeImages; + + QMap mapStages; + QMap mapWorkers; + QMap mapTeams; + QMap mapDeviceTypes; + QMap mapDeviceModels; + QMap mapDevices; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..d4e9c60 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,732 @@ + + + MainWindow + + + + 0 + 0 + 1147 + 905 + + + + Factory + + + + + + 0 + 0 + 481 + 25 + + + + + 0 + 0 + + + + + Arial + 10 + + + + + + + 570 + 0 + 581 + 862 + + + + + 0 + 0 + + + + + Arial + 10 + + + + 1 + + + + + + 0 + 10 + 571 + 16 + + + + + Arial + 12 + true + + + + Проекты + + + Qt::AlignmentFlag::AlignCenter + + + + + + 0 + 80 + 571 + 461 + + + + + + + 0 + 42 + 321 + 25 + + + + + Arial + 10 + + + + + + + 0 + 560 + 451 + 25 + + + + + Arial + 10 + + + + + + + 460 + 560 + 111 + 26 + + + + + Arial + 10 + + + + Очистить + + + + + + 0 + 610 + 571 + 252 + + + + + + + + + 230 + 190 + 161 + 30 + + + + + Arial + 10 + + + + Применить фильтрацию + + + + + + 410 + 190 + 151 + 30 + + + + + Arial + 10 + + + + Отменить фильтры + + + + + + 10 + 10 + 561 + 16 + + + + + Arial + 12 + true + + + + Фильтры + + + Qt::AlignmentFlag::AlignCenter + + + + + + 10 + 40 + 751 + 16 + + + + + Arial + 10 + true + + + + Состояние + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + 10 + 110 + 751 + 16 + + + + + Arial + 10 + true + + + + Цена + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + 10 + 70 + 89 + 20 + + + + Готов + + + + + + 120 + 70 + 89 + 20 + + + + Не готов + + + + + + 40 + 150 + 151 + 22 + + + + 9999999.990000000223517 + + + + + + 240 + 150 + 151 + 22 + + + + 9999999.990000000223517 + + + + + + 10 + 150 + 21 + 16 + + + + от + + + + + + 210 + 150 + 21 + 16 + + + + до + + + + + + 230 + 70 + 141 + 20 + + + + + Arial + 10 + + + + Не учитывать + + + + + + + 410 + 40 + 161 + 30 + + + + + Arial + 11 + + + + PointingHandCursor + + + Вывод по умолчанию + + + + + + + + 0 + 10 + 571 + 16 + + + + + Arial + 12 + true + + + + Информация о проекте + + + Qt::AlignmentFlag::AlignCenter + + + + + + 140 + 50 + 431 + 22 + + + + true + + + + + + 0 + 52 + 131 + 16 + + + + + Arial + 11 + + + + Идентификатор + + + + + + 140 + 90 + 431 + 22 + + + + true + + + + + + 0 + 92 + 131 + 21 + + + + + Arial + 11 + + + + Название проекта + + + + + + 0 + 130 + 121 + 16 + + + + + Arial + 11 + + + + Стоимость + + + + + + 140 + 130 + 431 + 22 + + + + true + + + + + + 0 + 170 + 121 + 16 + + + + + Arial + 11 + + + + Отв. команда + + + + + + 140 + 170 + 431 + 22 + + + + true + + + + + + 0 + 210 + 121 + 16 + + + + + Arial + 11 + + + + Модель + + + + + + 140 + 210 + 431 + 22 + + + + true + + + + + + 0 + 250 + 121 + 16 + + + + + Arial + 11 + + + + Тип + + + + + + 140 + 250 + 431 + 22 + + + + true + + + + + + 140 + 290 + 431 + 91 + + + + true + + + + + + 0 + 300 + 121 + 51 + + + + + Arial + 11 + + + + <html><head/><body><p>Дополнительная </p><p>информация</p></body></html> + + + Qt::AlignmentFlag::AlignCenter + + + + + true + + + + 140 + 400 + 20 + 20 + + + + + + + true + + + + + + 0 + 400 + 121 + 16 + + + + + Arial + 11 + + + + Готов + + + + + + 470 + 820 + 101 + 30 + + + + Назад + + + + + + + + 0 + 40 + 481 + 821 + + + + + 0 + 0 + + + + + Arial + 10 + + + + QAbstractItemView::SelectionMode::SingleSelection + + + + + + + 0 + 0 + 1147 + 26 + + + + + + + + diff --git a/presenter.cpp b/presenter.cpp new file mode 100644 index 0000000..0689c42 --- /dev/null +++ b/presenter.cpp @@ -0,0 +1,24 @@ +#include "presenter.h" + +Presenter::Presenter(QObject *parent) + : QObject{parent} +{ + DB = new ServiceLoadDB(); + window = new MainWindow(); + window->show(); + + connect(DB, &ServiceLoadDB::sendStages, window, &MainWindow::getStages); + connect(DB, &ServiceLoadDB::sendTeams, window, &MainWindow::getTeams); + connect(DB, &ServiceLoadDB::sendWorkers, window, &MainWindow::getWorkers); + connect(DB, &ServiceLoadDB::sendDeviceTypes, window, &MainWindow::getDeviceTypes); + connect(DB, &ServiceLoadDB::sendDeviceModels, window, &MainWindow::getDeviceModels); + connect(DB, &ServiceLoadDB::sendProjects, window, &MainWindow::getProjects); + + DB->start(); +} + +Presenter::~Presenter() +{ + DB->deleteLater(); + window->deleteLater(); +} diff --git a/presenter.h b/presenter.h new file mode 100644 index 0000000..9235c94 --- /dev/null +++ b/presenter.h @@ -0,0 +1,21 @@ +#ifndef PRESENTER_H +#define PRESENTER_H + +#include + +#include "service/serviceloaddb.h" +#include "mainwindow.h" + +class Presenter : public QObject +{ + Q_OBJECT +public: + Presenter(QObject *parent = nullptr); + ~Presenter(); + +private: + ServiceLoadDB *DB; + MainWindow *window; +}; + +#endif // PRESENTER_H diff --git a/resources/images/device-type-1.png b/resources/images/device-type-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f554bca86105b3437d262450a4a8eed2aa043b89 GIT binary patch literal 13711 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 literal 0 HcmV?d00001 diff --git a/resources/images/device-type-3.png b/resources/images/device-type-3.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6115bca06f0f864528154ba7e25d3f2390e137 GIT binary patch literal 9641 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 literal 0 HcmV?d00001 diff --git a/resources/images/device-type-6.png b/resources/images/device-type-6.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fef450fefde0cf0f064639351d489fd8cb747d GIT binary patch literal 26079 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

G$!lotetQWQ4X1+I@Hfv-u-s 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

S6adNt4sXi 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 literal 0 HcmV?d00001 diff --git a/resources/images/device-type-8.png b/resources/images/device-type-8.png new file mode 100644 index 0000000000000000000000000000000000000000..2ebf3e79a8876b8d03a006910da47aff27721fc4 GIT binary patch literal 14969 zcmeIZcT`hB_bz-8#6q)!AfnO~qzXYnng!`dhtNTKlU|dc2&nWXQUsA+0#X7}BcdR^ zhLTXFm(W9ikmMfT_x|(!|NFjmzqKwaWjL9cGiPSce)fL$o)0fIUof3#KMw!^lZx^) z9RN557Eb|Z>A|l(|KTI>i_Ytbir!i9FZk@M_u&8MUMm}W0RZ#wlQ&JWATtMe@w)eO zBX3=IJ8wTLPg}sx&rjIV&DqPw>b0$~yQh8n#$$E>xCN*@Q`Ga%z)uEzzlniukn9OE z8;ZN{cqDF1y!jcG>8fDe_E1boEY8wqooDH{hv(|luxyf|5<_(VT z6-+gvZH#vGVxhO`-@N1Lzc0ZO1aIFkC$hW|Qn*CIZ}<@#h)3{Z(;8kR20hizGS+pfme(@z{)a9wI|o$XIi>I|NBjw^}AwdT#NB;|;>zIx(yP{R0dP1?7xF$6c9?7ro0bHxzWIdmIr8K!ez8M)l!GNuycB$ZinlVQkpi=XUQgAs_O5lkfE~xQ{euB zVLA8&7!^Xwwzxp$jJxvnm8c4RYSv&GEim}|&QJQrddH!p%uq92YyToRb;?egH+r~X zy4JQSUn*Wt;T=b507uJtM+FP5X)_fjNt#b94HR`1R9>FTNN5TfvgNh2R~xh|#Aa|E#hYB2A?D@#28x z-HX6fJA?B`#?5!L)wxFx+U~aF$WRT4M4h~5!&!h$l`e#MarkX{7xwp2*8;;O_XB6y z5je$u#BNZS76?C2GXonAwNyzUFL-{y-+5M<-)Di|PIP3Y0iK2duNnK0f%sMk<0V{) zeH4G++?^_Y#K5P_sfy zMXcn1fB557-so9_f>e+LGnckk|IGem2UQ&Z1t8|v!BpcbnO6r~*Gl;c%uWG}r%(OV z9xJ_M#%TA0!X>PfX9oQD+N;vkxL1hq>mjpm0pRC3x{#bLq{besiILhGDyh2Oq6PGK zo&|N_!xQZo68e9O|5Ni&>B!n&sD|EK8ohf~-qE(8qpf_pYr${P>rl3>ix8CgtCkwP z8)L?mCKeDpu_4yIx3|xQSTLk6f;#GqsE&G?Xw7bGK~^Aic%S(AXnqJ%4e3ZTwaOKh z@GXxgw*A|#Tlyqoaq}jH*vbc(`jQdkB`4H=@~Q$t_yff=41)5DNl1CLlQN@VSbG-O zSix^*apzFueK~(B$M@LztiHX>U5h3T@XOn3ygmKsx2m{!La6~)DgJofA{f7kp!Aee zNhS!%`))M;tOyFa(ez$2HJ$10GkWU2b`Iu|-GufT1OO;~c2wGzF{J#NK3>8YYa4#+I9 zZZFKOrv)q@9#z>Qwny!2yn&afeHKUyiYu&!`Fd*)4-hgGB{{`a>kWK|Je2LAh}Q)t zOws_NkBz_J25D|Fw#M*~cEyEY^`O`%I||9&!9H7)spbTC%hH0$;}g-gy9IvE+ybuv z%y<4jEq3Oc0pPZK?3&g1%-uKh8@ybXKnFMDpI=SOK$dV{7O;PkO4s>YbT%bPh)b`` zx#>K~BH1O*_qk9(8dr&it_Y_2*Zt%q!?B-|o=OI~3_j6)BYF}B#x^YEFs6A7DR~7~ z_HRnRGs#z~=&0=?5OPh=DZOmT-n?My`|D*EmqyA?CPw9pPjn}=iR|n?=NCE4W1@$A zXpZvWFBZq=tWLa+5T`{xV9Uez+*2cTe%2~>(`ZGrUEaxFM3FiJ5|UDQ!Xn79&uekh za?ddx_Ql_cygn|l@4TnjYQekdI;DT(w}T)0g(B1g`c|t4+*v3gSFW@d`3<0Ua0R($ zs%m2pf;HK0?@3 zfc_`UQL_3ZeBtk-wQgv1U&JPrWj6P#>szPGnyL*^ddRH6y0>QyDGA=eVlVmrg$3JU z+j$ZtoMI&RrLP*Di{A=q$&;D=m|NMD?zOQgJ1c+Nt zmjq6P&a)=X0nse^VLu|iy(DE&nC9MX01$em2ebG_W}^Gx8*%ZjuIj!$bL$xzz~T0T zeR-k8ndc;mlhUW_<~N>Fex_BcDX5+Z%*u_i;<-?>4+O(=(Y_e*4}^$#-q9-kx=ann zls8Eiz|H2h`YByvB+`>uk4tei8=mS(DIiZq0B2QMCX2ONxbrQ&lg+(BR3#SPVY zUxmAlKJMl+b(|r!^DJdUg_2SoB`mpS=XH`a8USE3nMpv}X3kFnZS$!{>-ck^SEByz z`Gjx$Z_5(&gfS8wdnK)U`f*vNEe-*h@?X^tzwVf=CEvrVG~B2L9j*Rf(r0R%27ZoI zcLAcOJQzU9J#!KKczuE9|J3432>ujsWAa;_m-o@PI(E!JwrNd8q@q;cn&Y9$lSyK=TaCO&G{8Z|D+$Q5$m7#87zKOyJoL^&nu-@oFG$y1Z4&q4mD zUk6=b#9mhFc)Qk6Y9y-@u6Ocip;fD}7A>!YV%zv}8q~bKH4xY=Q8-58fWu~ZU@D-S zX6v<=J!iRyxknuq_mPRKDjPgjl=zXtKbdPrNf?J2t^ihCSC)VMKpy$C6m=^5s*B&2h%oRxZm))z)`4YgNiLN zh=p%tGud!9B<<80IuGhi2)J*GLcU-kn3yNdu1 z0`{*f41Kc>i8648xWr7zofB!UgzR99Cd=FF*@IkL+t`qEL9>`2)5K-_tbL-aYa)3v z9(S|wIoFe>K$UTd6nCxGsS|yS^TX@=S=`gXi8AV!VD6yI8ayI>H*s7=t~$P44+~+F z19mhn4*KQK(=}l>YYbT7%b?ZoiLqW%WOy8vBl|bXf@hAhbj&3o^>E-dYcdmBl|^A zhI#bbL|5|1eLtcD8C1wYqLX2W7ylx%;hvk^(r$zPu&v=lNso1h1utVJU$jw=NXI^* z1j+*H@=_Ff@`g^CfzS66lQoDt=4J#dg|nx7lEq1NG!pASVT(2Soc*yw@W%YjuFU#@ zF4^lEJ)@Gh=Sn`GTWGrar?j;3D8v(nOP(fHR+44X1K62P_Pz_LtO?uf?2fg~wQkRZ zVJqw{PKw0l(E5_+ZW=#wU&jY-vDzPbeST! zWDHl{y(uM6W{tuuNX)*Dllel}rcH%kSNZMt_ll&~<`3DW?5f36)t|bCis~UZx>!or zt@t<3H1Bh+j~r>3pu9GlbJaAvyXW}U)^%AOCq55!Li{)WBMkFrW`lZR2*cVDcWgdq z&_17;c=&Blyx(F!J~#7OxfJar0+|?57N|xErgU);rn|Eq=yJ*I(n4!JA~(zqs|7Gl zAR;FBEqN32mYll_eVe%J7{kQ`u0(d)?l=R2_fX&6Wjw!u3#PN6%J3x! zQUc;sQCsZB`{Cx7F1m6S4_BxA(q(nI9+CB2Cz_x7$?xRStL7EvS<}s212^0M6C8)d z&QM#0GGt6f&9?8MuExkYFy=jxD;GiRi$|}xIQwr&C17#V$$eL2qz|~fW^+T-QrK6pjQ^c`LSWatPy*f7UNrgtLi_Ox1;dSNFi7v4PF*G=ofJTCk1i_8H z+W?Ik*y694C6F8Tb-G3O^ z(VOH?E*s0Bj<*?@xO}Hp{iq2@V)V7(sTzlk3?uxU^zM9E!X5Z@Rh`i^F;O#v zvrZ^n3Vhxt;5tN2jO_j+OKYWxLO{rEi@nZS=h_wt@uAeH%(ee<;xZgAL8$ClXOey= z{crT;N&nC+)*cxkQrq--e?AEur>eB^I&(=eQ5w_Xaxj+X>e|*t_$h4=^(OdW1mr++ODA^my)=YYD6{` zJhUnlt*)%8D7RySGU;_<>+I1ZZeyjild=^~j#p0L%4gb8E(J7cs&%SAMI;GeK$t5z z^g&(qjK{WdqKD*&PRO#}nkTt6R^2p>dYZ(Eh`~cHSvCHiFR4b09SfcUSFpC$;qL>g z>{b))zvSz$L6%zzGIb}3iTAc(pdNC#Z3ZL9E&6mkBPndJp^Q>~IZL^HoPeAYX{;Ca#QiL9m)-}}JZMF%$&Z#sQeecjissF7 z*Re}=_}3o2;{}e`-yRH5dsLv$OWl9v z?&D?Y2zV|19oUz|B~o)Ug47gmuh>aT8=84~{0A(;t)A>g*nc52@>+c9;NFM*ln&+| z?4j{cK7`D+ehPrTtkW5Y_B&Sfvez6<zIXV?; zcA|29H)Z;xc5I43kZ<`ybnM;M^;zs-kZ|k1Yunhe>0XFAbA`UC_~=bA^^5cTn&MaT znTBfkkO6)oeM2agyXdeP?mbGICgxfR8rAW9QJlPe9LMe6NQ8pbSb>vl92ec@Uq$%x znu1|0hzG?|ew(gO2*{$i*qVla4vp`fCD}1k1}`Cr@myYS)+$as<{A$iv+G0+H(p$) z;;_dIo3Yb$SnV=hXNdEwf1oU-dqJro&s)OxeP+5PQloL-Z|)iZSpHt+RNjZYVDo@! z<}mvbAut#{=+lZ?H&wbl{YE~#=!cb9B?#ft;EW)lX!#ra-8Di0HJ@3^8s3s^FCw8m zNhJIdESDs(T{>y@Ymz)Rr1LhN23++gxJJ@0%j3h0Bej9dGlOSO+CRggHbZXuA3f*2 zdg_;`UY*2O(UsHTR)rB+6qErHCOZI+4F?JRkc;l*MI_d1CPY}Cn8Pkr|G*bvb)itA zzaTif(6sr2Ak@eiCrPyukdMTaJvY%Oc4r=V>_MMKGQJ4bY_s(RD%{WwVMtijf38`Tw!l0CdskC#w)? z@IaKcyLx0z&r)VSVCX9LK*Wh2m=QJS%X!Yse@LRU(V781A9 z@v^>6nU!vEeVXjLCjv%(L&fadB+THw5xn=}Tc&r#oz|A)?Em%M@^5pPDost3ne&(3 zn)f>DN%N^7-H6Jk58)jRcKq~&+ND*7^F-zvGZMh?4+L~E!9HH(@{}F%UY{#M%BHqZ zUuQ0@{L_LzLj{_ZSWJI*n0_&s1iYq5j%HatC8eAXl}}dBzTOVXhp1fD-khq_R!Xk5 zN&4gRN6yR9V)gSGv5vd@U)b-aq3J;JGw6Wu2*ZHaZ-Fd2}K~CcGWgz5-rip~e z0Hty~+gL`P`py{11@uxUP?4oI$Ip}sc(pG8fXa25;s*ni$LRZWfcXNeC%FK=dO>s1(c0PlAjToO5x%`=`ubN#rB>hYXX>M# z_nJsoUpjiQgm?ln4^ewTiG8eKv^%y=g!D}-*a&T0r5XE}^etF^cACIenOR_)a(`gn zBZphaSnvuCjETn_79DR_X^n!mvCn2_fnFISxz#=#nrEQ<0#|`xW%uwebjnvnjSRO~ zeEj}$^Otiu{^949gS_0e^p{#)cSi+2?6)7tKd%0z@VRekZ=uipTELdO`&#gH3$b)F)s-yjcXZRP*ltNFx#BrH(S0B+p62f!BxI4RrLovMdeV(9<8?9vl(&`+r{+dD z8`9uW;irB+?`oEiE41fI@b*Ytb-bRJn<#e9(x?zK$O0IeRqBnukL4G-f=%jx_{Ms6 z{ytZ~J`wvu+I+C=$JPxLYmOOmf#LarXY}dR61QeIsW-3Opj|%2J}{_+B*ZjAoZ$TTBnRI=rWAQ$5#jjinpDGAg8})M2Hz?MpvF%Wy3~TSCyWd3 zgO*Y6)GM1PO*s$E`F)jx{v!V8a6L6hO5`!lDQe(ffERa-X4{#$j3CHSo!X$vuIBrJ zK!5+eI#yJ9gH#1&m5}CydF6f??MiKNn>_5F(^w%*PD%ZDw>OM#>#Ah2y$yt_%Fdo< zvr-1rEzVpzj(cx?yu8fe)TrJVG@i&86AQ9j9T&?(c<){IayGzLaV54rm-iF7yg4yM zX=X__*$gn^sM%CquP=il3w4BfYc%?xC6ewggFWaUFBWbGKA0iFtzX69c4`xZx!yvj z?4pNVqj%cUVxCQnUD4KZ&*F>W0OLGwHU%&5K4tIGMUJB67p{kxMny#Zp3EH9Rwous z9zJ})CdSo;9k}LtUiO~$CRyzx;hOY4@+Rr!5oWH>X}wSrc3i3}2^)O2uyZ|?jRlFs ztQBLNE5*;-4m;GJZGB0bSLwSxUNQ=C8QFN}E{o2xp$vbap0Q~B+ez`c9P7@zTNwrG zeisNmKN7)wem57sI=~=WQ68@&e|Q@+Ia(fcGl&l_4*jJ~`}4G+nY_?T|47H)2jtpLEC;O( z{KrmBdW}Rj^;zT5krM1+IP61@;sN}Y;3#}DJQgYAn|~6?PtBnZQJAfblDO9qdVQQJ zyL&W9X$f(hHBELqA|a<<6zS;K85oLH$POAPHkG-Ank4rJk3f;rNi(WefP=>iMqtUz zYch{-`0BZv1$Ug$v$d%R(}3Nc9%Jco9+2J`b!12|;awYbrVF`N?X%=Y*dyeb(S!FT z(uKs{HyK$BJ2J3-AqwRRpIW*}T8S>XwB~hImN@A2rP;D90UBjQToW+j2%2S1IH8gp zQvl%Usw|O+6aQinpY)fvJibnF3)jb97K-M<1Y5}LbE((#VgDj1`>zKr1RQ(9!B7U6 zU9rkZGc&PPCdfWc<^B*8T_JVYU=QA!mTj8rmOtO5JO&A!|1ZmvHg zMa<&>`kkgO0^(OmyehhLzD}>)$p>#AS(w*(9=;zVj*MCiZjiy?i9J&Pi*d-Oe$ci~ zu`tQ-5gLmnuRN3s;@^AH^TCE~2as)8N@G8ER+6TrZPI+}ANk1!G zvCU7{AZ{uRjDYeVciNDOdWfCH$h#>nq^XBjrHF;wZ7uZP$0OAay!9Treia3^CR=Tt zbc0GLcti6#gVDXeMxoUids#=);$)E(|vpLt-!GpT_6PkQEIOodL^boa9 zwcLHN2mwqisw6P=B=}E$ruxskkjExJQ*3Qnl=54Nw?HQuA*|R6P1%*Vn<6&+eaQ5( z+fO{FWdOD^W+aX1Vj~;u-N-KGUaDt!ET-Iju-pP>rqYDvKO3B^M!xibMx)AY?iy(4 z>UP%vAv~KCwxgW<<6&Y){__J_!3bxa(@gw*NGP%$PS&xmr9CxmSTx)RVCYIln#wF5 zAAG)VB0{5(kks?a2b#gO(T3&XHST}CySkRHS2W_i%`eB3_>%{Iflh#BuVifMcAs-w z`sYb&B<8Y6V{Ujm7IZy)nK* zpC70(EOrk@5I08qxcpuI`rZww^o7rlC^^5_X{IXeu_O_iaGL`hIA0}-mH!!M{d+8h zI`=x-$lhN4*l3fz$*ieIrC>_g>I%pE3CKnwFOh5gBvg?(wOr10&V~|mV;Lj^SoWV$ zf5tXM`y&iJV;{NegC=NXR+IYWHg7)2K`qMfuEkxR-2m#RqD1~x@CQ?y7wzLoQvR8* zzMTP_5s8*U+`nL2j|;da$#I}CKVB#|FLC^e)*?u=FtSI1EJZzGx2S0UKD0}mJ!3;dTVF1t*nVeX#0de!F+0qFn;p`gx1=%Fi;XZ>bjH({}Mz9wU{W+lHbeq z#c#$mJ?jsj&A!z?TH=KIciiB}7F%dVNKYWp@mH(~-KjHKYz@Wlb z9%v?4Zuq~pRm%u^0NYARyo47?@9E%qh(}07F7>${iB%e~a}xBPaP0Fzd(NV4`s9#5 zsM;!n9lMJT10dTc0gv(=FTFB5*Nc6La(WKFQq>Jo)s@CwG*i|221we-Wd*<3n&vv) zbieh%e7p>^P$s(-y{avFruWQ=l{{?V;G$iGGRV_GpAR)vs0Syzo>ajv5jP_v{BIf0 z(J$mDTUa7&_AMBKdx?9xG*wVj!)!}G;7e?#J^B+GTO`v)Ci3VzOHTT?!|IPJ^FWt= z>}r0po-j+H5g5s&Qsf_iF`I!eEV5-&l;t(y@JPo*ejcm^-(~wE{0yi3qdMcroDTLP zZcm$gM<01#AOmcwMj9)O6XtEjK{E4gOqRHDVq2{4?G#<%wR!F)|QOEV=&Mspd`RGXPDE2CG zdH(X!a&;KLlb(G;Wvb%Ta`(%!#N?%ajpU>^DMsP0a+xJr9b}067@`-V8AE zC^Gz6`%9-S$3b(-nJY>3C&7}Jl@Vr^dQLu^%c}z?boyb>Y*2csc37^T4%3dkSlN@? zGcC#72j0_A0O0oRFDs-xx>B>4|h8-Xf2brXEM_fc?6XK{P_m>^}c7_1SWR=t-i94 zXE$@Xj;Yr$NyDP!@veB_R-yylzeiiZ%%@2bb8&-6o&DQ)R)vAcI$Q-wjhDO=U6JwuKX@=H&UJt>+88s@Ga)t^ zG$fVvh?*usg6v%`dca5<_C}<}$dBSm8GArpYcAKx z!*1=b>eQ7szgh0H{ZOdK9F*mL7%!UM<5E0&yex7*kQHsNdy+S#xrXO>=^j<<&I}?u zshNOuQky;%$CKDYxzj=U)+|8_gv9^+OHq~H6aV^Y#JHN8CB|1#7Y{}L+67ye?Nlk% zs%^2)S*ApH@Q$z1aJH4j{s)7Vh1P3?>PyedVM2B}xBD5;WK!#!nx$$@pTJ(t%ql z% zcEPb5PLbPN1pwtivee{jjfC1$#S1iUr@@Rx9&TBw=6Y~aDQ;t@0Tlr|X}J|!@efVo z1;e8~>0m^dyN9Aaa@^vFCQWk3q_m0y$2<85Z00>*(|-ZxcciwEDE8$?{ab1`0Kh?e zL9`l;z{$g4qyb9HcSaz=n@U6vL~jzH#v8sDb4#-&UG30O(vX>NEFhuSIX~ zRZs@LGl6x9M09{!cGFy6^!BCmG(H64jhBCWLDp_dPfWZEPC=tRmPq7QD^7rCWoi>a z3b)RlBStNqRspk0omV%p<)X^DG5`>+>gUk?T(J3&pxE@>Z|n@9Qopq5KKX@9aBp`?DUirFGE>a(_*aYcn_}eUI~J_#Ogf0qU#yU{i2yZaTR0pM_lRcJg9Td^n{hqu7Mp^opJ1FjRtQ6NjOkFn9SvR-2$6)dl zgYsPYguTPA=7VH;Lg-A1VpDxT)cKB&1Bn7Ce+n>w{VJZoa zk#B@3)WrxU83$#)nu?l`9{zRG>RhSum7F@E{RKZB14iK1)y#O9tfzBMtguCM#uvKQ zsEU0Xu{3uyX=C%#B|&;1?z~8~9V}}9@=c2deA4gYmbmYOgKRx>$BkgD=be3{rCA1Z z)H#HFk#&FYl28NujrN|2)QG@H9|Q1J(qFM9NJZz7(;20sU)j`Ouj4wf&U4jLgAY_N zrvT;H+MUI8!Gz4{f%c3%LkmB+>v`;kx;f)6RGwvHI^jm9f0~EWj;Ucaa&B>*XA~ zh;|{m9zzZs;!Ey|HqK;RGIrvqNw!0u4p5HdSIO=Utq82xZ{#&Zc&OaDnte|geXNDG zbuIn6XuSJchX4SB3o3&)wUc{|xyv{j-s{e2uMS=dAs(Hpmkd`6VH$&_4`D_t{O6Ks z0p)Rb;uinbtQ;DWzv(PSQn;Lfz$|H{>=}9-eIKlU0T0||IF}6Gcif#;;VxMrA$ojz z^piPk@-$fYZLitB{g)B{T7kAIDsP8!Esx$M;OlA7J1=d-FA62xe2>dQ9c>Tx!Qk+2 zcwC5ApIK(lE7jT#C&lhEf$>s=?w#kLV)!L{`Qv5)Q6|fmq)^<>$e}Js{t3vzgFV@M`bbDRM95`sT{+Co?W$=jDqh zq%rk(y-=-kz3`ij)i(oF^{-rDdQ(7OWN>NsG~Y1se&V^T#+hP~-vQtmvg*B65v@m` z@r~2UqdWsy$!_qq{R@C4T}LB{1yT+V*qzYTlrbLc@Q{(xiAX-oc@!xhC*wSDTwoD| zN8NJEdRTw5pl@9K(Yd+i{oda%d=`W>?u)xqX+th9zVF+zs9fJ2(ikxjEYVis{Hwb5 zs@w2p6CwXa;_BrH)7KcnQ0ZH$t!i@SDeZ}Y?cIl$rEW-3iwZcjOKHND|r z?_+Lcf^=LwANvXee}?DLBYt7Z&-8SIa%_g)beS|_e9697Zeb6dQX!?bxW_|+4DMzb zJtPSV8kR*hNL~SxGGdOdq5l&~0fQgtTs!<4;_09eUyckHWxJ>3D)l;@rcodvrQq{- zczo31Q$Zn&_7hX}CdIf%UJD;L-5s7xgAu#e-J=KQ{&-YkXyBr)if+1TyLrcBp|G{m z?lpt`uVUtCNh__ySX`wzWXSHSufVVocTbHHL+QG)(&8)0Lqb>ESf6b08Vh`++XfU+ zLNjg0p`n>ySu#vnd_4Q^*?U#>v+-F|$H`#YDrlbu)zCEKT5Bg8b=pYZK7aFTX==$F zN2G!Wk3tqXhRJh1B^L07ce-*fKQZ!hmv<%`7?r{wNb)4iLBqO{yr`U_8;Ju zKc0O99t#5)zl7Juxtj0p?0Q|xs_9V9`Z#z~Xdxxfa%Mni5yI!qZsMN?8ee1u`=J1?tS&tq8C|ENbGB?HX z9djAfLyF|$KSz&*Tfp`Ttn!WuL)lu`aY%0^k}?wa$x%fSicAQ;crdo1)w84iMn0{a8gnp3F9wpm%% z?HWsD$3;w1FQ>yEM2?- zjUdc;OxLp)$dD{?jVKAuPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw=TsA#jNi(`mK z=i7^l*-n8H4G)iNN_TJ_I-rnb5TV1i`=9^iStrvBXNHC8ur)V13a~Z5WzYB^XZWTo z+<%XL%~#9&mhF4?MD%`WPhRr#s6gB#=BO1eF*|0>n9e2PzUScatDmNK&2TxeTw`hM zThYzxA1v=(ihma)+0FjJU-I9^w)H$eguYgPykH$x{vg|A)1!rIX67GcZ}mS~$oK94 z1NM^nN1bhJ;vd?-IDW{PIcKuukz=1fU9x7pG^0UGdvU8W(D@9Wu6{1-oD!Mn{i8mWRTnj9$?b`LcuNS4=3d~S;PS5G+_wqeG&-;8necQgtc?*p+(nuqZapc~C z{rjHpHex@kwTT4LkY70*0J^QQ<0l~O3BFv0a%5yx?eMx*3%IWn0{#kFWOisLvHV@4ZhW^Uit zzW`cm(OMsDZ)r{fM`1yLGGY!XQ2-PQ1s_nVkK;J3U%vs@EpRiHLTg>VwsvhBvCd8w zFIKHJSEnYI>|ZH`h@eFu0zL+`0!SqK;v%wIDOE8^kZ~M`u1%Y9-2zjSlMfA_&1RRZ zskJUiSe;1p#Q}$CU~f^fUv{Ytng3+0bzy*p9O>+ z9()u~5AfiVfO>%k9|Y7BJa{ai-r&JQ0rdzE9to&dcXYalNj4`;b8&pr_L?RL9^YbXBaP{)~u`CM_;oRBL ziZ`-CKrGhDTkpKPtcko#BoZN?&*SA|`-zJemljaVXstQ@!zln>d;I`P1@nj^Facxd zf9Kn8z5<{l7UPBfmjdY{Fahy+9Lp|FA78gFs5b5jXwJ<-gt@u7noZpO#FKpX`IkU( z1=K1FjJa7@bWHA*fxVYRWZN5WzRi}c+iKR(|3ySRJ+^b@@&qT2AHx_k@yqDBr(w}Y zK*M2W%*hkSk6A6Ptyq@j*~DRp>$+spX^b(hhQp=tiUW}^5A5BqUG2e zZmv&Gf(Y4knz?M6iHS=X)NXtf;Pdv&>;dT7xT)$p7w#$6@GHKpfWd+OU4q&PMAXi~f&N{?qrd&(N1vX52__PWXv7pwA(HU4 zurVWfu@8)ljLdpj*7FtM821Pwi7iiU<(ZzIWg9lY#S0g>^7rM0tqVtiPdsR|9M1(9 zOury}_|XwIZ0xG)-qL>+wAL77%Dcd8SEu;k{evL9=ykuI3lPKtIQji|G&fhbm$EE{ zZ9BMb0oT=K0oiP(qPCau?Mv{?=^y_U2><{907*qoM6N<$f@mmD`2YX_ literal 0 HcmV?d00001 diff --git a/resources/images/search.png b/resources/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..7282ed71520330c5679da68f4fa752acfa57d5ec GIT binary patch literal 533 zcmV+w0_y#VP)HK4bWt8VXK%M{L1if$paUz0iHrTKN_R6!^OiK zl{0{2(Nq)#w?(_>5@16#*NTESqFr+dP!vs9QSe=~b6NmR8-6G>Ha=xlx3@;PB?m#pJpfjOnqDvTHCR|>$72pbZ!wjQK zU@KH>1$c1{5MU + + + images/mw-icon.png + + + images/search.png + + + images/down-arrow.png + + + images/device-type-1.png + + + images/device-type-2.png + + + images/device-type-3.png + + + images/device-type-4.png + + + images/device-type-5.png + + + images/device-type-6.png + + + images/device-type-7.png + + + images/device-type-8.png + + + styles.qss + + \ No newline at end of file diff --git a/resources/styles.qss b/resources/styles.qss new file mode 100644 index 0000000..1ff7186 --- /dev/null +++ b/resources/styles.qss @@ -0,0 +1,44 @@ +QComboBox, QPushButton, QLineEdit, QTextEdit, QListWidget, QTableWidget, QGroupBox { + border: 1px solid black; + border-radius: 2px; +} + +QLineEdit { + border-radius: 5px; +} + +QComboBox { + background-color: white; +} + +QComboBox::drop-down { + border: 0px; +} + +QComboBox::down-arrow { + width: 10px; + height: 10px; + image: url(:/images/down-arrow.png); +} + +QPushButton { + background-color: white; + padding: 5px; +} + +QPushButton:hover { + background-color: green; + color: white; +} + +QPushButton:pressed { + background-color: green; + border-radius: 4px; + border-width: 2px; + color: white; +} + +QPushButton#pushButtonSearch { + border: none; + background: transparent; +} \ No newline at end of file diff --git a/service/filterparams.cpp b/service/filterparams.cpp new file mode 100644 index 0000000..0e21bed --- /dev/null +++ b/service/filterparams.cpp @@ -0,0 +1,53 @@ +#include "filterparams.h" + +FilterParams::FilterParams() {} + +bool FilterParams::isReady() const +{ + return _isReady; +} + +void FilterParams::setIsReady(bool newIsReady) +{ + _isReady = newIsReady; +} + +double FilterParams::priceFrom() const +{ + return _priceFrom; +} + +void FilterParams::setPriceFrom(double newPriceFrom) +{ + _priceFrom = newPriceFrom; +} + +double FilterParams::priceTo() const +{ + return _priceTo; +} + +void FilterParams::setPriceTo(double newPriceTo) +{ + _priceTo = newPriceTo; +} + +bool FilterParams::getDisregardState() const +{ + return disregardState; +} + +void FilterParams::setDisregardState(bool newDisregardState) +{ + disregardState = newDisregardState; +} + +bool FilterParams::getApllyFilters() const +{ + return apllyFilters; +} + +void FilterParams::setApllyFilters(bool newApllyFilters) +{ + apllyFilters = newApllyFilters; +} diff --git a/service/filterparams.h b/service/filterparams.h new file mode 100644 index 0000000..8fe4995 --- /dev/null +++ b/service/filterparams.h @@ -0,0 +1,32 @@ +#ifndef FILTERPARAMS_H +#define FILTERPARAMS_H + +class FilterParams +{ +public: + FilterParams(); + + bool isReady() const; + void setIsReady(bool newIsReady); + + double priceFrom() const; + void setPriceFrom(double newPriceFrom); + + double priceTo() const; + void setPriceTo(double newPriceTo); + + bool getDisregardState() const; + void setDisregardState(bool newDisregardState); + + bool getApllyFilters() const; + void setApllyFilters(bool newApllyFilters); + +private: + bool _isReady = true; + double _priceFrom = -1; + double _priceTo = -1; + bool disregardState = false; + bool apllyFilters = false; +}; + +#endif // FILTERPARAMS_H diff --git a/service/projectlogic.cpp b/service/projectlogic.cpp new file mode 100644 index 0000000..b99f525 --- /dev/null +++ b/service/projectlogic.cpp @@ -0,0 +1,126 @@ +#include "projectlogic.h" + +ProjectLogic::ProjectLogic() {} + +QList ProjectLogic::findDevicesByAllParameters( + const QMap &projects, + int entityId, int currentEntity, + QString searchText, + const FilterParams &filterParams, + const QString &sortOrder + ) +{ + auto filteredDevices = filterByEntity(projects, entityId, currentEntity); + filteredDevices = searchDevices(filteredDevices, searchText); + filteredDevices = applyFilters(filteredDevices, filterParams); + return sortDevices(filteredDevices, sortOrder); +} + +QMap ProjectLogic::filterByEntity(const QMap &projects, int entityId, int currentEntity) +{ + QMap result; + if (entityId == -1 || currentEntity == 0) + return projects; // "Все проекты" + + for (auto &project : projects) { + switch (currentEntity) { + case 1: // Типы устройств + if (project.deviceModel().idType() == entityId) + result.insert(project.id(), project); + break; + case 2: // Команды + if (project.idTeam() == entityId) + result.insert(project.id(), project); + break; + case 3: // Работники + if (project.stages().idWorker() == entityId) + result.insert(project.id(), project); + break; + case 4: // Этапы + if (project.stages().id() == entityId) + result.insert(project.id(), project); + break; + case 5: // Модели устройств + if (project.deviceModel().id() == entityId) + result.insert(project.id(), project); + break; + default: break; + } + } + return result; +} + +QMap ProjectLogic::searchDevices(const QMap &projects, const QString &searchText) +{ + if (searchText.isEmpty()) + return projects; + + QMap result; + for (auto &project : projects) { + if (project.deviceModel().name().contains(searchText, Qt::CaseInsensitive) || + project.deviceModel().nameType().contains(searchText, Qt::CaseInsensitive)) { + result.insert(project.id(), project); + } + } + return result; +} + +QMap ProjectLogic::applyFilters(const QMap &projects, const FilterParams &filterParams) +{ + if (!filterParams.getApllyFilters()) + return projects; + QMap result; + if (filterParams.getDisregardState()) + { + for (auto &project : projects) { + if (project.budget() < filterParams.priceFrom() || project.budget() > filterParams.priceTo()) + continue; + result.insert(project.id(), project); + } + } + else + { + for (auto &project : projects) { + if (project.isReady() != filterParams.isReady()) + continue; + if (project.budget() < filterParams.priceFrom() || project.budget() > filterParams.priceTo()) + continue; + result.insert(project.id(), project); + } + } + + return result; +} + +QList ProjectLogic::sortDevices(QMap &projects, const QString &sortOrder) +{ + QList deviceList = projects.values(); + + if (sortOrder == "Сначала новые") { + std::sort(deviceList.begin(), deviceList.end(), [](const Project &a, const Project &b) { + return a.StartProjectDate() < b.StartProjectDate(); + }); + } + if (sortOrder == "Сначала старые") { + std::sort(deviceList.begin(), deviceList.end(), [](const Project &a, const Project &b) { + return a.FinishProjectDate() > b.FinishProjectDate(); + }); + } + if (sortOrder == "Сначала дешевые") { + std::sort(deviceList.begin(), deviceList.end(), [](const Project &a, const Project &b) { + return a.budget() < b.budget(); + }); + } + if (sortOrder == "Сначала дорогие") { + std::sort(deviceList.begin(), deviceList.end(), [](const Project &a, const Project &b) { + return a.budget() > b.budget(); + }); + } + if (sortOrder == "Сначала с лайком") { + std::sort(deviceList.begin(), deviceList.end(), [](const Project &a, const Project &b) { + return a.isLiked() > b.isLiked(); + }); + } + + return deviceList; +} diff --git a/service/projectlogic.h b/service/projectlogic.h new file mode 100644 index 0000000..16f1f06 --- /dev/null +++ b/service/projectlogic.h @@ -0,0 +1,27 @@ +#ifndef PROJECTLOGIC_H +#define PROJECTLOGIC_H + +#include "types.h" +#include "filterparams.h" + +class ProjectLogic +{ +public: + ProjectLogic(); + QList findDevicesByAllParameters( + const QMap &projects, + int entityId, + int currentEntity, + QString searchText, + const FilterParams &filterParams, + const QString &sortOrder + ); + +private: + QMap filterByEntity(const QMap &projects, int entityId, int currentEntity); + QMap searchDevices(const QMap &projects, const QString &searchText); + QMap applyFilters(const QMap &projects, const FilterParams &filterParams); + QList sortDevices(QMap &devices, const QString &sortOrder); +}; + +#endif // PROJECTLOGIC_H diff --git a/service/serviceloaddb.cpp b/service/serviceloaddb.cpp new file mode 100644 index 0000000..62faf55 --- /dev/null +++ b/service/serviceloaddb.cpp @@ -0,0 +1,276 @@ +#include "serviceloaddb.h" + +ServiceLoadDB::ServiceLoadDB(QObject *parent) + : QObject{parent} +{} + +void ServiceLoadDB::start() +{ + db = QSqlDatabase::addDatabase("QPSQL"); + db.setHostName("127.0.0.1"); + db.setDatabaseName("ProjectsAccountingDB"); + db.setUserName("postgres"); + db.setPassword("12345"); + if(!db.open()){ + qDebug() << "Не удалось открыть БД "; + return; + } + query = QSqlQuery(db); + + loadStages(); + loadWorkers(); + loadTeams(); + loadDeviceTypes(); + loadDeviceModels(); + loadProjects(); +} + +void ServiceLoadDB::loadStages() +{ + QFile file("../../data/requestStages.sql"); + if (!file.open(QIODevice::ReadOnly)) + return; + + db_input = QString(file.readAll()); + + if (!query.exec(db_input)) { + qDebug() << "Ошибка запроса к таблице stages: " << query.lastError().text(); + return; + } + + QSqlRecord rec; + while (query.next()) { + rec = query.record(); + + Stages stages; + int id = query.value(rec.indexOf("ID")).toInt(); + stages.setId(id); + stages.setName(query.value(rec.indexOf("Name")).toString()); + stages.setStartDate(query.value(rec.indexOf("StartDate")).toDateTime()); + stages.setFinishDate(query.value(rec.indexOf("FinishDate")).toDateTime()); + stages.setCompleted(query.value(rec.indexOf("Completed")).toBool()); + stages.setExpenses(query.value(rec.indexOf("Expenses")).toDouble()); + stages.setIdWorker(query.value(rec.indexOf("WorkerID")).toInt()); + stages.setNameWorker(query.value(rec.indexOf("worker_name")).toString()); + + mapStages.insert(stages.id(), stages); + } + + emit sendStages(mapStages); +} + +void ServiceLoadDB::loadWorkers() +{ + QFile file("../../data/requestWorkers.sql"); + if (!file.open(QIODevice::ReadOnly)) + return; + + db_input = QString(file.readAll()); + + if (!query.exec(db_input)) { + qDebug() << "Ошибка запроса к таблице Worker: " << query.lastError().text(); + return; + } + + QSqlRecord rec; + while (query.next()) { + rec = query.record(); + + Worker worker; + int id = query.value(rec.indexOf("ID")).toInt(); + worker.setId(id); + worker.setName(query.value(rec.indexOf("Name")).toString()); + worker.setExperience(query.value(rec.indexOf("Experience")).toInt()); + worker.setPhoneNumber(query.value(rec.indexOf("PhoneNumber")).toString()); + worker.setTeamName(query.value(rec.indexOf("team_name")).toString()); + + mapWorkers.insert(worker.id(), worker); + } + + emit sendWorkers(mapWorkers); +} + +void ServiceLoadDB::loadTeams() +{ + db_input = "SELECT * FROM public.Team"; + if (!query.exec(db_input)) { + qDebug() << "Ошибка запроса к таблице Team: " << query.lastError().text(); + return; + } + + QSqlRecord rec; + while (query.next()) { + rec = query.record(); + + Team team; + team.setId(query.value(rec.indexOf("ID")).toInt()); + team.setName(query.value(rec.indexOf("Name")).toString()); + team.setStatus(query.value(rec.indexOf("Status")).toBool()); + + mapTeams.insert(team.id(), team); + } + + emit sendTeams(mapTeams); +} + +void ServiceLoadDB::loadDeviceTypes() +{ + db_input = "SELECT * FROM public.DeviceType"; + if (!query.exec(db_input)) { + qDebug() << "Ошибка запроса к таблице DeviceType: " << query.lastError().text(); + return; + } + + QSqlRecord rec; + while (query.next()) { + rec = query.record(); + + DeviceType deviceType; + deviceType.setId(query.value(rec.indexOf("ID")).toInt()); + deviceType.setName(query.value(rec.indexOf("Name")).toString()); + + mapDeviceTypes.insert(deviceType.id(), deviceType); + } + + emit sendDeviceTypes(mapDeviceTypes); +} + +void ServiceLoadDB::loadDeviceModels() +{ + QFile file("../../data/requestDeviceModels.sql"); + if (!file.open(QIODevice::ReadOnly)) + return; + + db_input = QString(file.readAll()); + + if (!query.exec(db_input)) { + qDebug() << "Ошибка запроса при получении информации о моделях проектов: " << query.lastError().text(); + return; + } + + QSqlRecord rec; + while (query.next()) { + rec = query.record(); + + DeviceModel deviceModel; + int id = query.value(rec.indexOf("ID")).toInt(); + deviceModel.setId(id); + deviceModel.setName(query.value(rec.indexOf("Name")).toString()); + deviceModel.setDescription(query.value(rec.indexOf("Description")).toString()); + deviceModel.setWorkEfficiency(query.value(rec.indexOf("WorkEfficiency")).toInt()); + deviceModel.setReliability(query.value(rec.indexOf("reliability")).toInt()); + deviceModel.setDurability(query.value(rec.indexOf("durability")).toInt()); + deviceModel.setCreateDate(query.value(rec.indexOf("CreateDate")).toDateTime()); + deviceModel.setStructureElements(readStructureElements(id)); + deviceModel.setIdType(query.value(rec.indexOf("DeviceTypeID")).toInt()); + deviceModel.setNameType(query.value(rec.indexOf("device_type_name")).toString()); + + mapDeviceModels.insert(deviceModel.id(), deviceModel); + } + + emit sendDeviceModels(mapDeviceModels); +} + +void ServiceLoadDB::loadProjects() +{ + QFile file("../../data/requestProjects.sql"); + if (!file.open(QIODevice::ReadOnly)) + return; + db_input = QString(file.readAll()); + + if (!query.exec(db_input)) { + qDebug() << "Ошибка запроса при получении информации о проектах: " << query.lastError().text(); + return; + } + + QSqlRecord rec; + while (query.next()) { + rec = query.record(); + + Project project; + int id = query.value(rec.indexOf("id")).toInt(); + int idModel = query.value(rec.indexOf("ModelID")).toInt(); + if (!mapDeviceModels.contains(idModel)) { + qDebug() << "Не загружена модель проекта. Идентификатор проекта: " << id; + return; + } + + project.setId(id); + project.setName(query.value(rec.indexOf("Name")).toString()); + project.setDescription(query.value(rec.indexOf("Description")).toString()); + project.setStartProjectDate(query.value(rec.indexOf("StartProjectDate")).toDateTime()); + project.setFinishProjectDate(query.value(rec.indexOf("FinishProjectDate")).toDateTime()); + project.setBudget(query.value(rec.indexOf("Budget")).toDouble()); + project.setIsReady(query.value(rec.indexOf("isReady")).toBool()); + project.setIdTeam(query.value(rec.indexOf("TeamID")).toInt()); + project.setNameTeam(query.value(rec.indexOf("team_name")).toString()); + project.setIdStages(query.value(rec.indexOf("StagesID")).toInt()); + project.setNameStages(query.value(rec.indexOf("stages_name")).toString()); + project.setDeviceModel(mapDeviceModels[idModel]); + project.setIsLiked(query.value(rec.indexOf("isLiked")).toBool()); + + mapProjects.insert(project.id(), project); + } + + emit sendProjects(mapProjects); +} + +void ServiceLoadDB::updateLikesState(QMap &map) +{ + if (map.isEmpty()) { + qDebug() << "Нет проектов для обновления"; + return; + } + + QStringList updateQueries; + for (auto &project : map) { + int id = project.id(); + bool isLiked = project.isLiked(); + + updateQueries << QString("WHEN %1 THEN %2").arg(id).arg(isLiked ? "TRUE" : "FALSE"); + } + + QString caseQuery = updateQueries.join(" "); + + QStringList idStrings; + QList keys = map.keys(); + for (int id : keys) { + idStrings << QString::number(id); + } + + db_input = QString("UPDATE Project SET isLiked = CASE id %1 END WHERE id IN (%2)") + .arg(caseQuery, idStrings.join(", ")); + + if (!query.exec(db_input)) { + qDebug() << "Ошибка обновления состояния isLiked у проектов: " << query.lastError().text(); + } +} + +QList ServiceLoadDB::readStructureElements(int modelId) +{ + QSqlQuery secondQuery; + db_input = "SELECT * FROM get_model_structure(:model_id)"; + secondQuery.prepare(db_input); + secondQuery.bindValue(":model_id", modelId); + if (!secondQuery.exec()) { + qDebug() << "Ошибка при выполнении запроса для получения элементов структуры: " << secondQuery.lastError().text(); + return QList(); + } + + QSqlRecord rec; + QList elements; + while (secondQuery.next()) { + rec = secondQuery.record(); + + DeviceStructureElement element; + element.setId(secondQuery.value(rec.indexOf("Идентификатор элемента")).toInt()); + element.setName(secondQuery.value(rec.indexOf("Модель")).toString()); + element.setDescription(secondQuery.value(rec.indexOf("Описание элемента")).toString()); + element.setNameType(secondQuery.value(rec.indexOf("Тип элемента")).toString()); + element.setCount(secondQuery.value(rec.indexOf("Количество")).toInt()); + + elements.append(element); + } + + return elements; +} diff --git a/service/serviceloaddb.h b/service/serviceloaddb.h new file mode 100644 index 0000000..54c5c6b --- /dev/null +++ b/service/serviceloaddb.h @@ -0,0 +1,60 @@ +#ifndef SERVICELOADDB_H +#define SERVICELOADDB_H + +#include "service/types.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class ServiceLoadDB : public QObject +{ + Q_OBJECT +public: + explicit ServiceLoadDB(QObject *parent = nullptr); + void start(); + void updateLikesState(QMap &); + +private: + QList readStructureElements(int modelId); + +signals: + void sendStages(QMap &); + void sendWorkers(QMap &); + void sendTeams(QMap &); + void sendDeviceTypes(QMap &); + void sendDeviceModels(QMap &); + void sendProjects(QMap &); + +public slots: + void loadStages(); + void loadWorkers(); + void loadTeams(); + void loadDeviceTypes(); + void loadDeviceModels(); + void loadProjects(); + +private: + QSqlDatabase db; + QString db_input; + QSqlQuery query; + + QMap mapStages; + QMap mapWorkers; + QMap mapTeams; + QMap mapDeviceTypes; + QMap mapDeviceModels; + QMap mapProjects; +signals: +}; + +#endif // SERVICELOADDB_H diff --git a/service/types.cpp b/service/types.cpp new file mode 100644 index 0000000..e5f12c2 --- /dev/null +++ b/service/types.cpp @@ -0,0 +1,487 @@ +#include "types.h" + +Types::Types() {} + +Worker::Worker() {} + +int Worker::id() const +{ + return _id; +} + +void Worker::setId(int newId) +{ + _id = newId; +} + +QString Worker::name() const +{ + return _name; +} + +void Worker::setName(const QString &newName) +{ + _name = newName; +} + +int Worker::experience() const +{ + return _experience; +} + +void Worker::setExperience(int newExperience) +{ + _experience = newExperience; +} + +QString Worker::phoneNumber() const +{ + return _phoneNumber; +} + +void Worker::setPhoneNumber(const QString &newPhoneNumber) +{ + _phoneNumber = newPhoneNumber; +} + +QString Worker::teamName() const +{ + return _teamName; +} + +void Worker::setTeamName(const QString &newTeamName) +{ + _teamName = newTeamName; +} + +Team::Team() {} + +int Team::id() const +{ + return _id; +} + +void Team::setId(int newId) +{ + _id = newId; +} + +bool Team::status() const +{ + return _status; +} + +void Team::setStatus(bool newStatus) +{ + _status = newStatus; +} + +QString Team::name() const +{ + return _name; +} + +void Team::setName(const QString &newName) +{ + _name = newName; +} + +Stages::Stages() {} + +int Stages::id() const +{ + return _id; +} + +void Stages::setId(int newId) +{ + _id = newId; +} + +QString Stages::name() const +{ + return _name; +} + +void Stages::setName(const QString &newName) +{ + _name = newName; +} + +QDateTime Stages::StartDate() const +{ + return _StartDate; +} + +void Stages::setStartDate(const QDateTime &newStartDate) +{ + _StartDate = newStartDate; +} + +QDateTime Stages::FinishDate() const +{ + return _FinishDate; +} + +void Stages::setFinishDate(const QDateTime &newFinishDate) +{ + _FinishDate = newFinishDate; +} + +int Stages::expenses() const +{ + return _expenses; +} + +void Stages::setExpenses(int newExpenses) +{ + _expenses = newExpenses; +} + +QString Stages::nameWorker() const +{ + return _nameWorker; +} + +void Stages::setNameWorker(const QString &newNameWorker) +{ + _nameWorker = newNameWorker; +} + +int Stages::idWorker() const +{ + return _idWorker; +} + +void Stages::setIdWorker(int newIdWorker) +{ + _idWorker = newIdWorker; +} + +bool Stages::completed() const +{ + return _completed; +} + +void Stages::setCompleted(bool newCompleted) +{ + _completed = newCompleted; +} + +DeviceStructureElement::DeviceStructureElement() {} + +int DeviceStructureElement::id() const +{ + return _id; +} + +void DeviceStructureElement::setId(int newId) +{ + _id = newId; +} + +QString DeviceStructureElement::name() const +{ + return _name; +} + +void DeviceStructureElement::setName(const QString &newName) +{ + _name = newName; +} + +QString DeviceStructureElement::description() const +{ + return _description; +} + +void DeviceStructureElement::setDescription(const QString &newDescription) +{ + _description = newDescription; +} + +int DeviceStructureElement::count() const +{ + return _count; +} + +void DeviceStructureElement::setCount(int newCount) +{ + _count = newCount; +} + +QString DeviceStructureElement::nameType() const +{ + return _nameType; +} + +void DeviceStructureElement::setNameType(const QString &newNameType) +{ + _nameType = newNameType; +} + +DeviceModel::DeviceModel() {} + +int DeviceModel::id() const +{ + return _id; +} + +void DeviceModel::setId(int newId) +{ + _id = newId; +} + +QString DeviceModel::name() const +{ + return _name; +} + +void DeviceModel::setName(const QString &newName) +{ + _name = newName; +} + +QString DeviceModel::description() const +{ + return _description; +} + +void DeviceModel::setDescription(const QString &newDescription) +{ + _description = newDescription; +} + +int DeviceModel::workEfficiency() const +{ + return _workEfficiency; +} + +void DeviceModel::setWorkEfficiency(int newWorkEfficiency) +{ + _workEfficiency = newWorkEfficiency; +} + +int DeviceModel::reliability() const +{ + return _reliability; +} + +void DeviceModel::setReliability(int newReliability) +{ + _reliability = newReliability; +} + +int DeviceModel::durability() const +{ + return _durability; +} + +void DeviceModel::setDurability(int newDurability) +{ + _durability = newDurability; +} + +QDateTime DeviceModel::CreateDate() const +{ + return _CreateDate; +} + +void DeviceModel::setCreateDate(const QDateTime &newCreateDate) +{ + _CreateDate = newCreateDate; +} + +QList DeviceModel::structureElements() const +{ + return _structureElements; +} + +void DeviceModel::setStructureElements(const QList &newStructureElements) +{ + _structureElements = newStructureElements; +} + +int DeviceModel::idType() const +{ + return _idType; +} + +void DeviceModel::setIdType(int newIdType) +{ + _idType = newIdType; +} + +QString DeviceModel::nameType() const +{ + return _nameType; +} + +void DeviceModel::setNameType(const QString &newNameType) +{ + _nameType = newNameType; +} + +Project::Project() {} + +int Project::id() const +{ + return _id; +} + +void Project::setId(int newId) +{ + _id = newId; +} + +QString Project::description() const +{ + return _description; +} + +void Project::setDescription(const QString &newDescription) +{ + _description = newDescription; +} + +QDateTime Project::StartProjectDate() const +{ + return _StartProjectDate; +} + +void Project::setStartProjectDate(const QDateTime &newStartProjectDate) +{ + _StartProjectDate = newStartProjectDate; +} + +QDateTime Project::FinishProjectDate() const +{ + return _FinishProjectDate; +} + +void Project::setFinishProjectDate(const QDateTime &newFinishProjectDate) +{ + _FinishProjectDate = newFinishProjectDate; +} + +double Project::budget() const +{ + return _budget; +} + +void Project::setBudget(double newBudget) +{ + _budget = newBudget; +} + +int Project::idStages() const +{ + return _idStages; +} + +void Project::setIdStages(int newIdStages) +{ + _idStages = newIdStages; +} + +QString Project::nameStages() const +{ + return _nameStages; +} + +void Project::setNameStages(const QString &newNameStages) +{ + _nameStages = newNameStages; +} + +int Project::idTeam() const +{ + return _idTeam; +} + +void Project::setIdTeam(int newIdTeam) +{ + _idTeam = newIdTeam; +} + +QString Project::nameTeam() const +{ + return _nameTeam; +} + +void Project::setNameTeam(const QString &newNameTeam) +{ + _nameTeam = newNameTeam; +} + +DeviceModel Project::deviceModel() const +{ + return _deviceModel; +} + +void Project::setDeviceModel(const DeviceModel &newDeviceModel) +{ + _deviceModel = newDeviceModel; +} + +bool Project::isLiked() const +{ + return _isLiked; +} + +void Project::setIsLiked(bool newIsLiked) +{ + _isLiked = newIsLiked; +} + +bool Project::isReady() const +{ + return _isReady; +} + +void Project::setIsReady(bool newIsReady) +{ + _isReady = newIsReady; +} + +Stages Project::stages() const +{ + return _stages; +} + +void Project::setStages(const Stages &newStages) +{ + _stages = newStages; +} + +QString Project::name() const +{ + return _name; +} + +void Project::setName(const QString &newName) +{ + _name = newName; +} + +DeviceType::DeviceType() {} + +int DeviceType::id() const +{ + return _id; +} + +void DeviceType::setId(int newId) +{ + _id = newId; +} + +QString DeviceType::name() const +{ + return _name; +} + +void DeviceType::setName(const QString &newName) +{ + _name = newName; +} diff --git a/service/types.h b/service/types.h new file mode 100644 index 0000000..9e83759 --- /dev/null +++ b/service/types.h @@ -0,0 +1,257 @@ +#ifndef TYPES_H +#define TYPES_H + +#include +#include + +class Types +{ +public: + Types(); +}; + +class Worker +{ +public: + Worker(); + + int id() const; + void setId(int newId); + + QString name() const; + void setName(const QString &newName); + + int experience() const; + void setExperience(int newExperience); + + QString phoneNumber() const; + void setPhoneNumber(const QString &newPhoneNumber); + + QString teamName() const; + void setTeamName(const QString &newTeamName); + +private: + int _id = 0; + QString _name = ""; + int _experience = 0; + QString _phoneNumber = ""; + QString _teamName = ""; +}; + +class Team +{ +public: + Team(); + + int id() const; + void setId(int newId); + + bool status() const; + void setStatus(bool newStatus); + + QString name() const; + void setName(const QString &newName); + +private: + int _id = 0; + bool _status = true; + QString _name = ""; +}; + +class Stages +{ +public: + Stages(); + + int id() const; + void setId(int newId); + + QDateTime StartDate() const; + void setStartDate(const QDateTime &newStartDate); + + QDateTime FinishDate() const; + void setFinishDate(const QDateTime &newFinishDate); + + int expenses() const; + void setExpenses(int newExpenses); + + QString nameWorker() const; + void setNameWorker(const QString &newNameWorker); + + int idWorker() const; + void setIdWorker(int newIdWorker); + + QString name() const; + void setName(const QString &newName); + + bool completed() const; + void setCompleted(bool newCompleted); + +private: + int _id = 0; + QString _name = ""; + QDateTime _StartDate = QDateTime(); + QDateTime _FinishDate = QDateTime(); + bool _completed = ""; + int _expenses = 0; + int _idWorker = 0; + QString _nameWorker = ""; +}; + +class DeviceType +{ +public: + DeviceType(); + + int id() const; + void setId(int newId); + + QString name() const; + void setName(const QString &newName); + +private: + int _id = 0; + QString _name = ""; +}; + +class DeviceStructureElement +{ +public: + DeviceStructureElement(); + + int id() const; + void setId(int newId); + + QString name() const; + void setName(const QString &newName); + + QString description() const; + void setDescription(const QString &newDescription); + + int count() const; + void setCount(int newCount); + + QString nameType() const; + void setNameType(const QString &newNameType); + +private: + int _id = 0; + QString _name = ""; + QString _description = ""; + int _count = 1; + QString _nameType = ""; +}; + +class DeviceModel +{ +public: + DeviceModel(); + + int id() const; + void setId(int newId); + + QString name() const; + void setName(const QString &newName); + + QString description() const; + void setDescription(const QString &newDescription); + + int workEfficiency() const; + void setWorkEfficiency(int newWorkEfficiency); + + int reliability() const; + void setReliability(int newReliability); + + int durability() const; + void setDurability(int newDurability); + + QDateTime CreateDate() const; + void setCreateDate(const QDateTime &newCreateDate); + + QList structureElements() const; + void setStructureElements(const QList &newStructureElements); + + int idType() const; + void setIdType(int newIdType); + + QString nameType() const; + void setNameType(const QString &newNameType); + +private: + int _id = 0; + QString _name = ""; + QString _description = ""; + int _workEfficiency = 0; + int _reliability = 0; + int _durability = 0; + int _idType = 0; + QString _nameType = ""; + QDateTime _CreateDate = QDateTime(); + QList _structureElements; +}; + +class Project +{ +public: + Project(); + + int id() const; + void setId(int newId); + + QString description() const; + void setDescription(const QString &newDescription); + + QDateTime StartProjectDate() const; + void setStartProjectDate(const QDateTime &newStartProjectDate); + + QDateTime FinishProjectDate() const; + void setFinishProjectDate(const QDateTime &newFinishProjectDate); + + double budget() const; + void setBudget(double newBudget); + + int idStages() const; + void setIdStages(int newIdStages); + + QString nameStages() const; + void setNameStages(const QString &newNameStages); + + int idTeam() const; + void setIdTeam(int newIdTeam); + + QString nameTeam() const; + void setNameTeam(const QString &newNameTeam); + + DeviceModel deviceModel() const; + void setDeviceModel(const DeviceModel &newDeviceModel); + + bool isLiked() const; + void setIsLiked(bool newIsLiked); + + bool isReady() const; + void setIsReady(bool newIsReady); + + Stages stages() const; + void setStages(const Stages &newStages); + + QString name() const; + void setName(const QString &newName); + +private: + int _id = 0; + QString _description = ""; + QDateTime _StartProjectDate = QDateTime(); + QDateTime _FinishProjectDate = QDateTime(); + double _budget = 1; + int _idStages = 0; + QString _nameStages = ""; + int _idTeam = 0; + QString _nameTeam = ""; + DeviceModel _deviceModel; + Stages _stages; + bool _isLiked = false; + bool _isReady = true; + QString _name = ""; +}; + +#endif // TYPES_H