329 lines
8.6 KiB
JavaScript
329 lines
8.6 KiB
JavaScript
/**
|
|
* 智能耳标预警API使用示例
|
|
* @file smart-eartag-alert-usage.js
|
|
* @description 展示如何在其他程序中调用智能耳标预警API
|
|
*/
|
|
|
|
const axios = require('axios');
|
|
|
|
// 配置API基础URL
|
|
const API_BASE_URL = 'http://localhost:5350/api/smart-alerts/public';
|
|
|
|
// 创建API客户端类
|
|
class SmartEartagAlertClient {
|
|
constructor(baseURL = API_BASE_URL) {
|
|
this.client = axios.create({
|
|
baseURL,
|
|
timeout: 10000,
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取预警统计
|
|
*/
|
|
async getAlertStats() {
|
|
try {
|
|
const response = await this.client.get('/eartag/stats');
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('获取预警统计失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取预警列表
|
|
* @param {Object} options - 查询选项
|
|
*/
|
|
async getAlerts(options = {}) {
|
|
try {
|
|
const params = {
|
|
page: options.page || 1,
|
|
limit: options.limit || 10,
|
|
search: options.search,
|
|
alertType: options.alertType,
|
|
alertLevel: options.alertLevel,
|
|
status: options.status,
|
|
startDate: options.startDate,
|
|
endDate: options.endDate
|
|
};
|
|
|
|
const response = await this.client.get('/eartag', { params });
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('获取预警列表失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取预警详情
|
|
* @param {string} alertId - 预警ID
|
|
*/
|
|
async getAlertById(alertId) {
|
|
try {
|
|
const response = await this.client.get(`/eartag/${alertId}`);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('获取预警详情失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 处理预警
|
|
* @param {string} alertId - 预警ID
|
|
* @param {Object} data - 处理数据
|
|
*/
|
|
async handleAlert(alertId, data = {}) {
|
|
try {
|
|
const response = await this.client.post(`/eartag/${alertId}/handle`, data);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('处理预警失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 批量处理预警
|
|
* @param {Array} alertIds - 预警ID列表
|
|
* @param {Object} data - 处理数据
|
|
*/
|
|
async batchHandleAlerts(alertIds, data = {}) {
|
|
try {
|
|
const requestData = {
|
|
alertIds,
|
|
...data
|
|
};
|
|
const response = await this.client.post('/eartag/batch-handle', requestData);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('批量处理预警失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 导出预警数据
|
|
* @param {Object} options - 导出选项
|
|
*/
|
|
async exportAlerts(options = {}) {
|
|
try {
|
|
const params = {
|
|
search: options.search,
|
|
alertType: options.alertType,
|
|
alertLevel: options.alertLevel,
|
|
startDate: options.startDate,
|
|
endDate: options.endDate,
|
|
format: options.format || 'json'
|
|
};
|
|
|
|
const response = await this.client.get('/eartag/export', { params });
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('导出预警数据失败:', error.message);
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 使用示例
|
|
async function demonstrateUsage() {
|
|
console.log('🚀 智能耳标预警API使用示例\n');
|
|
|
|
const client = new SmartEartagAlertClient();
|
|
|
|
try {
|
|
// 1. 获取预警统计
|
|
console.log('1. 获取预警统计...');
|
|
const stats = await client.getAlertStats();
|
|
console.log('预警统计:', stats.data);
|
|
console.log('');
|
|
|
|
// 2. 获取预警列表
|
|
console.log('2. 获取预警列表...');
|
|
const alerts = await client.getAlerts({
|
|
page: 1,
|
|
limit: 5,
|
|
alertType: 'battery' // 只获取低电量预警
|
|
});
|
|
console.log(`找到 ${alerts.total} 条预警,当前页显示 ${alerts.data.length} 条`);
|
|
console.log('');
|
|
|
|
// 3. 获取预警详情
|
|
if (alerts.data.length > 0) {
|
|
console.log('3. 获取预警详情...');
|
|
const alertId = alerts.data[0].id;
|
|
const alertDetail = await client.getAlertById(alertId);
|
|
console.log('预警详情:', alertDetail.data);
|
|
console.log('');
|
|
|
|
// 4. 处理预警
|
|
console.log('4. 处理预警...');
|
|
const handleResult = await client.handleAlert(alertId, {
|
|
action: 'acknowledged',
|
|
notes: '通过API自动处理',
|
|
handler: 'system'
|
|
});
|
|
console.log('处理结果:', handleResult.data);
|
|
console.log('');
|
|
}
|
|
|
|
// 5. 批量处理预警
|
|
if (alerts.data.length > 1) {
|
|
console.log('5. 批量处理预警...');
|
|
const alertIds = alerts.data.slice(0, 2).map(alert => alert.id);
|
|
const batchResult = await client.batchHandleAlerts(alertIds, {
|
|
action: 'acknowledged',
|
|
notes: '批量处理',
|
|
handler: 'system'
|
|
});
|
|
console.log(`批量处理结果: 成功处理 ${batchResult.data.processedCount} 个预警`);
|
|
console.log('');
|
|
}
|
|
|
|
// 6. 导出预警数据
|
|
console.log('6. 导出预警数据...');
|
|
const exportData = await client.exportAlerts({
|
|
alertType: 'battery',
|
|
format: 'json'
|
|
});
|
|
console.log(`导出数据: ${exportData.data.length} 条预警记录`);
|
|
console.log('');
|
|
|
|
console.log('✅ 所有示例执行完成!');
|
|
|
|
} catch (error) {
|
|
console.error('❌ 示例执行失败:', error.message);
|
|
}
|
|
}
|
|
|
|
// 高级使用示例:监控预警变化
|
|
class AlertMonitor {
|
|
constructor(client, options = {}) {
|
|
this.client = client;
|
|
this.interval = options.interval || 30000; // 30秒检查一次
|
|
this.lastStats = null;
|
|
this.callbacks = {
|
|
onNewAlert: options.onNewAlert || (() => {}),
|
|
onAlertChange: options.onAlertChange || (() => {}),
|
|
onError: options.onError || (() => {})
|
|
};
|
|
}
|
|
|
|
start() {
|
|
console.log('🔍 开始监控预警变化...');
|
|
this.monitorInterval = setInterval(() => {
|
|
this.checkAlerts();
|
|
}, this.interval);
|
|
}
|
|
|
|
stop() {
|
|
if (this.monitorInterval) {
|
|
clearInterval(this.monitorInterval);
|
|
console.log('⏹️ 停止监控预警变化');
|
|
}
|
|
}
|
|
|
|
async checkAlerts() {
|
|
try {
|
|
const stats = await this.client.getAlertStats();
|
|
|
|
if (this.lastStats) {
|
|
// 检查是否有新的预警
|
|
const newAlerts = stats.data.totalAlerts - this.lastStats.totalAlerts;
|
|
if (newAlerts > 0) {
|
|
console.log(`🚨 发现 ${newAlerts} 个新预警!`);
|
|
this.callbacks.onNewAlert(newAlerts, stats.data);
|
|
}
|
|
|
|
// 检查各类预警数量变化
|
|
const changes = this.detectChanges(this.lastStats, stats.data);
|
|
if (changes.length > 0) {
|
|
console.log('📊 预警统计变化:', changes);
|
|
this.callbacks.onAlertChange(changes, stats.data);
|
|
}
|
|
}
|
|
|
|
this.lastStats = stats.data;
|
|
} catch (error) {
|
|
console.error('监控预警失败:', error.message);
|
|
this.callbacks.onError(error);
|
|
}
|
|
}
|
|
|
|
detectChanges(oldStats, newStats) {
|
|
const changes = [];
|
|
const fields = ['lowBattery', 'offline', 'highTemperature', 'abnormalMovement'];
|
|
|
|
fields.forEach(field => {
|
|
const oldValue = oldStats[field] || 0;
|
|
const newValue = newStats[field] || 0;
|
|
const diff = newValue - oldValue;
|
|
|
|
if (diff !== 0) {
|
|
changes.push({
|
|
type: field,
|
|
oldValue,
|
|
newValue,
|
|
diff
|
|
});
|
|
}
|
|
});
|
|
|
|
return changes;
|
|
}
|
|
}
|
|
|
|
// 监控示例
|
|
async function demonstrateMonitoring() {
|
|
console.log('\n🔍 预警监控示例\n');
|
|
|
|
const client = new SmartEartagAlertClient();
|
|
const monitor = new AlertMonitor(client, {
|
|
interval: 10000, // 10秒检查一次
|
|
onNewAlert: (count, stats) => {
|
|
console.log(`🚨 发现 ${count} 个新预警!当前总计: ${stats.totalAlerts}`);
|
|
},
|
|
onAlertChange: (changes, stats) => {
|
|
changes.forEach(change => {
|
|
const direction = change.diff > 0 ? '增加' : '减少';
|
|
console.log(`📊 ${change.type} 预警${direction} ${Math.abs(change.diff)} 个`);
|
|
});
|
|
},
|
|
onError: (error) => {
|
|
console.error('监控错误:', error.message);
|
|
}
|
|
});
|
|
|
|
// 开始监控
|
|
monitor.start();
|
|
|
|
// 30秒后停止监控
|
|
setTimeout(() => {
|
|
monitor.stop();
|
|
console.log('监控示例结束');
|
|
}, 30000);
|
|
}
|
|
|
|
// 如果直接运行此文件
|
|
if (require.main === module) {
|
|
// 运行基本使用示例
|
|
demonstrateUsage().then(() => {
|
|
// 运行监控示例
|
|
return demonstrateMonitoring();
|
|
}).catch(console.error);
|
|
}
|
|
|
|
// 导出类和函数
|
|
module.exports = {
|
|
SmartEartagAlertClient,
|
|
AlertMonitor,
|
|
demonstrateUsage,
|
|
demonstrateMonitoring
|
|
};
|