Files
SecMPS/doc/设计文档/规则引擎实施计划_任务清单.md

176 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 规则引擎实施计划 — 任务清单
> **版本**: 1.0
> **日期**: 2026-06-04
> **基准**: `doc/设计文档/规则引擎实现方案_v1.0.md`
> **分支**: gateway-dev
> **原则**: 分阶段分步骤执行,每步骤编译复查后提交,不合并主分支
---
## 当前状态
| 前置条件 | 状态 |
|------|:--:|
| RealtimePollJob10s 采集 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` 中就绪,本次仅需执行。