package com.zy.ai.service;
|
|
import com.alibaba.fastjson.JSON;
|
import com.zy.ai.entity.ChatCompletionRequest;
|
import com.zy.ai.entity.WcsDiagnosisRequest;
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@Service
|
@RequiredArgsConstructor
|
public class WcsDiagnosisService {
|
|
private final LlmChatService llmChatService;
|
|
/**
|
* 针对“系统不执行任务 / 不知道哪个设备没在运行”的通用 AI 诊断
|
*/
|
public String diagnose(WcsDiagnosisRequest request) {
|
List<ChatCompletionRequest.Message> messages = new ArrayList<>();
|
|
// 1. system:定义专家身份 + 输出结构
|
ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
|
system.setRole("system");
|
system.setContent(
|
"你是一名资深 WCS(仓储控制系统)与自动化立库专家,熟悉:堆垛机、输送线、提升机、穿梭车等设备的任务分配和运行逻辑," +
|
"也熟悉常见的系统卡死、任务不执行、设备空闲但无任务等问题模式。\n\n" +
|
"你将收到以下几类数据:\n" +
|
"1)任务信息(tasks):当前待执行/在执行/挂起任务\n" +
|
"2)设备实时数据(deviceRealtimeData):每台设备当前状态、是否在线、当前任务号等\n" +
|
"3)设备配置信息(deviceConfigs):设备是否启用、服务区域、允许的任务类型等\n" +
|
"4)系统日志(logs):按时间顺序的日志文本\n" +
|
"5)额外上下文(extraContext):如仓库代码、WCS 版本等\n\n" +
|
"你的目标是:帮助现场运维人员分析,为什么系统当前不执行任务,或者任务执行效率异常,指出可能是哪些设备导致的问题。\n\n" +
|
"请按以下结构输出诊断结果(使用简体中文):\n" +
|
"1. 问题概述(1-3 句话,概括当前系统状态)\n" +
|
"2. 可疑设备列表(列出 1-N 个设备编号,并说明每个设备为什么可疑,例如:配置禁用/长时间空闲/状态异常/任务分配不到它等)\n" +
|
"3. 可能原因(从任务分配、设备状态、配置错误、接口/通信异常等角度,列出 3-7 条)\n" +
|
"4. 建议排查步骤(步骤 1、2、3...,每步要尽量具体、可操作,例如:在某页面查看某字段、检查某个开关、对比某个状态位等)\n" +
|
"5. 风险评估(说明当前问题对业务影响程度:高/中/低,以及是否需要立即人工干预)\n" +
|
"6. WCS 逻辑优化建议(如果从日志/数据看出可能的系统逻辑缺陷,请给出简要建议,例如增加某个防呆校验、告警、监控等)\n"
|
);
|
messages.add(system);
|
|
// 2. user:把具体的数据组织成文本(JSON 形式方便模型看结构)
|
ChatCompletionRequest.Message user = new ChatCompletionRequest.Message();
|
user.setRole("user");
|
user.setContent(buildUserContent(request));
|
messages.add(user);
|
|
// 调用大模型
|
return llmChatService.chat(messages, 0.2, 2048);
|
}
|
|
public void diagnoseStream(WcsDiagnosisRequest request, SseEmitter emitter) {
|
List<ChatCompletionRequest.Message> messages = new ArrayList<>();
|
|
ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
|
system.setRole("system");
|
system.setContent(
|
"你是一名资深 WCS(仓储控制系统)与自动化立库专家,熟悉:堆垛机、输送线、提升机、穿梭车等设备的任务分配和运行逻辑,也熟悉常见的系统卡死、任务不执行、设备空闲但无任务等问题模式。\n\n" +
|
"你将收到以下几类数据:\n" +
|
"1)任务信息(tasks):当前待执行/在执行/挂起任务\n" +
|
"2)设备实时数据(deviceRealtimeData):每台设备当前状态、是否在线、当前任务号等\n" +
|
"3)设备配置信息(deviceConfigs):设备是否启用、服务区域、允许的任务类型等\n" +
|
"4)系统日志(logs):按时间顺序的日志文本\n" +
|
"5)额外上下文(extraContext):如仓库代码、WCS 版本等\n\n" +
|
"你的目标是:帮助现场运维人员分析,为什么系统当前不执行任务,或者任务执行效率异常,指出可能是哪些设备导致的问题。\n\n" +
|
"请按以下结构输出诊断结果(使用简体中文):\n" +
|
"1. 问题概述(1-3 句话,概括当前系统状态)\n" +
|
"2. 可疑设备列表(列出 1-N 个设备编号,并说明每个设备为什么可疑,例如:配置禁用/长时间空闲/状态异常/任务分配不到它等)\n" +
|
"3. 可能原因(从任务分配、设备状态、配置错误、接口/通信异常等角度,列出 3-7 条)\n" +
|
"4. 建议排查步骤(步骤 1、2、3...,每步要尽量具体、可操作,例如:在某页面查看某字段、检查某个开关、对比某个状态位等)\n" +
|
"5. 风险评估(说明当前问题对业务影响程度:高/中/低,以及是否需要立即人工干预)\n" +
|
"6. WCS 逻辑优化建议(如果从日志/数据看出可能的系统逻辑缺陷,请给出简要建议,例如增加某个防呆校验、告警、监控等)\n"
|
);
|
messages.add(system);
|
|
ChatCompletionRequest.Message user = new ChatCompletionRequest.Message();
|
user.setRole("user");
|
user.setContent(buildUserContent(request));
|
messages.add(user);
|
|
llmChatService.chatStream(messages, 0.2, 2048, s -> {
|
try { emitter.send(SseEmitter.event().data(s)); } catch (Exception ignore) {}
|
}, () -> {
|
try { emitter.complete(); } catch (Exception ignore) {}
|
}, e -> {
|
try { emitter.completeWithError(e); } catch (Exception ignore) {}
|
});
|
}
|
|
private String buildUserContent(WcsDiagnosisRequest request) {
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("【问题描述】\n");
|
if (request.getAlarmMessage() != null && !request.getAlarmMessage().isEmpty()) {
|
sb.append(request.getAlarmMessage()).append("\n\n");
|
} else {
|
sb.append("系统当前不执行任务,但具体原因不明,请根据以下信息帮助判断。\n\n");
|
}
|
|
sb.append("【设备信息】\n");
|
sb.append("关注设备(如果有指定): ")
|
.append(request.getCraneNo() != null ? request.getCraneNo() : "未指定,需整体分析")
|
.append("\n\n");
|
|
if (request.getExtraContext() != null && !request.getExtraContext().isEmpty()) {
|
sb.append("【额外上下文 extraContext】\n");
|
sb.append(JSON.toJSONString(request.getExtraContext(), true)).append("\n\n");
|
}
|
|
if (request.getTasks() != null && !request.getTasks().isEmpty()) {
|
sb.append("【任务信息 tasks】\n");
|
sb.append("下面是当前相关任务列表的 JSON 数据:\n");
|
sb.append(JSON.toJSONString(request.getTasks(), true)).append("\n\n");
|
} else {
|
sb.append("【任务信息 tasks】\n");
|
sb.append("当前未提供任务信息。\n\n");
|
}
|
|
if (request.getDeviceRealtimeData() != null && !request.getDeviceRealtimeData().isEmpty()) {
|
sb.append("【设备实时数据 deviceRealtimeData】\n");
|
sb.append("下面是各设备当前实时状态的 JSON 数据:\n");
|
sb.append(JSON.toJSONString(request.getDeviceRealtimeData(), true)).append("\n\n");
|
} else {
|
sb.append("【设备实时数据 deviceRealtimeData】\n");
|
sb.append("当前未提供设备实时数据。\n\n");
|
}
|
|
if (request.getDeviceConfigs() != null && !request.getDeviceConfigs().isEmpty()) {
|
sb.append("【设备配置信息 deviceConfigs】\n");
|
sb.append("下面是各设备配置的 JSON 数据:\n");
|
sb.append(JSON.toJSONString(request.getDeviceConfigs(), true)).append("\n\n");
|
} else {
|
sb.append("【设备配置信息 deviceConfigs】\n");
|
sb.append("当前未提供设备配置信息。\n\n");
|
}
|
|
sb.append("【系统日志 logs(按时间顺序)】\n");
|
if (request.getLogs() != null && !request.getLogs().isEmpty()) {
|
for (String logLine : request.getLogs()) {
|
sb.append(logLine).append("\n");
|
}
|
} else {
|
sb.append("当前未提供日志信息。\n");
|
}
|
|
sb.append("\n请根据以上所有信息,结合你的经验进行分析诊断。");
|
|
return sb.toString();
|
}
|
}
|