ZTStats/Sources/ReportGenerator.cpp

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;
}