#include "ReportGenerator.h" #include #include #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 *ElementList = new QList; 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 *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 *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")); 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,"---"); 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); 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,"---"); 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); 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; }