From 6576a240f36adb22a2ade354946babc0b18f0466 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期四, 16 四月 2026 17:38:27 +0800
Subject: [PATCH] 站点信号
---
rsf-open-api/src/main/java/com/vincent/rsf/openApi/tv/TvRcsStationPollService.java | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 156 insertions(+), 10 deletions(-)
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/tv/TvRcsStationPollService.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/tv/TvRcsStationPollService.java
index fc4507b..59f95ab 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/tv/TvRcsStationPollService.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/tv/TvRcsStationPollService.java
@@ -4,21 +4,31 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.vincent.rsf.openApi.feign.wms.WmsServerFeignClient;
import com.vincent.rsf.openApi.service.RcsTvCallbackService;
+import com.vincent.rsf.openApi.service.WcsStationStatusService;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
/**
- * 璋冪敤 RCS 绔欑偣鎺ュ彛锛岀粨鏋滃啓鍏ョ數瑙嗘満 Redis锛岀敱 zy-monitor-admin WebSocket 鎺ㄩ�佸埌鐢佃鏈�
+ * 瀹氭椂锛欸ET RCS /cv/station/getTaskNo锛汸OST RCS /cv/station/getError锛涗换鍔″彿瀛樺湪鏃惰皟 WMS queryTask 鍚堝苟鏂欑涓庣墿鏂欐槑缁嗚繘 Redis
*/
@Slf4j
@Service
public class TvRcsStationPollService {
+ private static final int MAX_LOG_LEN = 2000;
@Resource
private RestTemplate restTemplate;
@@ -28,12 +38,18 @@
private RcsTvCallbackService rcsTvCallbackService;
@Resource
private TvRcsStationPollProperties pollProperties;
+ @Resource
+ private WcsStationStatusService wcsStationStatusService;
+ @Resource
+ private WmsServerFeignClient wmsServerFeignClient;
public void pollOnce() {
+ String stationId = pollProperties.getTaskNoStationId();
if (StringUtils.hasText(pollProperties.getTaskNoPollUrl())) {
try {
- String raw = restTemplate.getForObject(pollProperties.getTaskNoPollUrl(), String.class);
- applyTaskNoResponse(raw, pollProperties.getTaskNoStationId());
+ String raw = pollTaskNoRaw();
+ String taskNo = applyTaskNoResponse(raw, stationId);
+ enrichSnapshotFromWms(stationId, taskNo);
} catch (RestClientException e) {
log.warn("RCS 浠诲姟鍙疯疆璇� HTTP 澶辫触: {}", e.getMessage());
} catch (Exception e) {
@@ -42,7 +58,7 @@
}
if (StringUtils.hasText(pollProperties.getErrorPollUrl())) {
try {
- String raw = restTemplate.getForObject(pollProperties.getErrorPollUrl(), String.class);
+ String raw = pollErrorRaw();
applyErrorResponse(raw, pollProperties.getErrorStationId());
} catch (RestClientException e) {
log.warn("RCS 寮傚父杞 HTTP 澶辫触: {}", e.getMessage());
@@ -52,22 +68,141 @@
}
}
- private void applyTaskNoResponse(String raw, String staNo) {
- if (!StringUtils.hasText(staNo)) {
+ private void enrichSnapshotFromWms(String stationId, String taskNo) {
+ if (!pollProperties.isEnrichTaskFromWms()) {
return;
+ }
+ if (!StringUtils.hasText(stationId)) {
+ return;
+ }
+ if (!StringUtils.hasText(taskNo) || "0".equals(taskNo.trim())) {
+ wcsStationStatusService.clearStationSnapshot(stationId);
+ return;
+ }
+ Map<String, Object> req = new HashMap<>();
+ req.put("taskNo", taskNo);
+ try {
+ Map<String, Object> res = wmsServerFeignClient.openAsrsQueryTask(req);
+ if (res == null) {
+ wcsStationStatusService.upsertFromRcsPoll(stationId, taskNo, null);
+ return;
+ }
+ Object codeObj = res.get("code");
+ int code = parseCode(codeObj);
+ if (code != 200) {
+ log.debug("WMS queryTask 闈炴垚鍔� code={} msg={}", code, res.get("msg"));
+ wcsStationStatusService.upsertFromRcsPoll(stationId, taskNo, null);
+ return;
+ }
+ Object data = res.get("data");
+ @SuppressWarnings("unchecked")
+ Map<String, Object> dataMap = data instanceof Map ? (Map<String, Object>) data : null;
+ wcsStationStatusService.upsertFromRcsPoll(stationId, taskNo, dataMap);
+ } catch (Exception e) {
+ log.warn("WMS queryTask 璋冪敤澶辫触: {}", e.getMessage());
+ wcsStationStatusService.upsertFromRcsPoll(stationId, taskNo, null);
+ }
+ }
+
+ private static int parseCode(Object codeObj) {
+ if (codeObj == null) {
+ return 0;
+ }
+ if (codeObj instanceof Number) {
+ return ((Number) codeObj).intValue();
+ }
+ try {
+ return Integer.parseInt(String.valueOf(codeObj));
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ private String pollErrorRaw() throws Exception {
+ String url = pollProperties.getErrorPollUrl();
+ if (pollProperties.isErrorPollUsePost()) {
+ String reqBody = objectMapper.writeValueAsString(createStationBody(pollProperties.getErrorStationId()));
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ HttpEntity<String> entity = new HttpEntity<>(reqBody, headers);
+ log.info("RCS绔欑偣杞璇锋眰 POST /cv/station/getError url={} body={}", url, trimForLog(reqBody));
+ ResponseEntity<String> resp = restTemplate.exchange(
+ url, HttpMethod.POST, entity, String.class);
+ String respBody = resp.getBody();
+ log.info("RCS绔欑偣杞鍝嶅簲 POST /cv/station/getError body={}", trimForLog(respBody));
+ return respBody;
+ }
+ log.info("RCS绔欑偣杞璇锋眰 GET /cv/station/getError url={}", url);
+ String raw = restTemplate.getForObject(url, String.class);
+ log.info("RCS绔欑偣杞鍝嶅簲 GET /cv/station/getError body={}", trimForLog(raw));
+ return raw;
+ }
+
+ private String pollTaskNoRaw() throws Exception {
+ String url = pollProperties.getTaskNoPollUrl();
+ if (pollProperties.isTaskNoPollUsePost()) {
+ String reqBody = objectMapper.writeValueAsString(createStationBody(pollProperties.getTaskNoStationId()));
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ HttpEntity<String> entity = new HttpEntity<>(reqBody, headers);
+ // log.info("RCS绔欑偣杞璇锋眰 GET /cv/station/getTaskNo url={}", url);
+ log.info("RCS绔欑偣杞璇锋眰 POST /cv/station/getTaskNo url={} body={}", url, trimForLog(reqBody));
+ ResponseEntity<String> resp = restTemplate.exchange(
+ url, HttpMethod.POST, entity, String.class);
+ String respBody = resp.getBody();
+ // log.info("RCS绔欑偣杞鍝嶅簲 GET /cv/station/getTaskNo body={}", trimForLog(raw));
+ log.info("RCS绔欑偣杞鍝嶅簲 POST /cv/station/getTaskNo body={}", trimForLog(respBody));
+ return respBody;
+ }
+ log.info("RCS绔欑偣杞璇锋眰 GET /cv/station/getTaskNo url={}", url);
+ String raw = restTemplate.getForObject(url, String.class);
+ log.info("RCS绔欑偣杞鍝嶅簲 GET /cv/station/getTaskNo body={}", trimForLog(raw));
+ return raw;
+ }
+
+ private ObjectNode createStationBody(String stationId) {
+ ObjectNode body = objectMapper.createObjectNode();
+ if (StringUtils.hasText(stationId)) {
+ body.put("stationId", stationId);
+ body.put("staNo", stationId);
+ }
+ return body;
+ }
+
+ /** 鍐欏叆 tvRcs 浠诲姟鍙� Hash锛涜繑鍥炶В鏋愬嚭鐨� taskNo锛堢敤浜� WMS 鍚堝苟锛� */
+ private String applyTaskNoResponse(String raw, String staNo) {
+ if (!StringUtils.hasText(staNo)) {
+ return null;
}
if (!StringUtils.hasText(raw)) {
rcsTvCallbackService.writeStationTaskNo(staNo, null);
- return;
+ return null;
}
String trimmed = raw.trim();
try {
JsonNode root = objectMapper.readTree(trimmed);
+ if (!httpSuccess(root)) {
+ rcsTvCallbackService.writeStationTaskNo(staNo, null);
+ return null;
+ }
String taskNo = extractTaskNo(root);
rcsTvCallbackService.writeStationTaskNo(staNo, taskNo);
+ return taskNo;
} catch (Exception e) {
rcsTvCallbackService.writeStationTaskNo(staNo, trimmed);
+ return trimmed;
}
+ }
+
+ private static boolean httpSuccess(JsonNode root) {
+ if (root == null || !root.isObject()) {
+ return true;
+ }
+ JsonNode c = root.get("code");
+ if (c == null || c.isNull()) {
+ return true;
+ }
+ return c.asInt(200) == 200;
}
private static String extractTaskNo(JsonNode root) {
@@ -122,15 +257,15 @@
rcsTvCallbackService.handleStationError(body);
}
- /**
- * 褰掍竴鎴� {@link com.vincent.rsf.openApi.service.RcsTvCallbackService#handleStationError} 鍙瘑鍒殑 data 鏁扮粍
- */
private JsonNode buildErrorCallbackBody(String raw, String defaultStaNo) throws Exception {
if (!StringUtils.hasText(raw)) {
return objectMapper.createArrayNode();
}
String trimmed = raw.trim();
JsonNode root = objectMapper.readTree(trimmed);
+ if (!httpSuccess(root)) {
+ return objectMapper.createArrayNode();
+ }
if (root.isArray()) {
return fillStaNo((ArrayNode) root, defaultStaNo);
}
@@ -194,4 +329,15 @@
}
return arr;
}
+
+ private static String trimForLog(String raw) {
+ if (raw == null) {
+ return "null";
+ }
+ String text = raw.trim();
+ if (text.length() <= MAX_LOG_LEN) {
+ return text;
+ }
+ return text.substring(0, MAX_LOG_LEN) + "...(truncated)";
+ }
}
--
Gitblit v1.9.1