Commit dbf89432 by huluobin

周转波动预测修改

parent 59838603
......@@ -390,9 +390,10 @@ public class AutoTurnoverJob extends PointJob {
* 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值
* 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含0, 无法使用指数函数拟合
*/
forecastSalesList = autoTurnoverService.getAutoTurnoverSaleDetails(dcAutoTurnover, turnoverDays, autoForecastDay);
// forecastSalesList = autoTurnoverService.getAutoTurnoverSaleDetails(dcAutoTurnover, turnoverDays, autoForecastDay);
calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku, warehouseCode, dcAutoWarehouseweekSales);
List<String> forecastSalesListFormula = autoTurnoverService.getAutoTurnoverSaleDetailsFormula(dcAutoTurnover, turnoverDays, autoForecastDay);
// List<String> forecastSalesListFormula = autoTurnoverService.getAutoTurnoverSaleDetailsFormula(dcAutoTurnover, turnoverDays, autoForecastDay);
/*
* 处理矫正信息
......@@ -647,7 +648,7 @@ public class AutoTurnoverJob extends PointJob {
if (i < 7) {
avgForecastSevendaySales = avgForecastSevendaySales.add(forecastSalesList.get(i));
forecastSalesList.add(i, BigDecimal.valueOf(historySalesList.get(23 + i)));
forecastSalesListFormula.add(StringUtils.SPACE);
// forecastSalesListFormula.add(i, StringUtils.SPACE);
forecastSalesExplainList.add(i, "历史销量");
forecastInboundList.add(i, 0);
forecastInventoryList.add(i, BigDecimal.ZERO);
......@@ -723,7 +724,7 @@ public class AutoTurnoverJob extends PointJob {
dcAutoTurnover.setTurnoverDays(turnoverDays);
dcAutoTurnover.setQuantitySafeInventory(totalSafeInventory);
dcAutoTurnover.setHqType(dcBaseWarehouse.getHqType());
dcAutoTurnover.setSalesDetailsFormula(new Gson().toJson(forecastSalesListFormula));
// dcAutoTurnover.setSalesDetailsFormula(new Gson().toJson(forecastSalesListFormula));
/*dcBaseStock.setSkuTitleCn(turnoverSku.getSkuTitleCn());
dcBaseStock.setProductInnerCode(turnoverSku.getProductInnerCode());
......@@ -1251,105 +1252,105 @@ public class AutoTurnoverJob extends PointJob {
}*/
// JIT 推送时间21天之内的sku 预测销量为最近7天均值
// if (turnoverSku.getPushTime() != null && 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);
// DcBaseOmsSku dcBaseOmsSku = dcBaseOmsSkuMapper.selectOneByCreateTime(bailunSku);*/
//
// List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
// });
// Integer historySevenSales = 0;
// Integer historyThreeSales = 0;
// for (int i = 0; i < 7; i++) {
// historySevenSales += historySalesList.get(23 + i);
// }
// BigDecimal avgHistorySevendaySales = BigDecimal.valueOf(historySevenSales.longValue()).divide(Constant.BIGDECIMAL_SEVEN, 3, RoundingMode.HALF_EVEN);
// for (int j = 0; j < autoForecastDay; j++) {
// forecastSalesList.set(j, avgHistorySevendaySales);
// }
//
// } else {
// BigDecimal forecastSales = BigDecimal.ZERO;
// List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
// });
// List<Integer> weekRateList = null;
// int weekTime = 0;
// boolean hasValue = true;
// if (dcAutoWarehouseweekSales == null) {
// hasValue = false;
// } else {
// weekRateList = JSON.parseObject("[" + dcAutoWarehouseweekSales.getRateDetail() + "]", new TypeReference<List<Integer>>() {
// });
// weekTime = Integer.valueOf(dcAutoWarehouseweekSales.getWeekTime());
// }
// for (int j = 0; j < autoForecastDay; j++) {
// // y = ae^bx
// /*double v;
// if (dcAutoSales.getFitForecastFormula().contains("ln(x)")) {
// //y = aln(x) + b
// v = dcAutoSales.getFitAVariable().doubleValue() * Math.log1p((j + 31)) + dcAutoSales.getFitBVariable().doubleValue();
// } else {
// v = dcAutoSales.getFitAVariable().doubleValue() * Math.exp(dcAutoSales.getFitBVariable().doubleValue() * (j + 31));
// }
// BigDecimal forecastSales = BigDecimal.valueOf(v < 0 ? 0 : v).setScale(0, RoundingMode.HALF_EVEN);
// forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);*/
//
// //20191127 预测销量更改为:(过去第四周*0.1 + 过去第三周*0.1 + 过去第二周*0.3 + 过去第一周*0.5)* 周系数
// if (0 <= j && j < 7) {
// forecastSales = BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1)).
// add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
// add(BigDecimal.valueOf(historySalesList.get(16 + j)).multiply(BigDecimal.valueOf(0.3))).
// add(BigDecimal.valueOf(historySalesList.get(23 + j)).multiply(BigDecimal.valueOf(0.5)));
// if (hasValue) {
// forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
// }
// } else if (7 <= j && j < 14) {
// forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
// add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
// add(BigDecimal.valueOf(historySalesList.get(16 + j)).multiply(BigDecimal.valueOf(0.3))).
// add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
// if (hasValue) {
// if (weekTime > 51) {
// weekTime = weekTime - 51;
// }
// forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
// }
// } else if (14 <= j && j < 21) {
// forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
// add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
// add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
// add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
// if (hasValue) {
// if (weekTime > 50) {
// weekTime = weekTime - 50;
// }
// forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
// }
// } else if (21 <= j && j < 27) {
// forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
// add(forecastSalesList.get(j - 21).multiply(BigDecimal.valueOf(0.1))).
// add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
// add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
// if (hasValue) {
// if (weekTime > 49) {
// weekTime = weekTime - 49;
// }
// forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
// }
// } else if (27 <= j && j < autoForecastDay) {
// forecastSales = (forecastSalesList.get(j - 27).multiply(BigDecimal.valueOf(0.1))).
// add(forecastSalesList.get(j - 21).multiply(BigDecimal.valueOf(0.1))).
// add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
// add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
// if (hasValue) {
// if (weekTime > 48) {
// weekTime = weekTime - 48;
// }
// forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
// }
// }
// forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);
// }
// }
if (turnoverSku.getPushTime() != null && 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);
DcBaseOmsSku dcBaseOmsSku = dcBaseOmsSkuMapper.selectOneByCreateTime(bailunSku);*/
List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
});
Integer historySevenSales = 0;
Integer historyThreeSales = 0;
for (int i = 0; i < 7; i++) {
historySevenSales += historySalesList.get(23 + i);
}
BigDecimal avgHistorySevendaySales = BigDecimal.valueOf(historySevenSales.longValue()).divide(Constant.BIGDECIMAL_SEVEN, 3, RoundingMode.HALF_EVEN);
for (int j = 0; j < autoForecastDay; j++) {
forecastSalesList.set(j, avgHistorySevendaySales);
}
} else {
BigDecimal forecastSales = BigDecimal.ZERO;
List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
});
List<Integer> weekRateList = null;
int weekTime = 0;
boolean hasValue = true;
if (dcAutoWarehouseweekSales == null) {
hasValue = false;
} else {
weekRateList = JSON.parseObject("[" + dcAutoWarehouseweekSales.getRateDetail() + "]", new TypeReference<List<Integer>>() {
});
weekTime = Integer.valueOf(dcAutoWarehouseweekSales.getWeekTime());
}
for (int j = 0; j < autoForecastDay; j++) {
// y = ae^bx
/*double v;
if (dcAutoSales.getFitForecastFormula().contains("ln(x)")) {
//y = aln(x) + b
v = dcAutoSales.getFitAVariable().doubleValue() * Math.log1p((j + 31)) + dcAutoSales.getFitBVariable().doubleValue();
} else {
v = dcAutoSales.getFitAVariable().doubleValue() * Math.exp(dcAutoSales.getFitBVariable().doubleValue() * (j + 31));
}
BigDecimal forecastSales = BigDecimal.valueOf(v < 0 ? 0 : v).setScale(0, RoundingMode.HALF_EVEN);
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);*/
//20191127 预测销量更改为:(过去第四周*0.1 + 过去第三周*0.1 + 过去第二周*0.3 + 过去第一周*0.5)* 周系数
if (0 <= j && j < 7) {
forecastSales = BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1)).
add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
add(BigDecimal.valueOf(historySalesList.get(16 + j)).multiply(BigDecimal.valueOf(0.3))).
add(BigDecimal.valueOf(historySalesList.get(23 + j)).multiply(BigDecimal.valueOf(0.5)));
if (hasValue) {
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
}
} else if (7 <= j && j < 14) {
forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
add(BigDecimal.valueOf(historySalesList.get(16 + j)).multiply(BigDecimal.valueOf(0.3))).
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
if (hasValue) {
if (weekTime > 51) {
weekTime = weekTime - 51;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
}
} else if (14 <= j && j < 21) {
forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
if (hasValue) {
if (weekTime > 50) {
weekTime = weekTime - 50;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
}
} else if (21 <= j && j < 27) {
forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
add(forecastSalesList.get(j - 21).multiply(BigDecimal.valueOf(0.1))).
add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
if (hasValue) {
if (weekTime > 49) {
weekTime = weekTime - 49;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
}
} else if (27 <= j && j < autoForecastDay) {
forecastSales = (forecastSalesList.get(j - 27).multiply(BigDecimal.valueOf(0.1))).
add(forecastSalesList.get(j - 21).multiply(BigDecimal.valueOf(0.1))).
add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
if (hasValue) {
if (weekTime > 48) {
weekTime = weekTime - 48;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
}
}
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);
}
}
/*if(dcBasePurchase == null) {
for(DcConfigForecastSales dcConfigForecastSales : configForecastSalesList) {
......
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