|
@@ -4,14 +4,13 @@ import com.jjt.common.core.controller.BaseController;
|
|
|
import com.jjt.common.core.domain.R;
|
|
|
import com.jjt.common.core.redis.RedisCache;
|
|
|
import com.jjt.common.utils.DateUtils;
|
|
|
+import com.jjt.common.utils.StringUtils;
|
|
|
import com.jjt.inventory.domain.TwinCalcDayBp;
|
|
|
import com.jjt.inventory.domain.TwinCalcDayPt;
|
|
|
import com.jjt.inventory.domain.TwinCalcHourBp;
|
|
|
import com.jjt.inventory.domain.TwinCalcHourPt;
|
|
|
import com.jjt.inventory.service.*;
|
|
|
-import com.jjt.inventory.vo.BpVO;
|
|
|
-import com.jjt.inventory.vo.PtVO;
|
|
|
-import com.jjt.inventory.vo.TopVO;
|
|
|
+import com.jjt.inventory.vo.*;
|
|
|
import com.jjt.utils.MssqlService;
|
|
|
import io.swagger.annotations.Api;
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
@@ -58,10 +57,14 @@ public class InventoryController extends BaseController {
|
|
|
@ResponseBody
|
|
|
public R<PtVO> pt() {
|
|
|
PtVO ptVO = new PtVO();
|
|
|
- //当前库统计
|
|
|
+ //当前库TOP10 统计
|
|
|
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);
|
|
|
ptVO.setTops(tops);
|
|
|
+ //当前库存明细
|
|
|
+ sql = "SELECT * FROM V_WMS_STOCK WHERE WAREHOUSE_ID='WH03-盘头仓库' ORDER BY LOT01";
|
|
|
+ List<PtStockDetailVO> detailVOList = detailProcess(sql);
|
|
|
+ Map<String, List<PtStockDetailVO>> detailMap = detailVOList.stream().collect(Collectors.groupingBy(PtStockDetailVO::getSkuDesc));
|
|
|
//30天统计
|
|
|
List<TwinCalcDayPt> calcDayList = dayPtService.selectStartDate(LocalDateTime.now().minusHours(7).minusDays(30).toLocalDate());
|
|
|
calcDayList = calcDayList.stream().sorted(Comparator.comparing(TwinCalcDayPt::getTime)).collect(Collectors.toList());
|
|
@@ -94,11 +97,28 @@ public class InventoryController extends BaseController {
|
|
|
stock.updateMax(pt.getNum());
|
|
|
stock.updateMin(pt.getNum());
|
|
|
stock.total(pt.getNum());
|
|
|
+ List<PtStockDetailVO> list = detailMap.getOrDefault(pt.getName(), Collections.emptyList());
|
|
|
+ stock.setCurr(list.size());
|
|
|
+ Map<PtStockVO, List<PtStockDetailVO>> groupedDetailMap = list.stream()
|
|
|
+ .collect(Collectors.groupingBy(detail ->
|
|
|
+ new PtStockVO(detail.getSkuClass(), detail.getSku(), detail.getSkuDesc(), detail.getLot13(), detail.getLot15())
|
|
|
+ ));
|
|
|
+ List<PtStockVO> calcList = new ArrayList<>();
|
|
|
+ groupedDetailMap.forEach((key, value) -> {
|
|
|
+ if ("容器类".equals(key.getSkuClass())) {
|
|
|
+ stock.setName("(空盘头)" + pt.getName());
|
|
|
+ }
|
|
|
+ key.setDetails(value);
|
|
|
+ key.setNum(value.size());
|
|
|
+ calcList.add(key);
|
|
|
+ });
|
|
|
+ stock.setCalc(calcList);
|
|
|
});
|
|
|
long hours = hourPtList.stream().map(TwinCalcHourPt::getHour).distinct().count();
|
|
|
stats.values().forEach(stock -> stock.calcAvg((int) hours));
|
|
|
|
|
|
ptVO.getStocks().addAll(stats.values());
|
|
|
+ ptVO.getStocks().sort(Comparator.comparing(PtVO.Stock::getCurr).reversed());
|
|
|
|
|
|
return R.ok(ptVO);
|
|
|
}
|
|
@@ -252,80 +272,6 @@ public class InventoryController extends BaseController {
|
|
|
// }
|
|
|
// }
|
|
|
});
|
|
|
-// calcDayList.stream()
|
|
|
-// .map(day -> {
|
|
|
-// BpVO.MonthStock monthStock = new BpVO.MonthStock();
|
|
|
-// monthStock.set
|
|
|
-// usage.setMax(day.getMaxNum());
|
|
|
-// usage.setRate(day.getRate());
|
|
|
-// usage.setDate(DateUtils.toLocalDate(day.getTime()));
|
|
|
-// Integer hour = Integer.parseInt(day.getData());
|
|
|
-// List<TwinCalcHourPt> hourPtList = hourPtService.selectTwinCalcHourPtByHour(day.getTime(), hour);
|
|
|
-// hourPtList.stream().filter(item -> item.getNum() > 0).sorted(Comparator.comparing(TwinCalcHourPt::getNum).reversed()).forEach(hourPt -> {
|
|
|
-// PtVO.YarnTypeDetail detail = new PtVO.YarnTypeDetail();
|
|
|
-// detail.setName(hourPt.getName());
|
|
|
-// detail.setNum(hourPt.getNum());
|
|
|
-// BigDecimal ratio = new BigDecimal(hourPt.getNum()).divide(new BigDecimal(day.getMaxNum()), 4, RoundingMode.HALF_UP);
|
|
|
-// detail.setRatio(ratio);
|
|
|
-// usage.getDetails().add(detail);
|
|
|
-// });
|
|
|
-// return monthStock;
|
|
|
-// }).forEach(bpVO.getRollMonthStocks()::add);
|
|
|
- // 模拟近一月库存情况 - 卷数、米数、重量三种类型
|
|
|
-// for (int i = 0; i < 30; i++) {
|
|
|
-// // 米数库存
|
|
|
-// BpVO.MonthStock meterStock = new BpVO.MonthStock();
|
|
|
-// meterStock.setMax(800 + (int) (Math.random() * 400));
|
|
|
-// // 800-1200米
|
|
|
-// meterStock.setMin(300 + (int) (Math.random() * 300));
|
|
|
-// // 300-600米
|
|
|
-// meterStock.setAvg(new BigDecimal((meterStock.getMax() + meterStock.getMin()) / 2.0).setScale(2, RoundingMode.HALF_UP));
|
|
|
-// meterStock.setDate(LocalDate.now().minusDays(29 - i));
|
|
|
-// bpVO.getMeterMonthStocks().add(meterStock);
|
|
|
-//
|
|
|
-// // 重量库存
|
|
|
-// BpVO.MonthStock weightStock = new BpVO.MonthStock();
|
|
|
-// weightStock.setMax(500 + (int) (Math.random() * 300));
|
|
|
-// // 500-800公斤
|
|
|
-// weightStock.setMin(200 + (int) (Math.random() * 200));
|
|
|
-// // 200-400公斤
|
|
|
-// weightStock.setAvg(new BigDecimal((weightStock.getMax() + weightStock.getMin()) / 2.0).setScale(2, RoundingMode.HALF_UP));
|
|
|
-// weightStock.setDate(LocalDate.now().minusDays(29 - i));
|
|
|
-// bpVO.getWeightMonthStocks().add(weightStock);
|
|
|
-//
|
|
|
-// // 卷数库存
|
|
|
-// BpVO.MonthStock rollStock = new BpVO.MonthStock();
|
|
|
-// rollStock.setMax(150 + (int) (Math.random() * 100));
|
|
|
-// // 150-250卷
|
|
|
-// rollStock.setMin(50 + (int) (Math.random() * 80));
|
|
|
-// // 50-130卷
|
|
|
-// rollStock.setAvg(new BigDecimal((rollStock.getMax() + rollStock.getMin()) / 2.0).setScale(2, RoundingMode.HALF_UP));
|
|
|
-// rollStock.setDate(LocalDate.now().minusDays(29 - i));
|
|
|
-// bpVO.getRollMonthStocks().add(rollStock);
|
|
|
-// for (BpVO.MonthStock stock : new BpVO.MonthStock[]{meterStock, weightStock, rollStock}) {
|
|
|
-// int totalNum = 0;
|
|
|
-// int yarnCount = 3 + (int) (Math.random() * 8);
|
|
|
-// // 随机3-10个纱种
|
|
|
-// List<BpVO.YarnTypeDetail> details = new java.util.ArrayList<>();
|
|
|
-//
|
|
|
-// // 先设置数量并计算总数
|
|
|
-// for (int j = 1; j <= yarnCount; j++) {
|
|
|
-// BpVO.YarnTypeDetail detail = new BpVO.YarnTypeDetail();
|
|
|
-// detail.setName("纱种" + j);
|
|
|
-// detail.setNum(50 + (int) (Math.random() * 100));
|
|
|
-// // 随机50-150的数量
|
|
|
-// totalNum += detail.getNum();
|
|
|
-// details.add(detail);
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 根据数量计算比例
|
|
|
-// for (BpVO.YarnTypeDetail detail : details) {
|
|
|
-// BigDecimal ratio = new BigDecimal(detail.getNum()).divide(new BigDecimal(totalNum), 2, RoundingMode.HALF_UP);
|
|
|
-// detail.setRatio(ratio);
|
|
|
-// stock.getDetails().add(detail);
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
|
|
|
//当日统计,按米克重统计
|
|
|
Map<Integer, BpVO.Stock[]> stats = new HashMap<>(16);
|
|
@@ -393,6 +339,39 @@ public class InventoryController extends BaseController {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 盘头库存TOP排名处理
|
|
|
+ *
|
|
|
+ * @return 结果集
|
|
|
+ */
|
|
|
+ private List<PtStockDetailVO> detailProcess(String sql) {
|
|
|
+ List<Map<String, Object>> tops = mssqlService.executeQuery(sql);
|
|
|
+ return tops.stream().map(map -> {
|
|
|
+ PtStockDetailVO vo = new PtStockDetailVO();
|
|
|
+ String sku = (String) map.get("SKU");
|
|
|
+ String skuClass = (String) map.get("SKU_CLASS");
|
|
|
+ String skuDesc = (String) map.get("SKU_DESCRC");
|
|
|
+ String dateStr = (String) map.get("LOT01");
|
|
|
+ String lot12 = (String) map.get("LOT12");
|
|
|
+ String lot13 = (String) map.get("LOT13");
|
|
|
+ String lot15 = (String) map.get("LOT15");
|
|
|
+ String lot17 = (String) map.get("LOT17");
|
|
|
+ vo.setSku(sku);
|
|
|
+ vo.setSkuClass(skuClass);
|
|
|
+ vo.setSkuDesc(skuDesc);
|
|
|
+ if (StringUtils.isNotEmpty(dateStr)) {
|
|
|
+ LocalDate date = LocalDate.parse(dateStr);
|
|
|
+ vo.setDate(date);
|
|
|
+ }
|
|
|
+ vo.setLot12(lot12);
|
|
|
+ vo.setLot13(lot13);
|
|
|
+ vo.setLot15(lot15);
|
|
|
+ vo.setLot17(lot17);
|
|
|
+ return vo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
* 处理库存数据
|
|
|
*
|
|
|
* @param stock 库存数据
|