Skip to content

人员定位异常监测规则

适用于矿山、建筑、物流等场景的人员定位信号异常监测与应急响应。

规则文件内容

请复制以下内容,保存为 .cursor/rules/personnel-location-anomaly.mdc

markdown
---
description: 人员定位信号异常监测与应急响应规则
globs: src/modules/location/**, src/modules/alert/**, src/modules/emergency/**
---

# 人员定位异常监测规则

## 1. 核心原则
- **实时监测**:每秒检查所有在岗人员的定位数据。
- **快速响应**:信号消失超过阈值立即报警,不等待人工发现。
- **分级处理**:根据异常持续时间自动升级,确保及时处置。
- **闭环管理**:所有异常事件必须记录处置过程和结果。

## 2. 异常判定逻辑

### 2.1 信号消失检测
$$ 信号消失时长 = 当前时间 - 最后信号时间 $$

### 2.2 判定规则
| 时长范围 | 严重程度 | 处理动作 |
| :--- | :--- | :--- |
| **≤ 3分钟** | 正常 | 无动作 |
| **3-10分钟** | 警告 (warning) | 立即报警,推送调度室 |
| **> 10分钟** | 严重 (critical) | 升级报警,推送安全科长 |
| **> 15分钟** | 紧急 (emergency) | 启动应急预案 |

### 2.3 自动响应规则
**立即响应(0分钟):**
1. 推送报警到调度室大屏、调度员手机、安全科长手机
2. 显示人员信息、最后位置、轨迹回放
3. 显示附近500米内的其他人员列表

**升级响应(10分钟未处理):**
1. 推送到安全科科长、值班矿长
2. 标记为"未处理"状态

**应急响应(15分钟未确认):**
1. 启动应急预案
2. 推送到矿长、安全科、救护队
3. 自动调取监控录像、通知附近人员

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

### 3.1 异常检测函数
```typescript
/**
 * 检测人员定位信号是否异常
 * @param worker 人员信息
 * @param currentTime 当前时间
 * @param threshold 阈值(秒,默认180秒=3分钟)
 * @returns 异常检测结果
 */
export function checkLocationAnomaly(
  worker: Worker,
  currentTime: Date,
  threshold: number = 180
): AnomalyResult {
  const lastSignalTime = worker.lastLocationUpdate;
  const duration = (currentTime.getTime() - lastSignalTime.getTime()) / 1000;

  if (duration <= threshold) {
    return { isAnomalous: false };
  }

  return {
    isAnomalous: true,
    duration,
    severity: duration > 600 ? 'critical' : 'warning',
    lastLocation: worker.lastKnownLocation
  };
}

3.2 自动报警函数

typescript
/**
 * 触发分级报警
 * @param anomaly 异常事件
 */
export async function triggerAlert(anomaly: AnomalyEvent): Promise<void> {
  const duration = anomaly.duration;

  // 立即报警(3分钟)
  if (duration >= 180) {
    await alertService.push({
      channels: ['大屏', '手机APP', '短信'],
      priority: 'HIGH',
      message: `人员定位异常:${anomaly.workerName}信号消失${Math.floor(duration / 60)}分钟`,
      data: {
        workerInfo: anomaly.worker,
        lastLocation: anomaly.lastLocation,
        nearbyWorkers: await getNearbyWorkers(anomaly.lastLocation, 500)
      }
    });
  }

  // 升级报警(10分钟)
  if (duration >= 600 && anomaly.status === 'PENDING') {
    await alertService.push({
      channels: ['安全科科长', '值班矿长'],
      priority: 'CRITICAL',
      message: `人员定位异常未处理:${anomaly.workerName}信号消失${Math.floor(duration / 60)}分钟`
    });
  }

  // 启动应急预案(15分钟)
  if (duration >= 900 && anomaly.status === 'PENDING') {
    await emergencyService.trigger({
      plan: 'PERSONNEL_MISSING',
      notifyTo: ['矿长', '安全科', '救护队'],
      autoActions: ['调取监控录像', '通知附近人员', '准备救援设备']
    });
  }
}

3.3 处置闭环函数

typescript
/**
 * 记录异常处置过程
 * @param anomalyId 异常事件ID
 * @param disposal 处置信息
 */
export async function recordDisposal(
  anomalyId: string,
  disposal: DisposalInfo
): Promise<void> {
  // 必须记录的字段
  const requiredFields = ['cause', 'actions', 'result', 'resolvedBy'];
  for (const field of requiredFields) {
    if (!disposal[field]) {
      throw new Error(`处置记录缺少必填字段: ${field}`);
    }
  }

  // 更新异常事件状态
  await db.anomalyEvents.update(anomalyId, {
    status: 'RESOLVED',
    disposal: {
      ...disposal,
      resolvedAt: new Date()
    }
  });

  // 自动归档到安全台账
  await safetyArchive.add({
    type: 'LOCATION_ANOMALY',
    eventId: anomalyId,
    disposal
  });
}

4. 数据模型约束

4.1 人员定位记录

typescript
interface LocationRecord {
  id: string;
  workerId: string;           // 人员ID
  workerName: string;         // 姓名
  area: string;               // 作业区域
  coordinates: { x: number; y: number; z: number };
  timestamp: Date;
  signalStrength: number;     // 信号强度
}

4.2 异常事件记录

typescript
interface AnomalyEvent {
  id: string;
  workerId: string;
  workerName: string;
  anomalyType: 'SIGNAL_LOST';
  detectedAt: Date;           // 检测到异常的时间
  lastSignalAt: Date;         // 最后信号时间
  duration: number;           // 持续时长(秒)
  lastLocation: LocationRecord;
  status: 'PENDING' | 'CONFIRMED' | 'RESOLVED';

  // 处置记录
  disposal?: {
    confirmedBy: string;      // 确认人
    confirmedAt: Date;
    verifiedBy: string;       // 核实人
    verifiedAt: Date;
    cause: string;            // 异常原因
    actions: string[];        // 处置措施
    result: string;           // 处置结果
    resolvedAt: Date;
  };
}

5. 开发注意事项

  1. 阈值可配置:不要硬编码3分钟,支持运营人员配置不同场景的阈值。
  2. 误报过滤:排除已出井人员、休息区人员、设备维护中的人员。
  3. 推送确认:报警推送必须有确认机制,未确认则持续推送。
  4. 数据留痕:所有异常事件和处置过程必须完整记录,不可删除。
  5. 性能优化:实时监测需要优化查询性能,建议使用Redis缓存最新定位数据。

6. 测试用例

6.1 正常场景

  • 人员定位信号正常更新(每秒一次)→ 无报警

6.2 异常场景

  • 信号消失3分钟 → 触发警告报警
  • 信号消失10分钟且未处理 → 触发升级报警
  • 信号消失15分钟且未确认 → 启动应急预案

6.3 边界场景

  • 人员刚出井(状态已更新为"已出井")→ 不触发报警
  • 人员在休息区(区域标记为"休息区")→ 不触发报警
  • 设备维护中(定位卡更换)→ 不触发报警

## 适用场景

- **矿山井下作业**:监测井下人员定位信号,防止人员遇险。
- **建筑施工现场**:监测工人进入危险区域后的定位信号。
- **物流配送**:监测配送员长时间停留或失联。
- **医院运送**:监测运送人员长时间未完成任务。

## 技术迁移

### 复用已有资产
- **医废场景:GPS轨迹验证规则** - 复用规则引擎框架、报警推送逻辑
- **医废场景:超期预警规则** - 复用时间窗口判断、升级机制

### 差异点
- 定位技术:GPS(室外)→ UWB/基站定位(井下/室内)
- 异常判断:偏离路线 > 50米 → 信号消失 > 3分钟
- 数据采集:4G网络实时上传 → 本地网络(井下无4G)

### 技术复用度
- 规则引擎逻辑:100%复用
- 报警推送逻辑:100%复用
- 数据采集层:需要适配UWB/基站定位设备(15%新开发)

## 相关资产

- [环境监测异常预警规则 →](./environment-monitoring-alert) - 传感器数据异常监测
- [设备巡检到期预警规则 →](./inspection-overdue-alert) - 计划任务到期提醒
- [GPS轨迹验证规则 →](./gps-trajectory-validation) - 路线偏离检测

## 实施指南

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

# 复制规则文件
cp personnel-location-anomaly.mdc .cursor/rules/

步骤2:配置阈值参数

typescript
// config/anomaly-rules.ts
export const LOCATION_ANOMALY_CONFIG = {
  signalLostThreshold: 180,      // 3分钟(可调整)
  escalationTime_1: 600,         // 10分钟升级
  escalationTime_2: 900,         // 15分钟启动应急预案
  nearbyRadius: 500,             // 附近人员搜索半径(米)
};

步骤3:在Cursor中使用

在Cursor中告诉AI:
"参考 personnel-location-anomaly.mdc 中的业务规则,
实现人员定位异常监测功能"

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

步骤4:测试验证

bash
# 运行单元测试
npm test -- location-anomaly

# 模拟异常场景
npm run simulate:signal-lost

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

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