Построение списков подпроцедур в Сервере работает

This commit is contained in:
2025-11-13 14:34:39 +03:00
parent 4bfd4dad82
commit a6bee48b77
7 changed files with 89 additions and 41 deletions

View File

@@ -56,7 +56,7 @@ void Module::setModeList(ModeList modeList)
{ {
this->modeList = modeList; this->modeList = modeList;
if(modeList.demo || modeList.train || modeList.exam || modeList.autoM) if(modeList.demo || modeList.train || modeList.exam /*|| modeList.autoM*/)
setIsActiveTrue(); setIsActiveTrue();
} }

View File

@@ -31,10 +31,10 @@ public:
bool getIsActive(); bool getIsActive();
void setModeList(ModeList modeList);; void setModeList(ModeList modeList);
ModeList getModeList(){return modeList;}; ModeList getModeList(){return modeList;}
protected: private:
void setIsActiveTrue(); void setIsActiveTrue();
protected: protected:

View File

@@ -16,17 +16,28 @@ DocsUpdater::~DocsUpdater()
} }
void DocsUpdater::lockAccessToDocs() //PUBLIC
void DocsUpdater::lockAccessToDocsXML()
{ {
mtxAccess.lock(); mtxAccess.lock();
} }
void DocsUpdater::unLockAccessToDocs() void DocsUpdater::unLockAccessToDocsXML()
{ {
mtxAccess.unlock(); mtxAccess.unlock();
} }
bool DocsUpdater::slot_update() QList<SubProc> DocsUpdater::getListSubProcForDMcode(QString dmCode)
{
QMutexLocker locker(&mtxAccess);
if(!listSubProcMap.contains(dmCode))
return QList<SubProc>();
return listSubProcMap.value(dmCode);
}
bool DocsUpdater::updateDocsXML()
{ {
QMutexLocker locker(&mtxAccess); QMutexLocker locker(&mtxAccess);
@@ -43,17 +54,41 @@ bool DocsUpdater::slot_update()
deleteAllModulsAMM(); deleteAllModulsAMM();
listTasksAMM.clear(); listTasksAMM.clear();
subProcMap.clear();
listSubProcMap.clear();
DMmodulesMap.clear();
domElementParserAMM(manifestElement, nullptr); domElementParserAMM(manifestElement, nullptr);
if(! Tools::saveDOMtoXML(pathDocsFile, &docTasksDOM)) if(! Tools::saveDOMtoXML(pathDocsFile, &docTasksDOM))
return false; {
deleteAllModulsAMM();
listTasksAMM.clear();
listSubProcMap.clear();
DMmodulesMap.clear();
return false;
}
for(QList<SubProc> listSP : listSubProcMap)
{
for(SubProc sp : listSP)
{
QString dmCode = sp.dmCode;
DM* module = getDMmoduleByDMcode(dmCode);
if(module)
{
sp.modeList = module->getModeList();
}
}
}
//emit signal_DocsChanged();
return true; return true;
} }
//PRIVATE
void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent) void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent)
{ {
QString name; QString name;
@@ -69,7 +104,7 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent)
do do
{ {
name = childElement.nodeName(); name = childElement.nodeName();
QDomNamedNodeMap nodeMap = childElement.attributes(); QDomNamedNodeMap nodeMap = childElement.attributes();
@@ -119,6 +154,8 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent)
PM* PMmodulParent = static_cast<PM*>(moduleParent); PM* PMmodulParent = static_cast<PM*>(moduleParent);
PMmodulParent->addChildModule(module); PMmodulParent->addChildModule(module);
} }
DMmodulesMap.insert(DMmodul->dmCode(), DMmodul);
} }
else if(name == "rus" || name == "eng") else if(name == "rus" || name == "eng")
{ {
@@ -145,20 +182,6 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent)
nodeMap.namedItem("bookmark").nodeValue(), nodeMap.namedItem("bookmark").nodeValue(),
nodeMap.namedItem("xml").nodeValue()); nodeMap.namedItem("xml").nodeValue());
//Активность
//QString canplay = nodeMap.namedItem("canplay").nodeValue();
//Обновление Активности и построение списка подпроцедур 1го уровня
/*
QString dmCode = DMmodulParent->dmCode();
QString canplay = defineCanplayByScenXML(dmCode);
DMmodulParent->setModeList(parseCanplay(canplay));
nodeMap.namedItem("canplay").setNodeValue(canplay);
*/
QString dmCode = DMmodulParent->dmCode(); QString dmCode = DMmodulParent->dmCode();
QString canplay = ""; QString canplay = "";
QList<SubProc> listSubProc; QList<SubProc> listSubProc;
@@ -167,7 +190,7 @@ void DocsUpdater::domElementParserAMM(QDomElement element, Module* moduleParent)
DMmodulParent->setModeList(parseCanplay(canplay)); DMmodulParent->setModeList(parseCanplay(canplay));
nodeMap.namedItem("canplay").setNodeValue(canplay); nodeMap.namedItem("canplay").setNodeValue(canplay);
subProcMap.insert(dmCode, listSubProc); listSubProcMap.insert(dmCode, listSubProc);
} }
else else
{ {
@@ -262,6 +285,7 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis
{ {
listSubProc.clear(); listSubProc.clear();
ModeList modeList;
canplay = ""; canplay = "";
QString signDemo = "-"; QString signDemo = "-";
QString signTrain = "-"; QString signTrain = "-";
@@ -286,7 +310,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis
{ {
//canplay //canplay
if(demoElement.toElement().attribute("canplay") == "True") if(demoElement.toElement().attribute("canplay") == "True")
{
signDemo = "+"; signDemo = "+";
modeList.demo = true;
}
//subProc //subProc
selectSubProc(demoElement, listSubProc); selectSubProc(demoElement, listSubProc);
@@ -297,7 +324,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis
{ {
//canplay //canplay
if(trainElement.toElement().attribute("canplay") == "True") if(trainElement.toElement().attribute("canplay") == "True")
{
signTrain = "+"; signTrain = "+";
modeList.train = true;
}
//subProc //subProc
selectSubProc(trainElement, listSubProc); selectSubProc(trainElement, listSubProc);
@@ -308,7 +338,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis
{ {
//canplay //canplay
if(examElement.toElement().attribute("canplay") == "True") if(examElement.toElement().attribute("canplay") == "True")
{
signExam = "+"; signExam = "+";
modeList.exam = true;
}
//subProc //subProc
selectSubProc(examElement, listSubProc); selectSubProc(examElement, listSubProc);
@@ -319,7 +352,10 @@ bool DocsUpdater::processingScenXML(const QString dmCode, QString &canplay, QLis
{ {
//canplay //canplay
if(autoElement.toElement().attribute("canplay") == "True") if(autoElement.toElement().attribute("canplay") == "True")
{
signAuto = "+"; signAuto = "+";
modeList.autoM = true;
}
//subProc //subProc
//Из этого режима не берем! //Из этого режима не берем!
@@ -350,3 +386,11 @@ void DocsUpdater::selectSubProc(QDomElement &modeElement, QList<SubProc> &listSu
} }
} }
} }
DM *DocsUpdater::getDMmoduleByDMcode(QString dmCode)
{
if(!DMmodulesMap.contains(dmCode))
return nullptr;
return DMmodulesMap.value(dmCode);
}

View File

@@ -9,6 +9,8 @@ struct SubProc
{ {
QString dmCode; QString dmCode;
QString title; QString title;
ModeList modeList;
}; };
@@ -20,30 +22,33 @@ public:
DocsUpdater(UpdateController* updateController, QObject *parent = nullptr); DocsUpdater(UpdateController* updateController, QObject *parent = nullptr);
~DocsUpdater(); ~DocsUpdater();
public: public:
void lockAccessToDocs(); void lockAccessToDocsXML();
void unLockAccessToDocs(); void unLockAccessToDocsXML();
public slots: QList<SubProc> getListSubProcForDMcode(QString dmCode);
bool slot_update();
bool updateDocsXML();
private: private:
void domElementParserAMM(QDomElement element, Module* moduleParent); void domElementParserAMM(QDomElement element, Module* moduleParent);
void deleteAllModulsAMM(); void deleteAllModulsAMM();
ModeList parseCanplay(QString canplay); ModeList parseCanplay(QString canplay);
bool processingScenXML(const QString dmCode, QString& canplay, QList<SubProc>& listSubProc); bool processingScenXML(const QString dmCode, QString& canplay, QList<SubProc>& listSubProc);
void selectSubProc(QDomElement& modeElement, QList<SubProc>& listSubProc); void selectSubProc(QDomElement& modeElement, QList<SubProc>& listSubProc);
DM* getDMmoduleByDMcode(QString dmCode);
private: private:
UpdateController* updateController; UpdateController* updateController;
QMutex mtxAccess; QMutex mtxAccess;
bool flagStop; bool flagStop;
QList<Module*> listAllModulesAMM; //? QList<Module*> listAllModulesAMM; //?
QList<TaskAmmFim> listTasksAMM; //? QList<TaskAmmFim> listTasksAMM; //?
QMap<QString, QList<SubProc>> subProcMap; QMap<QString, DM*> DMmodulesMap; //общий (линейный) словарь всех DM-модулей
QMap<QString, QList<SubProc>> listSubProcMap; //словарь подпроцедур для всех DM-модулей
}; };
#endif // DOCSUPDATER_H #endif // DOCSUPDATER_H

View File

@@ -516,10 +516,10 @@ void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, Clie
{ {
nameFile = tasksAMMfileName; nameFile = tasksAMMfileName;
pathFile = updateController->getPathAdditionalFile(nameFile); pathFile = updateController->getPathAdditionalFile(nameFile);
docsUpdater->lockAccessToDocs(); docsUpdater->lockAccessToDocsXML();
client->sendFileBlock(pathFile); client->sendFileBlock(pathFile);
client->sendPacketType(PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM); client->sendPacketType(PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM);
docsUpdater->unLockAccessToDocs(); docsUpdater->unLockAccessToDocsXML();
} }
} }

View File

@@ -118,8 +118,10 @@ void ServerLMSWidget::slot_ErrorPostgreSQL(QString text)
void ServerLMSWidget::slot_UpdateDocs() void ServerLMSWidget::slot_UpdateDocs()
{ {
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
emit signal_DocsUpdaterUpdate();
emit signal_DocsChanged(); if(docsUpdater->updateDocsXML())
emit signal_DocsChanged();
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
} }
@@ -302,7 +304,6 @@ void ServerLMSWidget::startInitialization()
updateController->moveToThread(updateThread); updateController->moveToThread(updateThread);
docsUpdater = new DocsUpdater(updateController, this); docsUpdater = new DocsUpdater(updateController, this);
connect(this, &ServerLMSWidget::signal_DocsUpdaterUpdate, docsUpdater, &DocsUpdater::slot_update,Qt::DirectConnection);
processingSystem = new ProcessingSystem(providerDBLMS, updateController, docsUpdater); processingSystem = new ProcessingSystem(providerDBLMS, updateController, docsUpdater);

View File

@@ -78,8 +78,6 @@ signals:
void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager); void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager);
QTcpSocket* sigGetSocket(); QTcpSocket* sigGetSocket();
void signal_DocsUpdaterUpdate();
void signal_DocsChanged(); void signal_DocsChanged();
public slots: public slots: