Rev 33926 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package com.spice.profitmandi.service;import com.spice.profitmandi.common.model.ProfitMandiConstants;import com.spice.profitmandi.dao.model.*;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.query.NativeQuery;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Component;import javax.persistence.TypedQuery;import java.time.LocalDate;import java.util.ArrayList;import java.util.List;@Componentpublic class RbmTargetServiceImpl implements RbmTargetService {private static final Logger LOGGER = LogManager.getLogger(RbmTargetServiceImpl.class);@AutowiredSessionFactory sessionFactory;@Overridepublic List<WarehouseRbmTargetModel> getWarehouseWiseRbmMonthlyTarget() {Session session = sessionFactory.getCurrentSession();final TypedQuery<WarehouseRbmTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getWarehouseWiseMonthlyTarget", WarehouseRbmTargetModel.class);return typedQuerySimilar.getResultList();}@Overridepublic List<MTDAchievedTargetModel> getDateWiseAchievedTargetOfRbm(LocalDate startDate, LocalDate endDate) {Session session = sessionFactory.getCurrentSession();final TypedQuery<MTDAchievedTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getRbmAchievedMonthlyTarget", MTDAchievedTargetModel.class);typedQuerySimilar.setParameter("startDate", startDate);typedQuerySimilar.setParameter("endDate", endDate);return typedQuerySimilar.getResultList();}@Overridepublic List<TodayAchievedMovementModel> getTodayTargetByMovement(LocalDate startDate, LocalDate endDate) {LOGGER.info("start date {}, end date {}", startDate, endDate);Session session = sessionFactory.getCurrentSession();final TypedQuery<TodayAchievedMovementModel> typedQuerySimilar = session.createNamedQuery("RBMTarget.TodayTargetByMovement", TodayAchievedMovementModel.class);typedQuerySimilar.setParameter("startDate", startDate);typedQuerySimilar.setParameter("endDate", endDate);return typedQuerySimilar.getResultList();}@Override@Cacheable(value = "warehouseMobileStockByMovement", cacheManager = "oneDayCacheManager")public List<WarehouseMobileStockByMovementModel> getWarehouseMobileStockByMovement() {Session session = sessionFactory.getCurrentSession();final TypedQuery<WarehouseMobileStockByMovementModel> typedQuerySimilar = session.createNamedQuery("WarehouseStock.MovementWiseMobileStock", WarehouseMobileStockByMovementModel.class);return typedQuerySimilar.getResultList();}public int getWorkingDaysCount(LocalDate startDate) {Session session = sessionFactory.getCurrentSession();// Convert the LocalDate to a format MySQL can interpretString startDateString = startDate.toString();final NativeQuery<?> nativeQuery = session.createNativeQuery("SELECT (DATEDIFF(LAST_DAY(:startDate), :startDate) + 1) " +" - (FLOOR((DATEDIFF(LAST_DAY(:startDate), :startDate) + (WEEKDAY(:startDate) + 1)) / 7)) " +" - (CASE WHEN WEEKDAY(:startDate) = 6 THEN 1 ELSE 0 END) " +" - (SELECT COUNT(*) " +" FROM logistics.publicholidays " +" WHERE date BETWEEN :startDate AND LAST_DAY(:startDate) " +" AND WEEKDAY(date) != 6) AS working_days");// Set the start date parameter for each placeholdernativeQuery.setParameter("startDate", startDateString);Object result = nativeQuery.getSingleResult();return result != null ? ((Number) result).intValue() : 0;}@Overridepublic List<RbmArrViewModel> getRbmTodayArr() throws Exception {LocalDate todayDate = LocalDate.now();return getRbmTodayArr(todayDate);}@Overridepublic List<RbmArrViewModel> getRbmTodayArr(LocalDate todayDate) throws Exception {LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();List<TodayAchievedMovementModel> todayAchievedMovementModels = getTodayTargetByMovement(todayDate, todayDate.plusDays(1));// LOGGER.info("todayAchievedMovementModels {} ", todayAchievedMovementModels);List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);List<WarehouseMobileStockByMovementModel> warehouseMobileStockByMovementModels = getWarehouseMobileStockByMovement();// LOGGER.info("warehouseMobileStockByMovementModels {}",warehouseMobileStockByMovementModels);List<RbmArrViewModel> rbmArrViewModels = new ArrayList<>();for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {// LOGGER.info("rbmTarget {}",rbmTarget);float monthlyTarget = rbmTarget.getMonthlyTarget();float achievedSoFar = (float) mtdAchievedTargetModels.stream().filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId()).mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget).sum();float remainingTarget = monthlyTarget - achievedSoFar;float todayTarget = remainingWorkingDaysCount > 0 ? remainingTarget / remainingWorkingDaysCount : 0;// Get the warehouse stock dataWarehouseMobileStockByMovementModel warehouseMobileStockByMovementModel = warehouseMobileStockByMovementModels.stream().filter(x -> x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().orElse(null);if (warehouseMobileStockByMovementModel != null) {// Total stock value for this warehousefloat totalStockValue = warehouseMobileStockByMovementModel.getTotalAvailabilityPrice();// Calculate target allocation based on stock value proportionfloat hidTarget = (warehouseMobileStockByMovementModel.getTotalHidCatalogPrice() / totalStockValue) * todayTarget;float fastMovingTarget = (warehouseMobileStockByMovementModel.getTotalFastMovingCatalogPrice() / totalStockValue) * todayTarget;float slowMovingTarget = (warehouseMobileStockByMovementModel.getTotalSlowMovingCatalogPrice() / totalStockValue) * todayTarget;float eolTarget = (warehouseMobileStockByMovementModel.getTotalEolCatalogPrice() / totalStockValue) * todayTarget;float otherTarget = (warehouseMobileStockByMovementModel.getTotalOtherCategoryCatalogPrice() / totalStockValue) * todayTarget;// set all realated value in view model for dashboardString warehouseName = ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(rbmTarget.getWarehouseId(), "Unknown");TodayAchievedMovementModel todayAchievedMovementModel = todayAchievedMovementModels.stream().filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().get();// LOGGER.info("todayAchievedMovementModel {}",todayAchievedMovementModel);RbmArrViewModel viewModel = new RbmArrViewModel();viewModel.setAuthId(rbmTarget.getAuthId());viewModel.setRbmName(rbmTarget.getRbmName());viewModel.setWarehouseName(warehouseName);viewModel.setTodayTarget(Math.round(todayTarget));viewModel.setMonthlyTarget(Math.round(monthlyTarget));viewModel.setMtdAchievedTarget(Math.round(achievedSoFar));viewModel.setTodayHidTarget(Math.round((hidTarget)));viewModel.setTodayFastMovingTarget(Math.round(fastMovingTarget));viewModel.setTodaySlowMovingTarget(Math.round(slowMovingTarget));viewModel.setTodayEolTarget(Math.round(eolTarget));viewModel.setTodayOtherMovingTarget(Math.round(otherTarget));viewModel.setTodayAchievedHidTarget(Math.round(todayAchievedMovementModel.getHidBilled()));viewModel.setTodayAchievedFastMovingTarget(Math.round(todayAchievedMovementModel.getFastMovingBilled()));viewModel.setTodayAchievedSlowMovingTarget(Math.round(todayAchievedMovementModel.getSlowMovingBilled()));viewModel.setTodayAchievedEolTarget(Math.round(todayAchievedMovementModel.getEolBilled()));viewModel.setTodayAchievedOtherMovingTarget(Math.round(todayAchievedMovementModel.getOtherBilled()));viewModel.setTotalAchievedTarget(Math.round(todayAchievedMovementModel.getHidBilled() + todayAchievedMovementModel.getFastMovingBilled() + todayAchievedMovementModel.getSlowMovingBilled() + todayAchievedMovementModel.getEolBilled() + todayAchievedMovementModel.getOtherBilled()));rbmArrViewModels.add(viewModel);}}LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);return rbmArrViewModels;}}