private boolean generateReport(Path output, Profile profile, DashBoard dash, int fetchCount, long startFrom) throws Exception { switch (report.reportOutput) { case MERGED_CSV: return merged(output, profile, dash, fetchCount, startFrom); case CSV_FILE_PER_DEVICE: return filePerDevice(output, profile, dash, fetchCount, startFrom); case CSV_FILE_PER_DEVICE_PER_PIN: case EXCEL_TAB_PER_DEVICE: default: return filePerDevicePerPin(output, profile, dash, fetchCount, startFrom); } }
@Override public void run() { try { report.lastReportAt = generateReport(); log.debug(report); } catch (Exception e) { log.debug("Error generating report {} for {}.", report, key.user.email, e); } }
private ReportResult generateReport(Path userCsvFolder, Profile profile, DashBoard dash, long now) throws Exception { int fetchCount = (int) report.reportType.getFetchCount(report.granularityType); long startFrom = now - TimeUnit.DAYS.toMillis(report.reportType.getDuration()); //truncate second, minute, hour, depending of granularity in order to do not filter first point. //https://github.com/blynkkk/blynk-server/issues/1149 startFrom = (startFrom / report.granularityType.period) * report.granularityType.period; Path output = Paths.get(userCsvFolder.toString() + ".zip"); boolean hasData = generateReport(output, profile, dash, fetchCount, startFrom); if (hasData) { sendEmail(output); return ReportResult.OK; } log.info("No data for report for user {} and reportId {}.", key.user.email, report.id); return ReportResult.NO_DATA; }
if (onePinDataCsv.length() > 0) { String onePinFileName = deviceAndPinFileName(deviceName, deviceId, reportDataStream); addZipEntryAndWrite(zipStream, onePinFileName, onePinDataCsv.getBytes(REPORT_ENCODING)); atLeastOne = true;
for (int deviceId : reportSource.getDeviceIds()) { String deviceName = profile.getDeviceName(dash, deviceId); String deviceFileName = deviceFileName(deviceName, deviceId); ZipEntry zipEntry = new ZipEntry(deviceFileName); zipStream.putNextEntry(zipEntry);
protected long generateReport() { long now = System.currentTimeMillis(); String date = LocalDate.now(report.tzName).toString(); Path userCsvFolder = FileUtils.getUserReportDir( key.user.email, key.user.appName, key.reportId, date); try { Profile profile = key.user.profile; DashBoard dash = profile.getDashByIdOrThrow(key.dashId); report.lastRunResult = generateReport(userCsvFolder, profile, dash, now); } catch (IllegalCommandException illegalState) { report.lastRunResult = ReportResult.ERROR; log.debug("Dashboard is not exists anymore for the report {} for user {}. ", report.id, key.user.email); } catch (Exception e) { report.lastRunResult = ReportResult.ERROR; log.error("Error generating report {} for user {}. ", report.id, key.user.email); log.error("Error: ", e); } long newNow = System.currentTimeMillis(); log.info("Processed report for {}, time {} ms.", key.user.email, newNow - now); return newNow; }