370 lines
10 KiB
JavaScript
370 lines
10 KiB
JavaScript
|
|
/**
|
|||
|
|
* Swagger API文档配置
|
|||
|
|
* @file swagger-config.js
|
|||
|
|
* @description 配置Swagger API文档,包含智能耳标预警和智能项圈预警接口
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const swaggerJSDoc = require('swagger-jsdoc');
|
|||
|
|
|
|||
|
|
const options = {
|
|||
|
|
definition: {
|
|||
|
|
openapi: '3.0.0',
|
|||
|
|
info: {
|
|||
|
|
title: '智能预警系统 API',
|
|||
|
|
version: '1.0.0',
|
|||
|
|
description: '智能耳标预警和智能项圈预警系统API文档',
|
|||
|
|
contact: {
|
|||
|
|
name: '开发团队',
|
|||
|
|
email: 'dev@example.com'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
servers: [
|
|||
|
|
{
|
|||
|
|
url: 'http://localhost:5350/api',
|
|||
|
|
description: '开发环境'
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
tags: [
|
|||
|
|
{
|
|||
|
|
name: '智能耳标预警',
|
|||
|
|
description: '智能耳标预警相关接口'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: '智能项圈预警',
|
|||
|
|
description: '智能项圈预警相关接口'
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
components: {
|
|||
|
|
schemas: {
|
|||
|
|
EartagAlert: {
|
|||
|
|
type: 'object',
|
|||
|
|
properties: {
|
|||
|
|
id: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警ID',
|
|||
|
|
example: '123_offline'
|
|||
|
|
},
|
|||
|
|
deviceId: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '设备ID',
|
|||
|
|
example: 123
|
|||
|
|
},
|
|||
|
|
deviceName: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '设备名称',
|
|||
|
|
example: 'EARTAG001'
|
|||
|
|
},
|
|||
|
|
eartagNumber: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '耳标编号',
|
|||
|
|
example: 'EARTAG001'
|
|||
|
|
},
|
|||
|
|
alertType: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警类型',
|
|||
|
|
enum: ['battery', 'offline', 'temperature', 'movement'],
|
|||
|
|
example: 'offline'
|
|||
|
|
},
|
|||
|
|
alertLevel: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警级别',
|
|||
|
|
enum: ['high', 'medium', 'low'],
|
|||
|
|
example: 'high'
|
|||
|
|
},
|
|||
|
|
alertTime: {
|
|||
|
|
type: 'string',
|
|||
|
|
format: 'date-time',
|
|||
|
|
description: '预警时间',
|
|||
|
|
example: '2024-01-15 10:30:00'
|
|||
|
|
},
|
|||
|
|
battery: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '设备电量',
|
|||
|
|
example: 85
|
|||
|
|
},
|
|||
|
|
temperature: {
|
|||
|
|
type: 'number',
|
|||
|
|
description: '设备温度',
|
|||
|
|
example: 25.5
|
|||
|
|
},
|
|||
|
|
dailySteps: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '当日步数',
|
|||
|
|
example: 0
|
|||
|
|
},
|
|||
|
|
totalSteps: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '总步数',
|
|||
|
|
example: 1500
|
|||
|
|
},
|
|||
|
|
yesterdaySteps: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '昨日步数',
|
|||
|
|
example: 1500
|
|||
|
|
},
|
|||
|
|
deviceStatus: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '设备状态',
|
|||
|
|
example: '离线'
|
|||
|
|
},
|
|||
|
|
gpsSignal: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: 'GPS信号',
|
|||
|
|
example: '无'
|
|||
|
|
},
|
|||
|
|
movementStatus: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '运动状态',
|
|||
|
|
example: '静止'
|
|||
|
|
},
|
|||
|
|
description: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警描述',
|
|||
|
|
example: '设备已离线超过30分钟'
|
|||
|
|
},
|
|||
|
|
longitude: {
|
|||
|
|
type: 'number',
|
|||
|
|
description: '经度',
|
|||
|
|
example: 116.3974
|
|||
|
|
},
|
|||
|
|
latitude: {
|
|||
|
|
type: 'number',
|
|||
|
|
description: '纬度',
|
|||
|
|
example: 39.9093
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
CollarAlert: {
|
|||
|
|
type: 'object',
|
|||
|
|
properties: {
|
|||
|
|
id: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警ID',
|
|||
|
|
example: '123_offline'
|
|||
|
|
},
|
|||
|
|
deviceId: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '设备ID',
|
|||
|
|
example: 123
|
|||
|
|
},
|
|||
|
|
deviceName: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '设备名称',
|
|||
|
|
example: 'COLLAR001'
|
|||
|
|
},
|
|||
|
|
collarNumber: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '项圈编号',
|
|||
|
|
example: 'COLLAR001'
|
|||
|
|
},
|
|||
|
|
alertType: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警类型',
|
|||
|
|
enum: ['battery', 'offline', 'temperature', 'movement', 'wear'],
|
|||
|
|
example: 'offline'
|
|||
|
|
},
|
|||
|
|
alertLevel: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警级别',
|
|||
|
|
enum: ['high', 'medium', 'low'],
|
|||
|
|
example: 'high'
|
|||
|
|
},
|
|||
|
|
alertTime: {
|
|||
|
|
type: 'string',
|
|||
|
|
format: 'date-time',
|
|||
|
|
description: '预警时间',
|
|||
|
|
example: '2024-01-15 10:30:00'
|
|||
|
|
},
|
|||
|
|
battery: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '设备电量',
|
|||
|
|
example: 85
|
|||
|
|
},
|
|||
|
|
temperature: {
|
|||
|
|
type: 'number',
|
|||
|
|
description: '设备温度',
|
|||
|
|
example: 25.5
|
|||
|
|
},
|
|||
|
|
dailySteps: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '当日步数',
|
|||
|
|
example: 0
|
|||
|
|
},
|
|||
|
|
totalSteps: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '总步数',
|
|||
|
|
example: 1500
|
|||
|
|
},
|
|||
|
|
yesterdaySteps: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '昨日步数',
|
|||
|
|
example: 1500
|
|||
|
|
},
|
|||
|
|
deviceStatus: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '设备状态',
|
|||
|
|
example: '离线'
|
|||
|
|
},
|
|||
|
|
gpsSignal: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: 'GPS信号',
|
|||
|
|
example: '无'
|
|||
|
|
},
|
|||
|
|
wearStatus: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '佩戴状态',
|
|||
|
|
example: '未佩戴'
|
|||
|
|
},
|
|||
|
|
movementStatus: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '运动状态',
|
|||
|
|
example: '静止'
|
|||
|
|
},
|
|||
|
|
description: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '预警描述',
|
|||
|
|
example: '设备已离线超过30分钟'
|
|||
|
|
},
|
|||
|
|
longitude: {
|
|||
|
|
type: 'number',
|
|||
|
|
description: '经度',
|
|||
|
|
example: 116.3974
|
|||
|
|
},
|
|||
|
|
latitude: {
|
|||
|
|
type: 'number',
|
|||
|
|
description: '纬度',
|
|||
|
|
example: 39.9093
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
AlertStats: {
|
|||
|
|
type: 'object',
|
|||
|
|
properties: {
|
|||
|
|
totalDevices: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '设备总数',
|
|||
|
|
example: 150
|
|||
|
|
},
|
|||
|
|
lowBattery: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '低电量预警数量',
|
|||
|
|
example: 12
|
|||
|
|
},
|
|||
|
|
offline: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '离线预警数量',
|
|||
|
|
example: 8
|
|||
|
|
},
|
|||
|
|
highTemperature: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '高温预警数量',
|
|||
|
|
example: 5
|
|||
|
|
},
|
|||
|
|
lowTemperature: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '低温预警数量',
|
|||
|
|
example: 3
|
|||
|
|
},
|
|||
|
|
abnormalMovement: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '异常运动预警数量',
|
|||
|
|
example: 7
|
|||
|
|
},
|
|||
|
|
wearOff: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '项圈脱落预警数量(仅项圈)',
|
|||
|
|
example: 2
|
|||
|
|
},
|
|||
|
|
totalAlerts: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '预警总数',
|
|||
|
|
example: 35
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
ApiResponse: {
|
|||
|
|
type: 'object',
|
|||
|
|
properties: {
|
|||
|
|
success: {
|
|||
|
|
type: 'boolean',
|
|||
|
|
description: '请求是否成功',
|
|||
|
|
example: true
|
|||
|
|
},
|
|||
|
|
data: {
|
|||
|
|
type: 'object',
|
|||
|
|
description: '响应数据'
|
|||
|
|
},
|
|||
|
|
message: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '响应消息',
|
|||
|
|
example: '操作成功'
|
|||
|
|
},
|
|||
|
|
total: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '数据总数(分页时使用)',
|
|||
|
|
example: 100
|
|||
|
|
},
|
|||
|
|
stats: {
|
|||
|
|
$ref: '#/components/schemas/AlertStats'
|
|||
|
|
},
|
|||
|
|
pagination: {
|
|||
|
|
type: 'object',
|
|||
|
|
properties: {
|
|||
|
|
page: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '当前页码',
|
|||
|
|
example: 1
|
|||
|
|
},
|
|||
|
|
limit: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '每页数量',
|
|||
|
|
example: 10
|
|||
|
|
},
|
|||
|
|
total: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '总数据量',
|
|||
|
|
example: 100
|
|||
|
|
},
|
|||
|
|
pages: {
|
|||
|
|
type: 'integer',
|
|||
|
|
description: '总页数',
|
|||
|
|
example: 10
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
ErrorResponse: {
|
|||
|
|
type: 'object',
|
|||
|
|
properties: {
|
|||
|
|
success: {
|
|||
|
|
type: 'boolean',
|
|||
|
|
description: '请求是否成功',
|
|||
|
|
example: false
|
|||
|
|
},
|
|||
|
|
message: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '错误消息',
|
|||
|
|
example: '请求失败'
|
|||
|
|
},
|
|||
|
|
error: {
|
|||
|
|
type: 'string',
|
|||
|
|
description: '详细错误信息',
|
|||
|
|
example: '具体错误描述'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
apis: [
|
|||
|
|
'./routes/smart-alerts.js',
|
|||
|
|
'./controllers/smartEartagAlertController.js',
|
|||
|
|
'./controllers/smartCollarAlertController.js'
|
|||
|
|
]
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const specs = swaggerJSDoc(options);
|
|||
|
|
|
|||
|
|
module.exports = specs;
|