package com.zy.ai.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.ai.entity.DeviceConfigsData; import com.zy.ai.entity.DeviceRealTimeData; import com.zy.ai.entity.WcsDiagnosisRequest; import com.zy.ai.entity.WcsDiagnosisResponse; import com.zy.ai.log.AiLogAppender; import com.zy.ai.service.WcsDiagnosisService; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasCrnpService; 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.StationProtocol; import com.zy.core.thread.CrnThread; import com.zy.core.thread.StationThread; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @RestController @RequestMapping("/ai/diagnose") @RequiredArgsConstructor public class WcsDiagnosisController { @Autowired private WcsDiagnosisService wcsDiagnosisService; @Autowired private WrkMastService wrkMastService; @Autowired private BasCrnpService basCrnpService; @GetMapping("/runAi") public WcsDiagnosisResponse runAi() { WcsDiagnosisRequest request = new WcsDiagnosisRequest(); request.setAlarmMessage("系统不执行任务"); List logs = AiLogAppender.getRecentLogs(100); request.setLogs(logs); List wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); request.setTasks(wrkMasts); List deviceRealTimeDataList = new ArrayList<>(); List deviceConfigsDataList = new ArrayList<>(); List basCrnps = basCrnpService.selectList(new EntityWrapper<>()); for (BasCrnp basCrnp : basCrnps) { CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo()); if (crnThread == null) { continue; } CrnProtocol protocol = crnThread.getStatus(); for (StationObjModel stationObjModel : basCrnp.getInStationList$()) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); if (stationThread == null) { continue; } Map map = stationThread.getStatusMap(); StationProtocol stationProtocol = map.get(stationObjModel.getStationId()); if (stationProtocol == null) { continue; } DeviceRealTimeData stationData = new DeviceRealTimeData(); stationData.setDeviceNo(stationObjModel.getDeviceNo()); stationData.setDeviceType(String.valueOf(SlaveType.Devp)); stationData.setDeviceData(stationProtocol); deviceRealTimeDataList.add(stationData); } DeviceRealTimeData deviceRealTimeData = new DeviceRealTimeData(); deviceRealTimeData.setDeviceNo(basCrnp.getCrnNo()); deviceRealTimeData.setDeviceType(String.valueOf(SlaveType.Crn)); deviceRealTimeData.setDeviceData(protocol); deviceRealTimeDataList.add(deviceRealTimeData); DeviceConfigsData deviceConfigsData = new DeviceConfigsData(); deviceConfigsData.setDeviceNo(basCrnp.getCrnNo()); deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Crn)); deviceConfigsData.setDeviceData(basCrnp); deviceConfigsDataList.add(deviceConfigsData); } request.setDeviceRealtimeData(deviceRealTimeDataList); request.setDeviceConfigs(deviceConfigsDataList); WcsDiagnosisResponse response = diagnose(request); return response; } @GetMapping("/runAiStream") public SseEmitter runAiStream() { SseEmitter emitter = new SseEmitter(0L); new Thread(() -> { try { WcsDiagnosisRequest request = new WcsDiagnosisRequest(); request.setAlarmMessage("系统不执行任务"); List logs = AiLogAppender.getRecentLogs(100); request.setLogs(logs); List wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); request.setTasks(wrkMasts); List deviceRealTimeDataList = new ArrayList<>(); List deviceConfigsDataList = new ArrayList<>(); List basCrnps = basCrnpService.selectList(new EntityWrapper<>()); for (BasCrnp basCrnp : basCrnps) { CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo()); if (crnThread == null) { continue; } CrnProtocol protocol = crnThread.getStatus(); for (StationObjModel stationObjModel : basCrnp.getInStationList$()) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); if (stationThread == null) { continue; } Map map = stationThread.getStatusMap(); StationProtocol stationProtocol = map.get(stationObjModel.getStationId()); if (stationProtocol == null) { continue; } DeviceRealTimeData stationData = new DeviceRealTimeData(); stationData.setDeviceNo(stationObjModel.getDeviceNo()); stationData.setDeviceType(String.valueOf(SlaveType.Devp)); stationData.setDeviceData(stationProtocol); deviceRealTimeDataList.add(stationData); } DeviceRealTimeData deviceRealTimeData = new DeviceRealTimeData(); deviceRealTimeData.setDeviceNo(basCrnp.getCrnNo()); deviceRealTimeData.setDeviceType(String.valueOf(SlaveType.Crn)); deviceRealTimeData.setDeviceData(protocol); deviceRealTimeDataList.add(deviceRealTimeData); DeviceConfigsData deviceConfigsData = new DeviceConfigsData(); deviceConfigsData.setDeviceNo(basCrnp.getCrnNo()); deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Crn)); deviceConfigsData.setDeviceData(basCrnp); deviceConfigsDataList.add(deviceConfigsData); } request.setDeviceRealtimeData(deviceRealTimeDataList); request.setDeviceConfigs(deviceConfigsDataList); wcsDiagnosisService.diagnoseStream(request, emitter); } catch (Exception e) { emitter.completeWithError(e); } }).start(); return emitter; } @GetMapping("/askStream") public SseEmitter askStream(@RequestParam("prompt") String prompt) { SseEmitter emitter = new SseEmitter(0L); new Thread(() -> { try { WcsDiagnosisRequest request = new WcsDiagnosisRequest(); List logs = AiLogAppender.getRecentLogs(100); request.setLogs(logs); List wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); request.setTasks(wrkMasts); List deviceRealTimeDataList = new ArrayList<>(); List deviceConfigsDataList = new ArrayList<>(); List basCrnps = basCrnpService.selectList(new EntityWrapper<>()); for (BasCrnp basCrnp : basCrnps) { CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo()); if (crnThread == null) { continue; } CrnProtocol protocol = crnThread.getStatus(); for (StationObjModel stationObjModel : basCrnp.getInStationList$()) { StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); if (stationThread == null) { continue; } Map map = stationThread.getStatusMap(); StationProtocol stationProtocol = map.get(stationObjModel.getStationId()); if (stationProtocol == null) { continue; } DeviceRealTimeData stationData = new DeviceRealTimeData(); stationData.setDeviceNo(stationObjModel.getDeviceNo()); stationData.setDeviceType(String.valueOf(SlaveType.Devp)); stationData.setDeviceData(stationProtocol); deviceRealTimeDataList.add(stationData); } DeviceRealTimeData deviceRealTimeData = new DeviceRealTimeData(); deviceRealTimeData.setDeviceNo(basCrnp.getCrnNo()); deviceRealTimeData.setDeviceType(String.valueOf(SlaveType.Crn)); deviceRealTimeData.setDeviceData(protocol); deviceRealTimeDataList.add(deviceRealTimeData); DeviceConfigsData deviceConfigsData = new DeviceConfigsData(); deviceConfigsData.setDeviceNo(basCrnp.getCrnNo()); deviceConfigsData.setDeviceType(String.valueOf(SlaveType.Crn)); deviceConfigsData.setDeviceData(basCrnp); deviceConfigsDataList.add(deviceConfigsData); } request.setDeviceRealtimeData(deviceRealTimeDataList); request.setDeviceConfigs(deviceConfigsDataList); wcsDiagnosisService.askStream(request, prompt, emitter); } catch (Exception e) { emitter.completeWithError(e); } }).start(); return emitter; } /** * POST /api/ai/diagnose/wcs */ @PostMapping("/wcs") public WcsDiagnosisResponse diagnose(@RequestBody WcsDiagnosisRequest request) { String analysis = wcsDiagnosisService.diagnose(request); WcsDiagnosisResponse resp = new WcsDiagnosisResponse(); resp.setAnalysis(analysis); resp.setOriginalRequest(request); return resp; } }