526 lines
23 KiB
C++
526 lines
23 KiB
C++
#include "ReportGenerator.h"
|
|
#include <QtXlsx>
|
|
#include <QStringList>
|
|
#include "ZTData.h"
|
|
#include "LogMgr.h"
|
|
#include "GlobalDefine.h"
|
|
#include "ZTStats.h"
|
|
|
|
CReportGenerator::CReportGenerator()
|
|
{
|
|
mDirParserThread = new QThread();
|
|
mDirParserWorkerThread = new CDirParserThread();
|
|
mDirParserWorkerThread->moveToThread(mDirParserThread);
|
|
connect(mDirParserThread,SIGNAL(started()),mDirParserWorkerThread,SLOT(ParseDirectories()));
|
|
connect(mDirParserThread,SIGNAL(finished()),this,SLOT(ThreadQuit()));
|
|
connect(mDirParserWorkerThread,SIGNAL(ParsingFinished(int)),this,SLOT(DirParsingFinished(int)));
|
|
connect(mDirParserWorkerThread,SIGNAL(ReportProgressStatus(QString)),this,SLOT(ThreadReportStatus(QString)));
|
|
connect(mDirParserWorkerThread,SIGNAL(ThreadAborted()),this,SLOT(DirThreadAborted()));
|
|
|
|
mStationNames << "Angrignon" << "Beaugrand" << "Longueuil" << "Berri" << "Snowdon" << "St-Michel" << "Vertu" << "Bourassa" << "Montmorency";
|
|
|
|
//Allocate report data structure for each station
|
|
for(int i = 0; i < NB_ZT_ID; i++)
|
|
{ QList<CLogElement*> *ElementList = new QList<CLogElement*>;
|
|
mReportData.append(ElementList);
|
|
}
|
|
}
|
|
|
|
CReportGenerator::~CReportGenerator()
|
|
{
|
|
mDirParserThread->quit();
|
|
delete mDirParserWorkerThread;
|
|
//delete mDirParserThread;
|
|
}
|
|
|
|
int CReportGenerator::GenerateReport(QString ReportFileName, CReportProgramSettingsData ReportSettings, CReportConfigData ReportFilters)
|
|
{
|
|
|
|
mReportFilename = ReportFileName;
|
|
mReportFilters = ReportFilters;
|
|
|
|
ClearReportData();
|
|
|
|
mDirParserWorkerThread->SetParsingInfo(ReportSettings,ReportFilters,&mReportData);
|
|
mDirParserThread->start();
|
|
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
int CReportGenerator::ClearReportData()
|
|
{
|
|
for(int station = 0; station < mReportData.size(); station++)
|
|
{
|
|
QList<CLogElement*> *LogsList = mReportData.at(station);
|
|
for(int log = 0; log < LogsList->size(); log++)
|
|
{
|
|
delete LogsList->at(log);
|
|
}
|
|
LogsList->clear();
|
|
}
|
|
return RET_OK;
|
|
}
|
|
|
|
|
|
|
|
void CReportGenerator::ThreadQuit()
|
|
{
|
|
qDebug("Parsing thread quit");
|
|
}
|
|
|
|
void CReportGenerator::ThreadTerminated()
|
|
{
|
|
qDebug("Parsing thread terminated");
|
|
}
|
|
|
|
void CReportGenerator::DirParsingFinished(int Res)
|
|
{
|
|
mDirParserThread->exit();
|
|
if(Res == 0)
|
|
{
|
|
ClearReportData();
|
|
ThreadReportStatus("La génération du rapport a échoué...");
|
|
mProgramPtr->ReportCreationFinished(QString());
|
|
return;
|
|
}
|
|
|
|
//Generate report
|
|
GenerateExcelReport();
|
|
}
|
|
|
|
void CReportGenerator::DirThreadAborted()
|
|
{
|
|
mDirParserThread->exit();
|
|
ClearReportData();
|
|
ThreadReportStatus("La génération du rapport a été annulée");
|
|
mProgramPtr->ReportCreationFinished(QString());
|
|
}
|
|
|
|
int CReportGenerator::GenerateExcelReport()
|
|
{
|
|
if(mReportFilename.isEmpty())
|
|
{
|
|
return RET_ERROR;
|
|
}
|
|
ThreadReportStatus("Passages analysés... création du fichier Excel.");
|
|
|
|
QXlsx::Document ExcelDoc(mReportFilename);
|
|
//Clean the file if it already exist
|
|
for(int station = 0; station < mStationNames.size(); station++)
|
|
{
|
|
ExcelDoc.deleteSheet(mStationNames.at(station));
|
|
}
|
|
|
|
for(int station = 0; station < mReportData.size(); station++)
|
|
{
|
|
int PassageID = 1;
|
|
if(mReportData.at(station)->isEmpty() == false)
|
|
{
|
|
QList<CLogElement*> *PassageLogData = mReportData.at(station);
|
|
int row = 6;
|
|
ExcelDoc.addSheet(mStationNames.at(station));
|
|
ExcelDoc.selectSheet(mStationNames.at(station));
|
|
|
|
//Create Header
|
|
ExcelDoc.write(1,1,QString("Rapport de déclenchements ZT de la station %1").arg(mStationNames.at(station)));
|
|
ExcelDoc.write(2,1,QString("Date de début %1").arg(mReportFilters.mReportStartDate.toString("yyyy-MM-dd")));
|
|
ExcelDoc.write(3,1,QString("Date de fin %1").arg(mReportFilters.mReportEndDate.toString("yyyy-MM-dd")));
|
|
|
|
ExcelDoc.write(5,1,QString("ID Passage"));
|
|
ExcelDoc.write(5,2,QString("Date et Heure"));
|
|
ExcelDoc.write(5,3,QString("Nb Décl (passage)"));
|
|
ExcelDoc.write(5,4,QString("Zone"));
|
|
ExcelDoc.write(5,5,QString("Composition"));
|
|
ExcelDoc.write(5,6,QString("Déclenchement"));
|
|
ExcelDoc.write(5,7,QString("Rang"));
|
|
ExcelDoc.write(5,8,QString("Fonction FN"));
|
|
ExcelDoc.write(5,9,QString("Fonction PG"));
|
|
ExcelDoc.write(5,10,QString("Fonction PP"));
|
|
ExcelDoc.write(5,11,QString("Fonction ZT1"));
|
|
ExcelDoc.write(5,12,QString("Fonction ZT2"));
|
|
|
|
|
|
|
|
for(int log = 0; log < PassageLogData->size(); log++)
|
|
{
|
|
if(PassageLogData->at(log)->mZTLogType == ZT1_LOG_TYPE)
|
|
{
|
|
bool IncPassage = false;
|
|
CZT1LogElement *Element = (CZT1LogElement*)PassageLogData->at(log);
|
|
if(mReportFilters.mReportIncludeSansDeclZT1 == true)
|
|
{
|
|
ExcelDoc.write(row,1,PassageID);
|
|
ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
|
|
ExcelDoc.write(row,3,Element->mZTDetections.size());
|
|
ExcelDoc.write(row,4,"ZT1");
|
|
ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
|
|
ExcelDoc.write(row,6,"---");
|
|
ExcelDoc.write(row,7,"---");
|
|
|
|
if(Element->mDetectionFlagsValid == false)
|
|
{
|
|
ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
|
|
ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
|
|
ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
|
|
ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
|
|
ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
|
|
}
|
|
else
|
|
{
|
|
QString Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_FN_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,8,Status); //Fonction FN
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PG_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,9,Status); //Fonction PG
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,10,Status); //Fonction PP
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,11,Status); //ZT1
|
|
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,12,Status); //ZT2
|
|
|
|
}
|
|
|
|
row++;
|
|
}
|
|
|
|
if(Element->mZTDetections.size() != 0)
|
|
{
|
|
for(int detect = 0; detect < Element->mZTDetections.size(); detect++)
|
|
{
|
|
QString DetectionName = "";
|
|
switch(Element->mZTDetections.at(detect)->mDetectionID)
|
|
{
|
|
case DETECTION_FN_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportFilterIncludeFN == true)
|
|
{
|
|
DetectionName = "FN";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_MAGNETIC_SENSOR_COUNT:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludeComptage1 == true)
|
|
{
|
|
DetectionName = "Erreur de comptage";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_PG_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePG == true)
|
|
{
|
|
DetectionName = "PG";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_PPI_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePPI1 == true)
|
|
{
|
|
DetectionName = "PPI";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_PPE_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePPE1 == true)
|
|
{
|
|
DetectionName = "PPE";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_PEQ1_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePEQ1 == true)
|
|
{
|
|
DetectionName = "Panne équipement";
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
DetectionName.clear();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(DetectionName.isEmpty() == false)
|
|
{
|
|
ExcelDoc.write(row,1,PassageID);
|
|
ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
|
|
ExcelDoc.write(row,3,Element->mZTDetections.size());
|
|
ExcelDoc.write(row,4,"ZT1");
|
|
ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
|
|
ExcelDoc.write(row,6,DetectionName);
|
|
ExcelDoc.write(row,7,Element->mZTDetections.at(detect)->mRank);
|
|
|
|
if(Element->mDetectionFlagsValid == false)
|
|
{
|
|
ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
|
|
ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
|
|
ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
|
|
ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
|
|
ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
|
|
}
|
|
else
|
|
{
|
|
QString Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_FN_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,8,Status); //Fonction FN
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PG_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,9,Status); //Fonction PG
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,10,Status); //Fonction PP
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,11,Status); //ZT1
|
|
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,12,Status); //ZT2
|
|
|
|
}
|
|
|
|
row++;
|
|
IncPassage = true; //we had ad least one log added, this passage must count...
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if(IncPassage == true || mReportFilters.mReportIncludeSansDeclZT1 == true)
|
|
{
|
|
PassageID++;
|
|
}
|
|
}
|
|
else if(PassageLogData->at(log)->mZTLogType == ZT2_LOG_TYPE)
|
|
{
|
|
bool IncPassage = false;
|
|
CZT2LogElement *Element = (CZT2LogElement*)PassageLogData->at(log);
|
|
if(mReportFilters.mReportIncludeSansDeclZT2 == true)
|
|
{
|
|
ExcelDoc.write(row,1,PassageID);
|
|
ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
|
|
ExcelDoc.write(row,3,Element->mZTDetections.size());
|
|
ExcelDoc.write(row,4,"ZT2");
|
|
ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
|
|
ExcelDoc.write(row,6,"---");
|
|
ExcelDoc.write(row,7,"---");
|
|
|
|
if(Element->mDetectionFlagsValid == false)
|
|
{
|
|
ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
|
|
ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
|
|
ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
|
|
ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
|
|
ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
|
|
}
|
|
else
|
|
{
|
|
ExcelDoc.write(row,8,QString("N/A")); //Fonction FN
|
|
ExcelDoc.write(row,9,QString("N/A")); //Fonction PG
|
|
|
|
QString Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP2)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,10,Status); //Fonction PP
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,11,Status); //ZT1
|
|
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,12,Status); //ZT2
|
|
|
|
}
|
|
|
|
|
|
row++;
|
|
}
|
|
|
|
if(Element->mZTDetections.size() != 0)
|
|
{
|
|
for(int detect = 0; detect < Element->mZTDetections.size(); detect++)
|
|
{
|
|
QString DetectionName = "";
|
|
switch(Element->mZTDetections.at(detect)->mDetectionID)
|
|
{
|
|
case DETECTION_ZT2_MAGNETIC_SENCOR_COUNT:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludeComptage2 == true)
|
|
{
|
|
DetectionName = "Erreur de comptage";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_ZT2_PPI_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePPI2 == true)
|
|
{
|
|
DetectionName = "PPI";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_ZT2_PPE_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePPE2 == true)
|
|
{
|
|
DetectionName = "PPE";
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_PEQ2_DETECTION:
|
|
{
|
|
if(mReportFilters.mReportfilterIncludePEQ2 == true)
|
|
{
|
|
DetectionName = "Panne Équipement";
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
DetectionName.clear();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(DetectionName.isEmpty() == false)
|
|
{
|
|
ExcelDoc.write(row,1,PassageID);
|
|
ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
|
|
ExcelDoc.write(row,3,Element->mZTDetections.size());
|
|
ExcelDoc.write(row,4,"ZT2");
|
|
ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
|
|
ExcelDoc.write(row,6,DetectionName);
|
|
ExcelDoc.write(row,7,Element->mZTDetections.at(detect)->mRank);
|
|
|
|
if(Element->mDetectionFlagsValid == false)
|
|
{
|
|
ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
|
|
ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
|
|
ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
|
|
ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
|
|
ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
|
|
}
|
|
else
|
|
{
|
|
ExcelDoc.write(row,8,QString("N/A")); //Fonction FN
|
|
ExcelDoc.write(row,9,QString("N/A")); //Fonction PG
|
|
|
|
QString Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP2)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,10,Status); //Fonction PP
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,11,Status); //ZT1
|
|
|
|
|
|
Status = "Hors service";
|
|
if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
|
|
{
|
|
Status = "En service";
|
|
}
|
|
ExcelDoc.write(row,12,Status); //ZT2
|
|
|
|
}
|
|
|
|
|
|
row++;
|
|
IncPassage = true; //we had ad least one log added, this passage must count...
|
|
}
|
|
}
|
|
|
|
}
|
|
if(IncPassage == true || mReportFilters.mReportIncludeSansDeclZT2)
|
|
{
|
|
PassageID++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ExcelDoc.save();
|
|
ThreadReportStatus("Rapport créé avec succès!");
|
|
mProgramPtr->ReportCreationFinished(mReportFilename);
|
|
qDebug("Création du rapport terminée");
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
void CReportGenerator::ThreadReportStatus(QString status)
|
|
{
|
|
mProgramPtr->UpdateReportProgressStatus(status);
|
|
}
|
|
|
|
int CReportGenerator::AbortReportCreation()
|
|
{
|
|
mDirParserWorkerThread->KillThread();
|
|
return RET_OK;
|
|
}
|