You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
7.0 KiB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. package com.gaotao.modules.dashboard.service;
  2. import com.gaotao.common.utils.R;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.messaging.simp.SimpMessagingTemplate;
  6. import org.springframework.stereotype.Service;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. import java.util.Map;
  10. /**
  11. * 看板WebSocket推送服务
  12. *
  13. * <p><b>功能说明:</b></p>
  14. * <ul>
  15. * <li>向订阅的前端看板推送实时数据</li>
  16. * <li>支持按看板类型定向推送</li>
  17. * <li>支持广播推送到所有看板</li>
  18. * </ul>
  19. *
  20. * <p><b>订阅主题列表:</b></p>
  21. * <ul>
  22. * <li>/topic/dashboard/manual-picking - 人工拣选看板</li>
  23. * <li>/topic/dashboard/robot-picking - 机械臂拣选看板</li>
  24. * <li>/topic/dashboard/slitting-board - 分切区看板</li>
  25. * <li>/topic/dashboard/inventory-board - 库存分析看板</li>
  26. * <li>/topic/dashboard/warehouse-3d - 智能立体仓库看板</li>
  27. * </ul>
  28. *
  29. * @author System
  30. * @since 2025-01-23
  31. */
  32. @Slf4j
  33. @Service
  34. public class DashboardWebSocketService {
  35. @Autowired
  36. private SimpMessagingTemplate messagingTemplate;
  37. /**
  38. * 创建带服务器时间的响应
  39. *
  40. * @param data 业务数据
  41. * @return 包含服务器时间的响应
  42. */
  43. private R createResponseWithServerTime(Map<String, Object> data) {
  44. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
  45. String serverTime = sdf.format(new Date());
  46. return R.ok()
  47. .put("data", data)
  48. .put("serverTime", serverTime);
  49. }
  50. /**
  51. * 推送人工拣选看板数据
  52. *
  53. * @param data 看板数据
  54. */
  55. public void pushManualPickingData(Map<String, Object> data) {
  56. try {
  57. messagingTemplate.convertAndSend("/topic/dashboard/manual-picking",
  58. createResponseWithServerTime(data));
  59. } catch (Exception e) {
  60. log.error("推送人工拣选看板数据失败: {}", e.getMessage(), e);
  61. }
  62. }
  63. /**
  64. * 推送机械臂拣选看板数据
  65. *
  66. * @param data 看板数据
  67. */
  68. public void pushRobotPickingData(Map<String, Object> data) {
  69. try {
  70. messagingTemplate.convertAndSend("/topic/dashboard/robot-picking",
  71. createResponseWithServerTime(data));
  72. } catch (Exception e) {
  73. log.error("推送机械臂拣选看板数据失败: {}", e.getMessage(), e);
  74. }
  75. }
  76. /**
  77. * 推送分切区看板数据
  78. *
  79. * @param data 看板数据
  80. */
  81. public void pushSlittingBoardData(Map<String, Object> data) {
  82. try {
  83. messagingTemplate.convertAndSend("/topic/dashboard/slitting-board",
  84. createResponseWithServerTime(data));
  85. } catch (Exception e) {
  86. log.error("推送分切区看板数据失败: {}", e.getMessage(), e);
  87. }
  88. }
  89. /**
  90. * 推送库存分析看板数据
  91. *
  92. * @param data 看板数据
  93. */
  94. public void pushInventoryBoardData(Map<String, Object> data) {
  95. try {
  96. messagingTemplate.convertAndSend("/topic/dashboard/inventory-board",
  97. createResponseWithServerTime(data));
  98. } catch (Exception e) {
  99. log.error("推送库存分析看板数据失败: {}", e.getMessage(), e);
  100. }
  101. }
  102. /**
  103. * 推送成品入库出库区看板数据
  104. *
  105. * @param data 看板数据
  106. */
  107. public void pushFinishedProductBoardData(Map<String, Object> data) {
  108. try {
  109. messagingTemplate.convertAndSend("/topic/dashboard/finished-product-board",
  110. createResponseWithServerTime(data));
  111. } catch (Exception e) {
  112. log.error("推送成品入库出库区看板数据失败: {}", e.getMessage(), e);
  113. }
  114. }
  115. /**
  116. * 推送原材收货区看板数据
  117. *
  118. * @param data 看板数据
  119. */
  120. public void pushMaterialReceivingBoardData(Map<String, Object> data) {
  121. try {
  122. messagingTemplate.convertAndSend("/topic/dashboard/material-receiving-board",
  123. createResponseWithServerTime(data));
  124. } catch (Exception e) {
  125. log.error("推送原材收货区看板数据失败: {}", e.getMessage(), e);
  126. }
  127. }
  128. /**
  129. * 推送缓存区看板数据
  130. *
  131. * @param data 看板数据
  132. */
  133. public void pushBufferBoardData(Map<String, Object> data) {
  134. try {
  135. messagingTemplate.convertAndSend("/topic/dashboard/buffer-board",
  136. createResponseWithServerTime(data));
  137. } catch (Exception e) {
  138. log.error("推送缓存区看板数据失败: {}", e.getMessage(), e);
  139. }
  140. }
  141. /**
  142. * 推送车间AGV放料区看板数据
  143. *
  144. * @param data 看板数据
  145. */
  146. public void pushWorkshopFeedingBoardData(Map<String, Object> data) {
  147. try {
  148. messagingTemplate.convertAndSend("/topic/dashboard/workshop-feeding-board",
  149. createResponseWithServerTime(data));
  150. } catch (Exception e) {
  151. log.error("推送车间AGV放料区看板数据失败: {}", e.getMessage(), e);
  152. }
  153. }
  154. /**
  155. * 推送异常处理区看板数据
  156. *
  157. * @param data 看板数据
  158. */
  159. public void pushExceptionBoardData(Map<String, Object> data) {
  160. try {
  161. messagingTemplate.convertAndSend("/topic/dashboard/exception-board",
  162. createResponseWithServerTime(data));
  163. } catch (Exception e) {
  164. log.error("推送异常处理区看板数据失败: {}", e.getMessage(), e);
  165. }
  166. }
  167. /**
  168. * 广播推送到所有看板
  169. *
  170. * @param data 看板数据
  171. */
  172. public void broadcastToAllDashboards(Map<String, Object> data) {
  173. try {
  174. messagingTemplate.convertAndSend("/topic/dashboard/broadcast",
  175. createResponseWithServerTime(data));
  176. } catch (Exception e) {
  177. log.error("广播推送到所有看板失败: {}", e.getMessage(), e);
  178. }
  179. }
  180. /**
  181. * 推送智能立体仓库看板数据
  182. *
  183. * @param data 看板数据
  184. */
  185. public void pushWarehouse3dBoardData(Map<String, Object> data) {
  186. try {
  187. messagingTemplate.convertAndSend("/topic/dashboard/warehouse-3d",
  188. createResponseWithServerTime(data));
  189. } catch (Exception e) {
  190. log.error("推送智能立体仓库看板数据失败: {}", e.getMessage(), e);
  191. }
  192. }
  193. /**
  194. * 推送到指定主题
  195. *
  196. * @param topic 主题名称
  197. * @param data 数据
  198. */
  199. public void pushToTopic(String topic, Object data) {
  200. try {
  201. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
  202. String serverTime = sdf.format(new Date());
  203. messagingTemplate.convertAndSend(topic, R.ok().put("data", data).put("serverTime", serverTime));
  204. } catch (Exception e) {
  205. log.error("推送数据到主题{}失败: {}", topic, e.getMessage(), e);
  206. }
  207. }
  208. }