773 lines
24 KiB
JavaScript
773 lines
24 KiB
JavaScript
/**
|
||
* 预警管理模块 Swagger 文档
|
||
* @file swagger-alerts.js
|
||
*/
|
||
|
||
const alertsPaths = {
|
||
// 获取所有预警
|
||
'/alerts': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '获取预警列表',
|
||
description: '分页获取系统中的所有预警信息',
|
||
security: [{ bearerAuth: [] }],
|
||
parameters: [
|
||
{
|
||
name: 'page',
|
||
in: 'query',
|
||
schema: { type: 'integer', default: 1 },
|
||
description: '页码'
|
||
},
|
||
{
|
||
name: 'limit',
|
||
in: 'query',
|
||
schema: { type: 'integer', default: 10 },
|
||
description: '每页数量'
|
||
},
|
||
{
|
||
name: 'search',
|
||
in: 'query',
|
||
schema: { type: 'string' },
|
||
description: '搜索关键词(预警标题、描述)'
|
||
},
|
||
{
|
||
name: 'type',
|
||
in: 'query',
|
||
schema: { type: 'string', enum: ['health', 'environment', 'device', 'security', 'breeding'] },
|
||
description: '预警类型筛选'
|
||
},
|
||
{
|
||
name: 'level',
|
||
in: 'query',
|
||
schema: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },
|
||
description: '预警级别筛选'
|
||
},
|
||
{
|
||
name: 'status',
|
||
in: 'query',
|
||
schema: { type: 'string', enum: ['pending', 'processing', 'resolved', 'ignored'] },
|
||
description: '预警状态筛选'
|
||
},
|
||
{
|
||
name: 'farmId',
|
||
in: 'query',
|
||
schema: { type: 'integer' },
|
||
description: '养殖场ID筛选'
|
||
}
|
||
],
|
||
responses: {
|
||
'200': {
|
||
description: '获取成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: {
|
||
type: 'array',
|
||
items: { $ref: '#/components/schemas/Alert' }
|
||
},
|
||
pagination: {
|
||
type: 'object',
|
||
properties: {
|
||
page: { type: 'integer' },
|
||
limit: { type: 'integer' },
|
||
total: { type: 'integer' },
|
||
totalPages: { type: 'integer' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
'401': {
|
||
description: '未授权',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
post: {
|
||
tags: ['预警管理'],
|
||
summary: '创建新预警',
|
||
description: '创建新的预警记录',
|
||
security: [{ bearerAuth: [] }],
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
required: ['title', 'type', 'level', 'farmId'],
|
||
properties: {
|
||
title: { type: 'string', description: '预警标题' },
|
||
description: { type: 'string', description: '预警描述' },
|
||
type: {
|
||
type: 'string',
|
||
enum: ['health', 'environment', 'device', 'security', 'breeding'],
|
||
description: '预警类型:health-健康,environment-环境,device-设备,security-安全,breeding-繁殖'
|
||
},
|
||
level: {
|
||
type: 'string',
|
||
enum: ['low', 'medium', 'high', 'critical'],
|
||
description: '预警级别:low-低,medium-中,high-高,critical-紧急'
|
||
},
|
||
farmId: { type: 'integer', description: '养殖场ID' },
|
||
animalId: { type: 'integer', description: '动物ID(可选)' },
|
||
deviceId: { type: 'integer', description: '设备ID(可选)' },
|
||
threshold: { type: 'number', description: '阈值' },
|
||
currentValue: { type: 'number', description: '当前值' },
|
||
location: { type: 'string', description: '位置信息' },
|
||
metadata: { type: 'object', description: '额外元数据' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
responses: {
|
||
'201': {
|
||
description: '创建成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
message: { type: 'string', example: '预警创建成功' },
|
||
data: { $ref: '#/components/schemas/Alert' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
'400': {
|
||
description: '请求参数错误',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
// 获取公共预警数据
|
||
'/alerts/public': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '获取公共预警数据',
|
||
description: '获取可公开访问的预警基本信息',
|
||
security: [], // 公共接口不需要认证
|
||
responses: {
|
||
'200': {
|
||
description: '获取成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: {
|
||
type: 'array',
|
||
items: {
|
||
type: 'object',
|
||
properties: {
|
||
id: { type: 'integer' },
|
||
title: { type: 'string' },
|
||
type: { type: 'string' },
|
||
level: { type: 'string' },
|
||
status: { type: 'string' },
|
||
createdAt: { type: 'string', format: 'date-time' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
// 搜索预警
|
||
'/alerts/search': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '搜索预警',
|
||
description: '根据养殖场名称等关键词搜索预警',
|
||
security: [{ bearerAuth: [] }],
|
||
parameters: [
|
||
{
|
||
name: 'q',
|
||
in: 'query',
|
||
required: true,
|
||
schema: { type: 'string' },
|
||
description: '搜索关键词'
|
||
},
|
||
{
|
||
name: 'limit',
|
||
in: 'query',
|
||
schema: { type: 'integer', default: 10 },
|
||
description: '返回结果数量限制'
|
||
}
|
||
],
|
||
responses: {
|
||
'200': {
|
||
description: '搜索成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: {
|
||
type: 'array',
|
||
items: { $ref: '#/components/schemas/Alert' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
// 获取预警详情
|
||
'/alerts/{id}': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '获取预警详情',
|
||
description: '根据预警ID获取详细信息',
|
||
parameters: [
|
||
{
|
||
name: 'id',
|
||
in: 'path',
|
||
required: true,
|
||
schema: { type: 'integer' },
|
||
description: '预警ID'
|
||
}
|
||
],
|
||
responses: {
|
||
'200': {
|
||
description: '获取成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: { $ref: '#/components/schemas/Alert' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
'404': {
|
||
description: '预警不存在',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
put: {
|
||
tags: ['预警管理'],
|
||
summary: '更新预警信息',
|
||
description: '更新指定预警的信息',
|
||
security: [{ bearerAuth: [] }],
|
||
parameters: [
|
||
{
|
||
name: 'id',
|
||
in: 'path',
|
||
required: true,
|
||
schema: { type: 'integer' },
|
||
description: '预警ID'
|
||
}
|
||
],
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
title: { type: 'string', description: '预警标题' },
|
||
description: { type: 'string', description: '预警描述' },
|
||
type: {
|
||
type: 'string',
|
||
enum: ['health', 'environment', 'device', 'security', 'breeding'],
|
||
description: '预警类型'
|
||
},
|
||
level: {
|
||
type: 'string',
|
||
enum: ['low', 'medium', 'high', 'critical'],
|
||
description: '预警级别'
|
||
},
|
||
status: {
|
||
type: 'string',
|
||
enum: ['pending', 'processing', 'resolved', 'ignored'],
|
||
description: '预警状态'
|
||
},
|
||
threshold: { type: 'number', description: '阈值' },
|
||
currentValue: { type: 'number', description: '当前值' },
|
||
location: { type: 'string', description: '位置信息' },
|
||
handlerNotes: { type: 'string', description: '处理备注' },
|
||
metadata: { type: 'object', description: '额外元数据' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
responses: {
|
||
'200': {
|
||
description: '更新成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
message: { type: 'string', example: '预警信息更新成功' },
|
||
data: { $ref: '#/components/schemas/Alert' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
'400': {
|
||
description: '请求参数错误',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
},
|
||
'404': {
|
||
description: '预警不存在',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
delete: {
|
||
tags: ['预警管理'],
|
||
summary: '删除预警',
|
||
description: '删除指定预警(软删除)',
|
||
security: [{ bearerAuth: [] }],
|
||
parameters: [
|
||
{
|
||
name: 'id',
|
||
in: 'path',
|
||
required: true,
|
||
schema: { type: 'integer' },
|
||
description: '预警ID'
|
||
}
|
||
],
|
||
responses: {
|
||
'200': {
|
||
description: '删除成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
message: { type: 'string', example: '预警删除成功' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
'404': {
|
||
description: '预警不存在',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
// 更新预警状态
|
||
'/alerts/{id}/status': {
|
||
put: {
|
||
tags: ['预警管理'],
|
||
summary: '更新预警状态',
|
||
description: '更新指定预警的处理状态',
|
||
parameters: [
|
||
{
|
||
name: 'id',
|
||
in: 'path',
|
||
required: true,
|
||
schema: { type: 'integer' },
|
||
description: '预警ID'
|
||
}
|
||
],
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
required: ['status'],
|
||
properties: {
|
||
status: {
|
||
type: 'string',
|
||
enum: ['pending', 'processing', 'resolved', 'ignored'],
|
||
description: '预警状态'
|
||
},
|
||
handlerNotes: { type: 'string', description: '处理备注' },
|
||
handlerId: { type: 'integer', description: '处理人ID' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
responses: {
|
||
'200': {
|
||
description: '状态更新成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
message: { type: 'string', example: '预警状态更新成功' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
'400': {
|
||
description: '请求参数错误',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
},
|
||
'404': {
|
||
description: '预警不存在',
|
||
content: {
|
||
'application/json': {
|
||
schema: { $ref: '#/components/schemas/ErrorResponse' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
// 获取预警统计信息
|
||
'/alerts/stats/type': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '获取按类型统计的预警数据',
|
||
description: '获取各种预警类型的统计信息',
|
||
responses: {
|
||
'200': {
|
||
description: '获取成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: {
|
||
type: 'object',
|
||
properties: {
|
||
health: { type: 'integer', description: '健康预警数量' },
|
||
environment: { type: 'integer', description: '环境预警数量' },
|
||
device: { type: 'integer', description: '设备预警数量' },
|
||
security: { type: 'integer', description: '安全预警数量' },
|
||
breeding: { type: 'integer', description: '繁殖预警数量' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
'/alerts/stats/level': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '获取按级别统计的预警数据',
|
||
description: '获取各种预警级别的统计信息',
|
||
responses: {
|
||
'200': {
|
||
description: '获取成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: {
|
||
type: 'object',
|
||
properties: {
|
||
low: { type: 'integer', description: '低级预警数量' },
|
||
medium: { type: 'integer', description: '中级预警数量' },
|
||
high: { type: 'integer', description: '高级预警数量' },
|
||
critical: { type: 'integer', description: '紧急预警数量' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
'/alerts/stats/status': {
|
||
get: {
|
||
tags: ['预警管理'],
|
||
summary: '获取按状态统计的预警数据',
|
||
description: '获取各种预警状态的统计信息',
|
||
responses: {
|
||
'200': {
|
||
description: '获取成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
data: {
|
||
type: 'object',
|
||
properties: {
|
||
pending: { type: 'integer', description: '待处理预警数量' },
|
||
processing: { type: 'integer', description: '处理中预警数量' },
|
||
resolved: { type: 'integer', description: '已解决预警数量' },
|
||
ignored: { type: 'integer', description: '已忽略预警数量' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
// 批量操作预警
|
||
'/alerts/batch': {
|
||
post: {
|
||
tags: ['预警管理'],
|
||
summary: '批量操作预警',
|
||
description: '批量更新预警状态或删除预警',
|
||
security: [{ bearerAuth: [] }],
|
||
requestBody: {
|
||
required: true,
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
required: ['ids', 'action'],
|
||
properties: {
|
||
ids: {
|
||
type: 'array',
|
||
items: { type: 'integer' },
|
||
description: '预警ID列表'
|
||
},
|
||
action: {
|
||
type: 'string',
|
||
enum: ['resolve', 'ignore', 'delete', 'reopen'],
|
||
description: '操作类型:resolve-解决,ignore-忽略,delete-删除,reopen-重新打开'
|
||
},
|
||
handlerNotes: { type: 'string', description: '处理备注' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
responses: {
|
||
'200': {
|
||
description: '批量操作成功',
|
||
content: {
|
||
'application/json': {
|
||
schema: {
|
||
type: 'object',
|
||
properties: {
|
||
success: { type: 'boolean', example: true },
|
||
message: { type: 'string', example: '批量操作完成' },
|
||
data: {
|
||
type: 'object',
|
||
properties: {
|
||
successCount: { type: 'integer', description: '成功处理数量' },
|
||
failedCount: { type: 'integer', description: '失败数量' },
|
||
failedIds: {
|
||
type: 'array',
|
||
items: { type: 'integer' },
|
||
description: '失败的预警ID列表'
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
// 数据模型定义
|
||
const alertSchemas = {
|
||
Alert: {
|
||
type: 'object',
|
||
properties: {
|
||
id: { type: 'integer', description: '预警ID' },
|
||
title: { type: 'string', description: '预警标题' },
|
||
description: { type: 'string', description: '预警描述' },
|
||
type: {
|
||
type: 'string',
|
||
enum: ['health', 'environment', 'device', 'security', 'breeding'],
|
||
description: '预警类型:health-健康,environment-环境,device-设备,security-安全,breeding-繁殖'
|
||
},
|
||
level: {
|
||
type: 'string',
|
||
enum: ['low', 'medium', 'high', 'critical'],
|
||
description: '预警级别:low-低,medium-中,high-高,critical-紧急'
|
||
},
|
||
status: {
|
||
type: 'string',
|
||
enum: ['pending', 'processing', 'resolved', 'ignored'],
|
||
description: '预警状态:pending-待处理,processing-处理中,resolved-已解决,ignored-已忽略'
|
||
},
|
||
farmId: { type: 'integer', description: '养殖场ID' },
|
||
farmName: { type: 'string', description: '养殖场名称' },
|
||
animalId: { type: 'integer', description: '动物ID(可选)' },
|
||
animalEarNumber: { type: 'string', description: '动物耳标号(可选)' },
|
||
deviceId: { type: 'integer', description: '设备ID(可选)' },
|
||
deviceName: { type: 'string', description: '设备名称(可选)' },
|
||
threshold: { type: 'number', description: '阈值' },
|
||
currentValue: { type: 'number', description: '当前值' },
|
||
location: { type: 'string', description: '位置信息' },
|
||
handlerId: { type: 'integer', description: '处理人ID' },
|
||
handlerName: { type: 'string', description: '处理人姓名' },
|
||
handlerNotes: { type: 'string', description: '处理备注' },
|
||
handledAt: { type: 'string', format: 'date-time', description: '处理时间' },
|
||
metadata: { type: 'object', description: '额外元数据' },
|
||
createdAt: { type: 'string', format: 'date-time', description: '创建时间' },
|
||
updatedAt: { type: 'string', format: 'date-time', description: '更新时间' }
|
||
}
|
||
},
|
||
|
||
AlertInput: {
|
||
type: 'object',
|
||
required: ['title', 'type', 'level', 'farmId'],
|
||
properties: {
|
||
title: { type: 'string', description: '预警标题' },
|
||
description: { type: 'string', description: '预警描述' },
|
||
type: {
|
||
type: 'string',
|
||
enum: ['health', 'environment', 'device', 'security', 'breeding'],
|
||
description: '预警类型'
|
||
},
|
||
level: {
|
||
type: 'string',
|
||
enum: ['low', 'medium', 'high', 'critical'],
|
||
description: '预警级别'
|
||
},
|
||
farmId: { type: 'integer', description: '养殖场ID' },
|
||
animalId: { type: 'integer', description: '动物ID(可选)' },
|
||
deviceId: { type: 'integer', description: '设备ID(可选)' },
|
||
threshold: { type: 'number', description: '阈值' },
|
||
currentValue: { type: 'number', description: '当前值' },
|
||
location: { type: 'string', description: '位置信息' },
|
||
metadata: { type: 'object', description: '额外元数据' }
|
||
}
|
||
},
|
||
|
||
AlertUpdate: {
|
||
type: 'object',
|
||
properties: {
|
||
title: { type: 'string', description: '预警标题' },
|
||
description: { type: 'string', description: '预警描述' },
|
||
type: {
|
||
type: 'string',
|
||
enum: ['health', 'environment', 'device', 'security', 'breeding'],
|
||
description: '预警类型'
|
||
},
|
||
level: {
|
||
type: 'string',
|
||
enum: ['low', 'medium', 'high', 'critical'],
|
||
description: '预警级别'
|
||
},
|
||
status: {
|
||
type: 'string',
|
||
enum: ['pending', 'processing', 'resolved', 'ignored'],
|
||
description: '预警状态'
|
||
},
|
||
threshold: { type: 'number', description: '阈值' },
|
||
currentValue: { type: 'number', description: '当前值' },
|
||
location: { type: 'string', description: '位置信息' },
|
||
handlerNotes: { type: 'string', description: '处理备注' },
|
||
metadata: { type: 'object', description: '额外元数据' }
|
||
}
|
||
},
|
||
|
||
AlertStats: {
|
||
type: 'object',
|
||
properties: {
|
||
totalAlerts: { type: 'integer', description: '总预警数' },
|
||
pendingAlerts: { type: 'integer', description: '待处理预警数' },
|
||
resolvedAlerts: { type: 'integer', description: '已解决预警数' },
|
||
criticalAlerts: { type: 'integer', description: '紧急预警数' },
|
||
todayAlerts: { type: 'integer', description: '今日新增预警数' },
|
||
byType: {
|
||
type: 'object',
|
||
properties: {
|
||
health: { type: 'integer' },
|
||
environment: { type: 'integer' },
|
||
device: { type: 'integer' },
|
||
security: { type: 'integer' },
|
||
breeding: { type: 'integer' }
|
||
}
|
||
},
|
||
byLevel: {
|
||
type: 'object',
|
||
properties: {
|
||
low: { type: 'integer' },
|
||
medium: { type: 'integer' },
|
||
high: { type: 'integer' },
|
||
critical: { type: 'integer' }
|
||
}
|
||
},
|
||
byStatus: {
|
||
type: 'object',
|
||
properties: {
|
||
pending: { type: 'integer' },
|
||
processing: { type: 'integer' },
|
||
resolved: { type: 'integer' },
|
||
ignored: { type: 'integer' }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
module.exports = { alertsPaths, alertSchemas }; |