Commit d8c8f488 by yinyong

预测销量 =(过去第四周*0.1 + 过去第三周*0.1 + 过去第二周*0.3 + 过去第一周*0.5)* 周系数

parent 2396821a
This source diff could not be displayed because it is too large. You can view the blob instead.
package com.bailuntec.mapper;
import com.bailuntec.domain.entity.DcAutoWarehouseweekSales;
import com.bailuntec.domain.example.DcAutoWarehouseweekSalesExample;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface DcAutoWarehouseweekSalesMapper {
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
long countByExample(DcAutoWarehouseweekSalesExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int deleteByExample(DcAutoWarehouseweekSalesExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int deleteByPrimaryKey(Integer id);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int insert(DcAutoWarehouseweekSales record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int insertSelective(DcAutoWarehouseweekSales record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
DcAutoWarehouseweekSales selectOneByExample(DcAutoWarehouseweekSalesExample example);
DcAutoWarehouseweekSales selectOneByWeekDay(@Param("warehouseCode") String warehouseCode);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
List<DcAutoWarehouseweekSales> selectByExample(DcAutoWarehouseweekSalesExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
DcAutoWarehouseweekSales selectByPrimaryKey(Integer id);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int updateByExampleSelective(@Param("record") DcAutoWarehouseweekSales record, @Param("example") DcAutoWarehouseweekSalesExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int updateByExample(@Param("record") DcAutoWarehouseweekSales record, @Param("example") DcAutoWarehouseweekSalesExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int updateByPrimaryKeySelective(DcAutoWarehouseweekSales record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
*/
int updateByPrimaryKey(DcAutoWarehouseweekSales record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
int upsert(DcAutoWarehouseweekSales record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dc_auto_warehouseweek_sales
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
int upsertSelective(DcAutoWarehouseweekSales record);
}
\ No newline at end of file
......@@ -145,6 +145,7 @@ public class AutoTurnoverJob extends PointJob {
String warehouseCode = dcBaseStock.getWarehouseCode();
DcAutoSales dcAutoSales = null;
DcBaseWarehouse dcBaseWarehouse = null;
DcAutoWarehouseweekSales dcAutoWarehouseweekSales = null;
try {
DcBaseWarehouseMapper baseWarehouseMapper = SessionUtil.getSession().getMapper(DcBaseWarehouseMapper.class);
dcBaseWarehouse = baseWarehouseMapper.selectOneByExample(DcBaseWarehouseExample.newAndCreateCriteria().andWarehouseCodeEqualTo(warehouseCode).example());
......@@ -179,13 +180,16 @@ public class AutoTurnoverJob extends PointJob {
} else {
dcAutoSales = autoSalesServiceImpl.forecastSalesBySalesVolumeDTO(salesVolumeDTO);
}
DcAutoWarehouseweekSalesMapper dcAutoWarehouseweekSalesMapper = SessionUtil.getSession().getMapper(DcAutoWarehouseweekSalesMapper.class);
dcAutoWarehouseweekSales = dcAutoWarehouseweekSalesMapper.selectOneByWeekDay(warehouseCode);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Mybatis操作DB失败", e);
} finally {
SessionUtil.closeSession();
}
autoTurnoverUseDcAutoSales(bailunSku, warehouseCode, dcAutoSales, dcBaseStock, dcBaseWarehouse);
autoTurnoverUseDcAutoSales(bailunSku, warehouseCode, dcAutoSales, dcBaseStock, dcBaseWarehouse, dcAutoWarehouseweekSales);
}
/*
......@@ -194,7 +198,7 @@ public class AutoTurnoverJob extends PointJob {
* 库存信息传入,dcBaseStock
* 计算自动周转
*/
private void autoTurnoverUseDcAutoSales(String bailunSku, String warehouseCode, DcAutoSales dcAutoSales, DcBaseStock dcBaseStock, DcBaseWarehouse dcBaseWarehouse) throws Exception {
private void autoTurnoverUseDcAutoSales(String bailunSku, String warehouseCode, DcAutoSales dcAutoSales, DcBaseStock dcBaseStock, DcBaseWarehouse dcBaseWarehouse, DcAutoWarehouseweekSales dcAutoWarehouseweekSales) throws Exception {
LocalDate recordTime = LocalDate.now();
DcAutoTurnover dcAutoTurnover = new DcAutoTurnover();
dcAutoTurnover.setBailunSku(bailunSku);
......@@ -300,7 +304,7 @@ public class AutoTurnoverJob extends PointJob {
* 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值
* 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含0, 无法使用指数函数拟合
*/
calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku, warehouseCode);
calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku, warehouseCode, dcAutoWarehouseweekSales);
/*
* 处理矫正信息
......@@ -1009,7 +1013,7 @@ 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, String warehouseCode) {
dcAutoSales, List<BigDecimal> forecastSalesList, DcBaseSku turnoverSku, LocalDate recordTime, String bailunSku, String warehouseCode, DcAutoWarehouseweekSales dcAutoWarehouseweekSales) {
/*DcConfigForecastSalesMapper dcConfigForecastSalesMapper = SessionUtil.getSession().getMapper(DcConfigForecastSalesMapper.class);
List<DcConfigForecastSales> configForecastSalesList = dcConfigForecastSalesMapper.selectByExample(DcConfigForecastSalesExample.newAndCreateCriteria().andBailunSkuEqualTo(bailunSku).andWarehouseCodeEqualTo(warehouseCode).example());
......@@ -1050,7 +1054,9 @@ public class AutoTurnoverJob extends PointJob {
}else{
// y = ae^bx
for (int j = 0; j < autoForecastDay; j++) {
double v;
//20191127 预测销量更改为:(过去第四周*0.1 + 过去第三周*0.1 + 过去第二周*0.3 + 过去第一周*0.5)* 周系数
/*double v;
if (dcAutoSales.getFitForecastFormula().contains("ln(x)")) {
//y = aln(x) + b
v = dcAutoSales.getFitAVariable().doubleValue() * Math.log1p((j + 31)) + dcAutoSales.getFitBVariable().doubleValue();
......@@ -1058,6 +1064,56 @@ public class AutoTurnoverJob extends PointJob {
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);*/
BigDecimal forecastSales = BigDecimal.ZERO;
List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
});
List<Integer> weekRateList = JSON.parseObject("["+dcAutoWarehouseweekSales.getRateDetail()+"]", new TypeReference<List<Integer>>(){
});
int weekTime = Integer.valueOf(dcAutoWarehouseweekSales.getWeekTime());
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)));
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime-1)));
}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(weekTime > 51) {
weekTime = weekTime - 51;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime-1)));
}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(weekTime > 50) {
weekTime = weekTime - 50;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime-1)));
}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(weekTime > 49) {
weekTime = weekTime - 49;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime-1)));
}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(weekTime > 48) {
weekTime = weekTime - 48;
}
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime-1)));
}
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);
}
}
......
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