初版Demo完善

This commit is contained in:
Cx330 committed 2026-01-22 13:43:59 +08:00
1 parent 1b8f833789
commit 34d658c2b9
10 files changed
+75 -75

No files matched your search

+2 -4
View File
@@ -1,10 +1,9 @@
// scripts/ai.js
import { COMMANDS } from './commands.js';
export async function translateToCommand(userInput) {
const availableKeys = COMMANDS.map(c => c.key).join(', ');
const systemPrompt = `你是一个工业自动化系统助手。
const systemPrompt = `你是美小智,是仪表云平台的自动化小助手。
标准指令列表:[${availableKeys}]
任务规则:
@@ -12,7 +11,6 @@ export async function translateToCommand(userInput) {
2. **意图识别**:如果用户意图匹配指令列表,输出 <cmd>标准指令</cmd>。如有参数(如设备号),输出 <arg>参数</arg>。
3. **示例**:
- 用户:“打开监控中心” -> “<communication>好的,正在为您进入监控中心。</communication><cmd>监控中心</cmd>”
- 用户:“你是谁” -> “<communication>我是您的自动化 AI 助手,可以帮您操作平台。</communication>”
- 用户:“添加设备 888” -> “<communication>没问题,正在为您添加编号为 888 的设备。</communication><cmd>添加设备</cmd><arg>888</arg>”
4. 只输出 XML 结果,不要输出任何解释说明,保持简洁。`;
@@ -30,7 +28,7 @@ export async function translateToCommand(userInput) {
// 返回包含内容和语音开关状态的对象
resolve({
content: content === "UNKNOWN" ? null : content,
voiceEnabled: response.voiceEnabled // 从 background.js 透传回来的开关状态
voiceEnabled: response.voiceEnabled // 从 background.js 透传回来的开关状态
});
} else {
resolve(null);
+56 -37
View File
@@ -1,6 +1,3 @@
// scripts/commands.js
// 标准指令路由映射表
export const COMMANDS = [
{ key: "首页", menu: "首页", route: "/首页" },
{ key: "添加设备", menu: "添加设备", route: "/添加设备/添加设备" },
@@ -16,15 +13,32 @@ export const COMMANDS = [
{ key: "报警通知", menu: "报警通知", route: "/报警管理/报警通知" },
{ key: "报警记录", menu: "报警记录", route: "/报警管理/报警记录" },
{ key: "基础报表", menu: "基础报表", route: "/报表管理/基础报表" },
{ key: "分析报表", menu: "分析报表", route: "/报表管理/分析报表" },
{ key: "区域管理", menu: "区域管理", route: "/系统管理/区域管理" },
{ key: "角色管理", menu: "角色管理", route: "/系统管理/角色管理" },
{ key: "用户管理", menu: "用户管理", route: "/系统管理/用户管理" }
{ key: "高级报表配置", menu: "高级报表配置", route: "/报表管理/高级报表配置" },
{ key: "高级报表", menu: "高级报表", route: "/报表管理/高级报表" },
{ key: "应用场景", menu: "应用场景", route: "/仪表管理/应用场景" },
{ key: "仪表管理", menu: "仪表管理", route: "/仪表管理/仪表管理" },
{ key: "虚拟仪表", menu: "虚拟仪表", route: "/仪表管理/虚拟仪表" },
{ key: "物位监测", menu: "物位监测", route: "/场景管理/物位监测/物位监测" },
{ key: "物位监测配置", menu: "物位监测配置", route: "/场景管理/物位监测/物位监测配置" },
{ key: "车间看板", menu: "车间看板", route: "/场景管理/车间看板/车间看板" },
{ key: "车间看板配置", menu: "车间看板配置", route: "/场景管理/车间看板/车间看板配置" },
{ key: "能源结算", menu: "能源结算", route: "/场景管理/能源抄表/能源结算" },
{ key: "能源结算配置", menu: "能源结算配置", route: "/场景管理/能源抄表/能源结算配置" },
{ key: "多租户能源结算", menu: "多租户能源结算", route: "/场景管理/多租户结算/多租户能源结算" },
{ key: "租户管理", menu: "租户管理", route: "/场景管理/多租户结算/租户管理" },
{ key: "计价方式管理", menu: "计价方式管理", route: "/场景管理/多租户结算/计价方式管理" },
{ key: "单染缸印染结算", menu: "单染缸印染结算", route: "/场景管理/印染结算/单染缸印染结算" },
{ key: "多染缸印染结算", menu: "多染缸印染结算", route: "/场景管理/印染结算/多染缸印染结算" },
{ key: "染缸能耗一览表", menu: "染缸能耗一览表", route: "/场景管理/印染结算/染缸能耗一览表" },
{ key: "印染结算配置", menu: "印染结算配置", route: "/场景管理/印染结算/印染结算配置" },
{ key: "尘埃粒子车间", menu: "尘埃粒子车间", route: "/场景管理/尘埃粒子/尘埃粒子车间" },
{ key: "洁净度一览表", menu: "洁净度一览表", route: "/场景管理/尘埃粒子/洁净度一览表" },
{ key: "尘埃粒子配置", menu: "尘埃粒子配置", route: "/场景管理/尘埃粒子/尘埃粒子配置" },
{ key: "消息管理", menu: "消息管理", route: "/系统管理/消息管理" },
{ key: "数据服务", menu: "数据服务", route: "/系统管理/数据服务" },
{ key: "数据下云", menu: "数据下云", route: "/系统管理/数据下云" },
];
/**
* 展开侧边栏父级菜单
*/
function expandParentMenu(span) {
let parent = span.closest('li');
while (parent) {
@@ -38,42 +52,52 @@ function expandParentMenu(span) {
}
}
/**
* 自动填充并提交搜索(模拟针对某些页面的操作)
*/
function autoFillAndSubmit(arg) {
if (!arg) return;
// 等待页面跳转和组件渲染
setTimeout(() => {
const input = document.querySelector('input[placeholder*="名称"], input[placeholder*="编号"]');
// 尝试寻找各种可能的输入框(针对 Element UI)
const input = document.querySelector('input[placeholder*="编号"]') ||
document.querySelector('input[placeholder*="名称"]') ||
document.querySelector('.el-input__inner');
if (input) {
input.value = arg;
// 触发 input 事件让 Vue 监听到数据变化
input.dispatchEvent(new Event('input', { bubbles: true }));
const searchBtn = document.querySelector('button.el-button--primary');
if (searchBtn) searchBtn.click();
// 寻找包含“添加”、“查询”
setTimeout(() => {
const buttons = Array.from(document.querySelectorAll('button'));
const submitBtn = buttons.find(btn =>
btn.innerText.includes("添加") ||
btn.innerText.includes("查询") ||
btn.innerText.includes("确认") ||
btn.classList.contains('el-button--primary')
);
if (submitBtn) {
submitBtn.click();
console.log("已自动点击按钮:", submitBtn.innerText);
}
}, 500);
}
}, 1000);
}, 1200);
}
/**
* 核心处理器:根据 AI 结果执行动作
* @param {string} aiResult AI 返回的 XML 字符串
* @param {object} uiRefs UI 更新引用的对象
* @param {boolean} voiceEnabled 是否允许播放语音 (由 ai.js 传入)
*/
export function handleCommand(aiResult, uiRefs, voiceEnabled = false) {
if (!aiResult || aiResult === "UNKNOWN") return;
// 1. 解析对话内容并反馈
if (typeof aiResult !== 'string' || aiResult === "UNKNOWN") return;
// 解析对话内容
const commMatch = aiResult.match(/<communication>([\s\S]*?)<\/communication>/);
if (commMatch && commMatch[1]) {
const speechText = commMatch[1].trim();
// 始终更新 UI 界面上的文字状态
if (uiRefs && uiRefs.updateStatus) {
uiRefs.updateStatus(speechText);
}
// 仅在语音开关开启时播报语音
// 语音播放判断
if (voiceEnabled) {
const utterance = new SpeechSynthesisUtterance(speechText);
utterance.lang = "zh-CN";
@@ -81,7 +105,7 @@ export function handleCommand(aiResult, uiRefs, voiceEnabled = false) {
}
}
// 2. 解析指令逻辑
// 解析指令和参数
const cmdMatch = aiResult.match(/<cmd>([\s\S]*?)<\/cmd>/);
const argMatch = aiResult.match(/<arg>([\s\S]*?)<\/arg>/);
@@ -89,14 +113,11 @@ export function handleCommand(aiResult, uiRefs, voiceEnabled = false) {
const arg = argMatch ? argMatch[1].trim() : null;
if (key) {
// 模糊匹配指令
const command = COMMANDS.find(c => c.key === key) ||
COMMANDS.find(c => key.includes(c.key));
if (command) {
console.log("🚀 执行指令:", command.key, "参数:", arg);
// 尝试点击侧边栏菜单(针对 Element UI 结构)
const allSpans = Array.from(document.querySelectorAll("span"));
let span = allSpans.find(el => el.innerText.trim() === command.menu);
@@ -105,15 +126,13 @@ export function handleCommand(aiResult, uiRefs, voiceEnabled = false) {
span.click();
}
// 路由跳转
// 执行跳转
window.location.hash = command.route;
// 自动填充搜索参数
// 如果有参数(如设备编号),执行自动填充
if (arg) {
autoFillAndSubmit(arg);
}
} else {
console.warn("⚠️ 未找到匹配指令:", key);
}
}
}
-1
View File
@@ -1,4 +1,3 @@
// scripts/panel.js
export function createPanel() {
const panelId = "automation-ai-panel";
let panel = document.getElementById(panelId);
+2 -3
View File
@@ -1,17 +1,16 @@
// scripts/voice.js
export function initVoice(panel, onResultCallback) {
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if (!SpeechRecognition) return { supportSpeech: false };
const recognition = new SpeechRecognition();
recognition.lang = "zh-CN";
recognition.continuous = false; // 改为 false,确保每次停止都能立即结算
recognition.continuous = false;
recognition.interimResults = false;
recognition.onresult = (event) => {
const text = event.results[0][0].transcript.trim();
if (text) {
console.log("🎤 识别结果:", text);
console.log("识别结果:", text);
onResultCallback(text);
}
};