人员定位异常监测规则
适用于矿山、建筑、物流等场景的人员定位信号异常监测与应急响应。
规则文件内容
请复制以下内容,保存为 .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. 开发注意事项
- 阈值可配置:不要硬编码3分钟,支持运营人员配置不同场景的阈值。
- 误报过滤:排除已出井人员、休息区人员、设备维护中的人员。
- 推送确认:报警推送必须有确认机制,未确认则持续推送。
- 数据留痕:所有异常事件和处置过程必须完整记录,不可删除。
- 性能优化:实时监测需要优化查询性能,建议使用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
