6.2 KiB
6.2 KiB
规则引擎实施计划 — 任务清单
版本: 1.0 日期: 2026-06-04 基准:
doc/设计文档/规则引擎实现方案_v1.0.md分支: gateway-dev 原则: 分阶段分步骤执行,每步骤编译复查后提交,不合并主分支
当前状态
| 前置条件 | 状态 |
|---|---|
| RealtimePollJob(10s 采集 MC4 IoT 值) | ✅ 已实现 |
| warehouse_rule/condition/action 表 + 管理端 CRUD | ✅ 已实现 |
| warehouse_rulelog 表 | ❌ 待建 |
| 网关 B4-batch 批量接口 | ✅ 已实现 (P1-1) |
| 网关 B5(设备控制) | ✅ 已实现 |
| 网关 B10(远程控制) | ✅ 已实现 |
| VolPro GatewayClient(调网关) | ✅ 已实现 |
| warehouse_variable 表 SQL | ✅ 已写入 db_init.sql(待执行) |
| RuleEngineService / RuleEngineJob | ❌ 待实现 |
阶段 R1: 数据库准备(预计 30min)
步骤 R1.1 — 新增 warehouse_rulelog 表
- 在数据库执行:
CREATE TABLE warehouse_rulelog ( LogID INT IDENTITY PRIMARY KEY, RuleID INT NOT NULL, ConditionMet NVARCHAR(50), ActionResult NVARCHAR(MAX), EvaluatedAt DATETIME DEFAULT GETDATE(), Detail NVARCHAR(MAX) NULL ); - 在数据库执行 ALTER TABLE 添加字段(若未执行):
warehouse_rule加Enable,Priority,LastEvaluated,LastTriggered,CooldownSecwarehouse_ruleaction加ActionType,ExtraJsonwarehouse_rulecondition加RecoveryThreshold_Numeric,RecoveryThreshold_Switch,LastTriggered,LastTriggerValue
- 在 Vol.Pro 代码生成器中选择
warehouse_rulelog生成全套 CRUD dotnet build→ 0 错误
步骤 R1.2 — 执行 warehouse_variable 表建表
- 在数据库执行
doc/db_init.sql中 warehouse_variable 建表语句 - Vol.Pro 代码生成器生成
warehouse_variableCRUD - 管理端字典补充(§5 字典项)
R1 提交点:
RuleEngine-R1: 数据库表+字典就绪
阶段 R2: RuleEngineService 实现(预计 3h)
步骤 R2.1 — 创建 RuleEngineService.cs
- 创建
api_sqlsugar/Warehouse/Services/RuleEngineService.cs - 注入
Iwarehouse_ruleRepository,Ibase_deviceRepository,Iiot_devicedataRepository,Iiot_alarmRepository,GatewayClient,IHubContext<HomePageMessageHub> - 实现
EvaluateAllAsync()— 主流程:LoadEnabledRulesAsync()— 从 DB 加载启用规则 + 条件 + 动作BuildDeviceMappingAsync()— DeviceId → (AdapterCode, SourceId, BaseUrl)BatchFetchRealtimeAsync()— 调网关 B4-batch 批量取实时值EvaluateRuleAsync(rule, data)— 逐规则比对ExecuteActionsAsync(rule)— 触发动作
步骤 R2.2 — 实现条件评估
EvaluateConditionAsync(cond, realtimeData):- 从 realtimeData 中找到对应设备+点位的实际值
- 按 CompareOperator 比对(大于/小于/等于/大于等于/小于等于/不等于)
- 支持滞后窗(P2-2):已触发过则用 RecoveryThreshold 判断恢复
- 支持条件级冷却(P2-3):未过冷却期则跳过
步骤 R2.3 — 实现动作执行
ExecuteActionsAsync(rule):- 动作类型 "控制" →
GatewayClient.ControlDeviceAsync(调网关 B5) - 动作类型 "告警" → 写入
iot_alarm表 - 动作类型 "通知" → SignalR
_hub.SendAsync("RuleTriggered", ...) - 冷却检查:未过
CooldownSec不重复执行 - 并发执行:
Task.WhenAll+ 5s 超时(P3-1)
- 动作类型 "控制" →
步骤 R2.4 — 编译验证
dotnet build api_sqlsugar/Warehouse→ 0 错误
R2 提交点:
RuleEngine-R2: RuleEngineService 完整实现
阶段 R3: RuleEngineJob + 调度(预计 30min)
步骤 R3.1 — 创建 RuleEngineJob.cs
- 创建
api_sqlsugar/Warehouse/Services/RuleEngineJob.cs - 实现
IJob接口,Execute中获取RuleEngineService调EvaluateAllAsync()
步骤 R3.2 — 注册 Quartz
- 管理端 → Quartz 管理 → 新建 Job:
JobName: RuleEngineJob Cron: 0/10 * * * * ? ClassName: Warehouse.Services.RuleEngineJob dotnet build→ 0 错误
R3 提交点:
RuleEngine-R3: RuleEngineJob 就绪
阶段 R4: 前端配套(预计 1h)
步骤 R4.1 — 规则管理页增强
- 编辑
web.vite/src/views/warehouse/warehouse_rule/warehouse_rule/options.js - 条件表格中 "设备" 列绑定
allDevices动态字典 - "变量" 列绑定
warehouse_variable字典 - 动作表格加"动作类型"下拉(控制/告警/通知)
步骤 R4.2 — 大屏告警接收
- 编辑
warehouse/src/view/DataView.vue - SignalR 订阅
RuleTriggered事件:connection.on("RuleTriggered", (data) => { ElMessage.warning(`[规则触发] ${data.title}: ${data.alertMessage}`); });
R4 提交点:
RuleEngine-R4: 前端配套完成
阶段 R5: 联调验证(预计 2h)
步骤 R5.1 — 联调
- 网关启动 → MC4 在线 → RealtimePollJob 有数据
- 管理端新建规则:"温度 > 28℃ → 告警"
- 等 10s → iot_alarm 表有告警记录
- 管理端收到 SignalR 推送
- 管理端新建规则:"温度 > 28℃ → 控制空调"
- 等 10s → 网关 B5 被调用
R5 提交点:
RuleEngine-R5: 联调通过
任务总览
| 阶段 | 步骤 | 内容 | 预计 |
|---|---|---|---|
| R1 | R1.1 | 建表 + 代码生成 | 20min |
| R1 | R1.2 | 变量表 + 字典 | 10min |
| R2 | R2.1 | RuleEngineService 主流程 | 1.5h |
| R2 | R2.2 | 条件评估 + 滞后窗 + 冷却 | 45min |
| R2 | R2.3 | 动作执行(控制/告警/通知) | 30min |
| R2 | R2.4 | 编译验证 | 15min |
| R3 | R3.1 | RuleEngineJob | 15min |
| R3 | R3.2 | Quartz 注册 | 15min |
| R4 | R4.1 | 管理端 UI 增强 | 30min |
| R4 | R4.2 | 大屏告警接收 | 30min |
| R5 | R5.1 | 联调 | 2h |
| 合计 | 11 步骤 | — | ~7h |
注: 原方案 R4(网关 B4-batch)已在 P1-1 修复中完成,R2 的 DeviceId 映射已在方案中设计,此次直接实现。
warehouse_variable建表 SQL 已在doc/db_init.sql中就绪,本次仅需执行。