增加两个批量查询接口
This commit is contained in:
274
docs/docs.go
274
docs/docs.go
@@ -146,6 +146,126 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/v1/alarm/threshold/area": {
|
"/api/v1/alarm/threshold/area": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "根据过滤条件和分页参数查询区域阈值告警列表",
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"告警管理"
|
||||||
|
],
|
||||||
|
"summary": "批量查询区域阈值告警",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "按区域主控ID过滤",
|
||||||
|
"name": "area_controller_id",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"Debug",
|
||||||
|
"Info",
|
||||||
|
"Warn",
|
||||||
|
"Error",
|
||||||
|
"DPanic",
|
||||||
|
"Panic",
|
||||||
|
"Fatal"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"DebugLevel",
|
||||||
|
"InfoLevel",
|
||||||
|
"WarnLevel",
|
||||||
|
"ErrorLevel",
|
||||||
|
"DPanicLevel",
|
||||||
|
"PanicLevel",
|
||||||
|
"FatalLevel"
|
||||||
|
],
|
||||||
|
"description": "按告警等级过滤",
|
||||||
|
"name": "level",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "排序字段,例如 \"id DESC\"",
|
||||||
|
"name": "order_by",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page_size",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-comments": {
|
||||||
|
"SensorTypeBatteryLevel": "电池电量",
|
||||||
|
"SensorTypeHumidity": "湿度",
|
||||||
|
"SensorTypeSignalMetrics": "信号强度",
|
||||||
|
"SensorTypeTemperature": "温度",
|
||||||
|
"SensorTypeWeight": "重量"
|
||||||
|
},
|
||||||
|
"x-enum-descriptions": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"SensorTypeSignalMetrics",
|
||||||
|
"SensorTypeBatteryLevel",
|
||||||
|
"SensorTypeTemperature",
|
||||||
|
"SensorTypeHumidity",
|
||||||
|
"SensorTypeWeight"
|
||||||
|
],
|
||||||
|
"description": "按传感器类型过滤",
|
||||||
|
"name": "sensor_type",
|
||||||
|
"in": "query"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "成功获取区域阈值告警列表",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/controller.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/dto.ListAreaThresholdAlarmResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"post": {
|
"post": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@@ -307,6 +427,126 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/v1/alarm/threshold/device": {
|
"/api/v1/alarm/threshold/device": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "根据过滤条件和分页参数查询设备阈值告警列表",
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"告警管理"
|
||||||
|
],
|
||||||
|
"summary": "批量查询设备阈值告警",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "按设备ID过滤",
|
||||||
|
"name": "device_id",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"Debug",
|
||||||
|
"Info",
|
||||||
|
"Warn",
|
||||||
|
"Error",
|
||||||
|
"DPanic",
|
||||||
|
"Panic",
|
||||||
|
"Fatal"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"DebugLevel",
|
||||||
|
"InfoLevel",
|
||||||
|
"WarnLevel",
|
||||||
|
"ErrorLevel",
|
||||||
|
"DPanicLevel",
|
||||||
|
"PanicLevel",
|
||||||
|
"FatalLevel"
|
||||||
|
],
|
||||||
|
"description": "按告警等级过滤",
|
||||||
|
"name": "level",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "排序字段,例如 \"id DESC\"",
|
||||||
|
"name": "order_by",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page_size",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-comments": {
|
||||||
|
"SensorTypeBatteryLevel": "电池电量",
|
||||||
|
"SensorTypeHumidity": "湿度",
|
||||||
|
"SensorTypeSignalMetrics": "信号强度",
|
||||||
|
"SensorTypeTemperature": "温度",
|
||||||
|
"SensorTypeWeight": "重量"
|
||||||
|
},
|
||||||
|
"x-enum-descriptions": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"SensorTypeSignalMetrics",
|
||||||
|
"SensorTypeBatteryLevel",
|
||||||
|
"SensorTypeTemperature",
|
||||||
|
"SensorTypeHumidity",
|
||||||
|
"SensorTypeWeight"
|
||||||
|
],
|
||||||
|
"description": "按传感器类型过滤",
|
||||||
|
"name": "sensor_type",
|
||||||
|
"in": "query"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "成功获取设备阈值告警列表",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/controller.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/dto.ListDeviceThresholdAlarmResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"post": {
|
"post": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@@ -5454,15 +5694,15 @@ const docTemplate = `{
|
|||||||
"alarm_code": {
|
"alarm_code": {
|
||||||
"$ref": "#/definitions/models.AlarmCode"
|
"$ref": "#/definitions/models.AlarmCode"
|
||||||
},
|
},
|
||||||
"alarm_details": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"alarm_summary": {
|
"alarm_summary": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"id": {
|
"id": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"json_details": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"level": {
|
"level": {
|
||||||
"$ref": "#/definitions/models.SeverityLevel"
|
"$ref": "#/definitions/models.SeverityLevel"
|
||||||
},
|
},
|
||||||
@@ -5500,6 +5740,20 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dto.ListAreaThresholdAlarmResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"list": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/dto.AreaThresholdAlarmDTO"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pagination": {
|
||||||
|
"$ref": "#/definitions/dto.PaginationDTO"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"dto.ListDeviceCommandLogResponse": {
|
"dto.ListDeviceCommandLogResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -5514,6 +5768,20 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dto.ListDeviceThresholdAlarmResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"list": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/dto.DeviceThresholdAlarmDTO"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pagination": {
|
||||||
|
"$ref": "#/definitions/dto.PaginationDTO"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"dto.ListFeedUsageRecordResponse": {
|
"dto.ListFeedUsageRecordResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|||||||
@@ -138,6 +138,126 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/v1/alarm/threshold/area": {
|
"/api/v1/alarm/threshold/area": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "根据过滤条件和分页参数查询区域阈值告警列表",
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"告警管理"
|
||||||
|
],
|
||||||
|
"summary": "批量查询区域阈值告警",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "按区域主控ID过滤",
|
||||||
|
"name": "area_controller_id",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"Debug",
|
||||||
|
"Info",
|
||||||
|
"Warn",
|
||||||
|
"Error",
|
||||||
|
"DPanic",
|
||||||
|
"Panic",
|
||||||
|
"Fatal"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"DebugLevel",
|
||||||
|
"InfoLevel",
|
||||||
|
"WarnLevel",
|
||||||
|
"ErrorLevel",
|
||||||
|
"DPanicLevel",
|
||||||
|
"PanicLevel",
|
||||||
|
"FatalLevel"
|
||||||
|
],
|
||||||
|
"description": "按告警等级过滤",
|
||||||
|
"name": "level",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "排序字段,例如 \"id DESC\"",
|
||||||
|
"name": "order_by",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page_size",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-comments": {
|
||||||
|
"SensorTypeBatteryLevel": "电池电量",
|
||||||
|
"SensorTypeHumidity": "湿度",
|
||||||
|
"SensorTypeSignalMetrics": "信号强度",
|
||||||
|
"SensorTypeTemperature": "温度",
|
||||||
|
"SensorTypeWeight": "重量"
|
||||||
|
},
|
||||||
|
"x-enum-descriptions": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"SensorTypeSignalMetrics",
|
||||||
|
"SensorTypeBatteryLevel",
|
||||||
|
"SensorTypeTemperature",
|
||||||
|
"SensorTypeHumidity",
|
||||||
|
"SensorTypeWeight"
|
||||||
|
],
|
||||||
|
"description": "按传感器类型过滤",
|
||||||
|
"name": "sensor_type",
|
||||||
|
"in": "query"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "成功获取区域阈值告警列表",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/controller.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/dto.ListAreaThresholdAlarmResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"post": {
|
"post": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@@ -299,6 +419,126 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/v1/alarm/threshold/device": {
|
"/api/v1/alarm/threshold/device": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"BearerAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "根据过滤条件和分页参数查询设备阈值告警列表",
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"告警管理"
|
||||||
|
],
|
||||||
|
"summary": "批量查询设备阈值告警",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "按设备ID过滤",
|
||||||
|
"name": "device_id",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"Debug",
|
||||||
|
"Info",
|
||||||
|
"Warn",
|
||||||
|
"Error",
|
||||||
|
"DPanic",
|
||||||
|
"Panic",
|
||||||
|
"Fatal"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"DebugLevel",
|
||||||
|
"InfoLevel",
|
||||||
|
"WarnLevel",
|
||||||
|
"ErrorLevel",
|
||||||
|
"DPanicLevel",
|
||||||
|
"PanicLevel",
|
||||||
|
"FatalLevel"
|
||||||
|
],
|
||||||
|
"description": "按告警等级过滤",
|
||||||
|
"name": "level",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "排序字段,例如 \"id DESC\"",
|
||||||
|
"name": "order_by",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"name": "page_size",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"x-enum-comments": {
|
||||||
|
"SensorTypeBatteryLevel": "电池电量",
|
||||||
|
"SensorTypeHumidity": "湿度",
|
||||||
|
"SensorTypeSignalMetrics": "信号强度",
|
||||||
|
"SensorTypeTemperature": "温度",
|
||||||
|
"SensorTypeWeight": "重量"
|
||||||
|
},
|
||||||
|
"x-enum-descriptions": [
|
||||||
|
"信号强度",
|
||||||
|
"电池电量",
|
||||||
|
"温度",
|
||||||
|
"湿度",
|
||||||
|
"重量"
|
||||||
|
],
|
||||||
|
"x-enum-varnames": [
|
||||||
|
"SensorTypeSignalMetrics",
|
||||||
|
"SensorTypeBatteryLevel",
|
||||||
|
"SensorTypeTemperature",
|
||||||
|
"SensorTypeHumidity",
|
||||||
|
"SensorTypeWeight"
|
||||||
|
],
|
||||||
|
"description": "按传感器类型过滤",
|
||||||
|
"name": "sensor_type",
|
||||||
|
"in": "query"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "成功获取设备阈值告警列表",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/controller.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/dto.ListDeviceThresholdAlarmResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"post": {
|
"post": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@@ -5446,15 +5686,15 @@
|
|||||||
"alarm_code": {
|
"alarm_code": {
|
||||||
"$ref": "#/definitions/models.AlarmCode"
|
"$ref": "#/definitions/models.AlarmCode"
|
||||||
},
|
},
|
||||||
"alarm_details": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"alarm_summary": {
|
"alarm_summary": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"id": {
|
"id": {
|
||||||
"type": "integer"
|
"type": "integer"
|
||||||
},
|
},
|
||||||
|
"json_details": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"level": {
|
"level": {
|
||||||
"$ref": "#/definitions/models.SeverityLevel"
|
"$ref": "#/definitions/models.SeverityLevel"
|
||||||
},
|
},
|
||||||
@@ -5492,6 +5732,20 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dto.ListAreaThresholdAlarmResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"list": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/dto.AreaThresholdAlarmDTO"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pagination": {
|
||||||
|
"$ref": "#/definitions/dto.PaginationDTO"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"dto.ListDeviceCommandLogResponse": {
|
"dto.ListDeviceCommandLogResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -5506,6 +5760,20 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dto.ListDeviceThresholdAlarmResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"list": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/dto.DeviceThresholdAlarmDTO"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pagination": {
|
||||||
|
"$ref": "#/definitions/dto.PaginationDTO"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"dto.ListFeedUsageRecordResponse": {
|
"dto.ListFeedUsageRecordResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|||||||
@@ -464,12 +464,12 @@ definitions:
|
|||||||
properties:
|
properties:
|
||||||
alarm_code:
|
alarm_code:
|
||||||
$ref: '#/definitions/models.AlarmCode'
|
$ref: '#/definitions/models.AlarmCode'
|
||||||
alarm_details:
|
|
||||||
type: string
|
|
||||||
alarm_summary:
|
alarm_summary:
|
||||||
type: string
|
type: string
|
||||||
id:
|
id:
|
||||||
type: integer
|
type: integer
|
||||||
|
json_details:
|
||||||
|
type: string
|
||||||
level:
|
level:
|
||||||
$ref: '#/definitions/models.SeverityLevel'
|
$ref: '#/definitions/models.SeverityLevel'
|
||||||
resolve_method:
|
resolve_method:
|
||||||
@@ -494,6 +494,15 @@ definitions:
|
|||||||
pagination:
|
pagination:
|
||||||
$ref: '#/definitions/dto.PaginationDTO'
|
$ref: '#/definitions/dto.PaginationDTO'
|
||||||
type: object
|
type: object
|
||||||
|
dto.ListAreaThresholdAlarmResponse:
|
||||||
|
properties:
|
||||||
|
list:
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/dto.AreaThresholdAlarmDTO'
|
||||||
|
type: array
|
||||||
|
pagination:
|
||||||
|
$ref: '#/definitions/dto.PaginationDTO'
|
||||||
|
type: object
|
||||||
dto.ListDeviceCommandLogResponse:
|
dto.ListDeviceCommandLogResponse:
|
||||||
properties:
|
properties:
|
||||||
list:
|
list:
|
||||||
@@ -503,6 +512,15 @@ definitions:
|
|||||||
pagination:
|
pagination:
|
||||||
$ref: '#/definitions/dto.PaginationDTO'
|
$ref: '#/definitions/dto.PaginationDTO'
|
||||||
type: object
|
type: object
|
||||||
|
dto.ListDeviceThresholdAlarmResponse:
|
||||||
|
properties:
|
||||||
|
list:
|
||||||
|
items:
|
||||||
|
$ref: '#/definitions/dto.DeviceThresholdAlarmDTO'
|
||||||
|
type: array
|
||||||
|
pagination:
|
||||||
|
$ref: '#/definitions/dto.PaginationDTO'
|
||||||
|
type: object
|
||||||
dto.ListFeedUsageRecordResponse:
|
dto.ListFeedUsageRecordResponse:
|
||||||
properties:
|
properties:
|
||||||
list:
|
list:
|
||||||
@@ -2401,6 +2419,90 @@ paths:
|
|||||||
tags:
|
tags:
|
||||||
- 告警管理
|
- 告警管理
|
||||||
/api/v1/alarm/threshold/area:
|
/api/v1/alarm/threshold/area:
|
||||||
|
get:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
description: 根据过滤条件和分页参数查询区域阈值告警列表
|
||||||
|
parameters:
|
||||||
|
- description: 按区域主控ID过滤
|
||||||
|
in: query
|
||||||
|
name: area_controller_id
|
||||||
|
type: integer
|
||||||
|
- description: 按告警等级过滤
|
||||||
|
enum:
|
||||||
|
- Debug
|
||||||
|
- Info
|
||||||
|
- Warn
|
||||||
|
- Error
|
||||||
|
- DPanic
|
||||||
|
- Panic
|
||||||
|
- Fatal
|
||||||
|
in: query
|
||||||
|
name: level
|
||||||
|
type: string
|
||||||
|
x-enum-varnames:
|
||||||
|
- DebugLevel
|
||||||
|
- InfoLevel
|
||||||
|
- WarnLevel
|
||||||
|
- ErrorLevel
|
||||||
|
- DPanicLevel
|
||||||
|
- PanicLevel
|
||||||
|
- FatalLevel
|
||||||
|
- description: 排序字段,例如 "id DESC"
|
||||||
|
in: query
|
||||||
|
name: order_by
|
||||||
|
type: string
|
||||||
|
- in: query
|
||||||
|
name: page
|
||||||
|
type: integer
|
||||||
|
- in: query
|
||||||
|
name: page_size
|
||||||
|
type: integer
|
||||||
|
- description: 按传感器类型过滤
|
||||||
|
enum:
|
||||||
|
- 信号强度
|
||||||
|
- 电池电量
|
||||||
|
- 温度
|
||||||
|
- 湿度
|
||||||
|
- 重量
|
||||||
|
in: query
|
||||||
|
name: sensor_type
|
||||||
|
type: string
|
||||||
|
x-enum-comments:
|
||||||
|
SensorTypeBatteryLevel: 电池电量
|
||||||
|
SensorTypeHumidity: 湿度
|
||||||
|
SensorTypeSignalMetrics: 信号强度
|
||||||
|
SensorTypeTemperature: 温度
|
||||||
|
SensorTypeWeight: 重量
|
||||||
|
x-enum-descriptions:
|
||||||
|
- 信号强度
|
||||||
|
- 电池电量
|
||||||
|
- 温度
|
||||||
|
- 湿度
|
||||||
|
- 重量
|
||||||
|
x-enum-varnames:
|
||||||
|
- SensorTypeSignalMetrics
|
||||||
|
- SensorTypeBatteryLevel
|
||||||
|
- SensorTypeTemperature
|
||||||
|
- SensorTypeHumidity
|
||||||
|
- SensorTypeWeight
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: 成功获取区域阈值告警列表
|
||||||
|
schema:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/controller.Response'
|
||||||
|
- properties:
|
||||||
|
data:
|
||||||
|
$ref: '#/definitions/dto.ListAreaThresholdAlarmResponse'
|
||||||
|
type: object
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: 批量查询区域阈值告警
|
||||||
|
tags:
|
||||||
|
- 告警管理
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
- application/json
|
- application/json
|
||||||
@@ -2499,6 +2601,90 @@ paths:
|
|||||||
tags:
|
tags:
|
||||||
- 告警管理
|
- 告警管理
|
||||||
/api/v1/alarm/threshold/device:
|
/api/v1/alarm/threshold/device:
|
||||||
|
get:
|
||||||
|
consumes:
|
||||||
|
- application/json
|
||||||
|
description: 根据过滤条件和分页参数查询设备阈值告警列表
|
||||||
|
parameters:
|
||||||
|
- description: 按设备ID过滤
|
||||||
|
in: query
|
||||||
|
name: device_id
|
||||||
|
type: integer
|
||||||
|
- description: 按告警等级过滤
|
||||||
|
enum:
|
||||||
|
- Debug
|
||||||
|
- Info
|
||||||
|
- Warn
|
||||||
|
- Error
|
||||||
|
- DPanic
|
||||||
|
- Panic
|
||||||
|
- Fatal
|
||||||
|
in: query
|
||||||
|
name: level
|
||||||
|
type: string
|
||||||
|
x-enum-varnames:
|
||||||
|
- DebugLevel
|
||||||
|
- InfoLevel
|
||||||
|
- WarnLevel
|
||||||
|
- ErrorLevel
|
||||||
|
- DPanicLevel
|
||||||
|
- PanicLevel
|
||||||
|
- FatalLevel
|
||||||
|
- description: 排序字段,例如 "id DESC"
|
||||||
|
in: query
|
||||||
|
name: order_by
|
||||||
|
type: string
|
||||||
|
- in: query
|
||||||
|
name: page
|
||||||
|
type: integer
|
||||||
|
- in: query
|
||||||
|
name: page_size
|
||||||
|
type: integer
|
||||||
|
- description: 按传感器类型过滤
|
||||||
|
enum:
|
||||||
|
- 信号强度
|
||||||
|
- 电池电量
|
||||||
|
- 温度
|
||||||
|
- 湿度
|
||||||
|
- 重量
|
||||||
|
in: query
|
||||||
|
name: sensor_type
|
||||||
|
type: string
|
||||||
|
x-enum-comments:
|
||||||
|
SensorTypeBatteryLevel: 电池电量
|
||||||
|
SensorTypeHumidity: 湿度
|
||||||
|
SensorTypeSignalMetrics: 信号强度
|
||||||
|
SensorTypeTemperature: 温度
|
||||||
|
SensorTypeWeight: 重量
|
||||||
|
x-enum-descriptions:
|
||||||
|
- 信号强度
|
||||||
|
- 电池电量
|
||||||
|
- 温度
|
||||||
|
- 湿度
|
||||||
|
- 重量
|
||||||
|
x-enum-varnames:
|
||||||
|
- SensorTypeSignalMetrics
|
||||||
|
- SensorTypeBatteryLevel
|
||||||
|
- SensorTypeTemperature
|
||||||
|
- SensorTypeHumidity
|
||||||
|
- SensorTypeWeight
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: 成功获取设备阈值告警列表
|
||||||
|
schema:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/controller.Response'
|
||||||
|
- properties:
|
||||||
|
data:
|
||||||
|
$ref: '#/definitions/dto.ListDeviceThresholdAlarmResponse'
|
||||||
|
type: object
|
||||||
|
security:
|
||||||
|
- BearerAuth: []
|
||||||
|
summary: 批量查询设备阈值告警
|
||||||
|
tags:
|
||||||
|
- 告警管理
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
- application/json
|
- application/json
|
||||||
|
|||||||
@@ -199,12 +199,14 @@ func (a *API) setupRoutes() {
|
|||||||
thresholdGroup.GET("/historical-alarms", a.alarmController.ListHistoricalAlarms) // 获取历史告警
|
thresholdGroup.GET("/historical-alarms", a.alarmController.ListHistoricalAlarms) // 获取历史告警
|
||||||
|
|
||||||
// 设备阈值告警配置
|
// 设备阈值告警配置
|
||||||
|
thresholdGroup.GET("/device", a.alarmController.ListDeviceThresholdAlarms)
|
||||||
thresholdGroup.POST("/device", a.alarmController.CreateDeviceThresholdAlarm)
|
thresholdGroup.POST("/device", a.alarmController.CreateDeviceThresholdAlarm)
|
||||||
thresholdGroup.GET("/device/:task_id", a.alarmController.GetDeviceThresholdAlarm)
|
thresholdGroup.GET("/device/:task_id", a.alarmController.GetDeviceThresholdAlarm)
|
||||||
thresholdGroup.PUT("/device/:task_id", a.alarmController.UpdateDeviceThresholdAlarm)
|
thresholdGroup.PUT("/device/:task_id", a.alarmController.UpdateDeviceThresholdAlarm)
|
||||||
thresholdGroup.DELETE("/device/:task_id", a.alarmController.DeleteDeviceThresholdAlarm)
|
thresholdGroup.DELETE("/device/:task_id", a.alarmController.DeleteDeviceThresholdAlarm)
|
||||||
|
|
||||||
// 区域阈值告警配置
|
// 区域阈值告警配置
|
||||||
|
thresholdGroup.GET("/area", a.alarmController.ListAreaThresholdAlarms)
|
||||||
thresholdGroup.POST("/area", a.alarmController.CreateAreaThresholdAlarm)
|
thresholdGroup.POST("/area", a.alarmController.CreateAreaThresholdAlarm)
|
||||||
thresholdGroup.GET("/area/:task_id", a.alarmController.GetAreaThresholdAlarm)
|
thresholdGroup.GET("/area/:task_id", a.alarmController.GetAreaThresholdAlarm)
|
||||||
thresholdGroup.PUT("/area/:task_id", a.alarmController.UpdateAreaThresholdAlarm)
|
thresholdGroup.PUT("/area/:task_id", a.alarmController.UpdateAreaThresholdAlarm)
|
||||||
|
|||||||
@@ -179,6 +179,76 @@ func (t *ThresholdAlarmController) ListHistoricalAlarms(ctx echo.Context) error
|
|||||||
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "成功获取历史告警列表", resp, actionType, "成功获取历史告警列表", req)
|
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "成功获取历史告警列表", resp, actionType, "成功获取历史告警列表", req)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListDeviceThresholdAlarms godoc
|
||||||
|
// @Summary 批量查询设备阈值告警
|
||||||
|
// @Description 根据过滤条件和分页参数查询设备阈值告警列表
|
||||||
|
// @Tags 告警管理
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param query query dto.ListDeviceThresholdAlarmRequest true "查询参数"
|
||||||
|
// @Success 200 {object} controller.Response{data=dto.ListDeviceThresholdAlarmResponse} "成功获取设备阈值告警列表"
|
||||||
|
// @Router /api/v1/alarm/threshold/device [get]
|
||||||
|
func (t *ThresholdAlarmController) ListDeviceThresholdAlarms(ctx echo.Context) error {
|
||||||
|
reqCtx, logger := logs.Trace(ctx.Request().Context(), t.ctx, "ListDeviceThresholdAlarms")
|
||||||
|
|
||||||
|
const actionType = "批量查询设备阈值告警"
|
||||||
|
var req dto.ListDeviceThresholdAlarmRequest
|
||||||
|
if err := ctx.Bind(&req); err != nil {
|
||||||
|
logger.Errorf("%s: 参数绑定失败: %v", actionType, err)
|
||||||
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求参数: "+err.Error(), actionType, "请求参数绑定失败", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := t.thresholdAlarmService.ListDeviceThresholdAlarms(reqCtx, &req)
|
||||||
|
if err != nil {
|
||||||
|
// 捕获 ErrInvalidPagination 错误,并返回 Bad Request
|
||||||
|
if errors.Is(err, repository.ErrInvalidPagination) {
|
||||||
|
logger.Warnf("%s: 无效的分页参数: %v", actionType, err)
|
||||||
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的分页参数: "+err.Error(), actionType, "无效分页参数", req)
|
||||||
|
}
|
||||||
|
logger.Errorf("%s: 服务层查询设备阈值告警失败: %v", actionType, err)
|
||||||
|
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "查询设备阈值告警失败: "+err.Error(), actionType, "服务层查询设备阈值告警失败", req)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Infof("%s: 成功, 获取到 %d 条记录, 总计 %d 条", actionType, len(resp.List), resp.Pagination.Total)
|
||||||
|
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "成功获取设备阈值告警列表", resp, actionType, "成功获取设备阈值告警列表", req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListAreaThresholdAlarms godoc
|
||||||
|
// @Summary 批量查询区域阈值告警
|
||||||
|
// @Description 根据过滤条件和分页参数查询区域阈值告警列表
|
||||||
|
// @Tags 告警管理
|
||||||
|
// @Security BearerAuth
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param query query dto.ListAreaThresholdAlarmRequest true "查询参数"
|
||||||
|
// @Success 200 {object} controller.Response{data=dto.ListAreaThresholdAlarmResponse} "成功获取区域阈值告警列表"
|
||||||
|
// @Router /api/v1/alarm/threshold/area [get]
|
||||||
|
func (t *ThresholdAlarmController) ListAreaThresholdAlarms(ctx echo.Context) error {
|
||||||
|
reqCtx, logger := logs.Trace(ctx.Request().Context(), t.ctx, "ListAreaThresholdAlarms")
|
||||||
|
|
||||||
|
const actionType = "批量查询区域阈值告警"
|
||||||
|
var req dto.ListAreaThresholdAlarmRequest
|
||||||
|
if err := ctx.Bind(&req); err != nil {
|
||||||
|
logger.Errorf("%s: 参数绑定失败: %v", actionType, err)
|
||||||
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求参数: "+err.Error(), actionType, "请求参数绑定失败", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := t.thresholdAlarmService.ListAreaThresholdAlarms(reqCtx, &req)
|
||||||
|
if err != nil {
|
||||||
|
// 捕获 ErrInvalidPagination 错误,并返回 Bad Request
|
||||||
|
if errors.Is(err, repository.ErrInvalidPagination) {
|
||||||
|
logger.Warnf("%s: 无效的分页参数: %v", actionType, err)
|
||||||
|
return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的分页参数: "+err.Error(), actionType, "无效分页参数", req)
|
||||||
|
}
|
||||||
|
logger.Errorf("%s: 服务层查询区域阈值告警失败: %v", actionType, err)
|
||||||
|
return controller.SendErrorWithAudit(ctx, controller.CodeInternalError, "查询区域阈值告警失败: "+err.Error(), actionType, "服务层查询区域阈值告警失败", req)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Infof("%s: 成功, 获取到 %d 条记录, 总计 %d 条", actionType, len(resp.List), resp.Pagination.Total)
|
||||||
|
return controller.SendSuccessWithAudit(ctx, controller.CodeSuccess, "成功获取区域阈值告警列表", resp, actionType, "成功获取区域阈值告警列表", req)
|
||||||
|
}
|
||||||
|
|
||||||
// CreateDeviceThresholdAlarm godoc
|
// CreateDeviceThresholdAlarm godoc
|
||||||
// @Summary 创建设备阈值告警
|
// @Summary 创建设备阈值告警
|
||||||
// @Description 为单个设备创建一条新的阈值告警规则
|
// @Description 为单个设备创建一条新的阈值告警规则
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ type HistoricalAlarmDTO struct {
|
|||||||
AlarmCode models.AlarmCode `json:"alarm_code"`
|
AlarmCode models.AlarmCode `json:"alarm_code"`
|
||||||
AlarmSummary string `json:"alarm_summary"`
|
AlarmSummary string `json:"alarm_summary"`
|
||||||
Level models.SeverityLevel `json:"level"`
|
Level models.SeverityLevel `json:"level"`
|
||||||
AlarmDetails string `json:"alarm_details"`
|
AlarmDetails string `json:"json_details"`
|
||||||
TriggerTime time.Time `json:"trigger_time"`
|
TriggerTime time.Time `json:"trigger_time"`
|
||||||
ResolveTime time.Time `json:"resolve_time"`
|
ResolveTime time.Time `json:"resolve_time"`
|
||||||
ResolveMethod string `json:"resolve_method"`
|
ResolveMethod string `json:"resolve_method"`
|
||||||
@@ -138,3 +138,35 @@ type DeviceThresholdAlarmDTO struct {
|
|||||||
Operator models.Operator `json:"operator"`
|
Operator models.Operator `json:"operator"`
|
||||||
Level models.SeverityLevel `json:"level"`
|
Level models.SeverityLevel `json:"level"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListDeviceThresholdAlarmRequest 定义了获取设备阈值告警列表的请求参数
|
||||||
|
type ListDeviceThresholdAlarmRequest struct {
|
||||||
|
Page int `json:"page" query:"page"`
|
||||||
|
PageSize int `json:"page_size" query:"page_size"`
|
||||||
|
DeviceID *uint32 `json:"device_id" query:"device_id"` // 按设备ID过滤
|
||||||
|
SensorType *models.SensorType `json:"sensor_type" query:"sensor_type"` // 按传感器类型过滤
|
||||||
|
Level *models.SeverityLevel `json:"level" query:"level"` // 按告警等级过滤
|
||||||
|
OrderBy string `json:"order_by" query:"order_by"` // 排序字段,例如 "id DESC"
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListDeviceThresholdAlarmResponse 是获取设备阈值告警列表的响应结构
|
||||||
|
type ListDeviceThresholdAlarmResponse struct {
|
||||||
|
List []DeviceThresholdAlarmDTO `json:"list"`
|
||||||
|
Pagination PaginationDTO `json:"pagination"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListAreaThresholdAlarmRequest 定义了获取区域阈值告警列表的请求参数
|
||||||
|
type ListAreaThresholdAlarmRequest struct {
|
||||||
|
Page int `json:"page" query:"page"`
|
||||||
|
PageSize int `json:"page_size" query:"page_size"`
|
||||||
|
AreaControllerID *uint32 `json:"area_controller_id" query:"area_controller_id"` // 按区域主控ID过滤
|
||||||
|
SensorType *models.SensorType `json:"sensor_type" query:"sensor_type"` // 按传感器类型过滤
|
||||||
|
Level *models.SeverityLevel `json:"level" query:"level"` // 按告警等级过滤
|
||||||
|
OrderBy string `json:"order_by" query:"order_by"` // 排序字段,例如 "id DESC"
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListAreaThresholdAlarmResponse 是获取区域阈值告警列表的响应结构
|
||||||
|
type ListAreaThresholdAlarmResponse struct {
|
||||||
|
List []AreaThresholdAlarmDTO `json:"list"`
|
||||||
|
Pagination PaginationDTO `json:"pagination"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ type ThresholdAlarmService interface {
|
|||||||
DeleteDeviceThresholdAlarm(ctx context.Context, taskID int, req *dto.DeleteDeviceThresholdAlarmDTO) error
|
DeleteDeviceThresholdAlarm(ctx context.Context, taskID int, req *dto.DeleteDeviceThresholdAlarmDTO) error
|
||||||
// DeleteDeviceThresholdAlarmByDeviceID 实现了根据设备ID删除一个设备下所有设备阈值告警的逻辑。
|
// DeleteDeviceThresholdAlarmByDeviceID 实现了根据设备ID删除一个设备下所有设备阈值告警的逻辑。
|
||||||
DeleteDeviceThresholdAlarmByDeviceID(ctx context.Context, deviceID uint32) error
|
DeleteDeviceThresholdAlarmByDeviceID(ctx context.Context, deviceID uint32) error
|
||||||
|
// ListDeviceThresholdAlarms 批量查询设备阈值告警配置。
|
||||||
|
ListDeviceThresholdAlarms(ctx context.Context, req *dto.ListDeviceThresholdAlarmRequest) (*dto.ListDeviceThresholdAlarmResponse, error)
|
||||||
|
|
||||||
// CreateAreaThresholdAlarm 创建一个区域阈值告警。
|
// CreateAreaThresholdAlarm 创建一个区域阈值告警。
|
||||||
CreateAreaThresholdAlarm(ctx context.Context, req *dto.CreateAreaThresholdAlarmDTO) error
|
CreateAreaThresholdAlarm(ctx context.Context, req *dto.CreateAreaThresholdAlarmDTO) error
|
||||||
@@ -47,6 +49,8 @@ type ThresholdAlarmService interface {
|
|||||||
DeleteAreaThresholdAlarm(ctx context.Context, taskID int) error
|
DeleteAreaThresholdAlarm(ctx context.Context, taskID int) error
|
||||||
// DeleteAreaThresholdAlarmByAreaControllerID 实现了根据区域ID删除一个区域下所有区域阈值告警的逻辑。
|
// DeleteAreaThresholdAlarmByAreaControllerID 实现了根据区域ID删除一个区域下所有区域阈值告警的逻辑。
|
||||||
DeleteAreaThresholdAlarmByAreaControllerID(ctx context.Context, areaControllerID uint32) error
|
DeleteAreaThresholdAlarmByAreaControllerID(ctx context.Context, areaControllerID uint32) error
|
||||||
|
// ListAreaThresholdAlarms 批量查询区域阈值告警配置。
|
||||||
|
ListAreaThresholdAlarms(ctx context.Context, req *dto.ListAreaThresholdAlarmRequest) (*dto.ListAreaThresholdAlarmResponse, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// thresholdAlarmService 是 ThresholdAlarmService 接口的具体实现。
|
// thresholdAlarmService 是 ThresholdAlarmService 接口的具体实现。
|
||||||
@@ -444,6 +448,110 @@ func (s *thresholdAlarmService) DeleteDeviceThresholdAlarmByDeviceID(ctx context
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListDeviceThresholdAlarms 实现了批量查询设备阈值告警配置的逻辑。
|
||||||
|
func (s *thresholdAlarmService) ListDeviceThresholdAlarms(ctx context.Context, req *dto.ListDeviceThresholdAlarmRequest) (*dto.ListDeviceThresholdAlarmResponse, error) {
|
||||||
|
serviceCtx, logger := logs.Trace(ctx, s.ctx, "ListDeviceThresholdAlarms")
|
||||||
|
|
||||||
|
// 1. 准备调用 planRepo.ListTasks 的选项
|
||||||
|
taskType := models.TaskTypeDeviceThresholdCheck
|
||||||
|
opts := repository.TaskListOptions{
|
||||||
|
Type: &taskType,
|
||||||
|
DeviceID: req.DeviceID,
|
||||||
|
SensorType: req.SensorType,
|
||||||
|
Level: req.Level,
|
||||||
|
OrderBy: req.OrderBy,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 调用底层的 ListTasks 方法
|
||||||
|
tasks, total, err := s.planRepo.ListTasks(serviceCtx, opts, req.Page, req.PageSize)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("查询设备阈值告警任务失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 将查询到的 models.Task 列表转换为 dto.DeviceThresholdAlarmDTO 列表
|
||||||
|
alarmDTOs := make([]dto.DeviceThresholdAlarmDTO, 0, len(tasks))
|
||||||
|
for _, t := range tasks {
|
||||||
|
var params task.DeviceThresholdCheckParams
|
||||||
|
if err := t.ParseParameters(¶ms); err != nil {
|
||||||
|
logger.Warnf("解析任务 %d 的参数失败: %v,已在列表中跳过", t.ID, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
alarmDTOs = append(alarmDTOs, dto.DeviceThresholdAlarmDTO{
|
||||||
|
ID: t.ID,
|
||||||
|
DeviceID: params.DeviceID,
|
||||||
|
SensorType: params.SensorType,
|
||||||
|
Thresholds: params.Thresholds,
|
||||||
|
Operator: params.Operator,
|
||||||
|
Level: params.Level,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 构建并返回响应
|
||||||
|
response := &dto.ListDeviceThresholdAlarmResponse{
|
||||||
|
List: alarmDTOs,
|
||||||
|
Pagination: dto.PaginationDTO{
|
||||||
|
Total: total,
|
||||||
|
Page: req.Page,
|
||||||
|
PageSize: req.PageSize,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListAreaThresholdAlarms 实现了批量查询区域阈值告警配置的逻辑。
|
||||||
|
func (s *thresholdAlarmService) ListAreaThresholdAlarms(ctx context.Context, req *dto.ListAreaThresholdAlarmRequest) (*dto.ListAreaThresholdAlarmResponse, error) {
|
||||||
|
serviceCtx, logger := logs.Trace(ctx, s.ctx, "ListAreaThresholdAlarms")
|
||||||
|
|
||||||
|
// 1. 准备调用 planRepo.ListTasks 的选项
|
||||||
|
taskType := models.TaskTypeAreaCollectorThresholdCheck
|
||||||
|
opts := repository.TaskListOptions{
|
||||||
|
Type: &taskType,
|
||||||
|
AreaControllerID: req.AreaControllerID,
|
||||||
|
SensorType: req.SensorType,
|
||||||
|
Level: req.Level,
|
||||||
|
OrderBy: req.OrderBy,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 调用底层的 ListTasks 方法
|
||||||
|
tasks, total, err := s.planRepo.ListTasks(serviceCtx, opts, req.Page, req.PageSize)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("查询区域阈值告警任务失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 将查询到的 models.Task 列表转换为 dto.AreaThresholdAlarmDTO 列表
|
||||||
|
alarmDTOs := make([]dto.AreaThresholdAlarmDTO, 0, len(tasks))
|
||||||
|
for _, t := range tasks {
|
||||||
|
var params task.AreaThresholdCheckParams
|
||||||
|
if err := t.ParseParameters(¶ms); err != nil {
|
||||||
|
logger.Warnf("解析区域任务 %d 的参数失败: %v,已在列表中跳过", t.ID, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
alarmDTOs = append(alarmDTOs, dto.AreaThresholdAlarmDTO{
|
||||||
|
ID: t.ID,
|
||||||
|
AreaControllerID: params.AreaControllerID,
|
||||||
|
SensorType: params.SensorType,
|
||||||
|
Thresholds: params.Thresholds,
|
||||||
|
Operator: params.Operator,
|
||||||
|
Level: params.Level,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 构建并返回响应
|
||||||
|
response := &dto.ListAreaThresholdAlarmResponse{
|
||||||
|
List: alarmDTOs,
|
||||||
|
Pagination: dto.PaginationDTO{
|
||||||
|
Total: total,
|
||||||
|
Page: req.Page,
|
||||||
|
PageSize: req.PageSize,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
// CreateAreaThresholdAlarm 实现了创建一个区域阈值告警的逻辑。
|
// CreateAreaThresholdAlarm 实现了创建一个区域阈值告警的逻辑。
|
||||||
func (s *thresholdAlarmService) CreateAreaThresholdAlarm(ctx context.Context, req *dto.CreateAreaThresholdAlarmDTO) error {
|
func (s *thresholdAlarmService) CreateAreaThresholdAlarm(ctx context.Context, req *dto.CreateAreaThresholdAlarmDTO) error {
|
||||||
serviceCtx, logger := logs.Trace(ctx, s.ctx, "CreateAreaThresholdAlarm")
|
serviceCtx, logger := logs.Trace(ctx, s.ctx, "CreateAreaThresholdAlarm")
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ func (app *Application) initializePeriodicSystemHealthCheckPlan(ctx context.Cont
|
|||||||
delayParams := task.DelayTaskParams{DelayDuration: 10} // 延时10秒
|
delayParams := task.DelayTaskParams{DelayDuration: 10} // 延时10秒
|
||||||
delayTask := models.Task{
|
delayTask := models.Task{
|
||||||
Name: "延时任务",
|
Name: "延时任务",
|
||||||
Description: "系统预设延时任务,用于错峰处理",
|
Description: "系统预设延时任务,用于等待设备上传数据",
|
||||||
ExecutionOrder: 2,
|
ExecutionOrder: 2,
|
||||||
Type: models.TaskTypeWaiting,
|
Type: models.TaskTypeWaiting,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,29 @@ type ListPlansOptions struct {
|
|||||||
PlanType PlanTypeFilter
|
PlanType PlanTypeFilter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TaskListOptions 定义了查询任务时的可选参数
|
||||||
|
type TaskListOptions struct {
|
||||||
|
// --- 通用筛选 ---
|
||||||
|
Name *string // 按任务名称进行模糊查询
|
||||||
|
PlanID *uint32 // 按所属的计划ID进行精确查询
|
||||||
|
Type *models.TaskType // 按任务类型精确查询
|
||||||
|
|
||||||
|
// --- 关联筛选 ---
|
||||||
|
// 用于通过 device_tasks 关联表筛选与特定设备ID关联的任务
|
||||||
|
DeviceID *uint32
|
||||||
|
|
||||||
|
// --- JSON 参数内筛选 (仅对特定任务类型有效) ---
|
||||||
|
// 用于筛选 TaskTypeAreaCollectorThresholdCheck 类型的任务
|
||||||
|
AreaControllerID *uint32
|
||||||
|
// 用于筛选 TaskTypeDeviceThresholdCheck 和 TaskTypeAreaCollectorThresholdCheck 类型的任务
|
||||||
|
SensorType *models.SensorType
|
||||||
|
// 用于筛选 TaskTypeDeviceThresholdCheck 和 TaskTypeAreaCollectorThresholdCheck 类型的任务
|
||||||
|
Level *models.SeverityLevel
|
||||||
|
|
||||||
|
// --- 排序 ---
|
||||||
|
OrderBy string // 例如 "id desc"
|
||||||
|
}
|
||||||
|
|
||||||
// PlanRepository 定义了与计划模型相关的数据库操作接口
|
// PlanRepository 定义了与计划模型相关的数据库操作接口
|
||||||
// 这是为了让业务逻辑层依赖于抽象,而不是具体的数据库实现
|
// 这是为了让业务逻辑层依赖于抽象,而不是具体的数据库实现
|
||||||
type PlanRepository interface {
|
type PlanRepository interface {
|
||||||
@@ -89,6 +112,8 @@ type PlanRepository interface {
|
|||||||
UpdatePlanStateAfterExecution(ctx context.Context, planID uint32, newCount uint32, newStatus models.PlanStatus) error
|
UpdatePlanStateAfterExecution(ctx context.Context, planID uint32, newCount uint32, newStatus models.PlanStatus) error
|
||||||
// ListTasksByDeviceID 根据设备ID获取关联任务列表
|
// ListTasksByDeviceID 根据设备ID获取关联任务列表
|
||||||
ListTasksByDeviceID(ctx context.Context, deviceID uint32) ([]*models.Task, error)
|
ListTasksByDeviceID(ctx context.Context, deviceID uint32) ([]*models.Task, error)
|
||||||
|
// ListTasks 支持分页和过滤的任务列表查询
|
||||||
|
ListTasks(ctx context.Context, opts TaskListOptions, page, pageSize int) ([]models.Task, int64, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// gormPlanRepository 是 PlanRepository 的 GORM 实现
|
// gormPlanRepository 是 PlanRepository 的 GORM 实现
|
||||||
@@ -896,3 +921,74 @@ func (r *gormPlanRepository) ListTasksByDeviceID(ctx context.Context, deviceID u
|
|||||||
|
|
||||||
return tasks, nil
|
return tasks, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListTasks 实现了分页和过滤查询任务的功能,并优化了 JOIN 后的计数逻辑
|
||||||
|
func (r *gormPlanRepository) ListTasks(ctx context.Context, opts TaskListOptions, page, pageSize int) ([]models.Task, int64, error) {
|
||||||
|
repoCtx := logs.AddFuncName(ctx, r.ctx, "ListTasks")
|
||||||
|
if page <= 0 || pageSize <= 0 {
|
||||||
|
return nil, 0, ErrInvalidPagination
|
||||||
|
}
|
||||||
|
|
||||||
|
var results []models.Task
|
||||||
|
var total int64
|
||||||
|
|
||||||
|
// 1. 构建基础查询,应用所有筛选条件
|
||||||
|
query := r.db.WithContext(repoCtx).Model(&models.Task{})
|
||||||
|
|
||||||
|
if opts.Name != nil && *opts.Name != "" {
|
||||||
|
query = query.Where("tasks.name LIKE ?", "%"+*opts.Name+"%")
|
||||||
|
}
|
||||||
|
if opts.PlanID != nil {
|
||||||
|
query = query.Where("tasks.plan_id = ?", *opts.PlanID)
|
||||||
|
}
|
||||||
|
if opts.Type != nil {
|
||||||
|
query = query.Where("tasks.type = ?", *opts.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- JSON 字段查询 ---
|
||||||
|
if opts.AreaControllerID != nil {
|
||||||
|
// 使用 ->> 操作符查询 JSON 字段的值(作为文本)
|
||||||
|
query = query.Where("parameters->>'area_controller_id' = ?", *opts.AreaControllerID)
|
||||||
|
}
|
||||||
|
if opts.SensorType != nil {
|
||||||
|
query = query.Where("parameters->>'sensor_type' = ?", *opts.SensorType)
|
||||||
|
}
|
||||||
|
if opts.Level != nil {
|
||||||
|
query = query.Where("parameters->>'level' = ?", *opts.Level)
|
||||||
|
}
|
||||||
|
// --- 结束 ---
|
||||||
|
|
||||||
|
if opts.DeviceID != nil {
|
||||||
|
query = query.Joins("JOIN device_tasks ON device_tasks.task_id = tasks.id").Where("device_tasks.device_id = ?", *opts.DeviceID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 执行计数查询
|
||||||
|
countQuery := query
|
||||||
|
if opts.DeviceID != nil {
|
||||||
|
if err := countQuery.Distinct("tasks.id").Count(&total).Error; err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := countQuery.Count(&total).Error; err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if total == 0 {
|
||||||
|
return []models.Task{}, 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 为数据查询应用排序、分页和预加载
|
||||||
|
orderBy := "tasks.id DESC"
|
||||||
|
if opts.OrderBy != "" {
|
||||||
|
orderBy = opts.OrderBy
|
||||||
|
}
|
||||||
|
|
||||||
|
err := query.Order(orderBy).
|
||||||
|
Limit(pageSize).
|
||||||
|
Offset((page - 1) * pageSize).
|
||||||
|
Preload("Devices").
|
||||||
|
Find(&results).Error
|
||||||
|
|
||||||
|
return results, total, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ design/archive/2025-11-05-provide-logger-with-mothed/task-service.md
|
|||||||
design/archive/2025-11-05-provide-logger-with-mothed/task-webhook.md
|
design/archive/2025-11-05-provide-logger-with-mothed/task-webhook.md
|
||||||
design/archive/2025-11-06-health-check-routing/index.md
|
design/archive/2025-11-06-health-check-routing/index.md
|
||||||
design/archive/2025-11-06-system-plan-continuously-triggered/index.md
|
design/archive/2025-11-06-system-plan-continuously-triggered/index.md
|
||||||
design/exceeding-threshold-alarm/index.md
|
design/archive/2025-11-10-exceeding-threshold-alarm/index.md
|
||||||
docs/docs.go
|
docs/docs.go
|
||||||
docs/swagger.json
|
docs/swagger.json
|
||||||
docs/swagger.yaml
|
docs/swagger.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user