Skip to content

环境监测异常预警规则

适用于矿山(瓦斯)、电力(温度)、冷链(温度)、水利(水位)等场景的环境参数监测与异常预警。

规则文件内容

请复制以下内容,保存为 .cursor/rules/environment-monitoring-alert.mdc

markdown
---
description: 环境监测数据异常判断与分级预警规则
globs: src/modules/monitoring/**, src/modules/sensor/**, src/modules/alert/**
---

# 环境监测异常预警规则

## 1. 核心原则
- **实时监测**:传感器数据实时采集,每秒/每分钟检查一次。
- **双重判断**:绝对值阈值 + 趋势变化,防止漏报和误报。
- **分级预警**:根据严重程度分级报警(预警/报警/紧急)。
- **误报控制**:平衡灵敏度和误报率,避免频繁误报导致麻痹。

## 2. 异常判定逻辑

### 2.1 绝对值阈值判断
$$ 当前值 > 预警阈值 \Rightarrow 预警 $$
$$ 当前值 > 报警阈值 \Rightarrow 报警 $$
$$ 当前值 > 紧急阈值 \Rightarrow 紧急 $$

### 2.2 趋势变化判断
$$ 变化率 = \frac{当前值 - 起始值}{时间窗口} $$
$$ 变化率 > 快速上升阈值 \Rightarrow 立即报警 $$

### 2.3 判定规则(以瓦斯浓度为例)
| 判定条件 | 严重程度 | 处理动作 |
| :--- | :--- | :--- |
| **浓度 > 0.5%** | 预警 (warning) | 推送预警,提醒关注 |
| **浓度 > 0.8%** | 报警 (alert) | 推送报警,准备撤离 |
| **浓度 > 1.0%** | 紧急 (emergency) | 强制撤离,停止作业 |
| **15分钟上升 > 0.3%** | 报警 (alert) | 快速上升,立即报警 |

### 2.4 自动响应规则
**预警响应(浓度 > 0.5%):**
1. 推送预警到调度室、安全科
2. 显示当前值、历史趋势图
3. 提醒加强通风

**报警响应(浓度 > 0.8% 或快速上升):**
1. 推送报警到调度室、安全科、矿长
2. 通知该区域人员准备撤离
3. 启动应急通风系统

**紧急响应(浓度 > 1.0%):**
1. 强制撤离该区域所有人员
2. 停止该区域所有作业
3. 启动应急预案

## 3. 代码实现规范 (TypeScript)

### 3.1 绝对值阈值判断
```typescript
/**
 * 检测环境参数是否超过阈值
 * @param currentValue 当前值
 * @param thresholds 阈值配置
 * @returns 异常检测结果
 */
export function checkAbsoluteThreshold(
  currentValue: number,
  thresholds: ThresholdConfig
): ThresholdResult {
  if (currentValue >= thresholds.emergency) {
    return { severity: 'emergency', exceeded: true };
  }
  if (currentValue >= thresholds.alert) {
    return { severity: 'alert', exceeded: true };
  }
  if (currentValue >= thresholds.warning) {
    return { severity: 'warning', exceeded: true };
  }
  return { severity: 'normal', exceeded: false };
}

3.2 趋势变化判断

typescript
/**
 * 检测环境参数是否快速上升
 * @param history 历史数据(时间窗口内)
 * @param rapidRiseThreshold 快速上升阈值
 * @returns 趋势检测结果
 */
export function checkRapidRise(
  history: SensorData[],
  rapidRiseThreshold: number
): TrendResult {
  if (history.length < 2) {
    return { isRapidRise: false };
  }

  const startValue = history[0].value;
  const endValue = history[history.length - 1].value;
  const rise = endValue - startValue;

  if (rise >= rapidRiseThreshold) {
    const duration = (history[history.length - 1].timestamp.getTime() -
                     history[0].timestamp.getTime()) / 1000;
    return {
      isRapidRise: true,
      rise,
      duration,
      riseRate: rise / (duration / 60)  // 每分钟上升速率
    };
  }

  return { isRapidRise: false };
}

3.3 综合判断函数

typescript
/**
 * 综合判断环境监测异常
 * @param currentValue 当前值
 * @param history 历史数据
 * @param config 配置参数
 * @returns 异常判断结果
 */
export function checkEnvironmentAnomaly(
  currentValue: number,
  history: SensorData[],
  config: MonitoringConfig
): AnomalyResult {
  // 绝对值判断
  const thresholdResult = checkAbsoluteThreshold(currentValue, config.thresholds);

  // 趋势判断
  const trendResult = checkRapidRise(history, config.rapidRiseThreshold);

  // 综合判断
  if (trendResult.isRapidRise) {
    return {
      isAnomalous: true,
      severity: 'alert',
      reason: 'RAPID_RISE',
      details: trendResult
    };
  }

  if (thresholdResult.exceeded) {
    return {
      isAnomalous: true,
      severity: thresholdResult.severity,
      reason: 'THRESHOLD_EXCEEDED',
      details: thresholdResult
    };
  }

  return { isAnomalous: false };
}

3.4 自动报警函数

typescript
/**
 * 触发分级报警
 * @param anomaly 异常事件
 */
export async function triggerEnvironmentAlert(
  anomaly: EnvironmentAnomaly
): Promise<void> {
  const { severity, sensorId, currentValue, location } = anomaly;

  switch (severity) {
    case 'warning':
      // 预警
      await alertService.push({
        channels: ['调度室', '安全科'],
        priority: 'MEDIUM',
        message: `${location} ${anomaly.parameterName}预警:当前值${currentValue}`,
        actions: ['加强通风', '持续监测']
      });
      break;

    case 'alert':
      // 报警
      await alertService.push({
        channels: ['调度室', '安全科', '矿长'],
        priority: 'HIGH',
        message: `${location} ${anomaly.parameterName}报警:当前值${currentValue}`,
        actions: ['准备撤离', '启动应急通风']
      });
      // 通知该区域人员
      await notifyAreaWorkers(location, '准备撤离');
      break;

    case 'emergency':
      // 紧急
      await alertService.push({
        channels: ['全体人员', '应急指挥中心'],
        priority: 'CRITICAL',
        message: `${location} ${anomaly.parameterName}紧急:当前值${currentValue},立即撤离!`,
        actions: ['强制撤离', '停止作业', '启动应急预案']
      });
      // 强制撤离
      await emergencyService.evacuate(location);
      break;
  }
}

4. 数据模型约束

4.1 传感器数据记录

typescript
interface SensorData {
  id: string;
  sensorId: string;           // 传感器ID
  parameterName: string;      // 参数名称(如"瓦斯浓度")
  value: number;              // 当前值
  unit: string;               // 单位(如"%")
  location: string;           // 位置
  timestamp: Date;
}

4.2 异常事件记录

typescript
interface EnvironmentAnomaly {
  id: string;
  sensorId: string;
  parameterName: string;
  currentValue: number;
  location: string;
  severity: 'warning' | 'alert' | 'emergency';
  reason: 'THRESHOLD_EXCEEDED' | 'RAPID_RISE';
  detectedAt: Date;
  status: 'PENDING' | 'CONFIRMED' | 'RESOLVED';

  // 处置记录
  disposal?: {
    confirmedBy: string;
    confirmedAt: Date;
    actions: string[];        // 处置措施
    result: string;           // 处置结果
    resolvedAt: Date;
  };
}

4.3 阈值配置

typescript
interface ThresholdConfig {
  warning: number;            // 预警阈值
  alert: number;              // 报警阈值
  emergency: number;          // 紧急阈值
  rapidRiseThreshold: number; // 快速上升阈值
  timeWindow: number;         // 时间窗口(秒)
}

5. 开发注意事项

  1. 阈值可配置:不同场景、不同参数的阈值不同,必须支持配置。
  2. 误报控制:设置合理的阈值和时间窗口,避免频繁误报。
  3. 数据平滑:传感器数据可能有波动,建议使用移动平均等方法平滑。
  4. 历史数据:保留足够的历史数据用于趋势分析(建议至少30分钟)。
  5. 性能优化:实时监测需要优化查询性能,建议使用时序数据库(如InfluxDB)。

6. 测试用例

6.1 正常场景

  • 参数值在正常范围内 → 无报警

6.2 绝对值异常

  • 瓦斯浓度 = 0.6% → 触发预警
  • 瓦斯浓度 = 0.9% → 触发报警
  • 瓦斯浓度 = 1.1% → 触发紧急

6.3 趋势异常

  • 15分钟内从0.3%上升到0.7%(上升0.4%)→ 触发报警

6.4 边界场景

  • 传感器故障(数据异常波动)→ 标记为设备故障,不触发报警
  • 传感器维护中 → 不触发报警

7. 场景配置示例

7.1 矿山瓦斯监测

typescript
const GAS_MONITORING_CONFIG: MonitoringConfig = {
  parameterName: '瓦斯浓度',
  unit: '%',
  thresholds: {
    warning: 0.5,
    alert: 0.8,
    emergency: 1.0
  },
  rapidRiseThreshold: 0.3,    // 15分钟上升0.3%
  timeWindow: 900,            // 15分钟
  checkInterval: 60           // 每分钟检查一次
};

7.2 电力变压器温度监测

typescript
const TRANSFORMER_TEMP_CONFIG: MonitoringConfig = {
  parameterName: '变压器温度',
  unit: '℃',
  thresholds: {
    warning: 85,
    alert: 95,
    emergency: 105
  },
  rapidRiseThreshold: 10,     // 30分钟上升10℃
  timeWindow: 1800,           // 30分钟
  checkInterval: 60           // 每分钟检查一次
};

7.3 冷链温度监测

typescript
const COLD_CHAIN_TEMP_CONFIG: MonitoringConfig = {
  parameterName: '冷库温度',
  unit: '℃',
  thresholds: {
    warning: 8,
    alert: 10,
    emergency: 12
  },
  rapidRiseThreshold: 3,      // 10分钟上升3℃
  timeWindow: 600,            // 10分钟
  checkInterval: 60           // 每分钟检查一次
};

7.4 水利水位监测

typescript
const WATER_LEVEL_CONFIG: MonitoringConfig = {
  parameterName: '水位',
  unit: 'm',
  thresholds: {
    warning: 50,              // 警戒水位
    alert: 55,                // 保证水位
    emergency: 58             // 设计水位
  },
  rapidRiseThreshold: 2,      // 1小时上升2米
  timeWindow: 3600,           // 1小时
  checkInterval: 300          // 每5分钟检查一次
};

## 适用场景

- **矿山安全**:瓦斯浓度、一氧化碳浓度、温度监测
- **电力运维**:变压器温度、局部放电、负载监测
- **冷链物流**:冷库温度、冷藏车温度监测
- **水利工程**:水位、流量、闸门开度监测
- **环保监测**:空气质量、水质、噪音监测

## 技术迁移

### 复用已有资产
- **生鲜场景:冷库温度监测规则** - 复用阈值判断、报警推送逻辑

### 差异点
- 监测参数:温度 → 瓦斯浓度/水位/其他参数
- 阈值设置:不同场景阈值不同
- 响应动作:预警/报警 → 预警/报警/强制撤离

### 技术复用度
- 规则引擎逻辑:100%复用
- 报警推送逻辑:100%复用
- 数据采集层:需要适配不同传感器(20%新开发)

## 相关资产

- [人员定位异常监测规则 →](./personnel-location-anomaly) - 人员定位信号异常
- [设备巡检到期预警规则 →](./inspection-overdue-alert) - 计划任务到期提醒
- [传感器数据采集规则 →](./sensor-anomaly-monitoring) - 传感器数据采集与异常检测

## 实施指南

### 步骤1:配置规则文件
```bash
# 创建规则文件目录
mkdir -p .cursor/rules

# 复制规则文件
cp environment-monitoring-alert.mdc .cursor/rules/

步骤2:配置阈值参数

typescript
// config/monitoring-rules.ts
export const MONITORING_CONFIGS = {
  gas: GAS_MONITORING_CONFIG,
  transformer: TRANSFORMER_TEMP_CONFIG,
  coldChain: COLD_CHAIN_TEMP_CONFIG,
  waterLevel: WATER_LEVEL_CONFIG
};

步骤3:在Cursor中使用

在Cursor中告诉AI:
"参考 environment-monitoring-alert.mdc 中的业务规则,
实现瓦斯浓度监测与预警功能"

AI会基于规则生成准确的判断逻辑、报警逻辑等。

步骤4:测试验证

bash
# 运行单元测试
npm test -- environment-monitoring

# 模拟异常场景
npm run simulate:gas-alert

← 返回Cursor Skills列表 | 查看使用示例 →

基于 AI 辅助开发,快速、灵活、可靠