diff --git a/src/main/java/com/gaotao/modules/dashboard/dao/DashboardDao.java b/src/main/java/com/gaotao/modules/dashboard/dao/DashboardDao.java index e431036..872af24 100644 --- a/src/main/java/com/gaotao/modules/dashboard/dao/DashboardDao.java +++ b/src/main/java/com/gaotao/modules/dashboard/dao/DashboardDao.java @@ -37,6 +37,73 @@ public interface DashboardDao { */ List> querySlittingInboundData(); + /** + * 查询成品包装区数据 + * + *

数据来源:view_board_finish_package

+ *

返回字段:

+ * + * + * @return 成品包装区实时数据 + */ + List> queryFinishPackageData(); + + /** + * 查询成品入库区数据 + * + *

数据来源:view_board_finish_inbound

+ *

返回字段:

+ * + * + * @return 成品入库区实时数据 + */ + List> queryFinishInboundData(); + + /** + * 查询原材收货区数据 + * + *

数据来源:view_board_receiving_receive

+ *

返回字段:

+ *
    + *
  • arrivalTime - 到达时间
  • + *
  • materialName - 拣选物料名称
  • + *
  • quantity - 数量
  • + *
  • location - 库位
  • + *
  • status - 状态
  • + *
+ * + * @return 原材收货区实时数据 + */ + List> queryReceivingReceiveData(); + + /** + * 查询原材入库区数据 + * + *

数据来源:view_board_receiving_inbound

+ *

返回字段:

+ *
    + *
  • storageLocation - 存放位置
  • + *
  • palletCode - 托盘码
  • + *
  • taskType - 任务分类
  • + *
  • status - 状态
  • + *
+ * + * @return 原材入库区实时数据 + */ + List> queryReceivingInboundData(); + // ==================== 智能立体仓库看板数据 ==================== /** 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 b33c6ee..a456931 100644 --- a/src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java +++ b/src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java @@ -600,5 +600,197 @@ public class DashboardPushTask { return "未知状态"; } + + /** + * 每5秒检查成品入库出库区看板数据并推送 + * + *

数据来源:

+ *
    + *
  • view_board_finish_package - 成品包装区数据
  • + *
  • view_board_finish_inbound - 成品入库区数据
  • + *
+ */ + @Scheduled(fixedRate = 5000) + public void pushFinishedProductBoardData() { + try { + // 从数据库视图获取成品区数据 + Map data = getFinishedProductBoardDataFromDb(); + + // 如果返回null,转换为空数据 + if (data == null) { + data = createEmptyFinishedProductData(); + } + + // 计算数据哈希值 + int currentHash = data.hashCode(); + webSocketService.pushFinishedProductBoardData(data); + lastDataHash.put("finished-product", currentHash); + + } catch (Exception e) { + log.error("推送成品入库出库区看板数据失败,推送空数据清空前端列表: {}", e.getMessage(), e); + // 异常时推送空数据,避免前端显示过期数据 + try { + Map emptyData = createEmptyFinishedProductData(); + webSocketService.pushFinishedProductBoardData(emptyData); + lastDataHash.put("finished-product", emptyData.hashCode()); + } catch (Exception ex) { + log.error("推送空数据失败: {}", ex.getMessage()); + } + } + } + + /** + * 从数据库视图获取成品入库出库区看板数据 + * + * @return 成品入库出库区看板数据 + */ + private Map getFinishedProductBoardDataFromDb() { + try { + // 查询成品包装区数据 + List> packageList = dashboardDao.queryFinishPackageData(); + log.debug("查询到成品包装区数据: {}条", packageList != null ? packageList.size() : 0); + + // 查询成品入库区数据 + List> inboundList = dashboardDao.queryFinishInboundData(); + log.debug("查询到成品入库区数据: {}条", inboundList != null ? inboundList.size() : 0); + + // 构造返回数据 + Map resultData = new HashMap<>(); + resultData.put("packagingList", packageList != null ? packageList : new ArrayList<>()); + resultData.put("inboundList", inboundList != null ? inboundList : new ArrayList<>()); + + return resultData; + + } catch (Exception e) { + log.error("从数据库获取成品入库出库区看板数据失败: {}", e.getMessage(), e); + return null; + } + } + + /** + * 创建空的成品入库出库区数据 + * + * @return 空的成品入库出库区数据结构 + */ + private Map createEmptyFinishedProductData() { + Map emptyData = new HashMap<>(); + emptyData.put("packagingList", new ArrayList<>()); + emptyData.put("inboundList", new ArrayList<>()); + return emptyData; + } + + /** + * 判断成品入库出库区数据是否为空 + * + * @param data 待检查的数据 + * @return true=数据为空,false=数据不为空 + */ + private boolean isFinishedProductDataEmpty(Map data) { + if (data == null || data.isEmpty()) { + return true; + } + + List packageList = (List) data.get("packagingList"); + List inboundList = (List) data.get("inboundList"); + + return (packageList == null || packageList.isEmpty()) + && (inboundList == null || inboundList.isEmpty()); + } + + /** + * 每5秒检查原材收货区看板数据并推送 + * + *

数据来源:

+ *
    + *
  • view_board_receiving_receive - 原材收货区数据
  • + *
  • view_board_receiving_inbound - 原材入库区数据
  • + *
+ */ + @Scheduled(fixedRate = 5000) + public void pushMaterialReceivingBoardData() { + try { + // 从数据库视图获取原材收货区数据 + Map data = getMaterialReceivingBoardDataFromDb(); + + // 如果返回null,转换为空数据 + if (data == null) { + data = createEmptyMaterialReceivingData(); + } + + // 计算数据哈希值 + int currentHash = data.hashCode(); + webSocketService.pushMaterialReceivingBoardData(data); + lastDataHash.put("material-receiving", currentHash); + + } catch (Exception e) { + log.error("推送原材收货区看板数据失败,推送空数据清空前端列表: {}", e.getMessage(), e); + // 异常时推送空数据,避免前端显示过期数据 + try { + Map emptyData = createEmptyMaterialReceivingData(); + webSocketService.pushMaterialReceivingBoardData(emptyData); + lastDataHash.put("material-receiving", emptyData.hashCode()); + } catch (Exception ex) { + log.error("推送空数据失败: {}", ex.getMessage()); + } + } + } + + /** + * 从数据库视图获取原材收货区看板数据 + * + * @return 原材收货区看板数据 + */ + private Map getMaterialReceivingBoardDataFromDb() { + try { + // 查询原材收货区数据 + List> receiveList = dashboardDao.queryReceivingReceiveData(); + log.debug("查询到原材收货区数据: {}条", receiveList != null ? receiveList.size() : 0); + + // 查询原材入库区数据 + List> inboundList = dashboardDao.queryReceivingInboundData(); + log.debug("查询到原材入库区数据: {}条", inboundList != null ? inboundList.size() : 0); + + // 构造返回数据 + Map resultData = new HashMap<>(); + resultData.put("receivingList", receiveList != null ? receiveList : new ArrayList<>()); + resultData.put("inboundList", inboundList != null ? inboundList : new ArrayList<>()); + + return resultData; + + } catch (Exception e) { + log.error("从数据库获取原材收货区看板数据失败: {}", e.getMessage(), e); + return null; + } + } + + /** + * 创建空的原材收货区数据 + * + * @return 空的原材收货区数据结构 + */ + private Map createEmptyMaterialReceivingData() { + Map emptyData = new HashMap<>(); + emptyData.put("receivingList", new ArrayList<>()); + emptyData.put("inboundList", new ArrayList<>()); + return emptyData; + } + + /** + * 判断原材收货区数据是否为空 + * + * @param data 待检查的数据 + * @return true=数据为空,false=数据不为空 + */ + private boolean isMaterialReceivingDataEmpty(Map data) { + if (data == null || data.isEmpty()) { + return true; + } + + List receiveList = (List) data.get("receivingList"); + List inboundList = (List) data.get("inboundList"); + + return (receiveList == null || receiveList.isEmpty()) + && (inboundList == null || inboundList.isEmpty()); + } } diff --git a/src/main/resources/mapper/dashboard/DashboardDao.xml b/src/main/resources/mapper/dashboard/DashboardDao.xml index 6167540..4fe3885 100644 --- a/src/main/resources/mapper/dashboard/DashboardDao.xml +++ b/src/main/resources/mapper/dashboard/DashboardDao.xml @@ -27,6 +27,53 @@ ORDER BY storage_location ASC + + + + + + + + + + + +