176 lines
6.2 KiB
Markdown
176 lines
6.2 KiB
Markdown
# 规则引擎实施计划 — 任务清单
|
||
|
||
> **版本**: 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<HomePageMessageHub>`
|
||
- [ ] 实现 `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` 中就绪,本次仅需执行。
|