diff options
Diffstat (limited to 'src/main/java/org/traccar')
-rw-r--r-- | src/main/java/org/traccar/model/Calendar.java | 16 | ||||
-rw-r--r-- | src/main/java/org/traccar/model/Report.java | 22 | ||||
-rw-r--r-- | src/main/java/org/traccar/schedule/TaskReports.java | 51 |
3 files changed, 34 insertions, 55 deletions
diff --git a/src/main/java/org/traccar/model/Calendar.java b/src/main/java/org/traccar/model/Calendar.java index c1f98a957..62c51cc4a 100644 --- a/src/main/java/org/traccar/model/Calendar.java +++ b/src/main/java/org/traccar/model/Calendar.java @@ -24,6 +24,7 @@ import net.fortuna.ical4j.filter.predicate.PeriodRule; import net.fortuna.ical4j.model.DateTime; import net.fortuna.ical4j.model.Period; import net.fortuna.ical4j.model.component.CalendarComponent; +import net.fortuna.ical4j.model.component.VEvent; import org.traccar.storage.QueryIgnore; import org.traccar.storage.StorageName; @@ -32,6 +33,7 @@ import java.io.IOException; import java.time.Duration; import java.util.Collection; import java.util.Date; +import java.util.List; @StorageName("tc_calendars") public class Calendar extends ExtendedModel { @@ -66,14 +68,18 @@ public class Calendar extends ExtendedModel { return calendar; } - public boolean checkMoment(Date date) { + public Collection<VEvent> findEvents(Date date) { if (calendar != null) { Period period = new Period(new DateTime(date), Duration.ZERO); - Filter<CalendarComponent> filter = new Filter<>(new PeriodRule<>(period)); - Collection<CalendarComponent> events = filter.filter(calendar.getComponents(CalendarComponent.VEVENT)); - return events != null && !events.isEmpty(); + Filter<VEvent> filter = new Filter<>(new PeriodRule<>(period)); + return filter.filter(calendar.getComponents(CalendarComponent.VEVENT)); + } else { + return List.of(); } - return false; + } + + public boolean checkMoment(Date date) { + return !findEvents(date).isEmpty(); } } diff --git a/src/main/java/org/traccar/model/Report.java b/src/main/java/org/traccar/model/Report.java index 83bb2e920..1556ecc9e 100644 --- a/src/main/java/org/traccar/model/Report.java +++ b/src/main/java/org/traccar/model/Report.java @@ -17,8 +17,6 @@ package org.traccar.model; import org.traccar.storage.StorageName; -import java.util.Date; - @StorageName("tc_reports") public class Report extends ScheduledModel { @@ -42,24 +40,4 @@ public class Report extends ScheduledModel { this.description = description; } - private Date from; - - public Date getFrom() { - return from; - } - - public void setFrom(Date from) { - this.from = from; - } - - private Date to; - - public Date getTo() { - return to; - } - - public void setTo(Date to) { - this.to = to; - } - } diff --git a/src/main/java/org/traccar/schedule/TaskReports.java b/src/main/java/org/traccar/schedule/TaskReports.java index 259eb10d4..c80b786e9 100644 --- a/src/main/java/org/traccar/schedule/TaskReports.java +++ b/src/main/java/org/traccar/schedule/TaskReports.java @@ -15,6 +15,7 @@ */ package org.traccar.schedule; +import net.fortuna.ical4j.model.component.VEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.traccar.model.BaseModel; @@ -86,8 +87,15 @@ public class TaskReports implements ScheduleTask { for (Report report : storage.getObjects(Report.class, new Request(new Columns.All()))) { Calendar calendar = storage.getObject(Calendar.class, new Request( new Columns.All(), new Condition.Equals("id", report.getCalendarId()))); - if (calendar.checkMoment(currentCheck) && !calendar.checkMoment(lastCheck)) { - executeReport(report); + + var lastEvents = calendar.findEvents(lastCheck); + var currentEvents = calendar.findEvents(currentCheck); + + if (!lastEvents.isEmpty() && currentEvents.isEmpty()) { + VEvent event = lastEvents.iterator().next(); + Date from = event.getStartDate().getDate(); + Date to = event.getEndDate().getDate(); + executeReport(report, from, to); } } } catch (StorageException e) { @@ -95,7 +103,8 @@ public class TaskReports implements ScheduleTask { } } - private void executeReport(Report report) throws StorageException { + private void executeReport(Report report, Date from, Date to) throws StorageException { + var deviceIds = storage.getObjects(Device.class, new Request( new Columns.Include("id"), new Condition.Permission(Device.class, Report.class, report.getId()))) @@ -107,42 +116,28 @@ public class TaskReports implements ScheduleTask { var users = storage.getObjects(User.class, new Request( new Columns.Include("id"), new Condition.Permission(User.class, Report.class, report.getId()))); + for (User user : users) { switch (report.getType()) { case "events": - reportMailer.sendAsync(user.getId(), stream -> { - eventsReportProvider.getExcel( - stream, user.getId(), deviceIds, groupIds, - List.of(), report.getFrom(), report.getTo()); - }); + reportMailer.sendAsync(user.getId(), stream -> eventsReportProvider.getExcel( + stream, user.getId(), deviceIds, groupIds, List.of(), from, to)); break; case "route": - reportMailer.sendAsync(user.getId(), stream -> { - routeReportProvider.getExcel( - stream, user.getId(), deviceIds, groupIds, - report.getFrom(), report.getTo()); - }); + reportMailer.sendAsync(user.getId(), stream -> routeReportProvider.getExcel( + stream, user.getId(), deviceIds, groupIds, from, to)); break; case "summary": - reportMailer.sendAsync(user.getId(), stream -> { - summaryReportProvider.getExcel( - stream, user.getId(), deviceIds, groupIds, - report.getFrom(), report.getTo(), false); - }); + reportMailer.sendAsync(user.getId(), stream -> summaryReportProvider.getExcel( + stream, user.getId(), deviceIds, groupIds, from, to, false)); break; case "trips": - reportMailer.sendAsync(user.getId(), stream -> { - tripsReportProvider.getExcel( - stream, user.getId(), deviceIds, groupIds, - report.getFrom(), report.getTo()); - }); + reportMailer.sendAsync(user.getId(), stream -> tripsReportProvider.getExcel( + stream, user.getId(), deviceIds, groupIds, from, to)); break; case "stops": - reportMailer.sendAsync(user.getId(), stream -> { - stopsReportProvider.getExcel( - stream, user.getId(), deviceIds, groupIds, - report.getFrom(), report.getTo()); - }); + reportMailer.sendAsync(user.getId(), stream -> stopsReportProvider.getExcel( + stream, user.getId(), deviceIds, groupIds, from, to)); break; default: LOGGER.warn("Unsupported report type {}", report.getType()); |