Commit dbf89432 by huluobin

周转波动预测修改

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