From bfe586ee2ec79c69ef4952bc656d277442ef9b79 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 24 Dec 2025 11:58:32 +0300 Subject: [PATCH 1/4] Report upgrade WH --- LibDataBaseInterface/CMakeLists.txt | 3 +- .../databaselms_tasks_amm.cpp | 314 +++++++++++++ ...ms_tasks.cpp => databaselms_tasks_fim.cpp} | 442 +++++------------- LibDataBaseInterface/databaselms_trainees.cpp | 15 +- LibDataBaseInterface/tasksAmmFim.cpp | 4 +- LibDataBaseInterface/tasksAmmFim.h | 25 +- .../connectorToServer/Core/dataparser.cpp | 4 +- .../Core/recognizesystem.cpp | 2 + .../tasks/checkertask.cpp | 67 +++ LibInstructorsAndTrainees/tasks/checkertask.h | 1 + .../tasks/fimtaskswidget.cpp | 6 +- .../tasks/tasktreepreparation.cpp | 6 +- .../tasks/tasktreepreparation.h | 5 +- LibServer/Systems/Parsers/dbanswerparser.cpp | 2 + LibServer/Systems/Parsers/processparser.cpp | 17 + 15 files changed, 584 insertions(+), 329 deletions(-) create mode 100644 LibDataBaseInterface/databaselms_tasks_amm.cpp rename LibDataBaseInterface/{databaselms_tasks.cpp => databaselms_tasks_fim.cpp} (72%) diff --git a/LibDataBaseInterface/CMakeLists.txt b/LibDataBaseInterface/CMakeLists.txt index fbc6e01..89fdc0e 100644 --- a/LibDataBaseInterface/CMakeLists.txt +++ b/LibDataBaseInterface/CMakeLists.txt @@ -5,7 +5,8 @@ common_info_for_project(DataBaseInterface) add_library(DataBaseInterface SHARED DataBaseLMS_global.h databaselms.cpp - databaselms_tasks.cpp + databaselms_tasks_amm.cpp + databaselms_tasks_fim.cpp databaselms_groups.cpp databaselms_users.cpp databaselms_instructors.cpp diff --git a/LibDataBaseInterface/databaselms_tasks_amm.cpp b/LibDataBaseInterface/databaselms_tasks_amm.cpp new file mode 100644 index 0000000..8046256 --- /dev/null +++ b/LibDataBaseInterface/databaselms_tasks_amm.cpp @@ -0,0 +1,314 @@ +#include "databaselms.h" + +#include +#include +#include + +int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee) +{ + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки + + queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, fk_trainee_id) " + "VALUES ('%1', '%2', %3) " + "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.title, + task.ammProcedure.dmCode, + QString::number(id_trainee)); + + int task_id = queryExecInt(queryStr); + if(!task_id) + { + resBool = db->rollback(); + return 0; + } + + + for(SubProc subProc : task.listSubProc) + { + subProc.setTitle(subProc.getTitle().replace("'", "''")); //Задваиваем одинарные кавычки + + queryStr = QString("INSERT INTO public.subprocs (dm_code, title, canplay, fk_task_amm_id) " + "VALUES ('%1', '%2', '%3', %4) " + "RETURNING subprocs.subproc_id").arg( + subProc.getDmCode(), + subProc.getTitle(), + subProc.getModeListStr(), + QString::number(task_id)); + + int subproc_id = queryExecInt(queryStr); + if(!subproc_id) + { + resBool = db->rollback(); + return 0; + } + } + + + resBool = db->commit(); + return task_id; +} + +int DataBaseLMS::updateTaskAMM(TaskAmmFim task) +{ + task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки + + QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2', status = '%3' " + "WHERE task_id = %4 " + "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.title, + task.ammProcedure.dmCode, + task.status, + QString::number(task.getID()) ); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateStatusTaskAMM(int task_id, QString status) +{ + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT users.user_id " + "FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY users.user_id ASC").arg( + QString::number(task_id)); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Обучаемый + id_trainee = query.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + + queryStr = QString("UPDATE public.tasks_amm SET status = '%1' " + "WHERE task_id = %2 " + "RETURNING tasks_amm.task_id").arg( + status, + QString::number(task_id) ); + + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; +} + +int DataBaseLMS::deleteTaskAMM(int id_task) +{ + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT users.user_id " + "FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY users.user_id ASC").arg( + QString::number(id_task)); + + QSqlQuery queryUserSEL = QSqlQuery(*db); + + if(queryExec(queryStr, &queryUserSEL)) + { + if (queryUserSEL.first()) + {//Обучаемый + id_trainee = queryUserSEL.value(0).toInt(); + } + } + if(!id_trainee) + { + resBool = db->rollback(); + return 0; + } + + + queryStr = QString("DELETE FROM public.subprocs " + "WHERE fk_task_amm_id = %1 ").arg( + QString::number(id_task)); + + QSqlQuery querySubProcDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &querySubProcDEL)) + { + resBool = db->rollback(); + return 0; + } + + + //-------------------- + queryStr = QString("DELETE FROM public.tasks_amm " + "WHERE task_id = %1 " + "RETURNING tasks_amm.task_id").arg( + QString::number(id_task)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; +} + +QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) +{ + QList listTasks; + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, " + "users.user_id " + "FROM public.tasks_amm JOIN public.users ON users.user_id = tasks_amm.fk_trainee_id " + "WHERE tasks_amm.fk_trainee_id = %1 " + "ORDER BY tasks_amm.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.ammProcedure.title = query.value(1).toString(); + task.ammProcedure.dmCode = query.value(2).toString(); + task.status = query.value(3).toString(); + + //Выгребаем все subproc для этой задачи + queryStr = QString("SELECT subprocs.subproc_id, subprocs.dm_code, subprocs.title, subprocs.canplay, " + "tasks_amm.task_id " + "FROM public.subprocs JOIN public.tasks_amm ON tasks_amm.task_id = subprocs.fk_task_amm_id " + "WHERE subprocs.fk_task_amm_id = %1 " + "ORDER BY subprocs.subproc_id ASC").arg( + task.getID()); + + QSqlQuery querySubProc = QSqlQuery(*db); + + if(queryExec(queryStr, &querySubProc)) + { + while (querySubProc.next()) + {//Подпроцедура + SubProc subProc; + int subproc_id = 0; + + subproc_id = querySubProc.value(0).toString().toInt(); + subProc.setDmCode(querySubProc.value(1).toString()); + subProc.setTitle(querySubProc.value(2).toString()); + subProc.setModeListStr(querySubProc.value(3).toString()); + + task.listSubProc.append(subProc); + }; + } + else + { + resBool = db->rollback(); + return QList(); + } + + listTasks.append(task); + } + } + else + { + resBool = db->rollback(); + return QList(); + } + + resBool = db->commit(); + return listTasks; +} + +TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task) +{ + TaskAmmFim task; + + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status " + "FROM public.tasks_amm " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY tasks_amm.task_id ASC").arg( + id_task); + + QSqlQuery query = QSqlQuery(*db); + + if(queryExec(queryStr, &query)) + { + if (query.first()) + {//Задача + task.setID(query.value(0).toInt()); + task.ammProcedure.title = query.value(1).toString(); + task.ammProcedure.dmCode = query.value(2).toString(); + task.status = query.value(3).toString(); + + //Выгребаем все subproc для этой задачи + queryStr = QString("SELECT subprocs.subproc_id, subprocs.dm_code, subprocs.title, subprocs.canplay, " + "tasks_amm.task_id " + "FROM public.subprocs JOIN public.tasks_amm ON tasks_amm.task_id = subprocs.fk_task_amm_id " + "WHERE subprocs.fk_task_amm_id = %1 " + "ORDER BY subprocs.subproc_id ASC").arg( + task.getID()); + + QSqlQuery querySubProc = QSqlQuery(*db); + + if(queryExec(queryStr, &querySubProc)) + { + while (querySubProc.next()) + {//Подпроцедура + SubProc subProc; + int subproc_id = 0; + + subproc_id = querySubProc.value(0).toString().toInt(); + subProc.setDmCode(querySubProc.value(1).toString()); + subProc.setTitle(querySubProc.value(2).toString()); + subProc.setModeListStr(querySubProc.value(3).toString()); + + task.listSubProc.append(subProc); + }; + } + else + { + resBool = db->rollback(); + return TaskAmmFim(); + } + } + } + else + { + resBool = db->rollback(); + return TaskAmmFim(); + } + + resBool = db->commit(); + return task; +} diff --git a/LibDataBaseInterface/databaselms_tasks.cpp b/LibDataBaseInterface/databaselms_tasks_fim.cpp similarity index 72% rename from LibDataBaseInterface/databaselms_tasks.cpp rename to LibDataBaseInterface/databaselms_tasks_fim.cpp index 71030b6..92d60e1 100644 --- a/LibDataBaseInterface/databaselms_tasks.cpp +++ b/LibDataBaseInterface/databaselms_tasks_fim.cpp @@ -4,316 +4,6 @@ #include #include -int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee) -{ - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки - - queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, fk_trainee_id) " - "VALUES ('%1', '%2', %3) " - "RETURNING tasks_amm.task_id").arg( - task.ammProcedure.title, - task.ammProcedure.dmCode, - QString::number(id_trainee)); - - int task_id = queryExecInt(queryStr); - if(!task_id) - { - resBool = db->rollback(); - return 0; - } - - - for(SubProc subProc : task.listSubProc) - { - subProc.setTitle(subProc.getTitle().replace("'", "''")); //Задваиваем одинарные кавычки - - queryStr = QString("INSERT INTO public.subprocs (dm_code, title, canplay, fk_task_amm_id) " - "VALUES ('%1', '%2', '%3', %4) " - "RETURNING subprocs.subproc_id").arg( - subProc.getDmCode(), - subProc.getTitle(), - subProc.getModeListStr(), - QString::number(task_id)); - - int subproc_id = queryExecInt(queryStr); - if(!subproc_id) - { - resBool = db->rollback(); - return 0; - } - } - - - resBool = db->commit(); - return task_id; -} - -int DataBaseLMS::updateTaskAMM(TaskAmmFim task) -{ - task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки - - QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2', status = '%3' " - "WHERE task_id = %4 " - "RETURNING tasks_amm.task_id").arg( - task.ammProcedure.title, - task.ammProcedure.dmCode, - task.status, - QString::number(task.getID()) ); - - return queryExecInt(queryStr); -} - -int DataBaseLMS::updateStatusTaskAMM(int task_id, QString status) -{ - QString queryStr; - bool resBool = false; - int id_trainee = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT users.user_id " - "FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id " - "WHERE tasks_amm.task_id = %1 " - "ORDER BY users.user_id ASC").arg( - QString::number(task_id)); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Обучаемый - id_trainee = query.value(0).toInt(); - } - } - if(!id_trainee) - { - resBool = db->rollback(); - return 0; - } - - - queryStr = QString("UPDATE public.tasks_amm SET status = '%1' " - "WHERE task_id = %2 " - "RETURNING tasks_amm.task_id").arg( - status, - QString::number(task_id) ); - - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - - resBool = db->commit(); - return id_trainee; -} - -int DataBaseLMS::deleteTaskAMM(int id_task) -{ - QString queryStr; - bool resBool = false; - int id_trainee = 0; - - resBool = db->transaction(); - - queryStr = QString("SELECT users.user_id " - "FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id " - "WHERE tasks_amm.task_id = %1 " - "ORDER BY users.user_id ASC").arg( - QString::number(id_task)); - - QSqlQuery queryUserSEL = QSqlQuery(*db); - - if(queryExec(queryStr, &queryUserSEL)) - { - if (queryUserSEL.first()) - {//Обучаемый - id_trainee = queryUserSEL.value(0).toInt(); - } - } - if(!id_trainee) - { - resBool = db->rollback(); - return 0; - } - - - queryStr = QString("DELETE FROM public.subprocs " - "WHERE fk_task_amm_id = %1 ").arg( - QString::number(id_task)); - - QSqlQuery querySubProcDEL = QSqlQuery(*db); - if(!queryExec(queryStr, &querySubProcDEL)) - { - resBool = db->rollback(); - return 0; - } - - - //-------------------- - queryStr = QString("DELETE FROM public.tasks_amm " - "WHERE task_id = %1 " - "RETURNING tasks_amm.task_id").arg( - QString::number(id_task)); - - if(!queryExecInt(queryStr)) - { - resBool = db->rollback(); - return 0; - } - - resBool = db->commit(); - return id_trainee; -} - -QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) -{ - QList listTasks; - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, " - "users.user_id " - "FROM public.tasks_amm JOIN public.users ON users.user_id = tasks_amm.fk_trainee_id " - "WHERE tasks_amm.fk_trainee_id = %1 " - "ORDER BY tasks_amm.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.ammProcedure.title = query.value(1).toString(); - task.ammProcedure.dmCode = query.value(2).toString(); - task.status = query.value(3).toString(); - - //Выгребаем все subproc для этой задачи - queryStr = QString("SELECT subprocs.subproc_id, subprocs.dm_code, subprocs.title, subprocs.canplay, " - "tasks_amm.task_id " - "FROM public.subprocs JOIN public.tasks_amm ON tasks_amm.task_id = subprocs.fk_task_amm_id " - "WHERE subprocs.fk_task_amm_id = %1 " - "ORDER BY subprocs.subproc_id ASC").arg( - task.getID()); - - QSqlQuery querySubProc = QSqlQuery(*db); - - if(queryExec(queryStr, &querySubProc)) - { - while (querySubProc.next()) - {//Подпроцедура - SubProc subProc; - int subproc_id = 0; - - subproc_id = querySubProc.value(0).toString().toInt(); - subProc.setDmCode(querySubProc.value(1).toString()); - subProc.setTitle(querySubProc.value(2).toString()); - subProc.setModeListStr(querySubProc.value(3).toString()); - - task.listSubProc.append(subProc); - }; - } - else - { - resBool = db->rollback(); - return QList(); - } - - listTasks.append(task); - } - } - else - { - resBool = db->rollback(); - return QList(); - } - - resBool = db->commit(); - return listTasks; -} - -TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task) -{ - TaskAmmFim task; - - QString queryStr; - bool resBool = false; - - resBool = db->transaction(); - - queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status " - "FROM public.tasks_amm " - "WHERE tasks_amm.task_id = %1 " - "ORDER BY tasks_amm.task_id ASC").arg( - id_task); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - if (query.first()) - {//Задача - task.setID(query.value(0).toInt()); - task.ammProcedure.title = query.value(1).toString(); - task.ammProcedure.dmCode = query.value(2).toString(); - task.status = query.value(3).toString(); - - //Выгребаем все subproc для этой задачи - queryStr = QString("SELECT subprocs.subproc_id, subprocs.dm_code, subprocs.title, subprocs.canplay, " - "tasks_amm.task_id " - "FROM public.subprocs JOIN public.tasks_amm ON tasks_amm.task_id = subprocs.fk_task_amm_id " - "WHERE subprocs.fk_task_amm_id = %1 " - "ORDER BY subprocs.subproc_id ASC").arg( - task.getID()); - - QSqlQuery querySubProc = QSqlQuery(*db); - - if(queryExec(queryStr, &querySubProc)) - { - while (querySubProc.next()) - {//Подпроцедура - SubProc subProc; - int subproc_id = 0; - - subproc_id = querySubProc.value(0).toString().toInt(); - subProc.setDmCode(querySubProc.value(1).toString()); - subProc.setTitle(querySubProc.value(2).toString()); - subProc.setModeListStr(querySubProc.value(3).toString()); - - task.listSubProc.append(subProc); - }; - } - else - { - resBool = db->rollback(); - return TaskAmmFim(); - } - } - } - else - { - resBool = db->rollback(); - return TaskAmmFim(); - } - - resBool = db->commit(); - return task; -} - - int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) { QString queryStr; @@ -340,12 +30,14 @@ int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) { malfanction.description = malfanction.description.replace("'", "''"); //Задваиваем одинарные кавычки - queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, fk_task_fim_id) " - "VALUES ('%1', '%2', '%3', %4) " + queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, go_name, obj_name, fk_task_fim_id) " + "VALUES ('%1', '%2', '%3', '%4', '%5', %6) " "RETURNING malfunctions.malfunction_id").arg( malfanction.num, malfanction.dmCode, malfanction.description, + malfanction.goName, + malfanction.objName, QString::number(task_id)); int malfunction_id = queryExecInt(queryStr); @@ -471,6 +163,17 @@ int DataBaseLMS::updateStatusTaskFIM(int task_id, QString status) return 0; } + queryStr = QString("DELETE FROM public.report_wh_items " + "WHERE fk_report_id = %1 ").arg( + QString::number(report_id)); + + QSqlQuery queryWhItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryWhItemsDEL)) + { + resBool = db->rollback(); + return 0; + } + queryStr = QString("DELETE FROM public.reports " "WHERE report_id = %1 ").arg( QString::number(report_id)); @@ -601,6 +304,17 @@ int DataBaseLMS::deleteTaskFIM(int id_task) return 0; } + queryStr = QString("DELETE FROM public.report_wh_items " + "WHERE fk_report_id = %1 ").arg( + QString::number(report_id)); + + QSqlQuery queryWhItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryWhItemsDEL)) + { + resBool = db->rollback(); + return 0; + } + queryStr = QString("DELETE FROM public.reports " "WHERE report_id = %1 ").arg( QString::number(report_id)); @@ -657,7 +371,7 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) task.status = query.value(2).toString(); //Выгребаем все malfunction для этой задачи - queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, " + queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, malfunctions.go_name, malfunctions.obj_name, " "tasks_fim.task_id " "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id " "WHERE malfunctions.fk_task_fim_id = %1 " @@ -677,6 +391,8 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) malfanction.num = queryMalf.value(1).toString(); malfanction.dmCode = queryMalf.value(2).toString(); malfanction.description = queryMalf.value(3).toString(); + malfanction.goName = queryMalf.value(4).toString(); + malfanction.objName = queryMalf.value(5).toString(); //Выгребаем сигналы для этой неисправности queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description " @@ -771,6 +487,35 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) resBool = db->rollback(); return QList(); } + + //Выгребаем все wh_item отчета + + queryStr = QString("SELECT report_wh_items.wh_item_id, report_wh_items.status, report_wh_items.go_name, report_wh_items.obj_name, report_wh_items.fk_report_id, report_wh_items.number " + "FROM public.report_wh_items " + "WHERE fk_report_id = %1 " + "ORDER BY report_wh_items.number ASC").arg( + QString::number(report_id)); + + QSqlQuery queryWhItems = QSqlQuery(*db); + + if(queryExec(queryStr, &queryWhItems)) + { + while (queryWhItems.next()) + {//report_wh_item + FIMReportWarehouseItem reportWhItem; + reportWhItem.id = queryWhItems.value(0).toInt(); + reportWhItem.status = queryWhItems.value(1).toInt(); + reportWhItem.goName = queryWhItems.value(2).toString(); + reportWhItem.objName = queryWhItems.value(3).toString(); + + task.report.warehouseItemList.append(reportWhItem); + } + } + else + { + resBool = db->rollback(); + return QList(); + } } listTasks.append(task); @@ -813,7 +558,7 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) task.status = query.value(2).toString(); //Выгребаем все malfunction для этой задачи - queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, " + queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, malfunctions.go_name, malfunctions.obj_name, " "tasks_fim.task_id " "FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id " "WHERE malfunctions.fk_task_fim_id = %1 " @@ -833,6 +578,8 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) malfanction.num = queryMalf.value(1).toString(); malfanction.dmCode = queryMalf.value(2).toString(); malfanction.description = queryMalf.value(3).toString(); + malfanction.goName = queryMalf.value(4).toString(); + malfanction.objName = queryMalf.value(5).toString(); //Выгребаем сигналы для этой неисправности queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description " @@ -927,6 +674,35 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) resBool = db->rollback(); return TaskAmmFim(); } + + //Выгребаем все wh_item отчета + + queryStr = QString("SELECT report_wh_items.wh_item_id, report_wh_items.status, report_wh_items.go_name, report_wh_items.obj_name, report_wh_items.fk_report_id, report_wh_items.number " + "FROM public.report_wh_items " + "WHERE fk_report_id = %1 " + "ORDER BY report_wh_items.number ASC").arg( + QString::number(report_id)); + + QSqlQuery queryWhItems = QSqlQuery(*db); + + if(queryExec(queryStr, &queryWhItems)) + { + while (queryWhItems.next()) + {//report_wh_item + FIMReportWarehouseItem reportWhItem; + reportWhItem.id = queryWhItems.value(0).toInt(); + reportWhItem.status = queryWhItems.value(1).toInt(); + reportWhItem.goName = queryWhItems.value(2).toString(); + reportWhItem.objName = queryWhItems.value(3).toString(); + + task.report.warehouseItemList.append(reportWhItem); + } + } + else + { + resBool = db->rollback(); + return TaskAmmFim(); + } } }; } @@ -972,10 +748,11 @@ int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task) if(!report_id) { - queryStr = QString("INSERT INTO public.reports (fk_task_fim_id) " - "VALUES (%1) " + queryStr = QString("INSERT INTO public.reports (fk_task_fim_id, mmel) " + "VALUES (%1, %2) " "RETURNING reports.report_id").arg( - task.getID()); + task.getID(), + task.report.mmel); report_id = queryExecInt(queryStr); if(!report_id) @@ -996,6 +773,17 @@ int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task) resBool = db->rollback(); return 0; } + + queryStr = QString("DELETE FROM public.report_wh_items " + "WHERE fk_report_id = %1 ").arg( + QString::number(report_id)); + + QSqlQuery queryWhItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryWhItemsDEL)) + { + resBool = db->rollback(); + return 0; + } } int number = 0; @@ -1019,6 +807,26 @@ int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task) } } + number = 0; + for(FIMReportWarehouseItem reportWhItem : task.report.warehouseItemList) + { + queryStr = QString("INSERT INTO public.report_wh_items (status, go_name, obj_name, code, fk_report_id, number) " + "VALUES ('%1', '%2', '%3', '%4', %5, %6) " + "RETURNING report_wh_items.wh_item_id").arg( + QString::number(reportWhItem.status), + reportWhItem.goName, + reportWhItem.objName, + reportWhItem.code, + QString::number(report_id), + QString::number(++number)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + } + queryStr = QString("UPDATE public.tasks_fim SET status = '%1' " "WHERE task_id = %2 ").arg( "checkup", diff --git a/LibDataBaseInterface/databaselms_trainees.cpp b/LibDataBaseInterface/databaselms_trainees.cpp index 8de21c6..ab3e884 100644 --- a/LibDataBaseInterface/databaselms_trainees.cpp +++ b/LibDataBaseInterface/databaselms_trainees.cpp @@ -384,8 +384,19 @@ int DataBaseLMS::deleteTrainee(int id_trainee) queryStr = QString("DELETE FROM public.report_items " "WHERE report_items.fk_report_id = %1 ").arg( report_id); - QSqlQuery queryReportDEL = QSqlQuery(*db); - if(!queryExec(queryStr, &queryReportDEL)) + QSqlQuery queryItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryItemsDEL)) + { + resBool = db->rollback(); + return 0; + } + + /*Удаление wh_items для этого отчета*/ + queryStr = QString("DELETE FROM public.report_wh_items " + "WHERE report_wh_items.fk_report_id = %1 ").arg( + report_id); + QSqlQuery queryWhItemsDEL = QSqlQuery(*db); + if(!queryExec(queryStr, &queryWhItemsDEL)) { resBool = db->rollback(); return 0; diff --git a/LibDataBaseInterface/tasksAmmFim.cpp b/LibDataBaseInterface/tasksAmmFim.cpp index 92e370b..04a43b2 100644 --- a/LibDataBaseInterface/tasksAmmFim.cpp +++ b/LibDataBaseInterface/tasksAmmFim.cpp @@ -20,11 +20,13 @@ void TaskAmmFim::addMalfunction(Malfunction malfunction) malfunctionList.append(malfunction); } -void Malfunction::initialize(QString dmCode, QString num, QString description) +void Malfunction::initialize(QString dmCode, QString num, QString description, QString goName, QString objName) { this->dmCode = dmCode; this->num = num; this->description = description; + this->goName = goName; + this->objName = objName; } void Malfunction::addMalfunctionSign(MalfunctionSign sign) diff --git a/LibDataBaseInterface/tasksAmmFim.h b/LibDataBaseInterface/tasksAmmFim.h index 1663964..e742b30 100644 --- a/LibDataBaseInterface/tasksAmmFim.h +++ b/LibDataBaseInterface/tasksAmmFim.h @@ -84,13 +84,15 @@ public: Malfunction(){}; ~Malfunction(){}; public: - void initialize(QString dmCode, QString num, QString description); + void initialize(QString dmCode, QString num, QString description, QString goName, QString objName); void addMalfunctionSign(MalfunctionSign sign); public: QString dmCode; // dmCode процедуры QString num; // номер по-порядку в пункте "2. Возможные причины" процедуры QString description; // описание QList malfunctionSigns;// список соответствующих неисправности признаков + QString goName; // имя GameObject (со скриптом DismantleData) - неисправный прибор + QString objName; }; class DATABASELMS_EXPORT FIMReportItem @@ -104,6 +106,23 @@ public: ProcedureID procedure; // ссылка на процедуру, при необходимости }; +class DATABASELMS_EXPORT FIMReportWarehouseItem +{ +public: + FIMReportWarehouseItem(){}; + ~FIMReportWarehouseItem(){}; +public: + int id = 0; // для идентификации в БД + // статус GameObject-а в сцене + int status = 0; // 0 - демонтировано, 1 - неисправно, 2 - заменено на новое со склада + // имя GameObject-а в сцене + QString goName = ""; + // человеческое название прибора + QString objName = ""; + // его код из документации + QString code = ""; +}; + class DATABASELMS_EXPORT FIMReport { public: @@ -111,7 +130,9 @@ public: ~FIMReport(){}; public: int id = 0; // для идентификации в БД - QList itemList; + QList itemList; // список выполненных/просмотренных процедур + QList warehouseItemList; + bool mmel = false; // выпуск самолета по MMEL }; class DATABASELMS_EXPORT TaskAmmFim diff --git a/LibInstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/LibInstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index 9dffe95..946ae72 100644 --- a/LibInstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/LibInstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -201,7 +201,9 @@ QByteArray DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id xmlWriter.writeStartElement("malfunction"); xmlWriter.writeAttribute("dmCode", malfunction.dmCode); xmlWriter.writeAttribute("num", malfunction.num); - xmlWriter.writeAttribute("description", malfunction.description); + xmlWriter.writeAttribute("description", malfunction.description); + xmlWriter.writeAttribute("goName", malfunction.goName); + xmlWriter.writeAttribute("objName", malfunction.objName); for(MalfunctionSign sign : malfunction.malfunctionSigns) { diff --git a/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index ea1e1cd..5620174 100644 --- a/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -862,6 +862,8 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array malfunction.num = malfOrReportNode.toElement().attribute("num"); malfunction.dmCode = malfOrReportNode.toElement().attribute("dmCode"); malfunction.description = malfOrReportNode.toElement().attribute("description"); + malfunction.goName = malfOrReportNode.toElement().attribute("goName"); + malfunction.objName = malfOrReportNode.toElement().attribute("objName"); for(int s = 0; s < malfOrReportNode.childNodes().count(); s++) { diff --git a/LibInstructorsAndTrainees/tasks/checkertask.cpp b/LibInstructorsAndTrainees/tasks/checkertask.cpp index 8570cc0..c9f178b 100644 --- a/LibInstructorsAndTrainees/tasks/checkertask.cpp +++ b/LibInstructorsAndTrainees/tasks/checkertask.cpp @@ -189,6 +189,10 @@ void CheckerTask::outReport(FIMReport report) ui->plainText->appendHtml("
"); */ + //Действия обучаемого + str = QString("%1").arg(tr("Trainee's actions:")); + ui->plainText->appendHtml(str); + for(FIMReportItem item : report.itemList) { /* @@ -220,6 +224,69 @@ void CheckerTask::outReport(FIMReport report) ui->plainText->appendHtml("
"); } + + ui->plainText->appendHtml("
"); + + //Устройства/приборы + bool flNeedMMEL = false; + str = QString("%1").arg(tr("Devices/instruments:")); + ui->plainText->appendHtml(str); + + for(FIMReportWarehouseItem whItem : report.warehouseItemList) + { + /* + //WhItem ID + str = QString("

WhItem ID: %1

").arg(QString::number(whItem.id)); + ui->plainText->appendHtml(str); + */ + + // статус GameObject-а в сцене + str = QString("

%1

").arg(getStatusStr(whItem.status)); + ui->plainText->appendHtml(str); + if(whItem.status == 0) + flNeedMMEL = true; + + // имя GameObject-а в сцене + str = QString("

%1

").arg(whItem.goName); + ui->plainText->appendHtml(str); + + // человеческое название прибора + str = QString("

%1

").arg(whItem.objName); + ui->plainText->appendHtml(str); + + // его код из документации + str = QString("

%1

").arg(whItem.code); + ui->plainText->appendHtml(str); + + ui->plainText->appendHtml("
"); + } + + ui->plainText->appendHtml("
"); + + if(flNeedMMEL) + { + QString strMMEL = tr("Trainee believes that:") + "\n"; + + if(report.mmel) + str += tr("The aircraft may operate with its equipment removed in accordance with the \"Master Minimum Equipment List\""); + else + str += tr("The aircraft cannot be flown with equipment removed in accordance with the \"Master Minimum Equipment List\""); + } +} + +QString CheckerTask::getStatusStr(int status) +{ + switch (status) + { + //демонтировано + case 0: return tr("dismantled"); + //неисправно + case 1: return tr("faulty"); + //заменено на новое со склада + case 2: return tr("replaced with a new one from the warehouse"); + //unknown + default: return "unknown"; + } } //НЕВЕРНО diff --git a/LibInstructorsAndTrainees/tasks/checkertask.h b/LibInstructorsAndTrainees/tasks/checkertask.h index 995c468..0e0e6eb 100644 --- a/LibInstructorsAndTrainees/tasks/checkertask.h +++ b/LibInstructorsAndTrainees/tasks/checkertask.h @@ -47,6 +47,7 @@ private slots: private: void outReport(FIMReport report); + QString getStatusStr(int status); private: TaskAmmFim task; diff --git a/LibInstructorsAndTrainees/tasks/fimtaskswidget.cpp b/LibInstructorsAndTrainees/tasks/fimtaskswidget.cpp index 08bd9b6..1a98bfa 100644 --- a/LibInstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/LibInstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -310,9 +310,9 @@ void FIMtasksWidget::reSetHeadTreeWidget() QStringList listHeaders; if(type == TypeListTreeAMMFIM::listForTrainee) - listHeaders = QStringList{tr("Procedure FIM"), tr("Status"), tr("ID")}; + listHeaders = QStringList{tr("Procedure FIM"), tr("Device"), tr("Status"), tr("ID")}; else - listHeaders = QStringList{tr("Procedure FIM"), tr("Status"), tr("ID")}; + listHeaders = QStringList{tr("Procedure FIM"), tr("Device"), tr("Status"), tr("ID")}; treeWidget->setHeaderLabels(listHeaders); } @@ -323,6 +323,8 @@ void FIMtasksWidget::setWidthColumnsTree() treeWidget->setColumnWidth(ColumnsTreeFIM::clmnFIM_Title, 100); listWidthColumn.append(100); + treeWidget->setColumnWidth(ColumnsTreeFIM::clmnFIM_Device, 150); + listWidthColumn.append(150); treeWidget->setColumnWidth(ColumnsTreeFIM::clmnFIM_status, 150); listWidthColumn.append(130); treeWidget->setColumnWidth(ColumnsTreeFIM::clmnFIM_ID, 50); diff --git a/LibInstructorsAndTrainees/tasks/tasktreepreparation.cpp b/LibInstructorsAndTrainees/tasks/tasktreepreparation.cpp index 3b425b3..28e8a4d 100644 --- a/LibInstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/LibInstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -225,7 +225,9 @@ void TaskAMMFIMTreePreparation::loadFIMtasksFromXML(QByteArray array) malfunction.initialize(nodeMap.namedItem("dmCode").nodeValue(), nodeMap.namedItem("num").nodeValue(), - nodeMap.namedItem("description").nodeValue()); + nodeMap.namedItem("description").nodeValue(), + nodeMap.namedItem("goName").nodeValue(), + nodeMap.namedItem("objName").nodeValue()); QDomElement signElement = malfunctionElement.firstChildElement(); if(!signElement.isNull()) @@ -614,6 +616,7 @@ void TaskAMMFIMTreePreparation::slot_prepareFIMListItems(QByteArray array) itemMalfunction->setFlags(itemMalfunction->flags() ^ Qt::ItemIsSelectable); itemMalfunction->setText(ColumnsTreeFIM::clmnFIM_Title, malfunction.description); + itemMalfunction->setText(ColumnsTreeFIM::clmnFIM_Device, malfunction.objName); if(type == TypeListTreeAMMFIM::listCommon) { itemMalfunction->setFlags(itemMalfunction->flags() | Qt::ItemIsUserCheckable); @@ -706,6 +709,7 @@ void TaskAMMFIMTreePreparation::slot_prepareFIMListItemsForTrainee(QListsetText(ColumnsTreeFIM::clmnFIM_Title, malfunction.description); + itemMalfunction->setText(ColumnsTreeFIM::clmnFIM_Device, malfunction.objName); if(type == TypeListTreeAMMFIM::listCommon) { itemMalfunction->setFlags(itemMalfunction->flags() | Qt::ItemIsUserCheckable); diff --git a/LibInstructorsAndTrainees/tasks/tasktreepreparation.h b/LibInstructorsAndTrainees/tasks/tasktreepreparation.h index 81f3309..0014510 100644 --- a/LibInstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/LibInstructorsAndTrainees/tasks/tasktreepreparation.h @@ -18,9 +18,10 @@ enum ColumnsTreeAMM{ }; enum ColumnsTreeFIM{ - clmnFIM_Title = 0, + clmnFIM_Title = 0, + clmnFIM_Device, clmnFIM_status, - clmnFIM_ID, + clmnFIM_ID, clmnFIM_count }; diff --git a/LibServer/Systems/Parsers/dbanswerparser.cpp b/LibServer/Systems/Parsers/dbanswerparser.cpp index 40b8563..c644b22 100644 --- a/LibServer/Systems/Parsers/dbanswerparser.cpp +++ b/LibServer/Systems/Parsers/dbanswerparser.cpp @@ -207,6 +207,8 @@ QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList malfunctionNode.toElement().setAttribute("dmCode", malfunction.dmCode); malfunctionNode.toElement().setAttribute("num", malfunction.num); malfunctionNode.toElement().setAttribute("description", malfunction.description); + malfunctionNode.toElement().setAttribute("goName", malfunction.goName); + malfunctionNode.toElement().setAttribute("objName", malfunction.objName); for(MalfunctionSign sign : malfunction.malfunctionSigns) {//Сигналы diff --git a/LibServer/Systems/Parsers/processparser.cpp b/LibServer/Systems/Parsers/processparser.cpp index 7627b35..7df7a36 100644 --- a/LibServer/Systems/Parsers/processparser.cpp +++ b/LibServer/Systems/Parsers/processparser.cpp @@ -208,6 +208,21 @@ void ProcessParser::clientUnityTaskFIMreport(QXmlStreamReader &xmlReader, Client report.itemList.append(reportItem); } + else if(reportItemNode.nodeName() == "warehouseItems") + { + FIMReportWarehouseItem warehouseItem; + warehouseItem.id = 0; + warehouseItem.status = reportItemNode.toElement().attribute("status").toInt(); + warehouseItem.goName = reportItemNode.toElement().attribute("goName"); + warehouseItem.objName = reportItemNode.toElement().attribute("name"); + warehouseItem.code = reportItemNode.toElement().attribute("code"); + + report.warehouseItemList.append(warehouseItem); + } + else if(reportItemNode.nodeName() == "mmel") + { + report.mmel = (reportItemNode.toElement().nodeValue() == "true" ? true : false); + } } task.report = report; @@ -279,6 +294,8 @@ TaskAmmFim ProcessParser::xmlParserQueryToDB_ASSIGN_TASK_FIM_TO_TRAINEE(QByteArr malfunction.num = malfunctionNode.toElement().attribute("num"); malfunction.dmCode = malfunctionNode.toElement().attribute("dmCode"); malfunction.description = malfunctionNode.toElement().attribute("description"); + malfunction.goName = malfunctionNode.toElement().attribute("goName"); + malfunction.objName = malfunctionNode.toElement().attribute("objName"); //Сигналы for(int j = 0; j < malfunctionNode.childNodes().count(); j++) From a06f7653c5fdfcbcd352e227daf73d8d78378241 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 24 Dec 2025 17:24:01 +0300 Subject: [PATCH 2/4] Report WH --- .../databaselms_tasks_fim.cpp | 16 +++++++++------ .../Core/recognizesystem.cpp | 12 +++++++++++ .../tasks/checkertask.cpp | 20 +++++++++++-------- .../tasks/dialogchekertask.cpp | 2 +- LibServer/Systems/Parsers/dbanswerparser.cpp | 12 +++++++++++ LibServer/Systems/Parsers/processparser.cpp | 2 +- 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/LibDataBaseInterface/databaselms_tasks_fim.cpp b/LibDataBaseInterface/databaselms_tasks_fim.cpp index 92d60e1..be9337c 100644 --- a/LibDataBaseInterface/databaselms_tasks_fim.cpp +++ b/LibDataBaseInterface/databaselms_tasks_fim.cpp @@ -431,7 +431,7 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) //Выгребаем отчет для этой задачи int report_id = 0; - queryStr = QString("SELECT reports.report_id " + queryStr = QString("SELECT reports.report_id, reports.mmel " "FROM public.reports " "WHERE fk_task_fim_id = %1 " "ORDER BY reports.report_id ASC").arg( @@ -445,6 +445,7 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) {//Отчет report_id = queryReport.value(0).toInt(); task.report.id = report_id; + task.report.mmel = queryReport.value(1).toBool(); } } else @@ -490,7 +491,7 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) //Выгребаем все wh_item отчета - queryStr = QString("SELECT report_wh_items.wh_item_id, report_wh_items.status, report_wh_items.go_name, report_wh_items.obj_name, report_wh_items.fk_report_id, report_wh_items.number " + queryStr = QString("SELECT report_wh_items.wh_item_id, report_wh_items.status, report_wh_items.go_name, report_wh_items.obj_name, report_wh_items.code, report_wh_items.fk_report_id, report_wh_items.number " "FROM public.report_wh_items " "WHERE fk_report_id = %1 " "ORDER BY report_wh_items.number ASC").arg( @@ -507,6 +508,7 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) reportWhItem.status = queryWhItems.value(1).toInt(); reportWhItem.goName = queryWhItems.value(2).toString(); reportWhItem.objName = queryWhItems.value(3).toString(); + reportWhItem.code = queryWhItems.value(4).toString(); task.report.warehouseItemList.append(reportWhItem); } @@ -618,7 +620,7 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) //Выгребаем отчет для этой задачи int report_id = 0; - queryStr = QString("SELECT reports.report_id " + queryStr = QString("SELECT reports.report_id, reports.mmel " "FROM public.reports " "WHERE fk_task_fim_id = %1 " "ORDER BY reports.report_id ASC").arg( @@ -632,6 +634,7 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) {//Отчет report_id = queryReport.value(0).toInt(); task.report.id = report_id; + task.report.mmel = queryReport.value(1).toBool(); } } else @@ -677,7 +680,7 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) //Выгребаем все wh_item отчета - queryStr = QString("SELECT report_wh_items.wh_item_id, report_wh_items.status, report_wh_items.go_name, report_wh_items.obj_name, report_wh_items.fk_report_id, report_wh_items.number " + queryStr = QString("SELECT report_wh_items.wh_item_id, report_wh_items.status, report_wh_items.go_name, report_wh_items.obj_name, report_wh_items.code, report_wh_items.fk_report_id, report_wh_items.number " "FROM public.report_wh_items " "WHERE fk_report_id = %1 " "ORDER BY report_wh_items.number ASC").arg( @@ -694,6 +697,7 @@ TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task) reportWhItem.status = queryWhItems.value(1).toInt(); reportWhItem.goName = queryWhItems.value(2).toString(); reportWhItem.objName = queryWhItems.value(3).toString(); + reportWhItem.code = queryWhItems.value(4).toString(); task.report.warehouseItemList.append(reportWhItem); } @@ -751,8 +755,8 @@ int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task) queryStr = QString("INSERT INTO public.reports (fk_task_fim_id, mmel) " "VALUES (%1, %2) " "RETURNING reports.report_id").arg( - task.getID(), - task.report.mmel); + QString::number(task.getID()), + (task.report.mmel ? "true" : "false")); report_id = queryExecInt(queryStr); if(!report_id) diff --git a/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 5620174..c8bf2af 100644 --- a/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/LibInstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -885,6 +885,7 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array {//Отчет FIMReport report; report.id = malfOrReportNode.toElement().attribute("report_id").toInt(); + report.mmel = malfOrReportNode.toElement().attribute("mmel") == "true" ? true : false; for(int k = 0; k < malfOrReportNode.childNodes().count(); k++) { @@ -906,6 +907,17 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array report.itemList.append(reportItem); } + else if(reportItemNode.nodeName() == "reportWHItem") + { + FIMReportWarehouseItem reportWhItem; + reportWhItem.id = reportItemNode.toElement().attribute("wh_item_id").toInt(); + reportWhItem.status = reportItemNode.toElement().attribute("status").toInt(); + reportWhItem.goName = reportItemNode.toElement().attribute("goName"); + reportWhItem.objName = reportItemNode.toElement().attribute("objName"); + reportWhItem.code = reportItemNode.toElement().attribute("code"); + + report.warehouseItemList.append(reportWhItem); + } } task.report = report; diff --git a/LibInstructorsAndTrainees/tasks/checkertask.cpp b/LibInstructorsAndTrainees/tasks/checkertask.cpp index c9f178b..2a1cef4 100644 --- a/LibInstructorsAndTrainees/tasks/checkertask.cpp +++ b/LibInstructorsAndTrainees/tasks/checkertask.cpp @@ -27,6 +27,7 @@ CheckerTask::CheckerTask(ConnectorToServer* connectorToServer, TypeChecker type, { fimTasksWidget = new FIMtasksWidget(nullptr, TypeListTreeAMMFIM::listOneTask, this); ui->verticalLayout_3->addWidget(fimTasksWidget); + fimTasksWidget->setMaximumHeight(300); ui->lblName->setVisible(false); ui->lblDMcode->setVisible(false); @@ -202,7 +203,7 @@ void CheckerTask::outReport(FIMReport report) */ //Title - str = QString("%1").arg(item.procedure.title); + str = QString("

%1

").arg(item.procedure.title); ui->plainText->appendHtml(str); //DMcode @@ -222,10 +223,10 @@ void CheckerTask::outReport(FIMReport report) str = QString("

%1

").arg(item.text); ui->plainText->appendHtml(str); - ui->plainText->appendHtml("
"); + //ui->plainText->appendHtml("
"); } - ui->plainText->appendHtml("
"); + //ui->plainText->appendHtml("
"); //Устройства/приборы bool flNeedMMEL = false; @@ -258,19 +259,22 @@ void CheckerTask::outReport(FIMReport report) str = QString("

%1

").arg(whItem.code); ui->plainText->appendHtml(str); - ui->plainText->appendHtml("
"); + //ui->plainText->appendHtml("
"); } - ui->plainText->appendHtml("
"); + //ui->plainText->appendHtml("
"); if(flNeedMMEL) { - QString strMMEL = tr("Trainee believes that:") + "\n"; + QString strMMEL = tr("Trainee believes that:"); if(report.mmel) - str += tr("The aircraft may operate with its equipment removed in accordance with the \"Master Minimum Equipment List\""); + strMMEL += tr("The aircraft may operate with its equipment removed in accordance with the \"Master Minimum Equipment List\""); else - str += tr("The aircraft cannot be flown with equipment removed in accordance with the \"Master Minimum Equipment List\""); + strMMEL += tr("The aircraft cannot be flown with equipment removed in accordance with the \"Master Minimum Equipment List\""); + + str = QString("

%1

").arg(strMMEL); + ui->plainText->appendHtml(str); } } diff --git a/LibInstructorsAndTrainees/tasks/dialogchekertask.cpp b/LibInstructorsAndTrainees/tasks/dialogchekertask.cpp index 8bd62f8..5fed614 100644 --- a/LibInstructorsAndTrainees/tasks/dialogchekertask.cpp +++ b/LibInstructorsAndTrainees/tasks/dialogchekertask.cpp @@ -18,7 +18,7 @@ DialogChekerTask::DialogChekerTask(ConnectorToServer* connectorToServer, Checker { case CheckerTask::TypeChecker::fim_check: this->setWindowTitle(tr("Check Task")); - this->setMinimumSize(1400, 700); + this->setMinimumSize(1400, 900); //this->setWindowState(Qt::WindowMaximized); break; case CheckerTask::TypeChecker::amm_check: diff --git a/LibServer/Systems/Parsers/dbanswerparser.cpp b/LibServer/Systems/Parsers/dbanswerparser.cpp index c644b22..49d2bdf 100644 --- a/LibServer/Systems/Parsers/dbanswerparser.cpp +++ b/LibServer/Systems/Parsers/dbanswerparser.cpp @@ -225,6 +225,7 @@ QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList QDomNode reportNode = commonDOM.createElement("report"); taskNode.appendChild(reportNode); reportNode.toElement().setAttribute("report_id", report.id); + reportNode.toElement().setAttribute("mmel", report.mmel ? "true" : "false"); for(FIMReportItem reportItem : task.report.itemList) {//FIMReportItem @@ -242,6 +243,17 @@ QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList procedureIDNode.toElement().setAttribute("dmCode", reportItem.procedure.dmCode); procedureIDNode.toElement().setAttribute("result", reportItem.procedure.result); } + + for(FIMReportWarehouseItem reportWhItem : task.report.warehouseItemList) + {//FIMReportWarehouseItem + QDomNode reportWhItemNode = commonDOM.createElement("reportWHItem"); + reportNode.appendChild(reportWhItemNode); + reportWhItemNode.toElement().setAttribute("wh_item_id", reportWhItem.id); + reportWhItemNode.toElement().setAttribute("status", reportWhItem.status); + reportWhItemNode.toElement().setAttribute("goName", reportWhItem.goName); + reportWhItemNode.toElement().setAttribute("objName", reportWhItem.objName); + reportWhItemNode.toElement().setAttribute("code", reportWhItem.code); + } } } diff --git a/LibServer/Systems/Parsers/processparser.cpp b/LibServer/Systems/Parsers/processparser.cpp index 7df7a36..c8d5189 100644 --- a/LibServer/Systems/Parsers/processparser.cpp +++ b/LibServer/Systems/Parsers/processparser.cpp @@ -221,7 +221,7 @@ void ProcessParser::clientUnityTaskFIMreport(QXmlStreamReader &xmlReader, Client } else if(reportItemNode.nodeName() == "mmel") { - report.mmel = (reportItemNode.toElement().nodeValue() == "true" ? true : false); + report.mmel = (reportItemNode.nodeValue() == "true" ? true : false); } } From 645dc130f496365c536156bc9bcdaf9bd01d1c53 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 25 Dec 2025 13:47:00 +0300 Subject: [PATCH 3/4] refact --- .../tasks/checkertask.cpp | 35 ++++++++++++------- LibServer/Systems/Parsers/processparser.cpp | 35 +++---------------- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/LibInstructorsAndTrainees/tasks/checkertask.cpp b/LibInstructorsAndTrainees/tasks/checkertask.cpp index 2a1cef4..7828467 100644 --- a/LibInstructorsAndTrainees/tasks/checkertask.cpp +++ b/LibInstructorsAndTrainees/tasks/checkertask.cpp @@ -202,12 +202,16 @@ void CheckerTask::outReport(FIMReport report) ui->plainText->appendHtml(str); */ + //AMM/FIM + str = QString("

%1

").arg(item.procedure.doc); + ui->plainText->appendHtml(str); + //Title str = QString("

%1

").arg(item.procedure.title); ui->plainText->appendHtml(str); //DMcode - str = QString("

%1

").arg(item.procedure.dmCode); + str = QString("

%1

").arg(item.procedure.dmCode); ui->plainText->appendHtml(str); //Result @@ -220,10 +224,10 @@ void CheckerTask::outReport(FIMReport report) ui->plainText->appendHtml(str); //Text - str = QString("

%1

").arg(item.text); + str = QString("

%1 %2

").arg(tr("Comment:"), item.text); ui->plainText->appendHtml(str); - //ui->plainText->appendHtml("
"); + ui->plainText->appendHtml("
"); } //ui->plainText->appendHtml("
"); @@ -248,8 +252,8 @@ void CheckerTask::outReport(FIMReport report) flNeedMMEL = true; // имя GameObject-а в сцене - str = QString("

%1

").arg(whItem.goName); - ui->plainText->appendHtml(str); + //str = QString("

%1

").arg(whItem.goName); + //ui->plainText->appendHtml(str); // человеческое название прибора str = QString("

%1

").arg(whItem.objName); @@ -259,7 +263,7 @@ void CheckerTask::outReport(FIMReport report) str = QString("

%1

").arg(whItem.code); ui->plainText->appendHtml(str); - //ui->plainText->appendHtml("
"); + ui->plainText->appendHtml("
"); } //ui->plainText->appendHtml("
"); @@ -267,14 +271,21 @@ void CheckerTask::outReport(FIMReport report) if(flNeedMMEL) { QString strMMEL = tr("Trainee believes that:"); - - if(report.mmel) - strMMEL += tr("The aircraft may operate with its equipment removed in accordance with the \"Master Minimum Equipment List\""); - else - strMMEL += tr("The aircraft cannot be flown with equipment removed in accordance with the \"Master Minimum Equipment List\""); - str = QString("

%1

").arg(strMMEL); ui->plainText->appendHtml(str); + + if(report.mmel) + { + strMMEL = tr("The aircraft may operate with its equipment removed in accordance with the \"Master Minimum Equipment List\""); + str = QString("

%1

").arg(strMMEL); + ui->plainText->appendHtml(str); + } + else + { + strMMEL = tr("The aircraft cannot be flown with equipment removed in accordance with the \"Master Minimum Equipment List\""); + str = QString("

%1

").arg(strMMEL); + ui->plainText->appendHtml(str); + } } } diff --git a/LibServer/Systems/Parsers/processparser.cpp b/LibServer/Systems/Parsers/processparser.cpp index c8d5189..bf7540c 100644 --- a/LibServer/Systems/Parsers/processparser.cpp +++ b/LibServer/Systems/Parsers/processparser.cpp @@ -221,43 +221,16 @@ void ProcessParser::clientUnityTaskFIMreport(QXmlStreamReader &xmlReader, Client } else if(reportItemNode.nodeName() == "mmel") { - report.mmel = (reportItemNode.nodeValue() == "true" ? true : false); + QString str1 = reportItemNode.nodeValue(); + QString str2 = reportItemNode.toElement().text(); + + report.mmel = (reportItemNode.toElement().text() == "true" ? true : false); } } task.report = report; } } - /* - - //TODO -------------- (!Заглушка!) Отчет о выполнении - FIMReport report; - FIMReportItem reportItem; - QString text; // текст, вводимый обучаемым - ProcedureID procedure; // ссылка на процедуру, при необходимости - - text = "1. Выполнил такую процедуру"; - procedure.doc = "fim"; - procedure.title = "Процедура №1"; - procedure.dmCode = "RRJ-N-27-92-00-51D01-420A-A"; - procedure.result = "viewed"; - reportItem.text = text; - reportItem.procedure = procedure; - report.itemList.append(reportItem); - - text = "2. Выполнил такую процедуру"; - procedure.doc = "fim"; - procedure.title = "Процедура №2"; - procedure.dmCode = "RRJ-N-28-22-00-01A01-420A-A"; - procedure.result = "viewed"; - reportItem.text = text; - reportItem.procedure = procedure; - report.itemList.append(reportItem); - - task.report = report; - //----------------- - */ - listTasks.append(task); From b990d147e690c5f171be7b721e293a8523f45b8d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 26 Dec 2025 13:49:36 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- translations/RRJServer_ru_RU.qm | Bin 31077 -> 32622 bytes translations/RRJServer_ru_RU.ts | 103 ++++++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 26 deletions(-) diff --git a/translations/RRJServer_ru_RU.qm b/translations/RRJServer_ru_RU.qm index 9136a27f5060b0a8e1a74302699886f1f87cfd14..d9b149529b1352740e19543ffd701a87791f93a1 100644 GIT binary patch delta 4034 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 Новая - + viewed Просмотрено - - + + completed выполнена - + failed неверно - + checkup на проверке - + new новая - + + Trainee's actions: + Действия обучаемого: + + + + Comment: + Комментарий: + + + + Devices/instruments: + Устройства/приборы: + + + + Trainee believes that: + Обучаемый считает, что: + + + + The aircraft may operate with its equipment removed in accordance with the "Master Minimum Equipment List" + Самолет может выполнять полёт с демонтированным оборудованием в соответствии с "Главным перечнем минимального состава оборудования" + + + + The aircraft cannot be flown with equipment removed in accordance with the "Master Minimum Equipment List" + Самолет не может выполнять полёт с демонтированным оборудованием в соответствии с "Главным перечнем минимального состава оборудования" + + + + dismantled + демонтировано + + + + faulty + неисправно + + + + replaced with a new one from the warehouse + заменено на новый со склада + + + Change task status? The status will be set: 'failed' @@ -184,8 +229,8 @@ The status will be set: 'неверно' - - + + Change task status? The status will be set: 'new' @@ -194,7 +239,7 @@ The status will be set: 'новая' - + Change task status? The status will be set: 'checkup' @@ -203,8 +248,8 @@ The status will be set: 'на проверке' - - + + Change task status? The status will be set: 'completed' @@ -1123,14 +1168,20 @@ The changes will not be accepted. Процедура FIM - + + + Device + Устройство + + + The deletion will be irrevocable. Delete it anyway? Удаление будет безвозвратным. Всё равно удалить? - + Assign this task? Назначить эту задачу? @@ -1755,30 +1806,30 @@ The server will be restarted. TaskAMMFIMTreePreparation - - - + + + completed выполнена - - - + + + failed неверно - - - + + + checkup на проверке - - - + + + new новая