# 规则引擎实施计划 — 任务清单 > **版本**: 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 表 - [ ] 在数据库执行: ```sql 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`, `CooldownSec` - `warehouse_ruleaction` 加 `ActionType`, `ExtraJson` - `warehouse_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_variable` CRUD - [ ] 管理端字典补充(§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` - [ ] 实现 `EvaluateAllAsync()` — 主流程: 1. `LoadEnabledRulesAsync()` — 从 DB 加载启用规则 + 条件 + 动作 2. `BuildDeviceMappingAsync()` — DeviceId → (AdapterCode, SourceId, BaseUrl) 3. `BatchFetchRealtimeAsync()` — 调网关 B4-batch 批量取实时值 4. `EvaluateRuleAsync(rule, data)` — 逐规则比对 5. `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` 事件: ```javascript 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` 中就绪,本次仅需执行。