|
@@ -3,7 +3,11 @@ package com.jjt.inventory.controller;
|
|
import com.jjt.common.core.controller.BaseController;
|
|
import com.jjt.common.core.controller.BaseController;
|
|
import com.jjt.common.core.domain.R;
|
|
import com.jjt.common.core.domain.R;
|
|
import com.jjt.common.core.redis.RedisCache;
|
|
import com.jjt.common.core.redis.RedisCache;
|
|
|
|
+import com.jjt.inventory.domain.TwinCalcHourBp;
|
|
|
|
+import com.jjt.inventory.domain.TwinCalcHourPt;
|
|
import com.jjt.inventory.service.IInventoryService;
|
|
import com.jjt.inventory.service.IInventoryService;
|
|
|
|
+import com.jjt.inventory.service.ITwinCalcHourBpService;
|
|
|
|
+import com.jjt.inventory.service.ITwinCalcHourPtService;
|
|
import com.jjt.inventory.vo.BpVO;
|
|
import com.jjt.inventory.vo.BpVO;
|
|
import com.jjt.inventory.vo.PtVO;
|
|
import com.jjt.inventory.vo.PtVO;
|
|
import com.jjt.inventory.vo.TopVO;
|
|
import com.jjt.inventory.vo.TopVO;
|
|
@@ -17,7 +21,10 @@ import javax.annotation.Resource;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
|
|
+import java.time.LocalDateTime;
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.time.temporal.ChronoUnit;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -36,6 +43,10 @@ public class InventoryController extends BaseController {
|
|
private IInventoryService inventoryService;
|
|
private IInventoryService inventoryService;
|
|
@Resource
|
|
@Resource
|
|
private MssqlService mssqlService;
|
|
private MssqlService mssqlService;
|
|
|
|
+ @Resource
|
|
|
|
+ private ITwinCalcHourBpService bpService;
|
|
|
|
+ @Resource
|
|
|
|
+ private ITwinCalcHourPtService ptService;
|
|
|
|
|
|
|
|
|
|
@ApiOperation("盘头库库存分析")
|
|
@ApiOperation("盘头库库存分析")
|
|
@@ -47,16 +58,6 @@ public class InventoryController extends BaseController {
|
|
String sql = "SELECT TOP 10 SKU,SKU_DESCRC,LOT01 FROM V_WMS_STOCK WHERE WAREHOUSE_ID='WH03-盘头仓库' AND UOM='个' AND LOT01 IS NOT NULL AND LOT01!='' ORDER BY LOT01";
|
|
String sql = "SELECT TOP 10 SKU,SKU_DESCRC,LOT01 FROM V_WMS_STOCK WHERE WAREHOUSE_ID='WH03-盘头仓库' AND UOM='个' AND LOT01 IS NOT NULL AND LOT01!='' ORDER BY LOT01";
|
|
List<TopVO> tops = topProcess(sql);
|
|
List<TopVO> tops = topProcess(sql);
|
|
ptVO.setTops(tops);
|
|
ptVO.setTops(tops);
|
|
-//
|
|
|
|
-//
|
|
|
|
-// // 模拟TOP排名数据
|
|
|
|
-// for (int i = 1; i <= 10; i++) {
|
|
|
|
-// PtVO.Top top = new PtVO.Top();
|
|
|
|
-// top.setName("纱种" + i);
|
|
|
|
-// top.setDate(LocalDate.now().minusDays(10 - i));
|
|
|
|
-// top.setDay(10 - i);
|
|
|
|
-// ptVO.getTops().add(top);
|
|
|
|
-// }
|
|
|
|
|
|
|
|
// 模拟30天的使用情况数据
|
|
// 模拟30天的使用情况数据
|
|
for (int day = 0; day < 30; day++) {
|
|
for (int day = 0; day < 30; day++) {
|
|
@@ -81,24 +82,28 @@ public class InventoryController extends BaseController {
|
|
}
|
|
}
|
|
// 计算比例
|
|
// 计算比例
|
|
for (PtVO.YarnTypeDetail detail : usage.getDetails()) {
|
|
for (PtVO.YarnTypeDetail detail : usage.getDetails()) {
|
|
- BigDecimal ratio = new BigDecimal(detail.getNum())
|
|
|
|
- .divide(new BigDecimal(totalNum), 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
+ BigDecimal ratio = new BigDecimal(detail.getNum()).divide(new BigDecimal(totalNum), 2, RoundingMode.HALF_UP);
|
|
detail.setRatio(ratio);
|
|
detail.setRatio(ratio);
|
|
}
|
|
}
|
|
ptVO.getUsages().add(usage);
|
|
ptVO.getUsages().add(usage);
|
|
}
|
|
}
|
|
|
|
|
|
- // 模拟库存情况数据
|
|
|
|
- for (int i = 1; i <= 4; i++) {
|
|
|
|
- PtVO.Stock stock = new PtVO.Stock();
|
|
|
|
- stock.setName("纱种" + i);
|
|
|
|
- stock.setIn(100 * i);
|
|
|
|
- stock.setOut(50 * i);
|
|
|
|
- stock.setMax(200 * i);
|
|
|
|
- stock.setMin(50 * i);
|
|
|
|
- stock.setAvg(BigDecimal.valueOf(120.5));
|
|
|
|
- ptVO.getStocks().add(stock);
|
|
|
|
- }
|
|
|
|
|
|
+ Map<String, PtVO.Stock> stats = new HashMap<>(16);
|
|
|
|
+ List<TwinCalcHourPt> hourPtList = ptService.selectTwinCalcHourPtByDay(LocalDateTime.now().minusHours(7).toLocalDate());
|
|
|
|
+
|
|
|
|
+ hourPtList.forEach(pt -> {
|
|
|
|
+ PtVO.Stock stock = stats.computeIfAbsent(pt.getName(), k -> new PtVO.Stock());
|
|
|
|
+ stock.setName(pt.getName());
|
|
|
|
+ stock.addIn(pt.getInNum());
|
|
|
|
+ stock.addOut(pt.getOutNum());
|
|
|
|
+ stock.updateMax(pt.getNum());
|
|
|
|
+ stock.updateMin(pt.getNum());
|
|
|
|
+ stock.total(pt.getNum());
|
|
|
|
+ });
|
|
|
|
+ long hours = hourPtList.stream().map(TwinCalcHourPt::getHour).distinct().count();
|
|
|
|
+ stats.values().forEach(stock -> stock.calcAvg((int) hours));
|
|
|
|
+
|
|
|
|
+ ptVO.getStocks().addAll(stats.values());
|
|
|
|
|
|
return R.ok(ptVO);
|
|
return R.ok(ptVO);
|
|
}
|
|
}
|
|
@@ -113,15 +118,6 @@ public class InventoryController extends BaseController {
|
|
List<TopVO> tops = topProcess(sql);
|
|
List<TopVO> tops = topProcess(sql);
|
|
bpVO.setTops(tops);
|
|
bpVO.setTops(tops);
|
|
|
|
|
|
-// // 模拟TOP排名数据
|
|
|
|
-// for (int i = 1; i <= 10; i++) {
|
|
|
|
-// BpVO.Top top = new BpVO.Top();
|
|
|
|
-// top.setName("纱种" + i);
|
|
|
|
-// top.setDate(LocalDate.now().minusDays(10 - i));
|
|
|
|
-// top.setDay(10 - i);
|
|
|
|
-// bpVO.getTops().add(top);
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
// 模拟近一月库存情况 - 卷数、米数、重量三种类型
|
|
// 模拟近一月库存情况 - 卷数、米数、重量三种类型
|
|
for (int i = 0; i < 30; i++) {
|
|
for (int i = 0; i < 30; i++) {
|
|
// 米数库存
|
|
// 米数库存
|
|
@@ -171,35 +167,50 @@ public class InventoryController extends BaseController {
|
|
|
|
|
|
// 根据数量计算比例
|
|
// 根据数量计算比例
|
|
for (BpVO.YarnTypeDetail detail : details) {
|
|
for (BpVO.YarnTypeDetail detail : details) {
|
|
- BigDecimal ratio = new BigDecimal(detail.getNum())
|
|
|
|
- .divide(new BigDecimal(totalNum), 2, RoundingMode.HALF_UP);
|
|
|
|
|
|
+ BigDecimal ratio = new BigDecimal(detail.getNum()).divide(new BigDecimal(totalNum), 2, RoundingMode.HALF_UP);
|
|
detail.setRatio(ratio);
|
|
detail.setRatio(ratio);
|
|
stock.getDetails().add(detail);
|
|
stock.getDetails().add(detail);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ Map<String, BpVO.Stock[]> stats = new HashMap<>(16);
|
|
|
|
+ List<TwinCalcHourBp> hourBpList = bpService.selectTwinCalcHourPtByDay(LocalDateTime.now().minusHours(7).toLocalDate());
|
|
|
|
|
|
- // 模拟库存情况数据(卷数、米数、重量)
|
|
|
|
- String[] stockTypes = {"卷数", "米数", "重量"};
|
|
|
|
- for (String type : stockTypes) {
|
|
|
|
- for (int i = 1; i <= 4; i++) {
|
|
|
|
- BpVO.Stock stock = new BpVO.Stock();
|
|
|
|
- stock.setName("纱种" + i);
|
|
|
|
- stock.setIn(100 * i);
|
|
|
|
- stock.setOut(50 * i);
|
|
|
|
- stock.setMax(200 * i);
|
|
|
|
- stock.setMin(50 * i);
|
|
|
|
- stock.setAvg(BigDecimal.valueOf(220.5));
|
|
|
|
-
|
|
|
|
- if (type.equals("卷数")) {
|
|
|
|
- bpVO.getRollStocks().add(stock);
|
|
|
|
- } else if (type.equals("米数")) {
|
|
|
|
- bpVO.getMeterStocks().add(stock);
|
|
|
|
- } else {
|
|
|
|
- bpVO.getWeightStocks().add(stock);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ hourBpList.forEach(bp -> {
|
|
|
|
+ BpVO.Stock[] stock = stats.computeIfAbsent(bp.getName(), k -> {
|
|
|
|
+ BpVO.Stock[] newStock = new BpVO.Stock[3];
|
|
|
|
+ newStock[0] = new BpVO.Stock(); // 卷数
|
|
|
|
+ newStock[1] = new BpVO.Stock(); // 米数
|
|
|
|
+ newStock[2] = new BpVO.Stock(); // 重量
|
|
|
|
+ return newStock;
|
|
|
|
+ });
|
|
|
|
+ // 处理卷数统计
|
|
|
|
+ processStock(stock[0], bp.getName(), bp.getRollIn(), bp.getRollOut(), bp.getRollNum());
|
|
|
|
+ // 处理米数统计
|
|
|
|
+ processStock(stock[1], bp.getName(), bp.getMeterIn(), bp.getMeterOut(), bp.getMeterNum());
|
|
|
|
+ // 处理重量统计
|
|
|
|
+ processStock(stock[2], bp.getName(), bp.getWeightIn(), bp.getWeightOut(), bp.getWeightNum());
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ long hours = hourBpList.stream().map(TwinCalcHourBp::getHour).distinct().count();
|
|
|
|
+
|
|
|
|
+ // 使用流式处理优化计算和分类
|
|
|
|
+ List<BpVO.Stock> rollStocks = new ArrayList<>();
|
|
|
|
+ List<BpVO.Stock> meterStocks = new ArrayList<>();
|
|
|
|
+ List<BpVO.Stock> weightStocks = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ stats.values().stream().forEach(stockArray -> {
|
|
|
|
+ stockArray[0].calcAvg((int) hours);
|
|
|
|
+ stockArray[1].calcAvg((int) hours);
|
|
|
|
+ stockArray[2].calcAvg((int) hours);
|
|
|
|
+
|
|
|
|
+ rollStocks.add(stockArray[0]);
|
|
|
|
+ meterStocks.add(stockArray[1]);
|
|
|
|
+ weightStocks.add(stockArray[2]);
|
|
|
|
+ });
|
|
|
|
+ bpVO.setRollStocks(rollStocks);
|
|
|
|
+ bpVO.setMeterStocks(meterStocks);
|
|
|
|
+ bpVO.setWeightStocks(weightStocks);
|
|
return R.ok(bpVO);
|
|
return R.ok(bpVO);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -223,5 +234,23 @@ public class InventoryController extends BaseController {
|
|
}).collect(Collectors.toList());
|
|
}).collect(Collectors.toList());
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 处理库存数据
|
|
|
|
+ *
|
|
|
|
+ * @param stock 库存数据
|
|
|
|
+ * @param name 名称
|
|
|
|
+ * @param in 入库数量
|
|
|
|
+ * @param out 出库数量
|
|
|
|
+ * @param num 数量
|
|
|
|
+ */
|
|
|
|
+ private void processStock(BpVO.Stock stock, String name, Integer in, Integer out, Integer num) {
|
|
|
|
+ stock.setName(name);
|
|
|
|
+ stock.addIn(in);
|
|
|
|
+ stock.addOut(out);
|
|
|
|
+ stock.updateMax(num);
|
|
|
|
+ stock.updateMin(num);
|
|
|
|
+ stock.total(num);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
}
|
|
}
|