From 74ae7f7f75879a1322d3be0a6ad56b975a76db8d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 28 Jan 2025 15:38:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20FIM=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D0=93=D0=A3=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 29 ++++++++++++++++ DataBaseLMS/databaselms.h | 1 + DataBaseLMS/interfacedatabaselms.cpp | 5 +++ DataBaseLMS/interfacedatabaselms.h | 1 + .../Core/recognizesystem.cpp | 23 +++++++++++++ .../connectorToServer/Core/recognizesystem.h | 1 + .../connectorToServer/connectortoserver.cpp | 20 +++++++++++ .../connectorToServer/connectortoserver.h | 3 ++ .../tasks/fimtaskswidget.cpp | 33 ++++++++++++++++++- InstructorsAndTrainees/tasks/fimtaskswidget.h | 5 +++ .../trainees/viewertrainees.cpp | 1 + ServerLMS/Systems/Parsers/dbanswerparser.cpp | 23 +++++++++++++ ServerLMS/Systems/Parsers/dbanswerparser.h | 1 + ServerLMS/Systems/processingsystem.cpp | 5 +++ ServerLMS/providerdblms.cpp | 18 ++++++++++ ServerLMS/providerdblms.h | 1 + ServerLMS/resources.qrc | 1 + ServerLMS/resources/blankXML/ListTasksFIM.xml | 3 ++ 18 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 ServerLMS/resources/blankXML/ListTasksFIM.xml diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index b714b8e..06ecb88 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -540,6 +540,35 @@ int DataBaseLMS::deleteTaskFIM(int id_task) return queryExecInt(queryStr); } +QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) +{ + QList listTasks; + + QString queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, " + "trainees.trainee_id " + "FROM public.tasks_fim JOIN public.trainees ON trainees.trainee_id = tasks_fim.trainee_task " + "WHERE tasks_fim.trainee_task = %1 " + "ORDER BY tasks_fim.task_id ASC").arg( + id_trainee); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Задача + TaskAmmFim task; + + task.setID(query.value(0).toInt()); + task.title = query.value(1).toString(); + + listTasks.append(task); + } + } + + return listTasks; +} + Trainee DataBaseLMS::selectTrainee(int id_trainee) { Trainee trainee; diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 3a4a440..3f5ea81 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -62,6 +62,7 @@ protected: int insertTaskFIM(int id_trainee); int updateTaskFIM(TaskAmmFim task); int deleteTaskFIM(int id_task); + QList selectTasksFIMofTrainee(int id_trainee); //Обучаемый Trainee selectTrainee(int id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 906e590..00652ca 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -301,6 +301,11 @@ QList InterfaceDataBaseLMS::getListTasksAMMofTrainee(int id_trainee) return selectTasksAMMofTrainee(id_trainee); } +QList InterfaceDataBaseLMS::getListTasksFIMofTrainee(int id_trainee) +{ + return selectTasksFIMofTrainee(id_trainee); +} + int InterfaceDataBaseLMS::newTaskFIM(int id_trainee) { return insertTaskFIM(id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 172a49b..6fd5f00 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -73,6 +73,7 @@ public: int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); QList getListTasksAMMofTrainee(int id_trainee); + QList getListTasksFIMofTrainee(int id_trainee); int newTaskFIM(int id_trainee); int delTaskFIM(int id); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index d4d4e72..9750900 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -275,6 +275,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket) case TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS: case TYPE_XMLANSWER_QUERY_DB__LIST_TASKS: case TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE: + case TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE: { QByteArray array; stream.startTransaction(); @@ -694,6 +695,28 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array emit sigAnswerQueryToDB_ListTasksAMMforTrainee(listTasks, trainee_id); } break; + case TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE: + { + QList listTasks; + int trainee_id = 0; + QDomNode listNode = commonDOM.namedItem("ListTasksFIM"); + trainee_id = listNode.toElement().attribute("trainee_id").toInt(); + + for(int i = 0; i < listNode.childNodes().count(); i++) + { + QDomNode taskNode = listNode.childNodes().at(i); + if(taskNode.nodeName() == "taskFIM") + {//Задача + TaskAmmFim task; + task.setID(taskNode.toElement().attribute("task_id").toInt()); + task.title = taskNode.toElement().attribute("title"); + + listTasks.append(task); + } + } + emit sigAnswerQueryToDB_ListTasksFIMforTrainee(listTasks, trainee_id); + } + break; }; } diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index 2648ede..de47193 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -50,6 +50,7 @@ signals: void sigAnswerQueryToDB_ListClassrooms(QList listClassrooms); void sigAnswerQueryToDB_ListTasks(QList listTasks); void sigAnswerQueryToDB_ListTasksAMMforTrainee(QListlistTasks, int trainee_id); + void sigAnswerQueryToDB_ListTasksFIMforTrainee(QListlistTasks, int trainee_id); void sigAnswerQueryTasksXML_FIM(QByteArray array); void sigAnswerQueryTasksXML_AMM(QByteArray array); void sigShowServerDataList(QList *versions); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index e6a7fdd..27e1637 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -156,6 +156,14 @@ QList ConnectorToServer::getListTasksAMMforTrainee(int trainee_id) return QList(); } +QList ConnectorToServer::getListTasksFIMforTrainee(int trainee_id) +{ + if(mapTasksFIM.contains(trainee_id)) + return mapTasksFIM.value(trainee_id); + else + return QList(); +} + bool ConnectorToServer::isArchivedInstructor(int id) { for(Instructor instructor : listInstructors) @@ -332,6 +340,17 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList listTasks, int trainee_id) +{ + //Удаляем старые задачи этого обучаемого + mapTasksFIM.remove(trainee_id); + + //Добавляем новые + mapTasksFIM.insert(trainee_id, listTasks); + + emit signal_UpdateTasksFIMforTrainee(trainee_id); +} + void ConnectorToServer::slot_AnswerQueryTasksXML_FIM(QByteArray array) { this->listTaskFimArray = array; @@ -405,6 +424,7 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasks,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasks); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksAMMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee); + connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksFIMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksFIMforTrainee); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_FIM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_FIM); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_AMM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_AMM); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 337ea71..b7dee66 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -46,6 +46,7 @@ public: QList getListClassrooms(); QList getListTasks(); QList getListTasksAMMforTrainee(int trainee_id); + QList getListTasksFIMforTrainee(int trainee_id); bool isArchivedInstructor(int id); bool isAdminInstructor(int id); @@ -75,6 +76,7 @@ public slots: void slot_AnswerQueryToDB_ListClassrooms(QList listClassrooms); void slot_AnswerQueryToDB_ListTasks(QList listTasks); void slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList listTasks, int trainee_id); + void slot_AnswerQueryToDB_ListTasksFIMforTrainee(QList listTasks, int trainee_id); void slot_AnswerQueryTasksXML_FIM(QByteArray array); void slot_AnswerQueryTasksXML_AMM(QByteArray array); @@ -133,6 +135,7 @@ private: QList listClassrooms; QList listTasks; QMap> mapTasksAMM; + QMap> mapTasksFIM; QByteArray listTaskFimArray; QByteArray listTaskAmmArray; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 721dffb..22a3833 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -14,7 +14,8 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty treeWidget(nullptr), type(type), userName(""), - loginTraineeSelected("") + loginTraineeSelected(""), + idTraineeSelected(0) { ui->setupUi(this); @@ -159,6 +160,9 @@ void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) void FIMtasksWidget::fillTree() { + //Обновление дерева + treeWidget->clear(); + for(int i = 0; i < listTaskAmmFim.count(); i++) {/*Задачи*/ TaskAmmFim* task = listTaskAmmFim.at(i); @@ -203,6 +207,19 @@ void FIMtasksWidget::fillTree() } } +void FIMtasksWidget::prepareListTasksForTrainee(QList listTask) +{ + deleteAllTaskAmmFim(); + + for(TaskAmmFim task : listTask) + { + TaskAmmFim* newTask = new TaskAmmFim(); + *newTask = task; + + listTaskAmmFim.append(newTask); + } +} + void FIMtasksWidget::preparationTreeWidget() { treeWidget->setColumnCount(2); @@ -228,6 +245,7 @@ void FIMtasksWidget::slot_traineeSelected(QString login) { qDebug() << "FIMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); loginTraineeSelected = login; + idTraineeSelected = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); if(type == TypeList::listForTrainee) { @@ -236,6 +254,19 @@ void FIMtasksWidget::slot_traineeSelected(QString login) } } +void FIMtasksWidget::slot_UpdateTasksFIMforTrainee(int trainee_id) +{ + if(type == TypeList::listForTrainee) + { + if(idTraineeSelected == trainee_id) + { + QList listTask = connectorToServer->getListTasksFIMforTrainee(trainee_id); + prepareListTasksForTrainee(listTask); + fillTree(); + } + } +} + void FIMtasksWidget::loadTasksFIM() { //Обновление дерева diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index da6d47e..e9b90d5 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -52,11 +52,15 @@ public Q_SLOTS: //слот обработки сигнала о выборе обучаемого void slot_traineeSelected(QString login); + void slot_UpdateTasksFIMforTrainee(int trainee_id); + private: TaskAmmFim* getTaskByID(int id); void loadFIMtasksFromXML(QByteArray array); void fillTree(); + void prepareListTasksForTrainee(QList listTask); + void preparationTreeWidget(); void reSetHeadTreeWidget(); void loadTasksFIM(); @@ -75,6 +79,7 @@ private: QString userName; QList listTaskAmmFim; QString loginTraineeSelected; + int idTraineeSelected; }; #endif // FIMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 9fb0099..83bebea 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -21,6 +21,7 @@ ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *pa connect(this, &ViewerTrainees::signal_traineeSelected, ammTasksWidget, &AMMtasksWidget::slot_traineeSelected); connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMMforTrainee, ammTasksWidget, &AMMtasksWidget::slot_UpdateTasksAMMforTrainee); + connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIMforTrainee, fimTasksWidget, &FIMtasksWidget::slot_UpdateTasksFIMforTrainee); ui->verticalLayout_2->addWidget(ammTasksWidget); ui->verticalLayout_2->addWidget(fimTasksWidget); diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.cpp b/ServerLMS/Systems/Parsers/dbanswerparser.cpp index abe1dc2..ee3f8cf 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.cpp +++ b/ServerLMS/Systems/Parsers/dbanswerparser.cpp @@ -131,3 +131,26 @@ QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList return commonDOM.toByteArray(); } + +QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id) +{ + QDomDocument commonDOM; + if(! dataParser->loadBlankXML(":/resources/blankXML/ListTasksFIM.xml", &commonDOM)) + return QByteArray(); + + QDomNode listNode = commonDOM.namedItem("ListTasksFIM"); + listNode.toElement().setAttribute("trainee_id", QString::number(trainee_id)); + + for(TaskAmmFim task : *listTasks) + { + //Задача + QDomNode taskNode = commonDOM.createElement("taskFIM"); + listNode.appendChild(taskNode); + taskNode.toElement().setAttribute("task_id", QString::number(task.getID())); + taskNode.toElement().setAttribute("title", task.title); + } + + dataParser->saveDOMtoXML("ListTasksFIM.xml", &commonDOM); + + return commonDOM.toByteArray(); +} diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.h b/ServerLMS/Systems/Parsers/dbanswerparser.h index e86af15..c3c0ca9 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.h +++ b/ServerLMS/Systems/Parsers/dbanswerparser.h @@ -21,6 +21,7 @@ public: QByteArray listTasks(bool result, QList *listTasks); QByteArray listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id); + QByteArray listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id); signals: private: diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 0ca0531..6833c26 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -265,6 +265,11 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE: { + QList listTasks = providerDBLMS->GetListTasksFIMofTrainee(id); + + arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + break; } } diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 2de59ec..7cd4e6f 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -347,3 +347,21 @@ QList ProviderDBLMS::GetListTasksAMMofTrainee(int id_trainee) mtxAccess.unlock(); return listTasks; } + +QList ProviderDBLMS::GetListTasksFIMofTrainee(int id_trainee) +{ + QList listTasks; + + mtxAccess.lock(); + + if(! dbLMS->DBisConnected()) + { + mtxAccess.unlock(); + return listTasks; + } + + listTasks = dbLMS->getListTasksFIMofTrainee(id_trainee); + + mtxAccess.unlock(); + return listTasks; +} diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 298d6c8..bb138ac 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -51,6 +51,7 @@ public: int editTaskFIM(TaskAmmFim task); QList GetListTasksAMMofTrainee(int id_trainee); + QList GetListTasksFIMofTrainee(int id_trainee); Q_SIGNALS: //сигнал о блокировке авторизации diff --git a/ServerLMS/resources.qrc b/ServerLMS/resources.qrc index 3a9591b..73ebc38 100644 --- a/ServerLMS/resources.qrc +++ b/ServerLMS/resources.qrc @@ -6,5 +6,6 @@ resources/icons/switchOff.png resources/icons/switchOn.png resources/blankXML/ListTasksAMM.xml + resources/blankXML/ListTasksFIM.xml diff --git a/ServerLMS/resources/blankXML/ListTasksFIM.xml b/ServerLMS/resources/blankXML/ListTasksFIM.xml new file mode 100644 index 0000000..c080f12 --- /dev/null +++ b/ServerLMS/resources/blankXML/ListTasksFIM.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file