Commit cc51a019 by wutong

修复自动周转持续冗余或缺货, 未记录的问题

parent 252f5ec1
......@@ -51,7 +51,7 @@ public class AutoTurnoverJob extends PointJob {
* 根据不同分片
* 再分页去处理数据
*/
int shardingSize = totalPage % shardingContext.getShardingTotalCount() == 0? totalPage / shardingContext.getShardingTotalCount() : totalPage / shardingContext.getShardingTotalCount() + 1;
int shardingSize = totalPage % shardingContext.getShardingTotalCount() == 0 ? totalPage / shardingContext.getShardingTotalCount() : totalPage / shardingContext.getShardingTotalCount() + 1;
if (shardingContext.getShardingItem() + 1 < shardingContext.getShardingTotalCount()) {
totalPage = shardingSize * (shardingContext.getShardingItem() + 1);
}
......@@ -81,10 +81,10 @@ public class AutoTurnoverJob extends PointJob {
//错误记录到日志表, 任务跑完了再跑一次错误SKU
try {
DcAutoExceptionMapper dcAutoExceptionMapper = SessionUtil.getSession().getMapper(DcAutoExceptionMapper.class);
DcAutoException dcAutoException = new DcAutoException(dcBaseStock.getBailunSku(),dcBaseStock.getWarehouseCode(),e.toString());
DcAutoException dcAutoException = new DcAutoException(dcBaseStock.getBailunSku(), dcBaseStock.getWarehouseCode(), e.toString());
dcAutoExceptionMapper.insertSelective(dcAutoException);
} catch (Exception ex) {
log.error("保存错误SKU失败,sku="+ dcBaseStock.getBailunSku() + ",仓库=" + dcBaseStock.getWarehouseCode());
log.error("保存错误SKU失败,sku=" + dcBaseStock.getBailunSku() + ",仓库=" + dcBaseStock.getWarehouseCode());
} finally {
SessionUtil.closeSession();
}
......@@ -191,9 +191,9 @@ public class AutoTurnoverJob extends PointJob {
}
Integer bailunFirstLevelCatagoryId = getBailunCatagoryId(turnoverSku); //百伦第一级分类Id, 可以为null
// 获取调拨头程 + 调拨打包 + 海外仓入库天数 的配置
DcAutoConfigDelivery dcAutoConfigDelivery = getDcAutoConfigDelivery(bailunSku,warehouseCode, dcBaseWarehouse, bailunFirstLevelCatagoryId);
DcAutoConfigDelivery dcAutoConfigDelivery = getDcAutoConfigDelivery(bailunSku, warehouseCode, dcBaseWarehouse, bailunFirstLevelCatagoryId);
//获取周转天数计算配置, 数据来源于.net同事计算的均值
Integer turnoverDays = getTurnoverDelivery(turnoverSku,dcBaseWarehouse, dcAutoTurnover, dcAutoConfigDelivery, dcAveragePurchase, dcAverageWarehouse);
Integer turnoverDays = getTurnoverDelivery(turnoverSku, dcBaseWarehouse, dcAutoTurnover, dcAutoConfigDelivery, dcAveragePurchase, dcAverageWarehouse);
if (paymentBeforeDelivery != null) {
turnoverDays += paymentBeforeDelivery;
}
......@@ -261,7 +261,7 @@ public class AutoTurnoverJob extends PointJob {
Integer purchase = 0;//采购在途
Integer transfer = 0;//调拨在途
Integer outStock = 0 ;//缺货数
Integer outStock = 0;//缺货数
DcMidTransit dcMidTransit = null;
try {
DcMidTransitMapper midTransitMapper = SessionUtil.getSession().getMapper(DcMidTransitMapper.class);
......@@ -284,7 +284,7 @@ public class AutoTurnoverJob extends PointJob {
* 还需要加上入库时长,
* 且不同交通方式的入库时长不一致
*/
ExpectedStorage(dcAutoConfigDelivery,forecastInboundRelationList, purchase, transfer, recordTime, dcAutoTurnover, forecastPurchaseInboundList, forecastTransferInboundList, forecastInboundList);
ExpectedStorage(dcAutoConfigDelivery, forecastInboundRelationList, purchase, transfer, recordTime, dcAutoTurnover, forecastPurchaseInboundList, forecastTransferInboundList, forecastInboundList);
//通过SKU和仓库拿到实际库存
Integer realInventory = (dcBaseStock != null && dcBaseStock.getUsableStock() != null) ? dcBaseStock.getUsableStock() : 0;
......@@ -350,7 +350,7 @@ public class AutoTurnoverJob extends PointJob {
*/
List<DcAutoForecastFluctuation> forecastFluctuationList = new ArrayList<>(turnoverDays);
DcAutoConfigSkuWarehouse dcAutoConfigSkuWarehouse = getAutoConfigSkuWarehouse(bailunSku, warehouseCode);
boolean hasMonitorFluctuation = actualForecastFluctuations(dcAutoTurnover,recordTime, forecastSalesList, realInventory, totalSafeInventory, outStock, dcAutoConfigSkuWarehouse, avgHistoryFourteendaySales, avgHistoryThreedaySales, forecastFluctuationList);
boolean hasMonitorFluctuation = actualForecastFluctuations(dcAutoTurnover, recordTime, forecastSalesList, realInventory, totalSafeInventory, outStock, dcAutoConfigSkuWarehouse, avgHistoryFourteendaySales, avgHistoryThreedaySales, forecastFluctuationList);
/*
* 获取采购建议-FBA仓库
......@@ -377,7 +377,7 @@ public class AutoTurnoverJob extends PointJob {
* 自动下单管理的冗余-缺货等异常提醒
*/
if (hasMonitorFluctuation) {
unusualFluctuation(totalSafeInventory,turnoverDays, recordTime, dcAutoConfigSkuWarehouse, turnoverSku, warehouseCode, dcAutoTurnover, avgHistoryThreedaySales, forecastFluctuationList, forecastShortSupplyList, forecastInventoryList);
unusualFluctuation(totalSafeInventory, turnoverDays, recordTime, dcAutoConfigSkuWarehouse, turnoverSku, warehouseCode, dcAutoTurnover, avgHistoryThreedaySales, forecastFluctuationList, forecastShortSupplyList, forecastInventoryList);
}
//拿一下2倍周转期内的入库总数
......@@ -412,7 +412,7 @@ public class AutoTurnoverJob extends PointJob {
BigDecimal avgForecastFourteendaySales = BigDecimal.ZERO;
BigDecimal avgForecastTurnoverDaySales = BigDecimal.ZERO;
BigDecimal stockUpSales = BigDecimal.ZERO;
int forturnoverDays = turnoverDays < 14? 14 : turnoverDays;
int forturnoverDays = turnoverDays < 14 ? 14 : turnoverDays;
for (int i = 0; i < forturnoverDays; i++) {
if (i < 7) {
avgForecastSevendaySales = avgForecastSevendaySales.add(forecastSalesList.get(i));
......@@ -422,7 +422,7 @@ public class AutoTurnoverJob extends PointJob {
forecastInventoryList.add(i, BigDecimal.ZERO);
forecastShortSupplyList.add(i, BigDecimal.ZERO);
}
if(i < 14) {
if (i < 14) {
avgForecastFourteendaySales = avgForecastFourteendaySales.add(forecastSalesList.get(i));
}
if (i < turnoverDays) {
......@@ -506,7 +506,7 @@ public class AutoTurnoverJob extends PointJob {
private void caculatePlatformAvgSales(DcAutoTurnover dcAutoTurnover) {
try {
DcAutoSalesMapper mapper = SessionUtil.getSession().getMapper(DcAutoSalesMapper.class);
SalesVolumeAvgDTO ebayAvgSales = mapper.getPlatformHistorySales(dcAutoTurnover.getBailunSku(), dcAutoTurnover.getWarehouseCode(),PlatformType.Ebay.value());
SalesVolumeAvgDTO ebayAvgSales = mapper.getPlatformHistorySales(dcAutoTurnover.getBailunSku(), dcAutoTurnover.getWarehouseCode(), PlatformType.Ebay.value());
dcAutoTurnover.setHistorySevendaySalesEbay(BigDecimal.ZERO);
dcAutoTurnover.setHistoryFourteendaySalesEbay(BigDecimal.ZERO);
dcAutoTurnover.setHistoryThirtydaySalesEbay(BigDecimal.ZERO);
......@@ -544,7 +544,7 @@ public class AutoTurnoverJob extends PointJob {
}
}
private boolean actualForecastFluctuations(DcAutoTurnover dcAutoTurnover,LocalDate recordTime, List<BigDecimal> forecastSalesList, Integer realInventory, BigDecimal totalSafeInventory, Integer outStock, DcAutoConfigSkuWarehouse dcAutoConfigSkuWarehouse, BigDecimal avgHistoryFourteendaySales, BigDecimal avgHistoryThreedaySales, List<DcAutoForecastFluctuation> forecastFluctuationList) {
private boolean actualForecastFluctuations(DcAutoTurnover dcAutoTurnover, LocalDate recordTime, List<BigDecimal> forecastSalesList, Integer realInventory, BigDecimal totalSafeInventory, Integer outStock, DcAutoConfigSkuWarehouse dcAutoConfigSkuWarehouse, BigDecimal avgHistoryFourteendaySales, BigDecimal avgHistoryThreedaySales, List<DcAutoForecastFluctuation> forecastFluctuationList) {
boolean hasMonitorFluctuation = false;//默认是停止了监控波动功能的
/*
* 这个if判断单纯是为了判断实际冗余,然后存一个表给别人用
......@@ -559,12 +559,12 @@ public class AutoTurnoverJob extends PointJob {
dcAutoDailyRedundance.setRecordTime(LocalDate.now().minusDays(1));
try {
DcAutoDailyRedundanceMapper mapper = SessionUtil.getSession().getMapper(DcAutoDailyRedundanceMapper.class);
int i = mapper.updateByExampleSelective(dcAutoDailyRedundance,DcAutoDailyRedundanceExample.newAndCreateCriteria().andBailunSkuEqualTo(dcAutoDailyRedundance.getBailunSku()).andWarehouseCodeEqualTo(dcAutoDailyRedundance.getWarehouseCode()).andRecordTimeEqualTo(dcAutoDailyRedundance.getRecordTime()).example());
int i = mapper.updateByExampleSelective(dcAutoDailyRedundance, DcAutoDailyRedundanceExample.newAndCreateCriteria().andBailunSkuEqualTo(dcAutoDailyRedundance.getBailunSku()).andWarehouseCodeEqualTo(dcAutoDailyRedundance.getWarehouseCode()).andRecordTimeEqualTo(dcAutoDailyRedundance.getRecordTime()).example());
if (i == 0) {
mapper.insertSelective(dcAutoDailyRedundance);
}
} catch (Exception e) {
throw new RuntimeException("MYBATIS操作dcAutoDailyRedundance失败",e);
throw new RuntimeException("MYBATIS操作dcAutoDailyRedundance失败", e);
} finally {
SessionUtil.closeSession();
}
......@@ -608,17 +608,22 @@ public class AutoTurnoverJob extends PointJob {
* 波动提醒优先级 --> 实际缺货-实际冗余-预计缺货-预计冗余
*/
private void unusualFluctuation(BigDecimal totalSafeInventory, Integer turnoverDays, LocalDate recordTime, DcAutoConfigSkuWarehouse dcAutoConfigSkuWarehouse, DcBaseSku turnoverSku, String warehouseCode, DcAutoTurnover dcAutoTurnover, BigDecimal avgHistoryThreedaySales, List<DcAutoForecastFluctuation> forecastFluctuationList, List<BigDecimal> forecastShortSupplyList, List<BigDecimal> forecastInventoryList) {
int days = 0;//连续冗余或缺货天数
int index = -1;//冗余或缺货天数索引
int days = 0;
int index = -1;
if (forecastShortSupplyList.get(turnoverDays).compareTo(BigDecimal.ZERO) == 1) {
for (int i = 0; i <= turnoverDays; i++) {
if (forecastShortSupplyList.get(i).compareTo(BigDecimal.ZERO) == 1) {
if (forecastShortSupplyList.get(i).compareTo(BigDecimal.ZERO) == 1) {
days++;
if (index < 0) {
index = i;
}
} else if (index > 0) {
if (i == turnoverDays && index >= 0) { //如果是最后一天
handleForecastFluctuation(2, forecastFluctuationList, recordTime, days, index);
days = 0;
index = -1;
}
} else if (index >= 0) {
handleForecastFluctuation(2, forecastFluctuationList, recordTime, days, index);
days = 0;
index = -1;
......@@ -627,14 +632,17 @@ public class AutoTurnoverJob extends PointJob {
}
}
if (forecastInventoryList.get(turnoverDays).compareTo(totalSafeInventory) == 1) {
for (int i = 0; i <= turnoverDays; i++) {
if (forecastInventoryList.get(i).compareTo(BigDecimal.ZERO) == 1) {
if (i < turnoverDays && forecastInventoryList.get(i).compareTo(totalSafeInventory) == 1) {
days++;
if (index < 0) {
index = i;
}
} else if (index > 0) {
if (i == turnoverDays && index >= 0) { //如果是最后一天
handleForecastFluctuation(4, forecastFluctuationList, recordTime, days, index);
}
} else if (index >= 0) {
handleForecastFluctuation(4, forecastFluctuationList, recordTime, days, index);
break;
}
......@@ -672,13 +680,13 @@ public class AutoTurnoverJob extends PointJob {
}
}
private Integer getTurnoverDelivery(DcBaseSku turnoverSku, DcBaseWarehouse dcBaseWarehouse,DcAutoTurnover dcAutoTurnover, DcAutoConfigDelivery dcAutoConfigDelivery, DcAveragePurchase dcAveragePurchase, DcAverageWarehouse dcAverageWarehouse) {
private Integer getTurnoverDelivery(DcBaseSku turnoverSku, DcBaseWarehouse dcBaseWarehouse, DcAutoTurnover dcAutoTurnover, DcAutoConfigDelivery dcAutoConfigDelivery, DcAveragePurchase dcAveragePurchase, DcAverageWarehouse dcAverageWarehouse) {
/*
* 供应商交期
* 先取dc_average_purchase,如果平均交期没有
* 再去SKUMS取, 取SKUMS数据的时候如果是国内仓,就还取dc_base_sku原来那个字段,否则就要取dc_base_sku原新字段(调拨交期)
*/
Integer turnoverSupplierDelivery = dcAveragePurchase != null && dcAveragePurchase.getDeliveryDays() >= 0? dcAveragePurchase.getDeliveryDays() : -1;
Integer turnoverSupplierDelivery = dcAveragePurchase != null && dcAveragePurchase.getDeliveryDays() >= 0 ? dcAveragePurchase.getDeliveryDays() : -1;
if (turnoverSupplierDelivery == null || turnoverSupplierDelivery.equals(-1)) {
turnoverSupplierDelivery = turnoverSku.getSupplierDelivery();
//如果是国内仓,就还取原来那个字段,否则就要取新字段(调拨交期)
......@@ -1037,7 +1045,7 @@ public class AutoTurnoverJob extends PointJob {
}
private BigDecimal calculateSafeInventory(String bailunSku, String warehouseCode, Integer
bailunFirstLevelCatagoryId, DcAutoSales dcAutoSales, String forecastSalesListJson,DcAutoTurnover dcAutoTurnover) {
bailunFirstLevelCatagoryId, DcAutoSales dcAutoSales, String forecastSalesListJson, DcAutoTurnover dcAutoTurnover) {
/*
* 手动设置
* 1. 根据仓库 + SKU在表里找dc_auto_config_safe_inventory
......@@ -1095,9 +1103,9 @@ public class AutoTurnoverJob extends PointJob {
dcAutoTurnover.setDailyWeightedSales(weightingAvgSales);
//乘倍数后的加权日均销量,小于0.8就置0 0.8-1 之间就置1
weightingAvgSales = weightingAvgSales.multiply(dcAutoConfigSafeInventory.getParam()).setScale(3, RoundingMode.HALF_EVEN);
if (weightingAvgSales.compareTo(BigDecimal.valueOf(0.8)) == -1 ){
if (weightingAvgSales.compareTo(BigDecimal.valueOf(0.8)) == -1) {
weightingAvgSales = BigDecimal.ZERO;
} else if (weightingAvgSales.compareTo(BigDecimal.ONE) <= 0){
} else if (weightingAvgSales.compareTo(BigDecimal.ONE) <= 0) {
weightingAvgSales = BigDecimal.ONE;
}
} else {
......@@ -1291,7 +1299,7 @@ public class AutoTurnoverJob extends PointJob {
dcAutoTurnover.setTurnoverSales(totalSales);
}
//采购建议 = 安全库存缺少值 + 今日的实际缺货 + 本次采购到货日期前一天的累计销量 - 本次采购到货日期累计到货数量 + 预计销量 - 今日的实际库存
BigDecimal totalAdvised = totalSafeInventory.subtract(forecastInventoryList.get(j>0?j - 1:0))//安全库存缺少值= 理论安全库存 - 预测库存
BigDecimal totalAdvised = totalSafeInventory.subtract(forecastInventoryList.get(j > 0 ? j - 1 : 0))//安全库存缺少值= 理论安全库存 - 预测库存
.add(BigDecimal.valueOf(outStock.longValue()))//今天的实际缺货
.add(totalSales)//累计销量
.subtract(BigDecimal.valueOf(totalInbound.doubleValue()))//累计到货
......@@ -1428,7 +1436,7 @@ public class AutoTurnoverJob extends PointJob {
dcAutoTurnover.setTurnoverSales(totalSales);
}
//采购建议 = 安全库存缺少值 + 今日的实际缺货 + 本次采购到货日期前一天的累计销量 - 本次采购到货日期累计到货数量 + 预计销量
BigDecimal totalAdvised = totalSafeInventory.subtract(forecastInventoryList.get(j>0?j - 1:0))//安全库存缺少值= 理论安全库存 - 预测库存
BigDecimal totalAdvised = totalSafeInventory.subtract(forecastInventoryList.get(j > 0 ? j - 1 : 0))//安全库存缺少值= 理论安全库存 - 预测库存
.add(BigDecimal.valueOf(outStock.longValue()))//今天的实际缺货
.add(totalSales)//累计销量
.subtract(BigDecimal.valueOf(totalInbound.doubleValue()))//累计到货
......@@ -1505,7 +1513,7 @@ public class AutoTurnoverJob extends PointJob {
* @param bailunFirstLevelCatagoryId
* @return
*/
private DcAutoConfigDelivery getDcAutoConfigDelivery(String bailunSku,String warehouseCode, DcBaseWarehouse dcBaseWarehouse, Integer
private DcAutoConfigDelivery getDcAutoConfigDelivery(String bailunSku, String warehouseCode, DcBaseWarehouse dcBaseWarehouse, Integer
bailunFirstLevelCatagoryId) {
DcAutoConfigDelivery dcAutoConfigDelivery = null;
//如果不是国内仓, 就读配置表
......
......@@ -52,7 +52,7 @@ public class AutoTurnoverTest {
// dcBaseStock = mapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria().andBailunSkuEqualTo("322572421").andWarehouseCodeEqualTo("QYBLZZ").example());
// dcBaseStock = mapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria().andBailunSkuEqualTo("232232601").andWarehouseCodeEqualTo("CHUKFBA").example());
// dcBaseStock = mapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria().andBailunSkuEqualTo("213789601").andWarehouseCodeEqualTo("GZBLWH").example());
dcBaseStock = mapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria().andBailunSkuEqualTo("ND016").andWarehouseCodeEqualTo("GZBLWH").example());
dcBaseStock = mapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria().andBailunSkuEqualTo("227290301").andWarehouseCodeEqualTo("AUFBACM").example());
} catch (Exception e) {
e.printStackTrace();
} finally {
......
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