You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

343 line
14 KiB

  1. #include "ReportGenerator.h"
  2. #include <QtXlsx>
  3. #include <QStringList>
  4. #include "ZTData.h"
  5. #include "LogMgr.h"
  6. #include "GlobalDefine.h"
  7. #include "ZTStats.h"
  8. CReportGenerator::CReportGenerator()
  9. {
  10. mDirParserThread = new QThread();
  11. mDirParserWorkerThread = new CDirParserThread();
  12. mDirParserWorkerThread->moveToThread(mDirParserThread);
  13. connect(mDirParserThread,SIGNAL(started()),mDirParserWorkerThread,SLOT(ParseDirectories()));
  14. connect(mDirParserThread,SIGNAL(finished()),this,SLOT(ThreadQuit()));
  15. connect(mDirParserWorkerThread,SIGNAL(ParsingFinished(int)),this,SLOT(DirParsingFinished(int)));
  16. connect(mDirParserWorkerThread,SIGNAL(ReportProgressStatus(QString)),this,SLOT(ThreadReportStatus(QString)));
  17. connect(mDirParserWorkerThread,SIGNAL(ThreadAborted()),this,SLOT(DirThreadAborted()));
  18. mStationNames << "Angrignon" << "Beaugrand" << "Longueuil" << "Berri" << "Snowdon" << "St-Michel" << "Vertu" << "Bourassa" << "Montmorency";
  19. //Allocate report data structure for each station
  20. for(int i = 0; i < NB_ZT_ID; i++)
  21. { QList<CLogElement*> *ElementList = new QList<CLogElement*>;
  22. mReportData.append(ElementList);
  23. }
  24. }
  25. CReportGenerator::~CReportGenerator()
  26. {
  27. mDirParserThread->quit();
  28. delete mDirParserWorkerThread;
  29. //delete mDirParserThread;
  30. }
  31. int CReportGenerator::GenerateReport(QString ReportFileName, CReportProgramSettingsData ReportSettings, CReportConfigData ReportFilters)
  32. {
  33. mReportFilename = ReportFileName;
  34. mReportFilters = ReportFilters;
  35. ClearReportData();
  36. mDirParserWorkerThread->SetParsingInfo(ReportSettings,ReportFilters,&mReportData);
  37. mDirParserThread->start();
  38. return RET_OK;
  39. }
  40. int CReportGenerator::ClearReportData()
  41. {
  42. for(int station = 0; station < mReportData.size(); station++)
  43. {
  44. QList<CLogElement*> *LogsList = mReportData.at(station);
  45. for(int log = 0; log < LogsList->size(); log++)
  46. {
  47. delete LogsList->at(log);
  48. }
  49. LogsList->clear();
  50. }
  51. return RET_OK;
  52. }
  53. void CReportGenerator::ThreadQuit()
  54. {
  55. qDebug("Parsing thread quit");
  56. }
  57. void CReportGenerator::ThreadTerminated()
  58. {
  59. qDebug("Parsing thread terminated");
  60. }
  61. void CReportGenerator::DirParsingFinished(int Res)
  62. {
  63. mDirParserThread->exit();
  64. if(Res == 0)
  65. {
  66. ClearReportData();
  67. ThreadReportStatus("La génération du rapport a échoué...");
  68. mProgramPtr->ReportCreationFinished(QString());
  69. return;
  70. }
  71. //Generate report
  72. GenerateExcelReport();
  73. }
  74. void CReportGenerator::DirThreadAborted()
  75. {
  76. mDirParserThread->exit();
  77. ClearReportData();
  78. ThreadReportStatus("La génération du rapport a été annulée");
  79. mProgramPtr->ReportCreationFinished(QString());
  80. }
  81. int CReportGenerator::GenerateExcelReport()
  82. {
  83. if(mReportFilename.isEmpty())
  84. {
  85. return RET_ERROR;
  86. }
  87. ThreadReportStatus("Passages analysés... création du fichier Excel.");
  88. QXlsx::Document ExcelDoc(mReportFilename);
  89. //Clean the file if it already exist
  90. for(int station = 0; station < mStationNames.size(); station++)
  91. {
  92. ExcelDoc.deleteSheet(mStationNames.at(station));
  93. }
  94. for(int station = 0; station < mReportData.size(); station++)
  95. {
  96. int PassageID = 1;
  97. if(mReportData.at(station)->isEmpty() == false)
  98. {
  99. QList<CLogElement*> *PassageLogData = mReportData.at(station);
  100. int row = 6;
  101. ExcelDoc.addSheet(mStationNames.at(station));
  102. ExcelDoc.selectSheet(mStationNames.at(station));
  103. //Create Header
  104. ExcelDoc.write(1,1,QString("Rapport de déclenchements ZT de la station %1").arg(mStationNames.at(station)));
  105. ExcelDoc.write(2,1,QString("Date de début %1").arg(mReportFilters.mReportStartDate.toString("yyyy-MM-dd")));
  106. ExcelDoc.write(3,1,QString("Date de fin %1").arg(mReportFilters.mReportEndDate.toString("yyyy-MM-dd")));
  107. ExcelDoc.write(5,1,QString("ID Passage"));
  108. ExcelDoc.write(5,2,QString("Date et Heure"));
  109. ExcelDoc.write(5,3,QString("Nb Décl (passage)"));
  110. ExcelDoc.write(5,4,QString("Zone"));
  111. ExcelDoc.write(5,5,QString("Composition"));
  112. ExcelDoc.write(5,6,QString("Déclenchement"));
  113. ExcelDoc.write(5,7,QString("Rang"));
  114. for(int log = 0; log < PassageLogData->size(); log++)
  115. {
  116. if(PassageLogData->at(log)->mZTLogType == ZT1_LOG_TYPE)
  117. {
  118. bool IncPassage = false;
  119. CZT1LogElement *Element = (CZT1LogElement*)PassageLogData->at(log);
  120. if(mReportFilters.mReportIncludeSansDeclZT1 == true)
  121. {
  122. ExcelDoc.write(row,1,PassageID);
  123. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  124. ExcelDoc.write(row,3,Element->mZTDetections.size());
  125. ExcelDoc.write(row,4,"ZT1");
  126. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  127. ExcelDoc.write(row,6,"---");
  128. ExcelDoc.write(row,7,"---");
  129. row++;
  130. }
  131. if(Element->mZTDetections.size() != 0)
  132. {
  133. for(int detect = 0; detect < Element->mZTDetections.size(); detect++)
  134. {
  135. QString DetectionName = "";
  136. switch(Element->mZTDetections.at(detect)->mDetectionID)
  137. {
  138. case DETECTION_FN_DETECTION:
  139. {
  140. if(mReportFilters.mReportFilterIncludeFN == true)
  141. {
  142. DetectionName = "FN";
  143. }
  144. break;
  145. }
  146. case DETECTION_MAGNETIC_SENSOR_COUNT:
  147. {
  148. if(mReportFilters.mReportfilterIncludeComptage1 == true)
  149. {
  150. DetectionName = "Erreur de comptage";
  151. }
  152. break;
  153. }
  154. case DETECTION_PG_DETECTION:
  155. {
  156. if(mReportFilters.mReportfilterIncludePG == true)
  157. {
  158. DetectionName = "PG";
  159. }
  160. break;
  161. }
  162. case DETECTION_PPI_DETECTION:
  163. {
  164. if(mReportFilters.mReportfilterIncludePPI1 == true)
  165. {
  166. DetectionName = "PPI";
  167. }
  168. break;
  169. }
  170. case DETECTION_PPE_DETECTION:
  171. {
  172. if(mReportFilters.mReportfilterIncludePPE1 == true)
  173. {
  174. DetectionName = "PPE";
  175. }
  176. break;
  177. }
  178. case DETECTION_PEQ1_DETECTION:
  179. {
  180. if(mReportFilters.mReportfilterIncludePEQ1 == true)
  181. {
  182. DetectionName = "Panne équipement";
  183. }
  184. break;
  185. }
  186. default:
  187. {
  188. DetectionName.clear();
  189. break;
  190. }
  191. }
  192. if(DetectionName.isEmpty() == false)
  193. {
  194. ExcelDoc.write(row,1,PassageID);
  195. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  196. ExcelDoc.write(row,3,Element->mZTDetections.size());
  197. ExcelDoc.write(row,4,"ZT1");
  198. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  199. ExcelDoc.write(row,6,DetectionName);
  200. ExcelDoc.write(row,7,Element->mZTDetections.at(detect)->mRank);
  201. row++;
  202. IncPassage = true; //we had ad least one log added, this passage must count...
  203. }
  204. }
  205. }
  206. if(IncPassage == true || mReportFilters.mReportIncludeSansDeclZT1 == true)
  207. {
  208. PassageID++;
  209. }
  210. }
  211. else if(PassageLogData->at(log)->mZTLogType == ZT2_LOG_TYPE)
  212. {
  213. bool IncPassage = false;
  214. CZT2LogElement *Element = (CZT2LogElement*)PassageLogData->at(log);
  215. if(mReportFilters.mReportIncludeSansDeclZT2 == true)
  216. {
  217. ExcelDoc.write(row,1,PassageID);
  218. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  219. ExcelDoc.write(row,3,Element->mZTDetections.size());
  220. ExcelDoc.write(row,4,"ZT2");
  221. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  222. ExcelDoc.write(row,6,"---");
  223. ExcelDoc.write(row,7,"---");
  224. row++;
  225. }
  226. if(Element->mZTDetections.size() != 0)
  227. {
  228. for(int detect = 0; detect < Element->mZTDetections.size(); detect++)
  229. {
  230. QString DetectionName = "";
  231. switch(Element->mZTDetections.at(detect)->mDetectionID)
  232. {
  233. case DETECTION_ZT2_MAGNETIC_SENCOR_COUNT:
  234. {
  235. if(mReportFilters.mReportfilterIncludeComptage2 == true)
  236. {
  237. DetectionName = "Erreur de comptage";
  238. }
  239. break;
  240. }
  241. case DETECTION_ZT2_PPI_DETECTION:
  242. {
  243. if(mReportFilters.mReportfilterIncludePPI2 == true)
  244. {
  245. DetectionName = "PPI";
  246. }
  247. break;
  248. }
  249. case DETECTION_ZT2_PPE_DETECTION:
  250. {
  251. if(mReportFilters.mReportfilterIncludePPE2 == true)
  252. {
  253. DetectionName = "PPE";
  254. }
  255. break;
  256. }
  257. case DETECTION_PEQ2_DETECTION:
  258. {
  259. if(mReportFilters.mReportfilterIncludePEQ2 == true)
  260. {
  261. DetectionName = "Panne Équipement";
  262. }
  263. break;
  264. }
  265. default:
  266. {
  267. DetectionName.clear();
  268. break;
  269. }
  270. }
  271. if(DetectionName.isEmpty() == false)
  272. {
  273. ExcelDoc.write(row,1,PassageID);
  274. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  275. ExcelDoc.write(row,3,Element->mZTDetections.size());
  276. ExcelDoc.write(row,4,"ZT2");
  277. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  278. ExcelDoc.write(row,6,DetectionName);
  279. ExcelDoc.write(row,7,Element->mZTDetections.at(detect)->mRank);
  280. row++;
  281. IncPassage = true; //we had ad least one log added, this passage must count...
  282. }
  283. }
  284. }
  285. if(IncPassage == true || mReportFilters.mReportIncludeSansDeclZT2)
  286. {
  287. PassageID++;
  288. }
  289. }
  290. }
  291. }
  292. }
  293. ExcelDoc.save();
  294. ThreadReportStatus("Rapport créé avec succès!");
  295. mProgramPtr->ReportCreationFinished(mReportFilename);
  296. qDebug("Création du rapport terminée");
  297. return RET_OK;
  298. }
  299. void CReportGenerator::ThreadReportStatus(QString status)
  300. {
  301. mProgramPtr->UpdateReportProgressStatus(status);
  302. }
  303. int CReportGenerator::AbortReportCreation()
  304. {
  305. mDirParserWorkerThread->KillThread();
  306. return RET_OK;
  307. }