package com.gaotao.modules.dashboard.task;
import com.beust.ah.A;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gaotao.common.utils.HttpUtils;
import com.gaotao.modules.automatedWarehouse.entity.tusk.AgvStatus;
import com.gaotao.modules.automatedWarehouse.entity.tusk.TuskResponse;
import com.gaotao.modules.automatedWarehouse.service.TuskClientService;
import com.gaotao.modules.dashboard.service.DashboardWebSocketService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* 看板数据推送定时任务
*
*
功能说明:
*
* - 定时从WCS Board API获取最新数据
* - 检测到数据变更后通过WebSocket推送到前端
* - 相比轮询,只在数据变更时推送,减少无效传输
*
*
* 推送策略:
*
* - 每5秒检查一次机械臂拣选数据
* - 数据有变化时立即推送
* - 推送失败时记录日志,不影响下次推送
*
*
* @author System
* @since 2025-01-23
*/
@Slf4j
@Component
public class DashboardPushTask {
@Autowired
private DashboardWebSocketService webSocketService;
@Value("${custom.wcs-board-api}")
private String wcsBoardApi;
// 看板推送任务开关配置(所有看板共用一个开关)
@Value("${dashboard.push.enabled:true}")
private boolean dashboardPushEnabled;
/**
* 上次推送的数据哈希值(用于检测数据变更)
*/
private Map lastDataHash = new HashMap<>();
@Autowired
private com.gaotao.modules.dashboard.dao.DashboardDao dashboardDao;
@Autowired(required = false)
private TuskClientService tuskClientService;
@Value("${custom.wcs-url}")
private String wcsUrl;
/**
* 每10秒检查人工拣选数据并推送
*
* 数据来源:WCS系统 - /api/wms/query-auto-sorting-info
*
* 数据说明:
*
* - sortingStation=1043 - 第一个表格(人工拣选1)
* - sortingStation=1028 - 第二个表格(人工拣选2)
*
*
* 配置开关:
*
* - dashboard.push.enabled - 看板推送总开关
*
*/
@Scheduled(fixedRate = 5000)
public void pushManualPickingData() {
// 检查总开关
if (!dashboardPushEnabled) {
log.trace("看板推送已禁用");
return;
}
try {
log.debug("=== 开始获取人工拣选看板数据 ===");
// 从WCS获取人工拣选数据
Map data = getManualPickingDataFromWcs();
// 如果返回null,转换为空数据
if (data == null) {
data = createEmptyManualPickingData();
}
// 计算数据哈希值并推送
int currentHash = data.hashCode();
webSocketService.pushManualPickingData(data);
lastDataHash.put("manual-picking", currentHash);
log.debug("=== 人工拣选数据推送完成 ===");
} catch (Exception e) {
log.error("推送人工拣选数据失败,推送空数据清空前端列表: {}", e.getMessage(), e);
// 异常时推送空数据,避免前端显示过期数据
try {
Map emptyData = createEmptyManualPickingData();
webSocketService.pushManualPickingData(emptyData);
lastDataHash.put("manual-picking", emptyData.hashCode());
} catch (Exception ex) {
log.error("推送空数据失败: {}", ex.getMessage());
}
}
}
/**
* 从WCS获取人工拣选数据
*
* @return 人工拣选数据
*/
private Map getManualPickingDataFromWcs() {
try {
String url = wcsUrl + "query-auto-sorting-info";
ObjectMapper mapper = new ObjectMapper();
// 请求1043站数据
log.info("调用WCS人工拣选API (1043站): {}", url);
List