From b6217a8b02a174a40d81dc81fd3e237e9770d760 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Thu, 12 Feb 2026 17:31:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(aiot):=20=E4=BC=98=E5=8C=96=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=20-=20=E4=BF=AE=E5=A4=8D=E4=BF=9D=E5=AD=98=E5=A4=B1=E8=B4=A5+?= =?UTF-8?q?=E7=B2=BE=E7=BE=8E=E6=97=B6=E9=97=B4=E9=80=89=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题修复: 1. 修复算法参数保存失败问题 - working_hours 数据格式错误(字符串数组 → 对象数组) - 添加参数校验逻辑 - 改进错误提示(显示后端具体错误信息) 2. 全新时间段选择器组件 - WorkingHoursEditor.vue(精美可视化界面) - 快捷模板:全天/单班制/两班制/三班制 - 可视化时间选择(TimePicker.RangePicker) - 智能校验(时间段不重叠、结束>开始) - 实时预览已配置时间段 核心改进: 1. AlgorithmParamEditor.vue - 引入 WorkingHoursEditor 组件 - 特殊处理 working_hours 字段 - validateParams() 参数校验 - 改进错误提示(catch块显示详细错误) - 增加帮助提示 2. WorkingHoursEditor.vue(新建) - 快捷模板区域: * 全天监控(空数组) * 单班制(09:00-18:00) * 两班制(09:00-12:00, 14:00-18:00) * 三班制(08:00-16:00, 16:00-00:00, 00:00-08:00) - 自定义时间段: * TimePicker.RangePicker 可视化选择 * 时间段卡片展示 * 一键删除、清空全部 * 显示时长(小时+分钟) - 智能校验: * 结束时间 > 开始时间 * 时间段不重叠 * 实时错误提示 - 帮助说明:使用提示 UI设计亮点: - 卡片式布局,清晰直观 - 快捷模板一键应用 - 时间段自动排序 - 空状态优化 - 响应式设计 - 精美的图标和颜色 数据格式: before: ["09:00-18:00"] // ❌ 字符串数组 after: [{"start": "09:00", "end": "18:00"}] // ✅ 对象数组 Co-Authored-By: Claude Sonnet 4.5 --- .../roi/components/AlgorithmParamEditor.vue | 121 ++++- .../roi/components/WorkingHoursEditor.vue | 447 ++++++++++++++++++ 2 files changed, 564 insertions(+), 4 deletions(-) create mode 100644 apps/web-antd/src/views/aiot/device/roi/components/WorkingHoursEditor.vue diff --git a/apps/web-antd/src/views/aiot/device/roi/components/AlgorithmParamEditor.vue b/apps/web-antd/src/views/aiot/device/roi/components/AlgorithmParamEditor.vue index 42deca53f..44499dd42 100644 --- a/apps/web-antd/src/views/aiot/device/roi/components/AlgorithmParamEditor.vue +++ b/apps/web-antd/src/views/aiot/device/roi/components/AlgorithmParamEditor.vue @@ -13,6 +13,8 @@ import { import { updateAlgoParams } from '#/api/aiot/device'; +import WorkingHoursEditor from './WorkingHoursEditor.vue'; + interface Props { open: boolean; paramSchema: string; @@ -85,8 +87,20 @@ function removeListItem(key: string, idx: number) { formData.value[key].splice(idx, 1); } +// 判断是否为工作时间段字段 +function isWorkingHoursField(key: string): boolean { + return key === 'working_hours'; +} + async function handleSave() { try { + // 保存前验证参数 + const validation = validateParams(formData.value); + if (!validation.valid) { + message.error(validation.error || '参数格式错误'); + return; + } + await updateAlgoParams({ bindId: props.bindId, params: JSON.stringify(formData.value), @@ -94,17 +108,74 @@ async function handleSave() { message.success('参数保存成功'); emit('saved', formData.value); emit('update:open', false); - } catch { - message.error('参数保存失败'); + } catch (error: any) { + console.error('保存失败:', error); + // 改进错误提示:显示后端返回的具体错误信息 + const errorMsg = error?.response?.data?.msg || + error?.response?.data?.message || + error?.message || + '参数保存失败,请检查参数格式'; + message.error(errorMsg); } } + +// 参数校验 +function validateParams(params: Record): { + valid: boolean; + error?: string; +} { + const schema = parsedSchema.value; + + for (const [key, value] of Object.entries(params)) { + const fieldSchema = schema[key]; + if (!fieldSchema) continue; + + // 校验整数类型 + if (fieldSchema.type === 'int') { + if (typeof value !== 'number') { + return { valid: false, error: `${key} 必须是整数` }; + } + if (fieldSchema.min !== undefined && value < fieldSchema.min) { + return { + valid: false, + error: `${key} 不能小于 ${fieldSchema.min}`, + }; + } + } + + // 校验列表类型 + if (fieldSchema.type === 'list') { + if (!Array.isArray(value)) { + return { valid: false, error: `${key} 必须是数组` }; + } + + // 特殊校验 working_hours 格式 + if (key === 'working_hours' && value.length > 0) { + const isValid = value.every( + (item: any) => + typeof item === 'object' && + typeof item.start === 'string' && + typeof item.end === 'string', + ); + if (!isValid) { + return { + valid: false, + error: '工作时间段格式错误,每项需包含 start 和 end', + }; + } + } + } + } + + return { valid: true }; +} + + diff --git a/apps/web-antd/src/views/aiot/device/roi/components/WorkingHoursEditor.vue b/apps/web-antd/src/views/aiot/device/roi/components/WorkingHoursEditor.vue new file mode 100644 index 000000000..7c412ba64 --- /dev/null +++ b/apps/web-antd/src/views/aiot/device/roi/components/WorkingHoursEditor.vue @@ -0,0 +1,447 @@ + + + + +