2020-06-15 17:47:55 +02:00
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 ;
2020-06-21 15:50:27 +02:00
import org.hso.ecommerce.repos.shop.CustomerOrderRepository ;
import org.hso.ecommerce.repos.user.UserRepository ;
import org.hso.ecommerce.repos.warehouse.SlotRepository ;
import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository ;
import org.springframework.beans.factory.annotation.Autowired ;
2020-06-15 17:47:55 +02:00
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 {
2020-06-21 15:50:27 +02:00
@Autowired
private SlotRepository slotRepository = null ;
@Autowired
private UserRepository userRepository = null ;
@Autowired
private WarehouseBookingPositionSlotEntryRepository warehouseBookingPositionSlotEntryRepository = null ;
@Autowired
private CustomerOrderRepository customerOrderRepository = null ;
2020-06-15 17:47:55 +02:00
@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 ( ) ;
2020-06-21 15:50:27 +02:00
List < WarehouseBookingPositionSlotEntry > entries = slotRepository . findAll ( ) . stream ( ) . map (
s - > warehouseBookingPositionSlotEntryRepository
2020-06-15 17:47:55 +02:00
. getBySlotNum ( s . slotNum )
. orElseGet ( ( ) - > WarehouseBookingPositionSlotEntry . empty ( null , s ) )
) . collect ( Collectors . toList ( ) ) ;
2020-06-21 15:50:27 +02:00
CalculateWarehouseStatsAction . WarehouseStats warehouseStats = new CalculateWarehouseStatsAction ( entries ) . finish ( ) ;
2020-06-15 17:47:55 +02:00
dashboardSummary . created = new java . sql . Date ( time . getTimeInMillis ( ) ) ;
2020-06-21 15:50:27 +02:00
dashboardSummary . todaysCustomersOrders = nullToZero ( getSales ( oneDayBefore , time ) ) ;
dashboardSummary . todaysNewCustomers = nullToZero ( getNewUsers ( oneDayBefore , time ) ) ;
2020-06-15 17:47:55 +02:00
dashboardSummary . todaysWarehouseCapacity = warehouseStats . efficiency ;
dashboardSummary . currentWarehouseCapacity = warehouseStats . ratioUsedSlots ;
2020-06-21 15:50:27 +02:00
dashboardSummary . todaysSalesCent = nullToZero ( getTurnover ( oneDayBefore , time ) ) ;
2020-06-15 17:47:55 +02:00
controller . dashboardSummaryRepository . save ( dashboardSummary ) ;
}
2020-06-15 21:41:54 +02:00
@Override
public String getDisplayName ( ) {
return " Dashboard refresh " ;
}
2020-06-21 15:50:27 +02:00
private Integer getSales ( Calendar begin , Calendar end ) {
return customerOrderRepository . countOrdersInTimespan (
2020-06-15 17:47:55 +02:00
new Timestamp ( begin . getTimeInMillis ( ) ) , new Timestamp ( end . getTimeInMillis ( ) ) ) ;
}
2020-06-21 15:50:27 +02:00
private Integer getTurnover ( Calendar begin , Calendar end ) {
return customerOrderRepository . countTurnoverInTimespan (
2020-06-15 17:47:55 +02:00
new Timestamp ( begin . getTimeInMillis ( ) ) , new Timestamp ( end . getTimeInMillis ( ) ) ) ;
}
2020-06-21 15:50:27 +02:00
private Integer getNewUsers ( Calendar begin , Calendar end ) {
return userRepository . countUsersInTimespan (
2020-06-15 17:47:55 +02:00
new Timestamp ( begin . getTimeInMillis ( ) ) , new Timestamp ( end . getTimeInMillis ( ) ) ) ;
}
2020-06-15 21:41:54 +02:00
private int nullToZero ( Integer input ) {
return input = = null ? 0 : input ;
}
2020-06-15 17:47:55 +02:00
}