Files
iot-device-management-frontend/apps/web-antd
lzh 40923670e0 [F4/F5/F6] 触发器/条件/动作配置表单 + 13 个自定义 widget (MVP)
三任务合并 commit。Subagent 因 stream_read_error 中途异常,主会话补齐
F5/F6 schema 与 SCHEMA_MAP 注册,并补 i18n keys。

## F4 触发器(补 2 种)
- node-schema: deviceEventTriggerSchema / deviceServiceTriggerSchema
  (F3 已有 device_state/device_property/timer)
- productSelectorRule 工厂函数复用

## F5 条件(补 2 种 + AviatorExprEditor 接入)
- node-schema: timeRangeConditionSchema (mode/startTime/endTime/timezone)
              conditionDeviceStateConditionSchema (deviceId/expectedState)
- expression schema 从 a-textarea 升级到 AviatorExprEditor 自定义组件
  (F3 已有 expression 基础版)

## F6 动作(补 2 种)
- node-schema: serviceInvokeActionSchema / alarmClearActionSchema
  (F3 已有 property_set/alarm_trigger/notify)

## SCHEMA_MAP 完整覆盖 13 种节点(对齐 F2 useNodeCatalog 全量清单)
device_state/device_property/device_event/device_service/timer/
expression/time_range/condition_device_state/
property_set/service_invoke/alarm_trigger/alarm_clear/notify

## 自定义 widgets(13 个 + register.ts)
apps/web-antd/src/views/iot/rule/chain/components/widgets/:
- DeviceSelector / ProductSelector / PropertyIdentifier / EventIdentifier /
  ServiceIdentifier / CronEditor (F4)
- AviatorExprEditor / VariableHint (F5)
- AlarmConfigSelector / NotifyChannelPicker / NotifyTemplateEditor /
  UserSelector (F6)
- register.ts: formCreate.component 批量注册,import 即生效

## MVP 决策
- AviatorExprEditor 用 a-textarea + VariableHint chip 列表(TODO post-MVP 接 Monaco/CodeMirror)
- CronEditor 用 a-input + Popover 预设按钮(TODO post-MVP 加 cron-parser 下次执行时间预览)
- DeviceSelector/ProductSelector 用 antd Select show-search remote loading(TODO 虚拟滚动)
- AlarmConfigSelector/UserSelector TODO 联 B12/system API

## i18n 追加
- iot.dag.trigger.* (15 keys): product/eventIdentifier/serviceIdentifier/
  cronPlaceholder/cronPresets 等
- iot.dag.condition.* (9 keys): timeRangeMode/modeDaily/startTime 等
- iot.dag.action.* (8 keys): alarmConfig/inputParams/templateTitle/Body 等
- iot.dag.validate.* (6 new): alarmConfigRequired/endTimeRequired/
  eventRequired/productRequired/serviceRequired/startTimeRequired

## Known Pitfalls 落地
- 评审 B5/C5: 模板变量统一 \${namespace.key},VariableHint 只展示新语法
- 联动刷新: productId 变更 → PropertyIdentifier/DeviceSelector 清空(widget 内部 watch)
- Webhook URL 前端格式正则,SSRF 白名单在 B16 后端
- 自定义 widgets 通过 formCreate.component 注册,DynamicNodeForm 识别 type 名

质检:
- pnpm test:unit src/views/iot/rule/chain → 58/58 通过
- pnpm lint chain/ → 0 errors
- pnpm check:type (web-antd) → chain 0 errors

Post-MVP TODO:
- Monaco Editor 或 CodeMirror 6 接入 AviatorExprEditor(语法高亮 + 自动补全)
- cron-parser 接入 CronEditor(下次执行时间预览)
- DeviceSelector/ProductSelector 虚拟滚动(千级设备场景)
- AlarmConfigSelector/UserSelector 联调真实后端 API
- E2E 测试覆盖 drop → 填表 → 保存完整流程

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 00:03:09 +08:00
..
2024-07-28 14:29:05 +08:00
2024-06-08 16:33:49 +08:00
2024-06-08 16:33:49 +08:00
2025-10-16 10:28:42 +08:00