From 4f14cddbed34af50cb91fc7d8dbed0383edb9ec3 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 18 Nov 2025 12:58:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=9F=D0=9F=20=D0=B2=20sendQueryToDB=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCS/Андрей/Board.md | 2 + DataBaseLMS/tasksAmmFim.h | 18 ++++++ .../tasks/ammtaskswidget.cpp | 64 ++++++++++++------- InstructorsAndTrainees/tasks/ammtaskswidget.h | 4 +- .../tasks/dialoglistsubproc.cpp | 23 +++++-- .../tasks/dialoglistsubproc.h | 6 +- .../tasks/fimtaskswidget.cpp | 1 - InstructorsAndTrainees/tasks/fimtaskswidget.h | 2 - InstructorsAndTrainees/tasks/listsubproc.cpp | 63 ++++++++++++++++++ InstructorsAndTrainees/tasks/listsubproc.h | 10 ++- InstructorsAndTrainees/tasks/listsubproc.ui | 36 ++++++++++- InstructorsAndTrainees/tasks/module.h | 17 +---- 12 files changed, 193 insertions(+), 53 deletions(-) diff --git a/DOCS/Андрей/Board.md b/DOCS/Андрей/Board.md index faa2f73..4cd05b7 100644 --- a/DOCS/Андрей/Board.md +++ b/DOCS/Андрей/Board.md @@ -57,6 +57,8 @@ kanban-plugin: board - [ ] Зарефакторить databaselms_PostgreSQL.cpp (возможно, нужно использовать транзакции при восстановлении БД!) - [ ] При долгой работе загибается главное окно (предположительно из-за лога) +- [ ] Отображать текущую версию data в статус баре +- [ ] Сделать крутилку на начальную загрузку Сервера ## GUI Messenger diff --git a/DataBaseLMS/tasksAmmFim.h b/DataBaseLMS/tasksAmmFim.h index e87c75d..abcb265 100644 --- a/DataBaseLMS/tasksAmmFim.h +++ b/DataBaseLMS/tasksAmmFim.h @@ -5,6 +5,22 @@ #include #include "DataBaseLMS_global.h" +struct ModeList +{ + bool demo = false; + bool train = false; + bool exam = false; + bool autoM = false; +}; + +struct SubProc +{ + QString dmCode; + QString title; + + ModeList modeList; +}; + class DATABASELMS_EXPORT ProcedureID { public: @@ -105,6 +121,8 @@ public: QList malfunctionList; // список неисправностей FIMReport report; // отчет по выполнению "fim" + QList listSubProc; + static int lastID; }; diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 5103a8c..23922f6 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -362,11 +362,48 @@ void AMMtasksWidget::assignTaskAMMtoTrainee() if(taskNew.getID()) { - emit signal_AssignedTask(); - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &taskNew); + //QList listSubProc; + + if(selectSubProcForAssignTaskAMM(taskNew, &taskNew.listSubProc)) + { + if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &taskNew); + } + } } } +bool AMMtasksWidget::selectSubProcForAssignTaskAMM(TaskAmmFim taskNew, QList* listSubProc) +{ + bool result = false; + + dlgListSubProc = new DialogListSubProc(connectorToServer, this); + dlgListSubProc->setTask(&taskNew); + + switch( dlgListSubProc->exec() ) + { + case QDialog::Accepted: + { + //Здесь нужно забрать список отмеченных подпроцедур + result = dlgListSubProc->getListCheckedSubProc(listSubProc); + break; + } + case QDialog::Rejected: + break; + default: + break; + } + + if(dlgListSubProc) + { + delete dlgListSubProc; + dlgListSubProc = nullptr; + } + + return result; +} + void AMMtasksWidget::setCurrentTask(int id) { for(int i = 0; i < treeWidget->topLevelItemCount(); i++) @@ -433,8 +470,7 @@ void AMMtasksWidget::on_btnCheck_clicked() void AMMtasksWidget::on_btnAssignTask_clicked() { - if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted) - assignTaskAMMtoTrainee(); + assignTaskAMMtoTrainee(); } void AMMtasksWidget::on_btnOnlyActive_clicked() @@ -464,24 +500,8 @@ void AMMtasksWidget::on_treeWidgetDoubleClicked(QTreeWidgetItem *item, int colum } else - {//Отображаем перечень подпроцедур - TaskAmmFim task = taskTreePreparation->getTaskAMMbyID(id); - - if(!task.getID()) - return; - - dlgListSubProc = new DialogListSubProc(connectorToServer, this); - dlgListSubProc->setTask(&task); - dlgListSubProc->exec(); - - //if(dlgListSubProc->getFlChanged()) - //waitAnimationWidget->showWithPlay(); - - if(dlgListSubProc) - { - delete dlgListSubProc; - dlgListSubProc = nullptr; - } + { + assignTaskAMMtoTrainee(); } } diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 970dec4..be4bb2f 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -65,14 +65,14 @@ private: void loadTasksAMM(bool flRequestFirst = true); void assignTaskAMMtoTrainee(); + bool selectSubProcForAssignTaskAMM(TaskAmmFim taskNew, QList* listSubProc); + void setCurrentTask(int id); Q_SIGNALS: void signal_prepareAMMListItems(QByteArray array, bool flOnlyActive, bool flRequestFirst); void signal_prepareAMMListItemsForTrainee(QList listTask); - void signal_AssignedTask(); - void signal_stopParserPreparation(); void signal_countTasksAMMforTraineeChanged(int trainee_id, int count); diff --git a/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp b/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp index d961de5..4c9ec42 100644 --- a/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp +++ b/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp @@ -7,12 +7,13 @@ DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidg | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint), - listSubProc(nullptr) + listSubProcCtrl(nullptr) { - listSubProc = new ListSubProc(connectorToServer, this); + listSubProcCtrl = new ListSubProc(connectorToServer, this); + connect(listSubProcCtrl, &ListSubProc::signal_Accepted, this, &DialogListSubProc::slot_Accepted); QHBoxLayout *layout = new QHBoxLayout(this); - layout->addWidget(listSubProc); + layout->addWidget(listSubProcCtrl); this->setWindowTitle(tr("List subprocedures")); this->setMinimumSize(1400, 700); @@ -21,15 +22,25 @@ DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidg DialogListSubProc::~DialogListSubProc() { - delete listSubProc; + delete listSubProcCtrl; } void DialogListSubProc::closeEvent(QCloseEvent *event) { - listSubProc->close(); + listSubProcCtrl->close(); +} + +void DialogListSubProc::slot_Accepted() +{ + this->accept(); } void DialogListSubProc::setTask(TaskAmmFim *task) { - listSubProc->setTask(task); + listSubProcCtrl->setTask(task); +} + +bool DialogListSubProc::getListCheckedSubProc(QList* listSubProc) +{ + return listSubProcCtrl->getListCheckedSubProc(listSubProc); } diff --git a/InstructorsAndTrainees/tasks/dialoglistsubproc.h b/InstructorsAndTrainees/tasks/dialoglistsubproc.h index eab583c..4951108 100644 --- a/InstructorsAndTrainees/tasks/dialoglistsubproc.h +++ b/InstructorsAndTrainees/tasks/dialoglistsubproc.h @@ -16,11 +16,15 @@ public: void closeEvent(QCloseEvent *event) override; +public slots: + void slot_Accepted(); + public: void setTask(TaskAmmFim* task); + bool getListCheckedSubProc(QList* listSubProcCtrl); private: - ListSubProc* listSubProc; + ListSubProc* listSubProcCtrl; }; #endif // DIALOGLISTSUBPROC_H diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 942dd29..8495057 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -374,7 +374,6 @@ void FIMtasksWidget::assignTaskFIMtoTrainee() } } - emit signal_AssignedTask(); connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, idTraineeSelected, &taskNew); updateTaskItem(current); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 1df9f8f..979fb7b 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -64,8 +64,6 @@ Q_SIGNALS: void signal_prepareFIMListItems(QByteArray array); void signal_prepareFIMListItemsForTrainee(QList listTask); - void signal_AssignedTask(); - void signal_stopParserPreparation(); void signal_countTasksFIMforTraineeChanged(int trainee_id, int count); diff --git a/InstructorsAndTrainees/tasks/listsubproc.cpp b/InstructorsAndTrainees/tasks/listsubproc.cpp index 9a8aab7..b3fd724 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.cpp +++ b/InstructorsAndTrainees/tasks/listsubproc.cpp @@ -69,6 +69,25 @@ void ListSubProc::setTask(TaskAmmFim *task) waitAnimationWidget->hideWithStop(); } +bool ListSubProc::getListCheckedSubProc(QList* listSubProc) +{ + //Заполнение списка отмеченных ПП + for (int i = 0; i < treeWidget->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = treeWidget->topLevelItem(i); + if(item->checkState(0) == Qt::Checked) + { + SubProc subProc; + subProc.dmCode = item->text(ColumnsTreeSubProc::clmnSP_code); + subProc.title = item->text(ColumnsTreeSubProc::clmnSP_title); + subProc.modeList = parseCanplay(item->text(ColumnsTreeSubProc::clmnSP_canplay)); + listSubProc->append(subProc); + } + } + + return true; +} + void ListSubProc::preparationTreeWidget() { treeWidget->setColumnCount(ColumnsTreeSubProc::clmnSP_count); @@ -131,6 +150,45 @@ QString ListSubProc::buildCanplay(ModeList modeList) return canplay; } +ModeList ListSubProc::parseCanplay(QString canplay) +{ + ModeList modeList; + + if(canplay == "") + { + modeList.demo = false; + modeList.train = false; + modeList.exam = false; + modeList.autoM = false; + } + else + { + QStringList list = canplay.split("/"); + + if(list.at(0) == "+") + modeList.demo = true; + else + modeList.demo = false; + + if(list.at(1) == "+") + modeList.train = true; + else + modeList.train = false; + + if(list.at(2) == "+") + modeList.exam = true; + else + modeList.exam = false; + + if(list.at(3) == "+") + modeList.autoM = true; + else + modeList.autoM = false; + } + + return modeList; +} + void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode) { if(this->task.ammProcedure.dmCode == dmCode) @@ -155,3 +213,8 @@ void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode) waitAnimationWidget->hideWithStop(); } } + +void ListSubProc::on_btnAssign_clicked() +{ + emit signal_Accepted(); +} diff --git a/InstructorsAndTrainees/tasks/listsubproc.h b/InstructorsAndTrainees/tasks/listsubproc.h index 46b7e42..88c201b 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.h +++ b/InstructorsAndTrainees/tasks/listsubproc.h @@ -30,17 +30,25 @@ public: void changeEvent(QEvent * event) override; void setTask(TaskAmmFim* task); + bool getListCheckedSubProc(QList* listSubProc); private: void preparationTreeWidget(); void reSetHeadTreeWidget(); void setWidthColumnsTree(); int calculateWidth_0Column(); - QString buildCanplay(ModeList modeList); + QString buildCanplay(ModeList modeList); //TODO Дублируется в DocsUpdater (Server)! + ModeList parseCanplay(QString canplay); //TODO Дублируется в DocsUpdater (Server)! public slots: void slot_UpdateSubProcForDMCode(QString dmCode); +private slots: + void on_btnAssign_clicked(); + +signals: + void signal_Accepted(); + private: Ui::ListSubProc *ui; diff --git a/InstructorsAndTrainees/tasks/listsubproc.ui b/InstructorsAndTrainees/tasks/listsubproc.ui index 72a46b7..68811f0 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.ui +++ b/InstructorsAndTrainees/tasks/listsubproc.ui @@ -39,7 +39,7 @@ - Subprocedures + Select subprocedures allowed to run in Auto mode @@ -48,10 +48,42 @@ + + + + + + + 50 + 50 + + + + Assign + + + + :/resources/icons/circleGreen.png:/resources/icons/circleGreen.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + + + - + + + diff --git a/InstructorsAndTrainees/tasks/module.h b/InstructorsAndTrainees/tasks/module.h index 213972a..018a7ad 100644 --- a/InstructorsAndTrainees/tasks/module.h +++ b/InstructorsAndTrainees/tasks/module.h @@ -2,6 +2,7 @@ #define MODULE_H #include #include +#include "tasksAmmFim.h" #include "instructorsAndTrainees_global.h" enum ModuleType @@ -10,22 +11,6 @@ enum ModuleType TYPE_DM = 1 }; -struct ModeList -{ - bool demo = false; - bool train = false; - bool exam = false; - bool autoM = false; -}; - -struct SubProc -{ - QString dmCode; - QString title; - - ModeList modeList; -}; - class INSTRUCTORSANDTRAINEES_EXPORT Module { public: