From 411ff551ae7641dfc5c9331e99bf8b6e5770e2fa Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 30 十二月 2025 18:05:14 +0800
Subject: [PATCH] #mcp

---
 src/main/java/com/zy/ai/service/WcsQueryService.java |  129 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 129 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/ai/service/WcsQueryService.java b/src/main/java/com/zy/ai/service/WcsQueryService.java
new file mode 100644
index 0000000..b531aab
--- /dev/null
+++ b/src/main/java/com/zy/ai/service/WcsQueryService.java
@@ -0,0 +1,129 @@
+package com.zy.ai.service;
+
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+public class WcsQueryService {
+
+    // 杩欓噷娉ㄥ叆浣犵幇鏈夌殑鍚勭被 Service/Mapper锛歞eviceService/taskService/logService/configService...
+
+    public Map<String, Object> buildDiagnosisSnapshot(Map<String, Object> args) {
+        Map<String, Object> focus = (Map<String, Object>) args.get("focus");
+        List<String> deviceIds = focus == null ? Collections.emptyList() : (List<String>) focus.get("deviceIds");
+        List<String> taskIds   = focus == null ? Collections.emptyList() : (List<String>) focus.get("taskIds");
+
+        int timeWindowSec = getInt(args, "timeWindowSec", 600);
+        int logLimit      = getInt(args, "logLimit", 400);
+        boolean includeConfigs = getBool(args, "includeConfigs", true);
+        boolean includeDerived = getBool(args, "includeDerivedSignals", true);
+
+        Date now = new Date();
+        Date from = new Date(now.getTime() - timeWindowSec * 1000L);
+
+        // 1) devices
+        List<Object> devices = new ArrayList<>();
+        for (String deviceId : safeList(deviceIds)) {
+            Map<String, Object> a = new HashMap<>();
+            a.put("deviceId", deviceId);
+            devices.add(getDeviceState(a));
+        }
+
+        // 2) tasks
+        Map<String, Object> taskArgs = new HashMap<>();
+        if (!safeList(taskIds).isEmpty()) {
+            // 浣犲彲浠ヨ listTasks 鏀寔 taskIds 绮剧‘杩囨护
+            taskArgs.put("taskIds", taskIds);
+        } else if (!safeList(deviceIds).isEmpty()) {
+            taskArgs.put("deviceId", deviceIds.get(0)); // 鎴栨敼鎴愭敮鎸� deviceIds 鏁扮粍
+            taskArgs.put("statuses", Arrays.asList("WAITING","RUNNING","SUSPENDED"));
+            taskArgs.put("limit", 200);
+        }
+        Map<String, Object> taskResult = (Map<String, Object>) listTasks(taskArgs);
+        List<Object> tasks = taskResult == null ? new ArrayList<>() : (List<Object>) taskResult.get("tasks");
+
+        // 3) logs
+        Map<String, Object> logArgs = new HashMap<>();
+        logArgs.put("timeFrom", iso(from));
+        logArgs.put("timeTo", iso(now));
+        logArgs.put("limit", logLimit);
+        if (!safeList(deviceIds).isEmpty()) logArgs.put("deviceId", deviceIds.get(0));
+        if (!safeList(taskIds).isEmpty())   logArgs.put("taskId", taskIds.get(0));
+        Map<String, Object> logResult = (Map<String, Object>) queryLogs(logArgs);
+        List<Object> logs = logResult == null ? new ArrayList<>() : (List<Object>) logResult.get("logs");
+
+        // 4) configs
+        Object configs = null;
+        if (includeConfigs) {
+            configs = getSystemConfig(new HashMap<String, Object>());
+        }
+
+        // 5) derived
+        Object derived = null;
+        if (includeDerived) {
+            derived = deriveSignals(devices, tasks, logs);
+        }
+
+        // output
+        Map<String, Object> out = new LinkedHashMap<>();
+        Map<String, Object> meta = new LinkedHashMap<>();
+        meta.put("snapshotId", UUID.randomUUID().toString());
+        meta.put("generatedAt", iso(now));
+        meta.put("timeFrom", iso(from));
+        meta.put("timeTo", iso(now));
+
+        out.put("meta", meta);
+        out.put("devices", devices);
+        out.put("tasks", tasks);
+        out.put("logs", logs);
+        out.put("configs", configs);
+        out.put("derivedSignals", derived);
+        return out;
+    }
+
+    private Map<String, Object> deriveSignals(List<Object> devices, List<Object> tasks, List<Object> logs) {
+        Map<String, Object> d = new LinkedHashMap<>();
+        List<String> flags = new ArrayList<>();
+        List<String> causes = new ArrayList<>();
+        List<String> bottlenecks = new ArrayList<>();
+
+        // TODO锛氭妸浣� WCS 棰嗗煙瑙勫垯濉炶繖閲岋紙蹇冭烦瓒呮椂銆佺瓑寰呯‘璁ゃ�佸懡浠ゆ棤ACK銆佺珯鍙版弧銆佷笅娓搁樆濉炵瓑锛�
+        // 鍏堢粰涓ず渚嬶細
+        if (tasks != null && !tasks.isEmpty() && (devices == null || devices.isEmpty())) {
+            flags.add("HAS_TASKS_BUT_NO_DEVICE_SNAPSHOT");
+        }
+
+        d.put("anomalyFlags", flags);
+        d.put("suspectedRootCauses", causes);
+        d.put("suspectedBottlenecks", bottlenecks);
+        return d;
+    }
+
+    // ======= 涓嬮潰杩欎簺鍑芥暟锛屼綘鐢ㄧ幇鏈� service 瀹炵幇鍗冲彲 =======
+    public Map<String, Object> getDeviceState(Map<String, Object> args) { /* ... */ return new HashMap<>(); }
+    public Map<String, Object> listTasks(Map<String, Object> args) { /* ... */ return new HashMap<>(); }
+    public Map<String, Object> queryLogs(Map<String, Object> args) { /* ... */ return new HashMap<>(); }
+    public Object getSystemConfig(Map<String, Object> args) { /* ... */ return new HashMap<>(); }
+
+    // helpers
+    private int getInt(Map<String, Object> m, String k, int def) {
+        Object v = m.get(k);
+        if (v == null) return def;
+        if (v instanceof Number) return ((Number) v).intValue();
+        return Integer.parseInt(String.valueOf(v));
+    }
+    private boolean getBool(Map<String, Object> m, String k, boolean def) {
+        Object v = m.get(k);
+        if (v == null) return def;
+        if (v instanceof Boolean) return (Boolean) v;
+        return Boolean.parseBoolean(String.valueOf(v));
+    }
+    private List<String> safeList(List<String> l) { return l == null ? Collections.emptyList() : l; }
+    private String iso(Date d) {
+        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+        f.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        return f.format(d);
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1