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

6.2 KiB
Raw Blame History

规则引擎实施计划 — 任务清单

版本: 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 表

  • 在数据库执行:
    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_ruleEnable, Priority, LastEvaluated, LastTriggered, CooldownSec
    • warehouse_ruleactionActionType, ExtraJson
    • warehouse_ruleconditionRecoveryThreshold_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 中获取 RuleEngineServiceEvaluateAllAsync()

步骤 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 中就绪,本次仅需执行。