Commit 43afdd12 by wutong

自动周转对于JIT的不做冗余和缺货预测 实际冗余和实际缺货也不用提醒

parent 9fa2ce23
...@@ -11,6 +11,11 @@ public interface Constant { ...@@ -11,6 +11,11 @@ public interface Constant {
String NAN_STRING = "N/A"; String NAN_STRING = "N/A";
String PURCHASE_SIGN = "p_"; String PURCHASE_SIGN = "p_";
String TRANSFER_SIGN = "t_"; String TRANSFER_SIGN = "t_";
//自动周转JIT的 可以不做 冗余 和 缺货预测 实际冗余和实际缺货也不用提醒
//这三个采购都是美甲和精油的, 都是JIT的
String BUYER_JIT_1 = "张莹霞";
String BUYER_JIT_2 = "张莹霞1";
String BUYER_JIT_3 = "冯兆欣";
BigDecimal BIGDECIMAL_FOURTEEN = BigDecimal.valueOf(14); BigDecimal BIGDECIMAL_FOURTEEN = BigDecimal.valueOf(14);
BigDecimal BIGDECIMAL_SEVEN = BigDecimal.valueOf(7); BigDecimal BIGDECIMAL_SEVEN = BigDecimal.valueOf(7);
BigDecimal BIGDECIMAL_THREE = BigDecimal.valueOf(3); BigDecimal BIGDECIMAL_THREE = BigDecimal.valueOf(3);
......
...@@ -155,7 +155,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -155,7 +155,7 @@ public class AutoTurnoverJob extends PointJob {
* 周转天数计算公式: * 周转天数计算公式:
* 供应链长度 = 周转天数 = 供应商交期 + 入库时间(2天质检入库时间) + 调拨头程 + 调拨打包 + 海外仓入库 * 供应链长度 = 周转天数 = 供应商交期 + 入库时间(2天质检入库时间) + 调拨头程 + 调拨打包 + 海外仓入库
*/ */
TurnoverSkuDTO turnoverSku = null; DcBaseSku turnoverSku = null;
DcBaseWarehouse dcBaseWarehouse = null; DcBaseWarehouse dcBaseWarehouse = null;
//从采购平均指标,仓库平均指标拿周转天数, 拿不到的或者数值异常的, 才按上面的来 //从采购平均指标,仓库平均指标拿周转天数, 拿不到的或者数值异常的, 才按上面的来
DcAveragePurchase dcAveragePurchase = null; DcAveragePurchase dcAveragePurchase = null;
...@@ -164,7 +164,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -164,7 +164,7 @@ public class AutoTurnoverJob extends PointJob {
Integer paymentBeforeDelivery = null; Integer paymentBeforeDelivery = null;
try { try {
DcBaseSkuMapper baseSkuMapper = SessionUtil.getSession().getMapper(DcBaseSkuMapper.class); DcBaseSkuMapper baseSkuMapper = SessionUtil.getSession().getMapper(DcBaseSkuMapper.class);
turnoverSku = baseSkuMapper.getTurnoverSku(bailunSku); turnoverSku = baseSkuMapper.selectOneByExample(DcBaseSkuExample.newAndCreateCriteria().andBailunSkuEqualTo(bailunSku).example());
DcBaseWarehouseMapper baseWarehouseMapper = SessionUtil.getSession().getMapper(DcBaseWarehouseMapper.class); DcBaseWarehouseMapper baseWarehouseMapper = SessionUtil.getSession().getMapper(DcBaseWarehouseMapper.class);
dcBaseWarehouse = baseWarehouseMapper.selectOneByExample(DcBaseWarehouseExample.newAndCreateCriteria().andWarehouseCodeEqualTo(warehouseCode).example()); dcBaseWarehouse = baseWarehouseMapper.selectOneByExample(DcBaseWarehouseExample.newAndCreateCriteria().andWarehouseCodeEqualTo(warehouseCode).example());
DcAveragePurchaseMapper dcAveragePurchaseMapper = SessionUtil.getSession().getMapper(DcAveragePurchaseMapper.class); DcAveragePurchaseMapper dcAveragePurchaseMapper = SessionUtil.getSession().getMapper(DcAveragePurchaseMapper.class);
...@@ -180,9 +180,6 @@ public class AutoTurnoverJob extends PointJob { ...@@ -180,9 +180,6 @@ public class AutoTurnoverJob extends PointJob {
} finally { } finally {
SessionUtil.closeSession(); SessionUtil.closeSession();
} }
if (turnoverSku == null) {
turnoverSku = new TurnoverSkuDTO(0);
}
if (dcBaseWarehouse != null) { if (dcBaseWarehouse != null) {
dcAutoTurnover.setWarehouseName(dcBaseWarehouse.getWarehouseName()); dcAutoTurnover.setWarehouseName(dcBaseWarehouse.getWarehouseName());
if (dcBaseWarehouse.getSystemFlag().toUpperCase().equals(PlatformType.FBA.value())) { if (dcBaseWarehouse.getSystemFlag().toUpperCase().equals(PlatformType.FBA.value())) {
...@@ -373,8 +370,10 @@ public class AutoTurnoverJob extends PointJob { ...@@ -373,8 +370,10 @@ public class AutoTurnoverJob extends PointJob {
inventoryAvailableDays = commonAdvise(hasMonitorFluctuation, forecastFluctuationList, recordTime, dcAutoTurnover, turnoverDays, autoForecastDay, forecastInventoryList, forecastInboundList, forecastSalesList, forecastShortSupplyList, forecastPurchaseAdvisedList, moqPurchaseAdvisedList, realInventory, totalSafeInventory, outStock, inventoryAvailableDays, totalSales, totalInbound, moqDecimal); inventoryAvailableDays = commonAdvise(hasMonitorFluctuation, forecastFluctuationList, recordTime, dcAutoTurnover, turnoverDays, autoForecastDay, forecastInventoryList, forecastInboundList, forecastSalesList, forecastShortSupplyList, forecastPurchaseAdvisedList, moqPurchaseAdvisedList, realInventory, totalSafeInventory, outStock, inventoryAvailableDays, totalSales, totalInbound, moqDecimal);
} }
//自动下单管理的冗余-缺货等异常提醒 /*
unusualFluctuation(dcAutoConfigSkuWarehouse, bailunSku, warehouseCode, dcAutoTurnover, avgHistoryThreedaySales, forecastFluctuationList); * 自动下单管理的冗余-缺货等异常提醒
*/
unusualFluctuation(dcAutoConfigSkuWarehouse, turnoverSku, warehouseCode, dcAutoTurnover, avgHistoryThreedaySales, forecastFluctuationList);
//拿一下2倍周转期内的入库总数 //拿一下2倍周转期内的入库总数
Integer quantityInbound = 0; Integer quantityInbound = 0;
...@@ -424,8 +423,8 @@ public class AutoTurnoverJob extends PointJob { ...@@ -424,8 +423,8 @@ public class AutoTurnoverJob extends PointJob {
if (i < turnoverDays) { if (i < turnoverDays) {
avgForecastTurnoverDaySales = avgForecastTurnoverDaySales.add(forecastSalesList.get(i)); avgForecastTurnoverDaySales = avgForecastTurnoverDaySales.add(forecastSalesList.get(i));
} }
//如果初始采购建议 <= 0, 那就也不用备货. //如果初始采购建议 <= 0, 那就也不用备货., stockUpDays - 1的原因是我们已经算了一天的预测销量了.
if (i < stockUpDays && forecastPurchaseAdvisedList.get(0).compareTo(BigDecimal.ZERO) == 1) { if (i < stockUpDays - 1 && forecastPurchaseAdvisedList.get(0).compareTo(BigDecimal.ZERO) == 1) {
stockUpSales = stockUpSales.add(forecastSalesList.get(i + 1 + turnoverDays)); stockUpSales = stockUpSales.add(forecastSalesList.get(i + 1 + turnoverDays));
} }
} }
...@@ -451,7 +450,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -451,7 +450,7 @@ public class AutoTurnoverJob extends PointJob {
dcAutoTurnover.setForecastFourteendaySales(avgForecastFourteendaySales.compareTo(BigDecimal.ZERO) == 1 ? avgForecastFourteendaySales.divide(Constant.BIGDECIMAL_FOURTEEN, 3, RoundingMode.HALF_EVEN) : BigDecimal.ZERO); dcAutoTurnover.setForecastFourteendaySales(avgForecastFourteendaySales.compareTo(BigDecimal.ZERO) == 1 ? avgForecastFourteendaySales.divide(Constant.BIGDECIMAL_FOURTEEN, 3, RoundingMode.HALF_EVEN) : BigDecimal.ZERO);
dcAutoTurnover.setQuantityInbound(quantityInbound); dcAutoTurnover.setQuantityInbound(quantityInbound);
dcAutoTurnover.setInventoryAvailableDays(inventoryAvailableDays); dcAutoTurnover.setInventoryAvailableDays(inventoryAvailableDays);
dcAutoTurnover.setSkuTitle(turnoverSku.getSkuTitle()); dcAutoTurnover.setSkuTitle(turnoverSku.getSkuTitleCn());
dcAutoTurnover.setPromotions(promotionsBuilder.toString()); dcAutoTurnover.setPromotions(promotionsBuilder.toString());
dcAutoTurnover.setQuantityInitAdvise(forecastPurchaseAdvisedList.get(0).add(stockUpSales)); dcAutoTurnover.setQuantityInitAdvise(forecastPurchaseAdvisedList.get(0).add(stockUpSales));
//如果初始建议数 + 备货数 > moq建议数, 那么moq建议数 + 备货数, 否则, 还是取moq建议数 //如果初始建议数 + 备货数 > moq建议数, 那么moq建议数 + 备货数, 否则, 还是取moq建议数
...@@ -486,7 +485,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -486,7 +485,7 @@ public class AutoTurnoverJob extends PointJob {
DcAutoConfigStockUpDaysMapper mapper = SessionUtil.getSession().getMapper(DcAutoConfigStockUpDaysMapper.class); DcAutoConfigStockUpDaysMapper mapper = SessionUtil.getSession().getMapper(DcAutoConfigStockUpDaysMapper.class);
DcAutoConfigStockUpDays dcAutoConfigStockUpDays = mapper.selectOneByExample(DcAutoConfigStockUpDaysExample.newAndCreateCriteria().andWarehouseCodeEqualTo(warehouseCode).example()); DcAutoConfigStockUpDays dcAutoConfigStockUpDays = mapper.selectOneByExample(DcAutoConfigStockUpDaysExample.newAndCreateCriteria().andWarehouseCodeEqualTo(warehouseCode).example());
if (dcAutoConfigStockUpDays != null && dcAutoConfigStockUpDays.getStatus() == 1) { if (dcAutoConfigStockUpDays != null && dcAutoConfigStockUpDays.getStatus() == 1) {
return dcAutoConfigStockUpDays.getStockUpDays() - 1;//备货天数减去1, 因为我们已经考虑到了一天的预计销量. return dcAutoConfigStockUpDays.getStockUpDays();//备货天数减去1, 因为我们已经考虑到了一天的预计销量.
} }
return 0; return 0;
} }
...@@ -537,34 +536,36 @@ public class AutoTurnoverJob extends PointJob { ...@@ -537,34 +536,36 @@ public class AutoTurnoverJob extends PointJob {
* 实际缺货的,预计缺货 * 实际缺货的,预计缺货
* 实际冗余的,预计冗余 * 实际冗余的,预计冗余
* *
* @param bailunSku
* @param warehouseCode * @param warehouseCode
* @param dcAutoTurnover * @param dcAutoTurnover
* @param forecastFluctuationList * @param forecastFluctuationList
*/ */
private void unusualFluctuation(DcAutoConfigSkuWarehouse dcAutoConfigSkuWarehouse, String bailunSku, String warehouseCode, DcAutoTurnover dcAutoTurnover, BigDecimal avgHistoryThreedaySales, List<DcAutoForecastFluctuation> forecastFluctuationList) { private void unusualFluctuation(DcAutoConfigSkuWarehouse dcAutoConfigSkuWarehouse, DcBaseSku turnoverSku, String warehouseCode, DcAutoTurnover dcAutoTurnover, BigDecimal avgHistoryThreedaySales, List<DcAutoForecastFluctuation> forecastFluctuationList) {
//status` '监控状态, 默认0监控, 停止监控1', //status` '监控状态, 默认0监控, 停止监控1',
try { try {
DcAutoForecastFluctuationMapper mapper = SessionUtil.getSession().getMapper(DcAutoForecastFluctuationMapper.class); DcAutoForecastFluctuationMapper mapper = SessionUtil.getSession().getMapper(DcAutoForecastFluctuationMapper.class);
if (dcAutoConfigSkuWarehouse == null || dcAutoConfigSkuWarehouse.getStatus().equals(0)) { //JIT的 可以不做 冗余 和 缺货预测 实际冗余和实际缺货也不用提醒
if (forecastFluctuationList != null && forecastFluctuationList.size() > 0) { if ( !turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_1) && !turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_2) && !turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_3)) {
//拿最早的时间 + 最晚的时间, SKU-仓库维度只放一条 if (dcAutoConfigSkuWarehouse == null || dcAutoConfigSkuWarehouse.getStatus().equals(0)) {
DcAutoForecastFluctuation dcAutoForecastFluctuation = forecastFluctuationList.get(0); if (forecastFluctuationList != null && forecastFluctuationList.size() > 0) {
dcAutoForecastFluctuation.setEndTime(forecastFluctuationList.get(forecastFluctuationList.size() - 1).getEndTime()); //拿最早的时间 + 最晚的时间, SKU-仓库维度只放一条
dcAutoForecastFluctuation.setBailunSku(bailunSku); DcAutoForecastFluctuation dcAutoForecastFluctuation = forecastFluctuationList.get(0);
dcAutoForecastFluctuation.setWarehouseCode(warehouseCode); dcAutoForecastFluctuation.setEndTime(forecastFluctuationList.get(forecastFluctuationList.size() - 1).getEndTime());
dcAutoForecastFluctuation.setWarehouseName(dcAutoTurnover.getWarehouseName()); dcAutoForecastFluctuation.setBailunSku(turnoverSku.getBailunSku());
dcAutoForecastFluctuation.setAvgSalesThree(avgHistoryThreedaySales); dcAutoForecastFluctuation.setWarehouseCode(warehouseCode);
DcAutoForecastFluctuation dcAutoForecastFluctuationSelected = mapper.selectOneByExample(DcAutoForecastFluctuationExample.newAndCreateCriteria().andBailunSkuEqualTo(bailunSku).andWarehouseCodeEqualTo(warehouseCode).example()); dcAutoForecastFluctuation.setWarehouseName(dcAutoTurnover.getWarehouseName());
if (dcAutoForecastFluctuationSelected != null) { dcAutoForecastFluctuation.setAvgSalesThree(avgHistoryThreedaySales);
dcAutoForecastFluctuation.setStartTime(dcAutoForecastFluctuationSelected.getStartTime()); DcAutoForecastFluctuation dcAutoForecastFluctuationSelected = mapper.selectOneByExample(DcAutoForecastFluctuationExample.newAndCreateCriteria().andBailunSkuEqualTo(turnoverSku.getBailunSku()).andWarehouseCodeEqualTo(warehouseCode).example());
mapper.updateByExampleSelective(dcAutoForecastFluctuation, DcAutoForecastFluctuationExample.newAndCreateCriteria().andBailunSkuEqualTo(dcAutoForecastFluctuation.getBailunSku()).andWarehouseCodeEqualTo(dcAutoForecastFluctuation.getWarehouseCode()).example()); if (dcAutoForecastFluctuationSelected != null) {
} else { dcAutoForecastFluctuation.setStartTime(dcAutoForecastFluctuationSelected.getStartTime());
mapper.insertSelective(dcAutoForecastFluctuation); mapper.updateByExampleSelective(dcAutoForecastFluctuation, DcAutoForecastFluctuationExample.newAndCreateCriteria().andBailunSkuEqualTo(dcAutoForecastFluctuation.getBailunSku()).andWarehouseCodeEqualTo(dcAutoForecastFluctuation.getWarehouseCode()).example());
} else {
mapper.insertSelective(dcAutoForecastFluctuation);
}
} }
} else if (dcAutoConfigSkuWarehouse != null && dcAutoConfigSkuWarehouse.getStatus().equals(1)) {
mapper.deleteByExample(DcAutoForecastFluctuationExample.newAndCreateCriteria().andBailunSkuEqualTo(turnoverSku.getBailunSku()).andWarehouseCodeEqualTo(warehouseCode).example());
} }
} else if(dcAutoConfigSkuWarehouse != null && dcAutoConfigSkuWarehouse.getStatus().equals(1)) {
mapper.deleteByExample(DcAutoForecastFluctuationExample.newAndCreateCriteria().andBailunSkuEqualTo(bailunSku).andWarehouseCodeEqualTo(warehouseCode).example());
} }
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("MYBATIS操作DB存DcAutoForecastFluctuation失败", e); throw new RuntimeException("MYBATIS操作DB存DcAutoForecastFluctuation失败", e);
...@@ -573,7 +574,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -573,7 +574,7 @@ public class AutoTurnoverJob extends PointJob {
} }
} }
private Integer getTurnoverDelivery(TurnoverSkuDTO 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,如果平均交期没有 * 先取dc_average_purchase,如果平均交期没有
...@@ -624,40 +625,6 @@ public class AutoTurnoverJob extends PointJob { ...@@ -624,40 +625,6 @@ public class AutoTurnoverJob extends PointJob {
return turnoverDays; return turnoverDays;
} }
/**
* 从TJ系统获取断货数
*
* @param bailunSku
* @param warehouseCode
* @return
* @throws IOException
*/
private Integer getOutStock(String bailunSku, String warehouseCode) {
HashMap<String, String> map = new HashMap<>(2);
map.put("sku", bailunSku);
map.put("warehousecode", warehouseCode);
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, JSONObject.toJSONString(map));
Request request = new Request.Builder()
.url(OkHttpUtil.attachHttpGetParams(propertiesUtil.getPropertyAsString("TJ_OUT_STOCK_URL"), map))
.post(body)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
if (response != null && response.isSuccessful()) {
return Integer.valueOf(response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("调用TJ获取缺货数接口失败", e);
} finally {
if (response != null) {
response.close();
}
}
return 0;
}
/** /**
* 获取百伦一级分类Id * 获取百伦一级分类Id
...@@ -666,7 +633,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -666,7 +633,7 @@ public class AutoTurnoverJob extends PointJob {
* @return * @return
* @throws Exception * @throws Exception
*/ */
private Integer getBailunCatagoryId(TurnoverSkuDTO turnoverSku) throws Exception { private Integer getBailunCatagoryId(DcBaseSku turnoverSku) throws Exception {
Integer bailunFirstLevelCatagoryId = null; Integer bailunFirstLevelCatagoryId = null;
String parentCategories = null; String parentCategories = null;
if (turnoverSku != null && turnoverSku.getBailunCategoryId() != null) { if (turnoverSku != null && turnoverSku.getBailunCategoryId() != null) {
......
...@@ -107,5 +107,12 @@ public class AutoTurnoverTest { ...@@ -107,5 +107,12 @@ public class AutoTurnoverTest {
AutoTurnoverJobListener autoTurnoverJobListener = new AutoTurnoverJobListener(); AutoTurnoverJobListener autoTurnoverJobListener = new AutoTurnoverJobListener();
autoTurnoverJobListener.afterJobExecuted(null); autoTurnoverJobListener.afterJobExecuted(null);
} }
@Test
public void test55() {
LocalDateTime recordTime = LocalDateTime.now();
LocalDateTime finalEstimatedArrivalTime = LocalDateTime.now().minusDays(1);
int interval = Period.between(recordTime.toLocalDate(), finalEstimatedArrivalTime.toLocalDate()).getDays();
System.out.println(interval);
}
} }
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