Commit fc1b8dfb by yinyong

JIT备货天数

parent 9c91d5fc
......@@ -32,10 +32,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.*;
@Slf4j
public class AutoTurnoverJob extends PointJob {
......@@ -265,6 +262,7 @@ public class AutoTurnoverJob extends PointJob {
List<BigDecimal> forecastShortSupplyList = new ArrayList<BigDecimal>(autoForecastDay);
List<BigDecimal> forecastPurchaseAdvisedList = new ArrayList<BigDecimal>(autoForecastDay);
List<BigDecimal> moqPurchaseAdvisedList = new ArrayList<BigDecimal>(autoForecastDay);
Map<String, BigDecimal> saveDaysMap = new HashMap<String, BigDecimal>();
initForecaseList(forecastInboundRelationList, forecastInventoryList, forecastPurchaseInboundList, forecastTransferInboundList, forecastInboundList, forecastSalesList, forecastShortSupplyList, autoForecastDay, forecastSalesExplainList);
/*
......@@ -282,7 +280,7 @@ public class AutoTurnoverJob extends PointJob {
* 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值
* 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含0, 无法使用指数函数拟合
*/
calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku);
calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku, warehouseCode);
/*
* 处理矫正信息
......@@ -341,7 +339,7 @@ public class AutoTurnoverJob extends PointJob {
* 可以支持配置
* 2019-04-22更新 不管逾期
*/
BigDecimal totalSafeInventory = calculateSafeInventory( turnoverSku, bailunSku, warehouseCode, bailunFirstLevelCatagoryId, dcAutoSales, JSON.toJSONString(forecastSalesList), dcAutoTurnover);
BigDecimal totalSafeInventory = calculateSafeInventory( turnoverSku, bailunSku, warehouseCode, bailunFirstLevelCatagoryId, dcAutoSales, JSON.toJSONString(forecastSalesList), dcAutoTurnover, saveDaysMap);
Integer moq = turnoverSku.getMoq();
/*
......@@ -413,7 +411,7 @@ public class AutoTurnoverJob extends PointJob {
* 获取采购建议-普通仓库
* 实际缺货 + 总销量 - 总预计入库 + (安全库存 - 预测库存) + 周转天的销量
*/
inventoryAvailableDays = commonAdvise(turnoverSku, warehouseCode, hasMonitorFluctuation, forecastFluctuationList, recordTime, dcAutoTurnover, turnoverDays, autoForecastDay, forecastInventoryList, forecastInboundList, forecastSalesList, forecastShortSupplyList, forecastPurchaseAdvisedList, moqPurchaseAdvisedList, realInventory, totalSafeInventory, outStock, inventoryAvailableDays, totalSales, totalInbound, moqDecimal);
inventoryAvailableDays = commonAdvise(turnoverSku, warehouseCode, hasMonitorFluctuation, forecastFluctuationList, recordTime, dcAutoTurnover, turnoverDays, autoForecastDay, forecastInventoryList, forecastInboundList, forecastSalesList, forecastShortSupplyList, forecastPurchaseAdvisedList, moqPurchaseAdvisedList, realInventory, totalSafeInventory, outStock, inventoryAvailableDays, totalSales, totalInbound, moqDecimal, saveDaysMap);
}
/*
......@@ -987,7 +985,15 @@ public class AutoTurnoverJob extends PointJob {
* @param forecastSalesList
*/
private void calculateForecastSales(BigDecimal salesUpperLimit, Integer autoForecastDay, DcAutoSales
dcAutoSales, List<BigDecimal> forecastSalesList, DcBaseSku turnoverSku, LocalDate recordTime, String bailunSku) {
dcAutoSales, List<BigDecimal> forecastSalesList, DcBaseSku turnoverSku, LocalDate recordTime, String bailunSku, String warehouseCode) {
/*DcConfigForecastSalesMapper dcConfigForecastSalesMapper = SessionUtil.getSession().getMapper(DcConfigForecastSalesMapper.class);
List<DcConfigForecastSales> configForecastSalesList = dcConfigForecastSalesMapper.selectByExample(DcConfigForecastSalesExample.newAndCreateCriteria().andBailunSkuEqualTo(bailunSku).andWarehouseCodeEqualTo(warehouseCode).example());
DcBasePurchase dcBasePurchase = null;
if(configForecastSalesList != null && configForecastSalesList.size() > 0) {
DcBasePurchaseMapper dcBasePurchaseMapper = SessionUtil.getSession().getMapper(DcBasePurchaseMapper.class);
dcBasePurchase = dcBasePurchaseMapper.selectOneByExample(DcBasePurchaseExample.newAndCreateCriteria().andBailunSkuEqualTo(bailunSku).andWarehouseCodeEqualTo(warehouseCode).example());
}*/
if(recordTime.minusDays(21L).isBefore(turnoverSku.getPushTime().toLocalDate()) && !(turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_1)) && !(turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_2)) && !(turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_4))) {
DcBaseOmsSkuMapper dcBaseOmsSkuMapper = SessionUtil.getSession().getMapper(DcBaseOmsSkuMapper.class);
......@@ -1007,7 +1013,6 @@ public class AutoTurnoverJob extends PointJob {
}
BigDecimal avgHistoryThreedaySales = BigDecimal.valueOf(historyThreeSales.longValue()).divide(Constant.BIGDECIMAL_THREE, 3, RoundingMode.HALF_EVEN);
BigDecimal avgHistorySevendaySales = BigDecimal.valueOf(historySevenSales.longValue()).divide(Constant.BIGDECIMAL_SEVEN, 3, RoundingMode.HALF_EVEN);
if(dcBaseOmsSku != null && recordTime.minusDays(7L).isBefore(dcBaseOmsSku.getCreateTime().toLocalDate())) {
for(int j = 0; j < autoForecastDay; j++) {
forecastSalesList.set(j, avgHistoryThreedaySales);
......@@ -1032,6 +1037,16 @@ public class AutoTurnoverJob extends PointJob {
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);
}
}
/*if(dcBasePurchase == null) {
for(DcConfigForecastSales dcConfigForecastSales : configForecastSalesList) {
LocalDate localDate = LocalDate.now();
for(int j = 0; j < autoForecastDay; j++) {
Long i = dcConfigForecastSales.getStartDate().toLocalDate().toEpochDay() - localDate.toEpochDay();
}
}
}*/
}
/**
......@@ -1144,7 +1159,7 @@ public class AutoTurnoverJob extends PointJob {
}
private BigDecimal calculateSafeInventory( DcBaseSku turnoverSku, String bailunSku, String warehouseCode, Integer
bailunFirstLevelCatagoryId, DcAutoSales dcAutoSales, String forecastSalesListJson, DcAutoTurnover dcAutoTurnover) {
bailunFirstLevelCatagoryId, DcAutoSales dcAutoSales, String forecastSalesListJson, DcAutoTurnover dcAutoTurnover, Map<String, BigDecimal> saveDaysMap) {
/*
* 先判断是否JIT 仓库是广州01 warehouse_code 且是那三个销售员 turnoversku
*
......@@ -1157,6 +1172,7 @@ public class AutoTurnoverJob extends PointJob {
BigDecimal weightingAvgSales = caculateWeightingAvgSales(BigDecimal.valueOf(0.3), BigDecimal.valueOf(0.3), BigDecimal.valueOf(0.4), historyThirtySalesList);
BigDecimal saveDays = getSaveDays(dcAutoSales, dcAutoTurnover, bailunSku, "weightingAvgSales", dcAutoStockUpRange);
saveDaysMap.put("saveDays", saveDays);
dcAutoTurnover.setDailyWeightedSales(weightingAvgSales);
weightingAvgSales = weightingAvgSales.multiply(saveDays);
return weightingAvgSales;
......@@ -1414,6 +1430,7 @@ public class AutoTurnoverJob extends PointJob {
if (j == turnoverDays) { //周转期内总销量
if (warehouseCode.equals(Constant.WAREHOUSE_JIT) && (turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_1) || turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_2))) {
totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(BigDecimal.valueOf(turnoverDays));
totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(BigDecimal.valueOf(turnoverDays));
dcAutoTurnover.setTurnoverSales(totalSales);
}else{
dcAutoTurnover.setTurnoverSales(totalSales);
......@@ -1460,7 +1477,7 @@ public class AutoTurnoverJob extends PointJob {
recordTime, DcAutoTurnover dcAutoTurnover, Integer turnoverDays, Integer
autoForecastDay, List<BigDecimal> forecastInventoryList, List<Integer> forecastInboundList, List<BigDecimal> forecastSalesList, List<BigDecimal> forecastShortSupplyList, List<BigDecimal> forecastPurchaseAdvisedList, List<BigDecimal> moqPurchaseAdvisedList, Integer
realInventory, BigDecimal totalSafeInventory, Integer outStock, Integer inventoryAvailableDays, BigDecimal
totalSales, BigDecimal totalInbound, BigDecimal moqDecimal) {
totalSales, BigDecimal totalInbound, BigDecimal moqDecimal, Map<String, BigDecimal> saveDaysMap) {
BigDecimal inboundDecimal;
BigDecimal forecastInventory;
BigDecimal shortSupply;
......@@ -1517,8 +1534,12 @@ public class AutoTurnoverJob extends PointJob {
if (j >= turnoverDays) {
if (j == turnoverDays) {
if (warehouseCode.equals(Constant.WAREHOUSE_JIT) && (turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_1) || turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_2))) {
BigDecimal saveDays = saveDaysMap.get("saveDays");
totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(BigDecimal.valueOf(turnoverDays));
dcAutoTurnover.setTurnoverSales(totalSales);
if(saveDays != null) {
totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(saveDays);
}
}else{
dcAutoTurnover.setTurnoverSales(totalSales);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment