Merge branch 'DEV' into draft-send-contacts

This commit is contained in:
semenov
2025-07-31 10:22:10 +03:00
18 changed files with 342 additions and 10 deletions

View File

@@ -25,6 +25,8 @@ add_library(DataBaseLMS SHARED
tasksAmmFim.cpp tasksAmmFim.cpp
tasksAmmFim.h tasksAmmFim.h
typeQueryToDB.h typeQueryToDB.h
timingoftrainee.cpp
timingoftrainee.h
) )
target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets) target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets)

View File

@@ -1691,6 +1691,56 @@ int DataBaseLMS::updateTrainee(Trainee trainee)
return queryExecInt(queryStr); return queryExecInt(queryStr);
} }
int DataBaseLMS::insertTimingTrainee(int id_trainee)
{
QString queryStr = QString("INSERT INTO public.timings (entry_time, exit_time, operating_time, timing_trainee) "
"VALUES (DEFAULT, DEFAULT, DEFAULT, %1) "
"RETURNING timings.timing_id").arg(
QString::number(id_trainee));
return queryExecInt(queryStr);
}
int DataBaseLMS::updateTimingTrainee(int id_trainee, TimingOfTrainee timing)
{
QString queryStr = QString("UPDATE public.timings "
"SET entry_time = '%1', exit_time = '%2', operating_time = '%3', timing_trainee = %4 "
"WHERE timing_id = %5 "
"RETURNING timings.timing_id").arg(
timing.getEntryTimeS(),
timing.getExitTimeS(),
timing.getOperatingTimeS(),
QString::number(id_trainee),
QString::number(timing.getID()) );
return queryExecInt(queryStr);
}
TimingOfTrainee DataBaseLMS::selectTimingTrainee(int id_trainee)
{
TimingOfTrainee timing(id_trainee);
QString queryStr = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.timing_trainee "
"FROM public.timings "
"WHERE timing_trainee = '%1'").arg(id_trainee);
QSqlQuery querySel = QSqlQuery(*db);
if(queryExec(queryStr, &querySel))
{
if (querySel.first())
{//Тайминг
timing.setID(querySel.value(0).toInt());
timing.setEntryTime(querySel.value(1).toDateTime());
timing.setExitTime(querySel.value(2).toDateTime());
timing.setOperatingTime(querySel.value(3).toTime());
timing.setTraineeID(querySel.value(4).toInt());
}
}
return timing;
}
int DataBaseLMS::queryExecInt(QString queryStr) int DataBaseLMS::queryExecInt(QString queryStr)
{ {
QSqlQuery query = QSqlQuery(*db); QSqlQuery query = QSqlQuery(*db);

View File

@@ -8,6 +8,7 @@
#include "trainee.h" #include "trainee.h"
#include "group.h" #include "group.h"
#include "tasksAmmFim.h" #include "tasksAmmFim.h"
#include "timingoftrainee.h"
class DataBaseSettings class DataBaseSettings
{ {
@@ -101,6 +102,11 @@ protected:
int deleteTrainee(int id_trainee); int deleteTrainee(int id_trainee);
int updateTrainee(Trainee trainee); int updateTrainee(Trainee trainee);
//Тайминг
int insertTimingTrainee(int id_trainee);
int updateTimingTrainee(int id_trainee, TimingOfTrainee timing);
TimingOfTrainee selectTimingTrainee(int id_trainee);
private: private:
DataBaseSettings getDataBaseSettings(); DataBaseSettings getDataBaseSettings();
int queryExecInt(QString queryStr); int queryExecInt(QString queryStr);

View File

@@ -1,6 +1,8 @@
#include <QMessageBox> #include <QMessageBox>
#include <QCoreApplication> #include <QCoreApplication>
#include <QSqlError> #include <QSqlError>
#include <QDateTime>
#include <QTime>
#include "interfacedatabaselms.h" #include "interfacedatabaselms.h"
InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget* parent): InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget* parent):
@@ -218,6 +220,46 @@ bool InterfaceDataBaseLMS::deAuthorizationAllTrainees()
return updateAllTraineesLoggedIn(false); return updateAllTraineesLoggedIn(false);
} }
int InterfaceDataBaseLMS::entryTraineeOnSimulator(int id_trainee)
{
TimingOfTrainee timing(id_trainee);
timing = selectTimingTrainee(id_trainee);
if(!timing.getID())
{//Еще нет записи
int timing_id = insertTimingTrainee(id_trainee);
timing.setID(timing_id);
if(!timing_id)
return 0;
}
timing.fixEntry();
return updateTimingTrainee(id_trainee, timing);
}
int InterfaceDataBaseLMS::exitTraineeFromSimulator(int id_trainee)
{
TimingOfTrainee timing(id_trainee);
timing = selectTimingTrainee(id_trainee);
if(!timing.getID())
{//Еще нет записи
int timing_id = insertTimingTrainee(id_trainee);
timing.setID(timing_id);
if(!timing_id)
return 0;
}
timing.fixExit();
return updateTimingTrainee(id_trainee, timing);
}
QString InterfaceDataBaseLMS::getNameTraineeOnComputer(QString computer_name) QString InterfaceDataBaseLMS::getNameTraineeOnComputer(QString computer_name)
{ {
return selectTraineeNameOnComputer(computer_name); return selectTraineeNameOnComputer(computer_name);

View File

@@ -51,6 +51,11 @@ public:
bool deAuthorizationTrainee(QString login); bool deAuthorizationTrainee(QString login);
bool deAuthorizationAllTrainees(); bool deAuthorizationAllTrainees();
//Регистрация тайминга Обучаемого
int entryTraineeOnSimulator(int id_trainee);
int exitTraineeFromSimulator(int id_trainee);
//void setTasks(QString login, QStringList tasks); //void setTasks(QString login, QStringList tasks);
QString getNameTraineeOnComputer(QString computer_name); QString getNameTraineeOnComputer(QString computer_name);

View File

@@ -0,0 +1,71 @@
#include "timingoftrainee.h"
TimingOfTrainee::TimingOfTrainee(int trainee_id):
timing_id(0),
trainee_id(trainee_id)
{
//QDateTime dataTimeCurr = QDateTime::currentDateTime();
dataTimeNull = QDateTime::fromString("2000-01-01 00:00:00.000", "yyyy-MM-dd hh:mm:ss.zzz");
setOperatingTime(QTime::fromString("00:00:00"));
setEntryTime(dataTimeNull);
setExitTime(dataTimeNull);
}
void TimingOfTrainee::setEntryTimeS(QString entry_time)
{
entryTime_str = entry_time;
entryTime = QDateTime::fromString(entry_time);
}
void TimingOfTrainee::setEntryTime(QDateTime entry_time)
{
entryTime = entry_time;
entryTime_str = entry_time.toString("yyyy-MM-dd hh:mm:ss.zzz");
}
void TimingOfTrainee::setExitTimeS(QString exit_time)
{
exitTime_str = exit_time;
exitTime = QDateTime::fromString(exit_time);
}
void TimingOfTrainee::setExitTime(QDateTime exit_time)
{
exitTime = exit_time;
exitTime_str = exit_time.toString("yyyy-MM-dd hh:mm:ss.zzz");
}
void TimingOfTrainee::setOperatingTimeS(QString operating_time)
{
operatingTime_str = operating_time;
operatingTime = QTime::fromString(operating_time);
}
void TimingOfTrainee::setOperatingTime(QTime operating_time)
{
operatingTime = operating_time;
operatingTime_str = operating_time.toString();
}
void TimingOfTrainee::fixEntry()
{
QDateTime dataTimeCurr = QDateTime::currentDateTime();
setEntryTime(dataTimeCurr);
}
void TimingOfTrainee::fixExit()
{
QDateTime dataTimeCurr = QDateTime::currentDateTime();
setExitTime(dataTimeCurr);
if(entryTime != dataTimeNull)
calculateOperatingTime();
}
void TimingOfTrainee::calculateOperatingTime()
{
int cntSec = entryTime.secsTo(exitTime);
setOperatingTime(getOperatingTime().addSecs(cntSec));
}

View File

@@ -0,0 +1,60 @@
#ifndef TIMINGOFTRAINEE_H
#define TIMINGOFTRAINEE_H
#include <QString>
#include <QDateTime>
class TimingOfTrainee
{
public:
TimingOfTrainee(int trainee_id);
void setID(int timing_id){this->timing_id = timing_id;}
int getID(){return timing_id;}
void setTraineeID(int trainee_id){this->trainee_id = trainee_id;}
int getTraineeID(){return trainee_id;}
void setEntryTimeS(QString entry_time);
void setEntryTime(QDateTime entry_time);
QString getEntryTimeS(){return entryTime_str;}
QDateTime getEntryTime(){return entryTime;}
void setExitTimeS(QString exit_time);
void setExitTime(QDateTime exit_time);
QString getExitTimeS(){return exitTime_str;}
QDateTime getExitTime(){return exitTime;}
void setOperatingTimeS(QString operating_time);
void setOperatingTime(QTime operating_time);
QString getOperatingTimeS(){return operatingTime_str;}
QTime getOperatingTime(){return operatingTime;}
void fixEntry();
void fixExit();
private:
void calculateOperatingTime();
private:
int timing_id;
int trainee_id;
QString entryTime_str; //"yyyy-MM-dd hh:mm:ss.zzz"
QString exitTime_str; //"yyyy-MM-dd hh:mm:ss.zzz"
QString operatingTime_str; //"hh:mm:ss"
QDateTime entryTime;
QDateTime exitTime;
QTime operatingTime;
QDateTime dataTimeNull;
};
#endif // TIMINGOFTRAINEE_H

View File

@@ -96,6 +96,16 @@ public:
isLoggedIn = value; isLoggedIn = value;
} }
void setAccessType(QString type)
{
accessType = type;
}
QString getAccessType()
{
return accessType;
}
QString getId() QString getId()
{ {
@@ -120,6 +130,7 @@ private:
bool isUnity = false; bool isUnity = false;
TypeClientAutorization TypeClient; TypeClientAutorization TypeClient;
QString accessType = "";
}; };
#endif // CLIENT_H #endif // CLIENT_H

View File

@@ -11,7 +11,7 @@ void ProcessParser::initialize(ProcessingSystem *processingSystem)
this->processingSystem = processingSystem; this->processingSystem = processingSystem;
} }
void ProcessParser::read(ClientHandler *client, QByteArray array) void ProcessParser::slot_read(ClientHandler *client, QByteArray array)
{ {
QXmlStreamReader xmlReader(array); QXmlStreamReader xmlReader(array);

View File

@@ -12,8 +12,9 @@ class ProcessParser : public QObject
public: public:
explicit ProcessParser(QObject *parent = nullptr); explicit ProcessParser(QObject *parent = nullptr);
void initialize(ProcessingSystem *processingSystem); void initialize(ProcessingSystem *processingSystem);
void read(ClientHandler *client, QByteArray array);
public slots:
void slot_read(ClientHandler *client, QByteArray array);
signals: signals:
void sigLogMessage(QString text); void sigLogMessage(QString text);

View File

@@ -4,8 +4,8 @@
ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, QObject *parent): ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, QObject *parent):
QObject(parent), QObject(parent),
providerDBLMS(nullptr), updateController(nullptr),
updateController(nullptr) providerDBLMS(nullptr)
{ {
this->providerDBLMS = providerDBLMS; this->providerDBLMS = providerDBLMS;
this->updateController = updateController; this->updateController = updateController;
@@ -58,6 +58,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien
{//Авторизуется инструктор {//Авторизуется инструктор
client->getClient()->setLogin(clientAutorization.Login); client->getClient()->setLogin(clientAutorization.Login);
client->getClient()->setAccessType("instructor");
client->getClient()->setTypeClient(clientAutorization.TypeClient); client->getClient()->setTypeClient(clientAutorization.TypeClient);
emit sigUpdateListClients(); emit sigUpdateListClients();
@@ -73,6 +74,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien
{//Авторизуется обучаемый {//Авторизуется обучаемый
client->getClient()->setLogin(clientAutorization.Login); client->getClient()->setLogin(clientAutorization.Login);
client->getClient()->setAccessType("trainee");
emit sigUpdateListClients(); emit sigUpdateListClients();
//KAV redact //KAV redact
@@ -120,6 +122,7 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli
{//ДеАвторизуется обучаемый {//ДеАвторизуется обучаемый
client->getClient()->setLogin(""); client->getClient()->setLogin("");
client->getClient()->setAccessType("");
emit sigUpdateListClients(); emit sigUpdateListClients();
arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login); arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login);
@@ -128,6 +131,7 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli
{//ДеАвторизуется инструктор {//ДеАвторизуется инструктор
client->getClient()->setLogin(""); client->getClient()->setLogin("");
client->getClient()->setAccessType("");
emit sigUpdateListClients(); emit sigUpdateListClients();
arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login); arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login);
@@ -160,6 +164,38 @@ void ProcessingSystem::processingClientDeAutorization(QString login)
} }
} }
void ProcessingSystem::processingEntryUnityClient(ClientHandler *client)
{
QString login = client->getClient()->getLogin();
QString accessType = client->getClient()->getAccessType();
if(accessType == "trainee")
{
int id_trainee = providerDBLMS->getIdTraineeByLogin(login);
providerDBLMS->entryTraineeOnSimulator(id_trainee);
}
else if(accessType == "instructor")
{
//Здесь пока ничего не происходит
}
}
void ProcessingSystem::processingExitUnityClient(ClientHandler *client)
{
QString login = client->getClient()->getLogin();
QString accessType = client->getClient()->getAccessType();
if(accessType == "trainee")
{
int id_trainee = providerDBLMS->getIdTraineeByLogin(login);
providerDBLMS->exitTraineeFromSimulator(id_trainee);
}
else if(accessType == "instructor")
{
//Здесь пока ничего не происходит
}
}
void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id, void* data) void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id, void* data)
{ {
qDebug() << "ProcessingQueryThread " << QThread::currentThreadId(); qDebug() << "ProcessingQueryThread " << QThread::currentThreadId();
@@ -487,9 +523,24 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif
sendTaskListToUnity(client); sendTaskListToUnity(client);
client->getSocket()->flush(); client->getSocket()->flush();
} }
else if(clientNotify.Code == commandStartTimerClient)
{
//Фиксируем время входа Юнити-клиента
if (client->getClient()->getIsUnity())
{
processingEntryUnityClient(client);
}
}
else if(clientNotify.Code == commandDisableClient) else if(clientNotify.Code == commandDisableClient)
{ {
qDebug() << "processing thread: " << QThread::currentThreadId(); qDebug() << "processing thread: " << QThread::currentThreadId();
//Фиксируем время выхода Юнити-клиента
if (client->getClient()->getIsUnity())
{
processingExitUnityClient(client);
}
client->sendDisable(); client->sendDisable();
} }
else if(clientNotify.Code == commandGetServerDataList) else if(clientNotify.Code == commandGetServerDataList)

View File

@@ -52,6 +52,9 @@ public:
ClientHandler* getUnityClientById(int id); ClientHandler* getUnityClientById(int id);
void processingClientDeAutorization(QString login); void processingClientDeAutorization(QString login);
void processingEntryUnityClient(ClientHandler *client);
void processingExitUnityClient(ClientHandler *client);
signals: signals:
void sigUpdateListClients(); void sigUpdateListClients();
void sigListsInstructorsTraineesChanged(); void sigListsInstructorsTraineesChanged();

View File

@@ -27,7 +27,7 @@ void RecognizeSystem::initialize(UpdateController *updateController,DataParser*
connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection); connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigXmlParser,dataParser->getProcessParser(),&ProcessParser::read,Qt::DirectConnection); connect(this,&RecognizeSystem::sigXmlParser,dataParser->getProcessParser(),&ProcessParser::slot_read,Qt::DirectConnection);
qDebug() << "Recognize init thread ID " << QThread::currentThreadId(); qDebug() << "Recognize init thread ID " << QThread::currentThreadId();
} }
@@ -430,7 +430,7 @@ void RecognizeSystem::recognize()
if(packetType == PacketType::TYPE_DISABLE) if(packetType == PacketType::TYPE_DISABLE)
{ {
clientHandler->sendDisable(); clientHandler->sendDisable();
} }
packetType = PacketType::TYPE_NONE; packetType = PacketType::TYPE_NONE;
@@ -450,6 +450,7 @@ void RecognizeSystem::packetTypeInit(PacketType packet,Client *client)
else if (packet == PacketType::TYPE_UNITY) else if (packet == PacketType::TYPE_UNITY)
{ {
client->setUnity(true); client->setUnity(true);
//Фиксируем время входа Юнити-клиента
} }
isPackageTypeInited = true; isPackageTypeInited = true;

View File

@@ -59,7 +59,7 @@ private:
bool isPackageTypeInited; bool isPackageTypeInited;
void packetTypeInit(PacketType packet,Client *client); void packetTypeInit(PacketType packet,Client *client);
void packetTypeInit(PacketType type); //void packetTypeInit(PacketType type);
bool checkIsChangeable(); bool checkIsChangeable();
}; };

View File

@@ -39,6 +39,7 @@ static const QString commandGetServerDataList = "GETSERVERDATALIST";
static const QString commandCheckVersionList = "CHECKVERSIONLIST"; static const QString commandCheckVersionList = "CHECKVERSIONLIST";
static const QString commandReadyClient = "READY"; static const QString commandReadyClient = "READY";
static const QString commandDisableClient = "DISABLE"; static const QString commandDisableClient = "DISABLE";
static const QString commandStartTimerClient = "UNITYSTARTTIMER";
static const QString commandDuplicateVerName = "DUPLICATEVERNAME"; static const QString commandDuplicateVerName = "DUPLICATEVERNAME";
static const QString commandHashCompleteClient = "HASHSENDCOMPLETE"; static const QString commandHashCompleteClient = "HASHSENDCOMPLETE";
static const QString commandCanChangeVersion = "CANCHANGE"; static const QString commandCanChangeVersion = "CANCHANGE";

View File

@@ -222,6 +222,22 @@ bool ProviderDBLMS::deAuthorizationAll()
return res1 && res2; return res1 && res2;
} }
bool ProviderDBLMS::entryTraineeOnSimulator(int id_trainee)
{
if(dbLMS->entryTraineeOnSimulator(id_trainee))
return true;
else
return false;
}
bool ProviderDBLMS::exitTraineeFromSimulator(int id_trainee)
{
if(dbLMS->exitTraineeFromSimulator(id_trainee))
return true;
else
return false;
}
int ProviderDBLMS::getIdTraineeByLogin(QString login) int ProviderDBLMS::getIdTraineeByLogin(QString login)
{ {
int id_trainee = 0; int id_trainee = 0;

View File

@@ -28,6 +28,10 @@ public:
//Общая деавторизация //Общая деавторизация
bool deAuthorizationAll(); bool deAuthorizationAll();
//Регистрация тайминга Обучаемого
bool entryTraineeOnSimulator(int id_trainee);
bool exitTraineeFromSimulator(int id_trainee);
// //
int getIdTraineeByLogin(QString login); int getIdTraineeByLogin(QString login);
int getIdInstructorByLogin(QString login); int getIdInstructorByLogin(QString login);

View File

@@ -132,16 +132,24 @@ bool ServerLMSWidget::stopServer()
//Закрываем все открытые сокеты //Закрываем все открытые сокеты
foreach(int idSocket, clientsMap.keys()) foreach(int idSocket, clientsMap.keys())
{ {
clientsMap[idSocket]->sigSendXmlAnswer(arrayAnswer,PacketType::TYPE_XMLANSWER); ClientHandler* clientHandlerOpen = clientsMap[idSocket];
//Фиксируем время выхода Юнити-клиента
if(clientHandlerOpen->getClient()->getIsUnity())
{
processingSystem->processingExitUnityClient(clientHandlerOpen);
}
clientHandlerOpen->sigSendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER);
//while (!clientsMap[idSocket]->sigSocketFlush()) {} //while (!clientsMap[idSocket]->sigSocketFlush()) {}
QString str = QString(arrayAnswer); QString str = QString(arrayAnswer);
emit sigLog("To Client: " + str); emit sigLog("To Client: " + str);
//slotDisconnectClient(clientsMap[idSocket]->get, QString peerPort) //slotDisconnectClient(clientsMap[idSocket]->get, QString peerPort)
processingSystem->processingClientDeAutorization(clientsMap[idSocket]->getClient()->getLogin()); processingSystem->processingClientDeAutorization(clientHandlerOpen->getClient()->getLogin());
clientsMap[idSocket]->sigSocketClose(); clientHandlerOpen->sigSocketClose();
//clientsMap.remove(idSocket); //clientsMap.remove(idSocket);
removeClient(idSocket); removeClient(idSocket);
} }