2026-01-02 21:06:54 +08:00
|
|
|
|
export const COMMANDS = [
|
|
|
|
|
|
{ key: "首页", menu: "首页", route: "/首页" },
|
|
|
|
|
|
{ key: "添加设备", menu: "添加设备", route: "/添加设备/添加设备" },
|
|
|
|
|
|
{ key: "监控中心", menu: "监控中心", route: "/监控中心/监控中心" },
|
|
|
|
|
|
{ key: "摄像头管理", menu: "摄像头管理", route: "/云视频管理/摄像头管理" },
|
|
|
|
|
|
{ key: "云视频监控", menu: "云视频监控", route: "/云视频监控/云视频监控" },
|
|
|
|
|
|
{ key: "GIS监控", menu: "GIS监控", route: "/GIS管理/GIS监控" },
|
|
|
|
|
|
{ key: "我的流量", menu: "我的流量", route: "/资源管理/我的流量" },
|
|
|
|
|
|
{ key: "我的资源", menu: "我的资源", route: "/资源管理/我的资源" },
|
|
|
|
|
|
{ key: "我的订单", menu: "我的订单", route: "/资源管理/我的订单" },
|
|
|
|
|
|
{ key: "仪表积分", menu: "仪表积分", route: "/资源管理/仪表积分" },
|
|
|
|
|
|
{ key: "报警设置", menu: "报警设置", route: "/报警管理/报警设置" },
|
|
|
|
|
|
{ key: "报警通知", menu: "报警通知", route: "/报警管理/报警通知" },
|
|
|
|
|
|
{ key: "报警记录", menu: "报警记录", route: "/报警管理/报警记录" },
|
|
|
|
|
|
{ key: "基础报表", menu: "基础报表", route: "/报表管理/基础报表" },
|
2026-01-22 13:43:59 +08:00
|
|
|
|
{ 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: "/系统管理/数据下云" },
|
2026-01-02 21:06:54 +08:00
|
|
|
|
];
|
|
|
|
|
|
|
2026-01-17 20:24:08 +08:00
|
|
|
|
function expandParentMenu(span) {
|
|
|
|
|
|
let parent = span.closest('li');
|
|
|
|
|
|
while (parent) {
|
|
|
|
|
|
if (parent.classList.contains('el-submenu')) {
|
|
|
|
|
|
const title = parent.querySelector('.el-submenu__title');
|
|
|
|
|
|
if (title && !parent.classList.contains('is-opened')) {
|
|
|
|
|
|
title.click();
|
|
|
|
|
|
}
|
2026-01-14 22:21:02 +08:00
|
|
|
|
}
|
2026-01-17 20:24:08 +08:00
|
|
|
|
parent = parent.parentElement.closest('li');
|
|
|
|
|
|
}
|
2026-01-14 22:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-17 20:24:08 +08:00
|
|
|
|
function autoFillAndSubmit(arg) {
|
|
|
|
|
|
if (!arg) return;
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 等待页面跳转和组件渲染
|
2026-01-17 20:24:08 +08:00
|
|
|
|
setTimeout(() => {
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 尝试寻找各种可能的输入框(针对 Element UI)
|
|
|
|
|
|
const input = document.querySelector('input[placeholder*="编号"]') ||
|
|
|
|
|
|
document.querySelector('input[placeholder*="名称"]') ||
|
|
|
|
|
|
document.querySelector('.el-input__inner');
|
|
|
|
|
|
|
2026-01-17 20:24:08 +08:00
|
|
|
|
if (input) {
|
|
|
|
|
|
input.value = arg;
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 触发 input 事件让 Vue 监听到数据变化
|
2026-01-17 20:24:08 +08:00
|
|
|
|
input.dispatchEvent(new Event('input', { bubbles: true }));
|
2026-01-22 13:43:59 +08:00
|
|
|
|
|
|
|
|
|
|
// 寻找包含“添加”、“查询”
|
|
|
|
|
|
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);
|
2026-01-14 22:21:02 +08:00
|
|
|
|
}
|
2026-01-22 13:43:59 +08:00
|
|
|
|
}, 1200);
|
2026-01-02 21:06:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-17 20:24:08 +08:00
|
|
|
|
export function handleCommand(aiResult, uiRefs, voiceEnabled = false) {
|
2026-01-14 22:21:02 +08:00
|
|
|
|
|
2026-01-22 13:43:59 +08:00
|
|
|
|
if (typeof aiResult !== 'string' || aiResult === "UNKNOWN") return;
|
|
|
|
|
|
|
|
|
|
|
|
// 解析对话内容
|
2026-01-15 22:49:48 +08:00
|
|
|
|
const commMatch = aiResult.match(/<communication>([\s\S]*?)<\/communication>/);
|
|
|
|
|
|
if (commMatch && commMatch[1]) {
|
|
|
|
|
|
const speechText = commMatch[1].trim();
|
|
|
|
|
|
if (uiRefs && uiRefs.updateStatus) {
|
|
|
|
|
|
uiRefs.updateStatus(speechText);
|
|
|
|
|
|
}
|
2026-01-17 20:24:08 +08:00
|
|
|
|
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 语音播放判断
|
2026-01-17 20:24:08 +08:00
|
|
|
|
if (voiceEnabled) {
|
|
|
|
|
|
const utterance = new SpeechSynthesisUtterance(speechText);
|
|
|
|
|
|
utterance.lang = "zh-CN";
|
|
|
|
|
|
window.speechSynthesis.speak(utterance);
|
|
|
|
|
|
}
|
2026-01-15 22:49:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 解析指令和参数
|
2026-01-15 21:35:04 +08:00
|
|
|
|
const cmdMatch = aiResult.match(/<cmd>([\s\S]*?)<\/cmd>/);
|
|
|
|
|
|
const argMatch = aiResult.match(/<arg>([\s\S]*?)<\/arg>/);
|
2026-01-02 21:06:54 +08:00
|
|
|
|
|
2026-01-15 21:35:04 +08:00
|
|
|
|
const key = cmdMatch ? cmdMatch[1].trim() : null;
|
|
|
|
|
|
const arg = argMatch ? argMatch[1].trim() : null;
|
|
|
|
|
|
|
2026-01-15 22:49:48 +08:00
|
|
|
|
if (key) {
|
|
|
|
|
|
const command = COMMANDS.find(c => c.key === key) ||
|
|
|
|
|
|
COMMANDS.find(c => key.includes(c.key));
|
2026-01-11 12:22:49 +08:00
|
|
|
|
|
2026-01-15 22:49:48 +08:00
|
|
|
|
if (command) {
|
2026-01-22 13:43:59 +08:00
|
|
|
|
|
2026-01-15 22:49:48 +08:00
|
|
|
|
const allSpans = Array.from(document.querySelectorAll("span"));
|
|
|
|
|
|
let span = allSpans.find(el => el.innerText.trim() === command.menu);
|
2026-01-11 12:22:49 +08:00
|
|
|
|
|
2026-01-15 22:49:48 +08:00
|
|
|
|
if (span) {
|
|
|
|
|
|
expandParentMenu(span);
|
|
|
|
|
|
span.click();
|
2026-01-14 22:21:02 +08:00
|
|
|
|
}
|
2026-01-17 20:24:08 +08:00
|
|
|
|
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 执行跳转
|
2026-01-17 20:24:08 +08:00
|
|
|
|
window.location.hash = command.route;
|
|
|
|
|
|
|
2026-01-22 13:43:59 +08:00
|
|
|
|
// 如果有参数(如设备编号),执行自动填充
|
2026-01-17 20:24:08 +08:00
|
|
|
|
if (arg) {
|
|
|
|
|
|
autoFillAndSubmit(arg);
|
|
|
|
|
|
}
|
2026-01-14 22:21:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-02 21:06:54 +08:00
|
|
|
|
}
|