選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

526 行
23 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. ExcelDoc.write(5,8,QString("Fonction FN"));
  115. ExcelDoc.write(5,9,QString("Fonction PG"));
  116. ExcelDoc.write(5,10,QString("Fonction PP"));
  117. ExcelDoc.write(5,11,QString("Fonction ZT1"));
  118. ExcelDoc.write(5,12,QString("Fonction ZT2"));
  119. for(int log = 0; log < PassageLogData->size(); log++)
  120. {
  121. if(PassageLogData->at(log)->mZTLogType == ZT1_LOG_TYPE)
  122. {
  123. bool IncPassage = false;
  124. CZT1LogElement *Element = (CZT1LogElement*)PassageLogData->at(log);
  125. if(mReportFilters.mReportIncludeSansDeclZT1 == true)
  126. {
  127. ExcelDoc.write(row,1,PassageID);
  128. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  129. ExcelDoc.write(row,3,Element->mZTDetections.size());
  130. ExcelDoc.write(row,4,"ZT1");
  131. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  132. ExcelDoc.write(row,6,"---");
  133. ExcelDoc.write(row,7,"---");
  134. if(Element->mDetectionFlagsValid == false)
  135. {
  136. ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
  137. ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
  138. ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
  139. ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
  140. ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
  141. }
  142. else
  143. {
  144. QString Status = "Hors service";
  145. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_FN_MASK)
  146. {
  147. Status = "En service";
  148. }
  149. ExcelDoc.write(row,8,Status); //Fonction FN
  150. Status = "Hors service";
  151. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PG_MASK)
  152. {
  153. Status = "En service";
  154. }
  155. ExcelDoc.write(row,9,Status); //Fonction PG
  156. Status = "Hors service";
  157. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP)
  158. {
  159. Status = "En service";
  160. }
  161. ExcelDoc.write(row,10,Status); //Fonction PP
  162. Status = "Hors service";
  163. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
  164. {
  165. Status = "En service";
  166. }
  167. ExcelDoc.write(row,11,Status); //ZT1
  168. Status = "Hors service";
  169. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
  170. {
  171. Status = "En service";
  172. }
  173. ExcelDoc.write(row,12,Status); //ZT2
  174. }
  175. row++;
  176. }
  177. if(Element->mZTDetections.size() != 0)
  178. {
  179. for(int detect = 0; detect < Element->mZTDetections.size(); detect++)
  180. {
  181. QString DetectionName = "";
  182. switch(Element->mZTDetections.at(detect)->mDetectionID)
  183. {
  184. case DETECTION_FN_DETECTION:
  185. {
  186. if(mReportFilters.mReportFilterIncludeFN == true)
  187. {
  188. DetectionName = "FN";
  189. }
  190. break;
  191. }
  192. case DETECTION_MAGNETIC_SENSOR_COUNT:
  193. {
  194. if(mReportFilters.mReportfilterIncludeComptage1 == true)
  195. {
  196. DetectionName = "Erreur de comptage";
  197. }
  198. break;
  199. }
  200. case DETECTION_PG_DETECTION:
  201. {
  202. if(mReportFilters.mReportfilterIncludePG == true)
  203. {
  204. DetectionName = "PG";
  205. }
  206. break;
  207. }
  208. case DETECTION_PPI_DETECTION:
  209. {
  210. if(mReportFilters.mReportfilterIncludePPI1 == true)
  211. {
  212. DetectionName = "PPI";
  213. }
  214. break;
  215. }
  216. case DETECTION_PPE_DETECTION:
  217. {
  218. if(mReportFilters.mReportfilterIncludePPE1 == true)
  219. {
  220. DetectionName = "PPE";
  221. }
  222. break;
  223. }
  224. case DETECTION_PEQ1_DETECTION:
  225. {
  226. if(mReportFilters.mReportfilterIncludePEQ1 == true)
  227. {
  228. DetectionName = "Panne équipement";
  229. }
  230. break;
  231. }
  232. default:
  233. {
  234. DetectionName.clear();
  235. break;
  236. }
  237. }
  238. if(DetectionName.isEmpty() == false)
  239. {
  240. ExcelDoc.write(row,1,PassageID);
  241. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  242. ExcelDoc.write(row,3,Element->mZTDetections.size());
  243. ExcelDoc.write(row,4,"ZT1");
  244. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  245. ExcelDoc.write(row,6,DetectionName);
  246. ExcelDoc.write(row,7,Element->mZTDetections.at(detect)->mRank);
  247. if(Element->mDetectionFlagsValid == false)
  248. {
  249. ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
  250. ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
  251. ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
  252. ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
  253. ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
  254. }
  255. else
  256. {
  257. QString Status = "Hors service";
  258. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_FN_MASK)
  259. {
  260. Status = "En service";
  261. }
  262. ExcelDoc.write(row,8,Status); //Fonction FN
  263. Status = "Hors service";
  264. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PG_MASK)
  265. {
  266. Status = "En service";
  267. }
  268. ExcelDoc.write(row,9,Status); //Fonction PG
  269. Status = "Hors service";
  270. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP)
  271. {
  272. Status = "En service";
  273. }
  274. ExcelDoc.write(row,10,Status); //Fonction PP
  275. Status = "Hors service";
  276. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
  277. {
  278. Status = "En service";
  279. }
  280. ExcelDoc.write(row,11,Status); //ZT1
  281. Status = "Hors service";
  282. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
  283. {
  284. Status = "En service";
  285. }
  286. ExcelDoc.write(row,12,Status); //ZT2
  287. }
  288. row++;
  289. IncPassage = true; //we had ad least one log added, this passage must count...
  290. }
  291. }
  292. }
  293. if(IncPassage == true || mReportFilters.mReportIncludeSansDeclZT1 == true)
  294. {
  295. PassageID++;
  296. }
  297. }
  298. else if(PassageLogData->at(log)->mZTLogType == ZT2_LOG_TYPE)
  299. {
  300. bool IncPassage = false;
  301. CZT2LogElement *Element = (CZT2LogElement*)PassageLogData->at(log);
  302. if(mReportFilters.mReportIncludeSansDeclZT2 == true)
  303. {
  304. ExcelDoc.write(row,1,PassageID);
  305. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  306. ExcelDoc.write(row,3,Element->mZTDetections.size());
  307. ExcelDoc.write(row,4,"ZT2");
  308. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  309. ExcelDoc.write(row,6,"---");
  310. ExcelDoc.write(row,7,"---");
  311. if(Element->mDetectionFlagsValid == false)
  312. {
  313. ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
  314. ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
  315. ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
  316. ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
  317. ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
  318. }
  319. else
  320. {
  321. ExcelDoc.write(row,8,QString("N/A")); //Fonction FN
  322. ExcelDoc.write(row,9,QString("N/A")); //Fonction PG
  323. QString Status = "Hors service";
  324. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP2)
  325. {
  326. Status = "En service";
  327. }
  328. ExcelDoc.write(row,10,Status); //Fonction PP
  329. Status = "Hors service";
  330. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
  331. {
  332. Status = "En service";
  333. }
  334. ExcelDoc.write(row,11,Status); //ZT1
  335. Status = "Hors service";
  336. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
  337. {
  338. Status = "En service";
  339. }
  340. ExcelDoc.write(row,12,Status); //ZT2
  341. }
  342. row++;
  343. }
  344. if(Element->mZTDetections.size() != 0)
  345. {
  346. for(int detect = 0; detect < Element->mZTDetections.size(); detect++)
  347. {
  348. QString DetectionName = "";
  349. switch(Element->mZTDetections.at(detect)->mDetectionID)
  350. {
  351. case DETECTION_ZT2_MAGNETIC_SENCOR_COUNT:
  352. {
  353. if(mReportFilters.mReportfilterIncludeComptage2 == true)
  354. {
  355. DetectionName = "Erreur de comptage";
  356. }
  357. break;
  358. }
  359. case DETECTION_ZT2_PPI_DETECTION:
  360. {
  361. if(mReportFilters.mReportfilterIncludePPI2 == true)
  362. {
  363. DetectionName = "PPI";
  364. }
  365. break;
  366. }
  367. case DETECTION_ZT2_PPE_DETECTION:
  368. {
  369. if(mReportFilters.mReportfilterIncludePPE2 == true)
  370. {
  371. DetectionName = "PPE";
  372. }
  373. break;
  374. }
  375. case DETECTION_PEQ2_DETECTION:
  376. {
  377. if(mReportFilters.mReportfilterIncludePEQ2 == true)
  378. {
  379. DetectionName = "Panne Équipement";
  380. }
  381. break;
  382. }
  383. default:
  384. {
  385. DetectionName.clear();
  386. break;
  387. }
  388. }
  389. if(DetectionName.isEmpty() == false)
  390. {
  391. ExcelDoc.write(row,1,PassageID);
  392. ExcelDoc.write(row,2,Element->mPassageDateTime.toString("yyyy-MM-dd hh:mm:ss"));
  393. ExcelDoc.write(row,3,Element->mZTDetections.size());
  394. ExcelDoc.write(row,4,"ZT2");
  395. ExcelDoc.write(row,5,QString("%1-%2-%3").arg(Element->mFlags.mTrainCompo1).arg(Element->mFlags.mTrainCompo2).arg(Element->mFlags.mTrainCompo3));
  396. ExcelDoc.write(row,6,DetectionName);
  397. ExcelDoc.write(row,7,Element->mZTDetections.at(detect)->mRank);
  398. if(Element->mDetectionFlagsValid == false)
  399. {
  400. ExcelDoc.write(row,8,QString("N/D")); //Fonction FN
  401. ExcelDoc.write(row,9,QString("N/D")); //Fonction PG
  402. ExcelDoc.write(row,10,QString("N/D")); //Fonction PPE
  403. ExcelDoc.write(row,11,QString("N/D")); //Fonction ZT1
  404. ExcelDoc.write(row,12,QString("N/D")); //Fonction ZT2
  405. }
  406. else
  407. {
  408. ExcelDoc.write(row,8,QString("N/A")); //Fonction FN
  409. ExcelDoc.write(row,9,QString("N/A")); //Fonction PG
  410. QString Status = "Hors service";
  411. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_PP2)
  412. {
  413. Status = "En service";
  414. }
  415. ExcelDoc.write(row,10,Status); //Fonction PP
  416. Status = "Hors service";
  417. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT1_MASK)
  418. {
  419. Status = "En service";
  420. }
  421. ExcelDoc.write(row,11,Status); //ZT1
  422. Status = "Hors service";
  423. if(Element->mFlags.mZTDetectionsConfig & DETECTION_FCT_ZT2_MASK)
  424. {
  425. Status = "En service";
  426. }
  427. ExcelDoc.write(row,12,Status); //ZT2
  428. }
  429. row++;
  430. IncPassage = true; //we had ad least one log added, this passage must count...
  431. }
  432. }
  433. }
  434. if(IncPassage == true || mReportFilters.mReportIncludeSansDeclZT2)
  435. {
  436. PassageID++;
  437. }
  438. }
  439. }
  440. }
  441. }
  442. ExcelDoc.save();
  443. ThreadReportStatus("Rapport créé avec succès!");
  444. mProgramPtr->ReportCreationFinished(mReportFilename);
  445. qDebug("Création du rapport terminée");
  446. return RET_OK;
  447. }
  448. void CReportGenerator::ThreadReportStatus(QString status)
  449. {
  450. mProgramPtr->UpdateReportProgressStatus(status);
  451. }
  452. int CReportGenerator::AbortReportCreation()
  453. {
  454. mDirParserWorkerThread->KillThread();
  455. return RET_OK;
  456. }