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/mcp/service/impl/WcsDataFacadeImpl.java |  324 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 324 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java b/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java
new file mode 100644
index 0000000..4cf371b
--- /dev/null
+++ b/src/main/java/com/zy/ai/mcp/service/impl/WcsDataFacadeImpl.java
@@ -0,0 +1,324 @@
+package com.zy.ai.mcp.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.zy.ai.entity.DeviceConfigsData;
+import com.zy.ai.log.AiLogAppender;
+import com.zy.ai.mcp.service.WcsDataFacade;
+import com.zy.asrs.entity.BasCrnp;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasCrnpService;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.asrs.service.BasRgvService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.StationObjModel;
+import com.zy.core.model.protocol.CrnProtocol;
+import com.zy.core.model.protocol.RgvProtocol;
+import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.thread.CrnThread;
+import com.zy.core.thread.RgvThread;
+import com.zy.core.thread.StationThread;
+import com.zy.system.entity.Config;
+import com.zy.system.service.ConfigService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service("wcsDataFacade")
+@RequiredArgsConstructor
+public class WcsDataFacadeImpl implements WcsDataFacade {
+
+    @Autowired
+    private BasCrnpService basCrnpService;
+    @Autowired
+    private BasDevpService basDevpService;
+    @Autowired
+    private BasRgvService basRgvService;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private ConfigService configService;
+
+    @Override
+    public Object getCrnDeviceStatus(JSONObject args) {
+        List<Integer> deviceNoList = optIntList(args, "crnNos");
+        EntityWrapper<BasCrnp> wrapper = new EntityWrapper<>();
+        if (deviceNoList != null && deviceNoList.size() > 0) {
+            wrapper.in("crn_no", deviceNoList);
+        }
+        JSONObject data = new JSONObject();
+
+        List<Object> deviceList = new ArrayList<>();
+        List<BasCrnp> basCrnps = basCrnpService.selectList(wrapper);
+        for (BasCrnp basCrnp : basCrnps) {
+            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo());
+            if (crnThread == null) {
+                continue;
+            }
+            CrnProtocol protocol = crnThread.getStatus();
+            deviceList.add(protocol);
+        }
+
+        data.put("devices", deviceList);
+        return data;
+    }
+
+    @Override
+    public Object getStationDeviceStatus(JSONObject args) {
+        List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>());
+        JSONObject data = new JSONObject();
+
+        List<Object> stationList = new ArrayList<>();
+        for (BasDevp basDevp : basDevps) {
+            StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+            if (stationThread == null) {
+                continue;
+            }
+
+            Map<Integer, StationProtocol> map = stationThread.getStatusMap();
+
+            for (StationObjModel stationObjModel : basDevp.getStationList$()) {
+                StationProtocol stationProtocol = map.get(stationObjModel.getStationId());
+                if (stationProtocol == null) {
+                    continue;
+                }
+                stationList.add(stationProtocol);
+            }
+        }
+
+        data.put("stations", stationList);
+        return data;
+    }
+
+    @Override
+    public Object getRgvDeviceStatus(JSONObject args) {
+        List<Integer> deviceNoList = optIntList(args, "rgvNos");
+        EntityWrapper<BasRgv> wrapper = new EntityWrapper<>();
+        if (deviceNoList != null && deviceNoList.size() > 0) {
+            wrapper.in("rgv_no", deviceNoList);
+        }
+        JSONObject data = new JSONObject();
+
+        List<Object> deviceList = new ArrayList<>();
+        List<BasRgv> basRgvs = basRgvService.selectList(wrapper);
+        for (BasRgv basRgv : basRgvs) {
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getStatus();
+            deviceList.add(rgvProtocol);
+        }
+
+        data.put("devices", deviceList);
+        return data;
+    }
+
+    @Override
+    public Object getTasks(JSONObject args) {
+        int crnNo = optInt(args, "crnNo", -1);
+        int rgvNo = optInt(args, "rgvNo", -1);
+        List<Integer> taskNos = optIntList(args, "taskNos");
+        int limit = optInt(args, "limit", 200);
+
+        EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
+        if (taskNos != null && taskNos.size() > 0) {
+            wrapper.in("wrk_no", taskNos);
+        }
+
+        if (crnNo != -1) {
+            wrapper.eq("crn_no", crnNo);
+        }
+
+        if (rgvNo != -1) {
+            wrapper.eq("rgv_no", rgvNo);
+        }
+
+        List<WrkMast> tasks = wrkMastService.selectList(wrapper);
+        JSONObject data = new JSONObject();
+        data.put("tasks", tasks);
+        return data;
+    }
+
+    @Override
+    public Object getLogs(JSONObject args) {
+        int limit = optInt(args, "limit", 500);
+        List<String> logs = AiLogAppender.getRecentLogs(limit);
+        JSONObject data = new JSONObject();
+        data.put("logs", logs);
+        return data;
+    }
+
+    @Override
+    public Object getDeviceConfig(JSONObject args) {
+        JSONObject data = new JSONObject();
+        List<DeviceConfigsData> deviceConfigsDataList = new ArrayList<>();
+
+        List<Integer> crnNoList = optIntList(args, "crnNos");
+        EntityWrapper<BasCrnp> crnWrapper = new EntityWrapper<>();
+        if (crnNoList != null && crnNoList.size() > 0) {
+            crnWrapper.in("crn_no", crnNoList);
+        }
+
+        List<Integer> rgvNoList = optIntList(args, "rgvNos");
+        EntityWrapper<BasRgv> rgvWrapper = new EntityWrapper<>();
+        if (rgvNoList != null && rgvNoList.size() > 0) {
+            rgvWrapper.in("rgv_no", rgvNoList);
+        }
+
+        List<Integer> devpNoList = optIntList(args, "devpNos");
+        EntityWrapper<BasDevp> devpWrapper = new EntityWrapper<>();
+        if (devpNoList != null && devpNoList.size() > 0) {
+            devpWrapper.in("devp_no", devpNoList);
+        }
+
+        List<BasCrnp> basCrnps = basCrnpService.selectList(crnWrapper);
+        for (BasCrnp basCrnp : basCrnps) {
+            DeviceConfigsData deviceConfigsData = new DeviceConfigsData();
+            deviceConfigsData.setDeviceNo(basCrnp.getCrnNo());
+            deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Crn));
+            deviceConfigsData.setDeviceData(basCrnp);
+            deviceConfigsDataList.add(deviceConfigsData);
+        }
+
+        List<BasRgv> basRgvs = basRgvService.selectList(rgvWrapper);
+        for (BasRgv basRgv : basRgvs) {
+            DeviceConfigsData deviceConfigsData = new DeviceConfigsData();
+            deviceConfigsData.setDeviceNo(basRgv.getRgvNo());
+            deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Rgv));
+            deviceConfigsData.setDeviceData(basRgv);
+            deviceConfigsDataList.add(deviceConfigsData);
+        }
+
+        List<BasDevp> basDevps = basDevpService.selectList(devpWrapper);
+        for (BasDevp basDevp : basDevps) {
+            DeviceConfigsData deviceConfigsData = new DeviceConfigsData();
+            deviceConfigsData.setDeviceNo(basDevp.getDevpNo());
+            deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Devp));
+            deviceConfigsData.setDeviceData(basDevp);
+            deviceConfigsDataList.add(deviceConfigsData);
+        }
+
+        data.put("deviceConfigs", deviceConfigsDataList);
+        return data;
+    }
+
+    @Override
+    public Object getSystemConfig(JSONObject args) {
+        JSONObject data = new JSONObject();
+        List<Config> systemConfigList = configService.selectList(new EntityWrapper<Config>().notIn("dingdingReportUrl"));
+        data.put("systemConfigs", systemConfigList);
+        return data;
+    }
+
+    @Override
+    public Object buildDiagnosisSnapshot(JSONObject args) {
+        String wh = mustStr(args, "warehouseCode");
+        List<String> crnDeviceNos = optStrList(args, "crnDeviceNos");
+        List<String> taskIds = optStrList(args, "taskIds");
+        int lookbackSeconds = optInt(args, "lookbackSeconds", 300);
+        int logMaxLines = optInt(args, "logMaxLines", 600);
+        boolean includeConfig = optBool(args, "includeConfig", true);
+
+        long now = System.currentTimeMillis();
+        long fromTs = now - lookbackSeconds * 1000L;
+
+        // 1) crn devices
+        JSONObject devArgs = new JSONObject();
+        devArgs.put("deviceNos", crnDeviceNos);
+        JSONObject devices = (JSONObject) getCrnDeviceStatus(devArgs);
+
+        // 2) tasks
+        JSONObject taskArgs = new JSONObject();
+        taskArgs.put("warehouseCode", wh);
+        taskArgs.put("taskIds", taskIds);
+        taskArgs.put("limit", 200);
+        JSONObject tasks = (JSONObject) getTasks(taskArgs);
+
+        // 3) logs (涓�娆℃�у彇鍥烇紝鐒跺悗鍋氬垎妗�+鎺掑簭+鎴柇)
+        JSONObject logArgs = new JSONObject();
+        logArgs.put("warehouseCode", wh);
+        logArgs.put("fromTs", fromTs);
+        logArgs.put("toTs", now);
+//        logArgs.put("deviceIds", deviceIds);
+        logArgs.put("taskIds", taskIds);
+        logArgs.put("maxLines", logMaxLines);
+        JSONObject logs = (JSONObject) getLogs(logArgs);
+
+        // 4) 缁撴瀯鍖栧揩鐓ц緭鍑猴紙寤鸿锛氬垎妗讹級
+        JSONObject snapshot = new JSONObject();
+        snapshot.put("warehouseCode", wh);
+        snapshot.put("generatedTs", now);
+        snapshot.put("timeRange", new JSONObject()
+                .fluentPut("fromTs", fromTs)
+                .fluentPut("toTs", now)
+                .fluentPut("lookbackSeconds", lookbackSeconds));
+
+        snapshot.put("devices", devices);
+        snapshot.put("tasks", tasks);
+        snapshot.put("logs", logs);
+
+        JSONArray hints = new JSONArray();
+        hints.add("Prefer diagnosing with snapshot.devices + snapshot.tasks + snapshot.logs");
+        hints.add("Logs are already filtered by time range; if missing, expand lookbackSeconds");
+        snapshot.put("hints", hints);
+
+        JSONObject data = new JSONObject();
+        data.put("snapshot", snapshot);
+        return data;
+    }
+
+    // --------- helpers ---------
+
+    private String mustStr(JSONObject o, String key) {
+        if (o == null || o.getString(key) == null || o.getString(key).trim().isEmpty())
+            throw new IllegalArgumentException(key + " is required");
+        return o.getString(key).trim();
+    }
+
+    private long mustLong(JSONObject o, String key) {
+        if (o == null || !o.containsKey(key)) throw new IllegalArgumentException(key + " is required");
+        return o.getLongValue(key);
+    }
+
+    private int optInt(JSONObject o, String key, int def) {
+        if (o == null || !o.containsKey(key)) return def;
+        return o.getIntValue(key);
+    }
+
+    private boolean optBool(JSONObject o, String key, boolean def) {
+        if (o == null || !o.containsKey(key)) return def;
+        return o.getBooleanValue(key);
+    }
+
+    private List<String> optStrList(JSONObject o, String key) {
+        if (o == null || !o.containsKey(key)) return Collections.emptyList();
+        JSONArray arr = o.getJSONArray(key);
+        if (arr == null) return Collections.emptyList();
+        List<String> list = new ArrayList<>();
+        for (int i = 0; i < arr.size(); i++) {
+            String s = arr.getString(i);
+            if (s != null && !s.trim().isEmpty()) list.add(s.trim());
+        }
+        return list;
+    }
+
+    private List<Integer> optIntList(JSONObject o, String key) {
+        if (o == null || !o.containsKey(key)) return Collections.emptyList();
+        JSONArray arr = o.getJSONArray(key);
+        if (arr == null) return Collections.emptyList();
+        List<Integer> list = new ArrayList<>();
+        for (int i = 0; i < arr.size(); i++) {
+            String s = arr.getString(i);
+            if (s != null && !s.trim().isEmpty()) list.add(Integer.parseInt(s.trim()));
+        }
+        return list;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1