Browse Source

异常看板

master
han\hanst 2 months ago
parent
commit
f3edae6516
  1. 208
      src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java

208
src/main/java/com/gaotao/modules/dashboard/task/DashboardPushTask.java

@ -1336,5 +1336,213 @@ public class DashboardPushTask {
return "idle";
}
/**
* 定时推送异常看板数据
*
* <p><b>功能说明</b>每10秒从WMS系统获取异常数据并推送到前端</p>
*
* <p><b>数据来源</b></p>
* <ul>
* <li>WMS系统 - http://172.28.1.18:7002/api/wms/query-task-error-info</li>
* <li>设备编码1101</li>
* </ul>
*
* <p><b>配置开关</b></p>
* <ul>
* <li>dashboard.push.enabled - 看板推送总开关</li>
* </ul>
*/
@Scheduled(fixedRate = 10000)
public void pushExceptionBoardData() {
// 检查总开关
if (!dashboardPushEnabled) {
log.trace("看板推送已禁用");
return;
}
try {
// 从WMS获取异常数据
Map<String, Object> data = getExceptionDataFromWms();
// 如果返回null转换为空数据
if (data == null) {
data = createEmptyExceptionData();
}
// 计算数据哈希值并推送
int currentHash = data.hashCode();
webSocketService.pushExceptionBoardData(data);
lastDataHash.put("exception-board", currentHash);
} catch (Exception e) {
log.error("推送异常看板数据失败,推送空数据: {}", e.getMessage(), e);
// 异常时推送空数据避免前端显示过期数据
try {
Map<String, Object> emptyData = createEmptyExceptionData();
webSocketService.pushExceptionBoardData(emptyData);
lastDataHash.put("exception-board", emptyData.hashCode());
} catch (Exception ex) {
log.error("推送空数据失败: {}", ex.getMessage());
}
}
}
/**
* 从WMS系统获取异常数据
*
* <p><b>数据来源</b></p>
* <ul>
* <li>API: http://172.28.1.18:7002/api/wms/query-task-error-info</li>
* <li>入参: 1101设备编码</li>
* <li>返回格式: {resCode, resMsg, memo1, memo2, memo3}</li>
* </ul>
*
* @return 异常数据
*/
private Map<String, Object> getExceptionDataFromWms() {
List<Map<String, Object>> exceptionList = new ArrayList<>();
try {
// 调用WMS异常查询API
String url = wcsUrl + "query-task-error-info";
log.debug("调用WMS异常查询API: {}", url);
// 构造POST请求参数 - 传入设备编码1101
String jsonBody = "\"1101\"";
String wmsResponse = HttpUtils.doPost(url, jsonBody, null);
log.debug("WMS API返回数据: {}", wmsResponse);
// 解析JSON数据
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(wmsResponse);
// 检查返回码
int resCode = rootNode.get("resCode").asInt();
if (resCode != 200) {
log.warn("WMS异常查询API返回错误: code={}", resCode);
return createExceptionBoardData(exceptionList);
}
// 解析resMsg
String resMsg = rootNode.has("resMsg") ? rootNode.get("resMsg").asText() : "";
// 检查是否有真实异常排除"无异常"的情况
if (resMsg != null && !resMsg.isEmpty() && !resMsg.equals("无异常")) {
Map<String, Object> exception = parseExceptionMessage(resMsg);
if (exception != null) {
exceptionList.add(exception);
}
} else {
log.debug("WMS返回无异常信息: {}", resMsg);
}
log.info("从WMS获取到{}条异常数据", exceptionList.size());
} catch (Exception e) {
log.error("从WMS获取异常数据失败", e);
}
return createExceptionBoardData(exceptionList);
}
/**
* 解析异常消息
* 消息格式托盘号W00108异常信息数据对比异常,多盘标签:["A552025111800000129"],少盘标签:[]
*
* @param resMsg 异常消息
* @return 解析后的异常数据
*/
private Map<String, Object> parseExceptionMessage(String resMsg) {
try {
Map<String, Object> exception = new HashMap<>();
// 提取托盘号
String palletCode = "";
if (resMsg.contains("托盘号:")) {
int start = resMsg.indexOf("托盘号:") + 4;
int end = resMsg.indexOf(",", start);
if (end > start) {
palletCode = resMsg.substring(start, end).trim();
}
}
// 提取异常信息
String exceptionInfo = "";
String exceptionType = "数据对比异常";
if (resMsg.contains("异常信息:")) {
int start = resMsg.indexOf("异常信息:") + 5;
exceptionInfo = resMsg.substring(start).trim();
// 提取异常类型
if (exceptionInfo.contains(",")) {
exceptionType = exceptionInfo.substring(0, exceptionInfo.indexOf(","));
}
}
// 提取多盘标签
String moreTags = "";
if (resMsg.contains("多盘标签:")) {
int start = resMsg.indexOf("多盘标签:") + 5;
int end = resMsg.indexOf("],", start);
if (end > start) {
moreTags = resMsg.substring(start, end + 1).trim();
}
}
// 提取少盘标签
String lessTags = "";
if (resMsg.contains("少盘标签:")) {
int start = resMsg.indexOf("少盘标签:") + 5;
lessTags = resMsg.substring(start).trim();
}
// 构造异常数据
exception.put("palletCode", palletCode);
exception.put("exceptionType", exceptionType);
exception.put("description", exceptionInfo);
exception.put("moreTags", moreTags);
exception.put("lessTags", lessTags);
exception.put("occurTime", java.time.LocalDateTime.now().format(
java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
exception.put("status", "待处理");
exception.put("location", "1101"); // 设备编码作为位置
return exception;
} catch (Exception e) {
log.error("解析异常消息失败: {}", resMsg, e);
return null;
}
}
/**
* 创建异常看板数据结构
*
* @param exceptionList 异常列表
* @return 看板数据
*/
private Map<String, Object> createExceptionBoardData(List<Map<String, Object>> exceptionList) {
Map<String, Object> data = new HashMap<>();
data.put("exceptionList", exceptionList != null ? exceptionList : new ArrayList<>());
data.put("totalCount", exceptionList != null ? exceptionList.size() : 0);
data.put("updateTime", java.time.LocalDateTime.now().format(
java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
return data;
}
/**
* 创建空的异常看板数据
*
* @return 空数据结构
*/
private Map<String, Object> createEmptyExceptionData() {
Map<String, Object> data = new HashMap<>();
data.put("exceptionList", new ArrayList<>());
data.put("totalCount", 0);
data.put("updateTime", java.time.LocalDateTime.now().format(
java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
return data;
}
}
Loading…
Cancel
Save