Files
aiot-platform-cloud/sql/iot/V2.0.1__iot_rule_chain.sql
lzh 962e69290b feat(iot): B2 RuleChain/Node/Link 数据模型 + CRUD(单 Trigger/DAG 无环/乐观锁)
- 新增 sql/iot/V2.0.1__iot_rule_chain.sql(iot_rule_chain/node/link 三表 + idx_binding 索引)
- 新增 rule 模块 dal/(3 个 DO + 4 个封闭枚举 + 3 个 Mapper)
- 新增 rule 模块 service/(CRUD + 单 Trigger 校验 + DAG DFS 无环 + 乐观锁 + 级联软删)
- 新增 rule 模块 controller/admin/(7 REST 端点 + @PreAuthorize + VO)
- 新增 resources/mapper/rule/(3 个 MyBatis XML)
- api 模块 ErrorCodeConstants 新增规则链段(1-050-030-xxx)
- **补 B1 遗漏依赖**:rule/pom.xml 追加 viewsh-spring-boot-starter-{web,security,biz-tenant}
- 测试:8 个单元用例全绿(BaseMockitoUnitTest)
- Known Pitfalls 落地:
  ⚠️ 评审 B4:relation_type VARCHAR + 应用层 RuleLinkRelationType.isValid 校验
  ⚠️ 评审 B9:updateWithVersion 乐观锁原子 SQL + idx_update_time 索引支撑 B9 拉模式兜底扫描
  ⚠️ 评审 B10:单 Trigger 校验在 Service 层(validateSingleTrigger)
  ⚠️ 评审 A4:name UK(name, tenant_id, deleted)
  ⚠️ 评审 §十一-B:idx_binding (tenant_id, subsystem_id, product_id, device_id) 最左匹配

Co-Authored-By: Claude Sonnet (B2 subagent) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context, orchestrator) <noreply@anthropic.com>
2026-04-23 21:09:54 +08:00

67 lines
4.2 KiB
SQL
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.

-- IoT 规则引擎三张核心表
-- [B2] RuleChain/Node/Link 数据模型
CREATE TABLE IF NOT EXISTS iot_rule_chain (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(128) NOT NULL COMMENT '规则链名称',
description TEXT COMMENT '规则链描述',
type VARCHAR(32) NOT NULL COMMENT 'SCENE / DATA / CUSTOM',
status TINYINT NOT NULL DEFAULT 1 COMMENT '0=禁用 1=启用 2=WARNING物模型变更导致',
priority INT NOT NULL DEFAULT 100 COMMENT 'ASC 排序,评审 A5',
version BIGINT NOT NULL DEFAULT 0 COMMENT '变更时+1评审 B9 多实例校验用',
debug_mode TINYINT NOT NULL DEFAULT 0 COMMENT '调试模式',
-- 三层绑定(评审 §十一-B
subsystem_id BIGINT COMMENT 'NULL = 全局规则',
product_id BIGINT COMMENT 'NULL = 不限产品',
device_id BIGINT COMMENT 'NULL/0 = 范围内所有设备',
tenant_id BIGINT NOT NULL COMMENT '租户编号',
creator VARCHAR(64) COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT NOT NULL DEFAULT b'0' COMMENT '是否删除',
INDEX idx_binding (tenant_id, subsystem_id, product_id, device_id),
INDEX idx_status (tenant_id, status, priority),
INDEX idx_update_time (update_time)
) COMMENT = '规则链';
CREATE TABLE IF NOT EXISTS iot_rule_node (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
rule_chain_id BIGINT NOT NULL COMMENT '所属规则链编号',
name VARCHAR(128) COMMENT '节点名称',
category VARCHAR(32) NOT NULL COMMENT 'trigger / condition / action',
type VARCHAR(64) NOT NULL COMMENT 'Provider 标识device_property / alarm_trigger 等)',
configuration JSON NOT NULL COMMENT '节点配置',
position_x INT COMMENT '画布 X 坐标',
position_y INT COMMENT '画布 Y 坐标',
tenant_id BIGINT NOT NULL COMMENT '租户编号',
creator VARCHAR(64) COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT NOT NULL DEFAULT b'0' COMMENT '是否删除',
INDEX idx_chain (rule_chain_id, deleted)
) COMMENT = '规则节点';
CREATE TABLE IF NOT EXISTS iot_rule_link (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
rule_chain_id BIGINT NOT NULL COMMENT '所属规则链编号',
source_node_id BIGINT NOT NULL COMMENT '源节点编号',
target_node_id BIGINT NOT NULL COMMENT '目标节点编号',
relation_type VARCHAR(32) NOT NULL COMMENT '【封闭枚举 评审 B4】Success/Failure/True/False/Timeout/Skip',
condition JSON COMMENT '连线条件(可选)',
sort_order INT DEFAULT 0 COMMENT '排序',
tenant_id BIGINT NOT NULL COMMENT '租户编号',
creator VARCHAR(64) COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater VARCHAR(64) COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted BIT NOT NULL DEFAULT b'0' COMMENT '是否删除',
INDEX idx_source (rule_chain_id, source_node_id, deleted)
) COMMENT = '规则连线';