package org.hso.ecommerce.controller.cronjob; import org.hso.ecommerce.action.warehouse.CalculateWarehouseStatsAction; import org.hso.ecommerce.entities.dashboard.DashboardSummary; import org.hso.ecommerce.entities.warehouse.WarehouseBookingPositionSlotEntry; import org.springframework.stereotype.Component; import java.sql.Timestamp; import java.util.Calendar; import java.util.List; import java.util.stream.Collectors; @Component public class DashboardCronjob implements ICronjob { @Override public Calendar nextExecution(Calendar reference) { reference.add(Calendar.DAY_OF_MONTH, 1); reference.set(Calendar.HOUR_OF_DAY, 0); reference.set(Calendar.MINUTE, 0); reference.set(Calendar.SECOND, 0); reference.set(Calendar.MILLISECOND, 0); return reference; } @Override public Calendar previousExecution(Calendar reference) { reference.set(Calendar.HOUR_OF_DAY, 0); reference.set(Calendar.MINUTE, 0); reference.set(Calendar.SECOND, 0); reference.set(Calendar.MILLISECOND, 0); return reference; } @Override public void executeAt(Calendar time, CronjobController controller) { Calendar oneDayBefore = (Calendar) time.clone(); oneDayBefore.add(Calendar.DAY_OF_MONTH, -1); DashboardSummary dashboardSummary = new DashboardSummary(); List entries = controller.slotRepository.findAll().stream().map( s -> controller.warehouseBookingPositionSlotEntryRepository .getBySlotNum(s.slotNum) .orElseGet(() -> WarehouseBookingPositionSlotEntry.empty(null, s)) ).collect(Collectors.toList()); CalculateWarehouseStatsAction.WarehouseStats warehouseStats = new CalculateWarehouseStatsAction(entries).finish(); dashboardSummary.created = new java.sql.Date(time.getTimeInMillis()); dashboardSummary.todaysCustomersOrders = nullToZero(getSales(oneDayBefore, time, controller)); dashboardSummary.todaysNewCustomers = nullToZero(getNewUsers(oneDayBefore, time, controller)); dashboardSummary.todaysWarehouseCapacity = warehouseStats.efficiency; dashboardSummary.currentWarehouseCapacity = warehouseStats.ratioUsedSlots; dashboardSummary.todaysSalesCent = nullToZero(getTurnover(oneDayBefore, time, controller)); controller.dashboardSummaryRepository.save(dashboardSummary); } @Override public String getDisplayName() { return "Dashboard refresh"; } private Integer getSales (Calendar begin, Calendar end, CronjobController controller) { return controller.customerOrderRepository.countOrdersInTimespan( new Timestamp(begin.getTimeInMillis()), new Timestamp(end.getTimeInMillis())); } private Integer getTurnover (Calendar begin, Calendar end, CronjobController controller) { return controller.customerOrderRepository.countTurnoverInTimespan( new Timestamp(begin.getTimeInMillis()), new Timestamp(end.getTimeInMillis())); } private Integer getNewUsers (Calendar begin, Calendar end, CronjobController controller) { return controller.userRepository.countUsersInTimespan( new Timestamp(begin.getTimeInMillis()), new Timestamp(end.getTimeInMillis())); } private int nullToZero(Integer input) { return input == null ? 0 : input; } }