diff --git a/src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java b/src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java index f105327..148317b 100644 --- a/src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java +++ b/src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java @@ -45,7 +45,7 @@ public class DashboardPushTask { @Value("${custom.wcs-board-api}") private String wcsBoardApi; - + // 看板推送任务开关配置(所有看板共用一个开关) @Value("${dashboard.push.enabled:true}") private boolean dashboardPushEnabled; @@ -69,20 +69,20 @@ public class DashboardPushTask { *
  • 如果数据变化频繁,可以缩短间隔(如2-3秒)
  • *
  • 如果数据变化不频繁,可以延长间隔(如10-15秒)
  • * - * + * *

    配置开关:

    * */ - @Scheduled(fixedRate = 5000) + @Scheduled(fixedRate = 10000) public void pushRobotPickingData() { // 检查总开关 if (!dashboardPushEnabled) { log.trace("看板推送已禁用"); return; } - + try { // 从WCS Board API获取机械臂拣选数据 Map data = getRobotPickingDataFromWcs(); @@ -252,14 +252,14 @@ public class DashboardPushTask { *
  • view_board_slitting_inbound - 分切入库区数据
  • * */ - @Scheduled(fixedRate = 5000) + @Scheduled(fixedRate = 10000) public void pushSlittingBoardData() { // 检查总开关 if (!dashboardPushEnabled) { log.trace("看板推送已禁用"); return; } - + try { // 从数据库视图获取分切区数据 Map data = getSlittingBoardDataFromDb(); @@ -358,14 +358,14 @@ public class DashboardPushTask { *
  • 发货统计 - queryWarehouseShipmentStats
  • * */ - @Scheduled(fixedRate = 5000) + @Scheduled(fixedRate = 10000) public void pushWarehouse3dBoardData() { // 检查总开关 if (!dashboardPushEnabled) { log.trace("看板推送已禁用"); return; } - + try { // 从数据库获取立体仓库看板数据 Map data = getWarehouse3dBoardDataFromDb(); @@ -447,7 +447,7 @@ public class DashboardPushTask { resultData.put("agvData", agvStatus != null ? agvStatus : new ArrayList<>()); resultData.put("materialRequestData", materialRequestStats != null ? materialRequestStats : new HashMap<>()); resultData.put("shipmentData", shipmentStats != null ? shipmentStats : new HashMap<>()); - + // 添加库存趋势数据 resultData.put("rawMaterialTrend", rawMaterialTrend != null ? rawMaterialTrend : new ArrayList<>()); resultData.put("specifiedMaterialTrend", specifiedMaterialTrend != null ? specifiedMaterialTrend : new ArrayList<>()); @@ -487,7 +487,7 @@ public class DashboardPushTask { // 调用WCS Board API String url = wcsBoardApi + "WmsDashboard/inventory-stats"; log.debug("调用WCS库存统计API: {}", url); - + String wcsResponse = HttpUtils.doGet(url, null, null); log.debug("WCS API返回数据: {}", wcsResponse); @@ -517,36 +517,59 @@ public class DashboardPushTask { return createEmptyStorageData(); } - // 提取各类托盘数量 - int flatPallet = materialInventory.has("flatPallet") ? + // 提取物料盘各类托盘数量 + int materialFlatPallet = materialInventory.has("flatPallet") ? materialInventory.get("flatPallet").asInt() : 0; - int framePallet = materialInventory.has("framePallet") ? + int materialFramePallet = materialInventory.has("framePallet") ? materialInventory.get("framePallet").asInt() : 0; - int steelPallet = materialInventory.has("steelPallet") ? + int materialSteelPallet = materialInventory.has("steelPallet") ? materialInventory.get("steelPallet").asInt() : 0; - - // 提取空容器库存 - int emptyContainer = resData.has("emptyContainerInventory") ? - resData.get("emptyContainerInventory").asInt() : 0; - // 计算总使用库位和利用率 - int usedSlots = flatPallet + framePallet + steelPallet; + // 提取空容器各类托盘数量 + JsonNode emptyContainerInventory = resData.get("emptyContainerInventory"); + int emptyFlatPallet = 0; + int emptyFramePallet = 0; + int emptySteelPallet = 0; + + if (emptyContainerInventory != null && !emptyContainerInventory.isNull()) { + emptyFlatPallet = emptyContainerInventory.has("flatPallet") ? + emptyContainerInventory.get("flatPallet").asInt() : 0; + emptyFramePallet = emptyContainerInventory.has("framePallet") ? + emptyContainerInventory.get("framePallet").asInt() : 0; + emptySteelPallet = emptyContainerInventory.has("steelPallet") ? + emptyContainerInventory.get("steelPallet").asInt() : 0; + } + + // 计算总使用库位和利用率(物料盘+空盘) + int usedSlots = materialFlatPallet + materialFramePallet + materialSteelPallet + + emptyFlatPallet + emptyFramePallet + emptySteelPallet; int totalSlots = 1960; // 固定值 - double utilizationRate = totalSlots > 0 ? + double utilizationRate = totalSlots > 0 ? Math.round((double) usedSlots / totalSlots * 1000.0) / 10.0 : 0.0; + // 构造物料盘库存数据 + Map materialInventoryData = new HashMap<>(); + materialInventoryData.put("flatPallet", materialFlatPallet+emptyFlatPallet); // 物料盘-平托 + materialInventoryData.put("framePallet", materialFramePallet+emptyFramePallet); // 物料盘-围框托盘 + materialInventoryData.put("steelPallet", materialSteelPallet+emptySteelPallet); // 物料盘-钢底托 + + // 构造空盘库存数据 + Map emptyContainerInventoryData = new HashMap<>(); + emptyContainerInventoryData.put("flatPallet", emptyFlatPallet); // 空盘-平托 + emptyContainerInventoryData.put("framePallet", emptyFramePallet); // 空盘-围框托盘 + emptyContainerInventoryData.put("steelPallet", emptySteelPallet); // 空盘-钢底托 + // 构造返回数据 Map storageData = new HashMap<>(); - storageData.put("totalSlots", totalSlots); // 总库位数 - storageData.put("usedSlots", usedSlots); // 已使用库位数 - storageData.put("utilizationRate", utilizationRate); // 利用率 - storageData.put("flatPallet", flatPallet); // 平托 - storageData.put("guardPallet", framePallet); // 围挡托盘(对应framePallet) - storageData.put("steelPallet", steelPallet); // 钢托盘 - storageData.put("otherPallet", emptyContainer); // 其他(空容器) + storageData.put("totalSlots", totalSlots); // 总库位数 + storageData.put("usedSlots", usedSlots); // 已使用库位数 + storageData.put("utilizationRate", utilizationRate); // 利用率 + storageData.put("materialInventory", materialInventoryData); // 物料盘库存 + storageData.put("emptyContainerInventory", emptyContainerInventoryData); // 空盘库存 - log.info("库存统计数据获取成功 - 平托:{}, 框架托:{}, 钢托:{}, 空容器:{}, 总使用:{}, 利用率:{}%", - flatPallet, framePallet, steelPallet, emptyContainer, usedSlots, utilizationRate); + log.info("库存统计数据获取成功 - 物料盘[平托:{}, 框架托:{}, 钢托:{}], 空盘[平托:{}, 框架托:{}, 钢托:{}], 总使用:{}, 利用率:{}%", + materialFlatPallet, materialFramePallet, materialSteelPallet, + emptyFlatPallet, emptyFramePallet, emptySteelPallet, usedSlots, utilizationRate); return storageData; @@ -562,14 +585,25 @@ public class DashboardPushTask { * @return 空的库存统计数据结构 */ private Map createEmptyStorageData() { + // 构造空的物料盘库存数据 + Map emptyMaterialInventory = new HashMap<>(); + emptyMaterialInventory.put("flatPallet", 0); + emptyMaterialInventory.put("framePallet", 0); + emptyMaterialInventory.put("steelPallet", 0); + + // 构造空的空盘库存数据 + Map emptyContainerInventory = new HashMap<>(); + emptyContainerInventory.put("flatPallet", 0); + emptyContainerInventory.put("framePallet", 0); + emptyContainerInventory.put("steelPallet", 0); + + // 构造返回数据 Map emptyData = new HashMap<>(); emptyData.put("totalSlots", 1960); emptyData.put("usedSlots", 0); emptyData.put("utilizationRate", 0.0); - emptyData.put("flatPallet", 0); - emptyData.put("guardPallet", 0); - emptyData.put("steelPallet", 0); - emptyData.put("otherPallet", 0); + emptyData.put("materialInventory", emptyMaterialInventory); + emptyData.put("emptyContainerInventory", emptyContainerInventory); return emptyData; } @@ -747,14 +781,14 @@ public class DashboardPushTask { *
  • view_board_finish_inbound - 成品入库区数据
  • * */ - @Scheduled(fixedRate = 5000) + @Scheduled(fixedRate = 10000) public void pushFinishedProductBoardData() { // 检查总开关 if (!dashboardPushEnabled) { log.trace("看板推送已禁用"); return; } - + try { // 从数据库视图获取成品区数据 Map data = getFinishedProductBoardDataFromDb(); @@ -849,14 +883,14 @@ public class DashboardPushTask { *
  • view_board_receiving_inbound - 原材入库区数据
  • * */ - @Scheduled(fixedRate = 5000) + @Scheduled(fixedRate = 10000) public void pushMaterialReceivingBoardData() { // 检查总开关 if (!dashboardPushEnabled) { log.trace("看板推送已禁用"); return; } - + try { // 从数据库视图获取原材收货区数据 Map data = getMaterialReceivingBoardDataFromDb();