Commit fc1b8dfb by yinyong

JIT备货天数

parent 9c91d5fc
...@@ -32,10 +32,7 @@ import java.time.LocalDate; ...@@ -32,10 +32,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.Period; import java.time.Period;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@Slf4j @Slf4j
public class AutoTurnoverJob extends PointJob { public class AutoTurnoverJob extends PointJob {
...@@ -265,6 +262,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -265,6 +262,7 @@ public class AutoTurnoverJob extends PointJob {
List<BigDecimal> forecastShortSupplyList = new ArrayList<BigDecimal>(autoForecastDay); List<BigDecimal> forecastShortSupplyList = new ArrayList<BigDecimal>(autoForecastDay);
List<BigDecimal> forecastPurchaseAdvisedList = new ArrayList<BigDecimal>(autoForecastDay); List<BigDecimal> forecastPurchaseAdvisedList = new ArrayList<BigDecimal>(autoForecastDay);
List<BigDecimal> moqPurchaseAdvisedList = 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); initForecaseList(forecastInboundRelationList, forecastInventoryList, forecastPurchaseInboundList, forecastTransferInboundList, forecastInboundList, forecastSalesList, forecastShortSupplyList, autoForecastDay, forecastSalesExplainList);
/* /*
...@@ -282,7 +280,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -282,7 +280,7 @@ public class AutoTurnoverJob extends PointJob {
* 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值 * 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值
* 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含0, 无法使用指数函数拟合 * 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含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 { ...@@ -341,7 +339,7 @@ public class AutoTurnoverJob extends PointJob {
* 可以支持配置 * 可以支持配置
* 2019-04-22更新 不管逾期 * 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(); Integer moq = turnoverSku.getMoq();
/* /*
...@@ -413,7 +411,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -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 { ...@@ -987,7 +985,15 @@ public class AutoTurnoverJob extends PointJob {
* @param forecastSalesList * @param forecastSalesList
*/ */
private void calculateForecastSales(BigDecimal salesUpperLimit, Integer autoForecastDay, DcAutoSales 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))) { 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); DcBaseOmsSkuMapper dcBaseOmsSkuMapper = SessionUtil.getSession().getMapper(DcBaseOmsSkuMapper.class);
...@@ -1007,7 +1013,6 @@ public class AutoTurnoverJob extends PointJob { ...@@ -1007,7 +1013,6 @@ public class AutoTurnoverJob extends PointJob {
} }
BigDecimal avgHistoryThreedaySales = BigDecimal.valueOf(historyThreeSales.longValue()).divide(Constant.BIGDECIMAL_THREE, 3, RoundingMode.HALF_EVEN); 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); BigDecimal avgHistorySevendaySales = BigDecimal.valueOf(historySevenSales.longValue()).divide(Constant.BIGDECIMAL_SEVEN, 3, RoundingMode.HALF_EVEN);
if(dcBaseOmsSku != null && recordTime.minusDays(7L).isBefore(dcBaseOmsSku.getCreateTime().toLocalDate())) { if(dcBaseOmsSku != null && recordTime.minusDays(7L).isBefore(dcBaseOmsSku.getCreateTime().toLocalDate())) {
for(int j = 0; j < autoForecastDay; j++) { for(int j = 0; j < autoForecastDay; j++) {
forecastSalesList.set(j, avgHistoryThreedaySales); forecastSalesList.set(j, avgHistoryThreedaySales);
...@@ -1032,6 +1037,16 @@ public class AutoTurnoverJob extends PointJob { ...@@ -1032,6 +1037,16 @@ public class AutoTurnoverJob extends PointJob {
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales); 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 { ...@@ -1144,7 +1159,7 @@ public class AutoTurnoverJob extends PointJob {
} }
private BigDecimal calculateSafeInventory( DcBaseSku turnoverSku, String bailunSku, String warehouseCode, Integer 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 * 先判断是否JIT 仓库是广州01 warehouse_code 且是那三个销售员 turnoversku
* *
...@@ -1157,6 +1172,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -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 weightingAvgSales = caculateWeightingAvgSales(BigDecimal.valueOf(0.3), BigDecimal.valueOf(0.3), BigDecimal.valueOf(0.4), historyThirtySalesList);
BigDecimal saveDays = getSaveDays(dcAutoSales, dcAutoTurnover, bailunSku, "weightingAvgSales", dcAutoStockUpRange); BigDecimal saveDays = getSaveDays(dcAutoSales, dcAutoTurnover, bailunSku, "weightingAvgSales", dcAutoStockUpRange);
saveDaysMap.put("saveDays", saveDays);
dcAutoTurnover.setDailyWeightedSales(weightingAvgSales); dcAutoTurnover.setDailyWeightedSales(weightingAvgSales);
weightingAvgSales = weightingAvgSales.multiply(saveDays); weightingAvgSales = weightingAvgSales.multiply(saveDays);
return weightingAvgSales; return weightingAvgSales;
...@@ -1414,6 +1430,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -1414,6 +1430,7 @@ 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))) { 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));
totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(BigDecimal.valueOf(turnoverDays));
dcAutoTurnover.setTurnoverSales(totalSales); dcAutoTurnover.setTurnoverSales(totalSales);
}else{ }else{
dcAutoTurnover.setTurnoverSales(totalSales); dcAutoTurnover.setTurnoverSales(totalSales);
...@@ -1460,7 +1477,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -1460,7 +1477,7 @@ public class AutoTurnoverJob extends PointJob {
recordTime, DcAutoTurnover dcAutoTurnover, Integer turnoverDays, Integer 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 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 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 inboundDecimal;
BigDecimal forecastInventory; BigDecimal forecastInventory;
BigDecimal shortSupply; BigDecimal shortSupply;
...@@ -1517,8 +1534,12 @@ public class AutoTurnoverJob extends PointJob { ...@@ -1517,8 +1534,12 @@ public class AutoTurnoverJob extends PointJob {
if (j >= turnoverDays) { if (j >= turnoverDays) {
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))) { 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)); totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(BigDecimal.valueOf(turnoverDays));
dcAutoTurnover.setTurnoverSales(totalSales); dcAutoTurnover.setTurnoverSales(totalSales);
if(saveDays != null) {
totalSales = dcAutoTurnover.getDailyWeightedSales().multiply(saveDays);
}
}else{ }else{
dcAutoTurnover.setTurnoverSales(totalSales); 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