cl
5 天以前 ff86e3738197b49ed20910501e1fe3f356e2a6e0
rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/RcsTvCallbackService.java
@@ -10,6 +10,9 @@
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@@ -64,7 +67,8 @@
                continue;
            }
            if (StringUtils.hasText(staNo)) {
                parts.add("[" + staNo + "]" + msg);
                // 全角括号前缀,避免电视机端 Redis 值误判
                parts.add("【" + staNo + "】" + msg);
            } else {
                parts.add(msg);
            }
@@ -77,6 +81,38 @@
        tvMonitorStringRedisTemplate.opsForValue().set(TvMonitorRedisKeys.TV_MANUAL_ERROR_MSG, value);
        log.info("RCS 报警已写入 Redis tvManualErrorMsg,条数={}", parts.size());
        return rcsOk(value);
    }
    /** AGV 异常整段写入 tvManualErrorMsg,后次覆盖前次 */
    public void publishAgvErrorToTv(JsonNode body) {
        if (body == null || !body.isObject()) {
            return;
        }
        String agvId = text(body.get("agvId"));
        String faultName = text(body.get("faultName"));
        String faultNo = text(body.get("faultNo"));
        if ("undefined".equalsIgnoreCase(faultName)) {
            faultName = "";
        }
        String prefix = StringUtils.hasText(agvId) ? ("【AGV" + agvId + "】") : "【AGV】";
        String desc = StringUtils.hasText(faultName) ? faultName : "异常";
        StringBuilder sb = new StringBuilder(prefix).append(desc);
        if (StringUtils.hasText(faultNo)) {
            sb.append(" ").append(faultNo);
        }
        JsonNode tsNode = body.get("timestamp");
        if (tsNode != null && tsNode.isNumber()) {
            long ts = tsNode.asLong();
            if (ts > 0) {
                sb.append(" ")
                        .append(Instant.ofEpochMilli(ts)
                                .atZone(ZoneId.systemDefault())
                                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            }
        }
        String value = sb.toString();
        tvMonitorStringRedisTemplate.opsForValue().set(TvMonitorRedisKeys.TV_MANUAL_ERROR_MSG, value);
        log.info("AGV 报警已写入 Redis tvManualErrorMsg agvId={}", agvId);
    }
    private static JsonNode resolveErrorArray(JsonNode body) {
@@ -122,12 +158,7 @@
        if (!StringUtils.hasText(staNo)) {
            throw new IllegalArgumentException("staNo 不能为空");
        }
        if (!StringUtils.hasText(taskNo)) {
            tvMonitorStringRedisTemplate.opsForHash().delete(TvMonitorRedisKeys.TV_RCS_STATION_TASK_NO, staNo);
        } else {
            tvMonitorStringRedisTemplate.opsForHash()
                    .put(TvMonitorRedisKeys.TV_RCS_STATION_TASK_NO, staNo, taskNo);
        }
        writeStationTaskNo(staNo, taskNo);
        log.info("RCS 任务号已写入 Redis Hash staNo={} taskNo={}", staNo, taskNo);
        Map<String, Object> payload = new LinkedHashMap<>();
        payload.put("staNo", staNo);
@@ -135,6 +166,22 @@
        return rcsOk(payload);
    }
    /**
     * 轮询 RCS 站点任务号时写入 Redis,与 {@link #handleStationTaskNo} 中 Hash 规则一致
     */
    public void writeStationTaskNo(String staNo, String taskNo) {
        if (!StringUtils.hasText(staNo)) {
            return;
        }
        String t = taskNo == null ? "" : taskNo.trim();
        if (!StringUtils.hasText(t) || "0".equals(t)) {
            tvMonitorStringRedisTemplate.opsForHash().delete(TvMonitorRedisKeys.TV_RCS_STATION_TASK_NO, staNo);
        } else {
            tvMonitorStringRedisTemplate.opsForHash()
                    .put(TvMonitorRedisKeys.TV_RCS_STATION_TASK_NO, staNo, t);
        }
    }
    private Map<String, Object> rcsOk(Object data) {
        Map<String, Object> m = new LinkedHashMap<>();
        m.put("code", 200);