iot_server/internal/dtos/alertrule.go

309 lines
12 KiB
Go

/*******************************************************************************
* Copyright 2017.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*******************************************************************************/
package dtos
import (
"fmt"
"github.com/winc-link/hummingbird/internal/models"
"github.com/winc-link/hummingbird/internal/pkg/constants"
"strings"
)
type RuleAddRequest struct {
Name string `json:"name"` //名字
AlertType constants.AlertType `json:"alert_type"` //告警类型
AlertLevel constants.AlertLevel `json:"alert_level"` //告警级别
Description string `json:"description"` //描述
}
type RuleFieldUpdate struct {
Id string `json:"id"`
Name string `json:"name"`
AlertLevel constants.AlertLevel `json:"alert_level"`
Description string `json:"description"`
}
type RuleUpdateRequest struct {
Id string `json:"id"`
Condition constants.WorkerCondition `json:"condition"` //执行条件
SubRule []SubRule `json:"sub_rule"`
Notify []Notify `json:"notify"`
SilenceTime int64 `json:"silence_time"` //静默时间
}
type AlertTreatedRequest struct {
Id string `json:"id"`
Message string `json:"message"`
}
type Notify struct {
Name constants.AlertWay `json:"name"` //告警方式
Option map[string]string `json:"option"`
StartEffectTime string `json:"start_effect_time"` //生效开始时间
EndEffectTime string `json:"end_effect_time"` //生效结束时间
}
func (b *RuleUpdateRequest) BuildEkuiperSql(deviceId string, specsType constants.SpecsType) string {
var sql string
switch specsType {
case constants.SpecsTypeInt, constants.SpecsTypeFloat:
var s int
switch b.SubRule[0].Option["value_cycle"] {
case "1分钟周期":
s = 60
case "5分钟周期":
s = 60 * 5
case "15分钟周期":
s = 60 * 15
case "30分钟周期":
s = 60 * 30
case "60分钟周期":
s = 60 * 60
default:
if b.SubRule[0].Option["value_type"] != constants.Original {
return ""
}
}
switch b.SubRule[0].Option["value_type"] {
case constants.Original:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
originalTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time ,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") %s`
sql = fmt.Sprintf(originalTemp, code, deviceId, code, code, decideCondition)
case constants.Avg:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,avg(json_path_query(data, "$.%s.value")) as avg_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING avg_%s %s`
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
case constants.Max:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,max(json_path_query(data, "$.%s.value")) as max_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING max_%s %s`
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
case constants.Min:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,min(json_path_query(data, "$.%s.value")) as min_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING min_%s %s`
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
case constants.Sum:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
sqlTemp := `SELECT window_start(),window_end(),rule_id(),deviceId,sum(json_path_query(data, "$.%s.value")) as sum_%s FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true GROUP BY %s HAVING sum_%s %s`
sql = fmt.Sprintf(sqlTemp, code, code, deviceId, code, fmt.Sprintf("TUMBLINGWINDOW(ss, %d)", s), code, decideCondition)
}
return sql
case constants.SpecsTypeText:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
st := strings.Split(decideCondition, " ")
if len(st) != 2 {
return ""
}
sqlTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") = "%s"`
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, st[1])
case constants.SpecsTypeEnum:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
st := strings.Split(decideCondition, " ")
if len(st) != 2 {
return ""
}
sqlTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") = %s`
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, st[1])
case constants.SpecsTypeBool:
code := b.SubRule[0].Option["code"]
decideCondition := b.SubRule[0].Option["decide_condition"]
st := strings.Split(decideCondition, " ")
if len(st) != 2 {
return ""
}
sqlTemp := `SELECT rule_id(),json_path_query(data, "$.%s.time") as report_time,deviceId FROM mqtt_stream where deviceId = "%s" and messageType = "PROPERTY_REPORT" and json_path_exists(data, "$.%s") = true and json_path_query(data, "$.%s.value") = %s`
if st[1] == "true" {
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, "1")
} else if st[1] == "false" {
sql = fmt.Sprintf(sqlTemp, code, deviceId, code, code, "0")
}
}
return sql
}
func ReplaceRuleFields(ds *models.AlertRule, patch RuleFieldUpdate) {
if patch.Name != "" {
ds.Name = patch.Name
}
if patch.AlertLevel != "" {
ds.AlertLevel = patch.AlertLevel
}
if patch.Description != "" {
ds.Description = patch.Description
}
}
func ReplaceRuleModelFields(ds *models.AlertRule, patch RuleUpdateRequest) {
if patch.Condition != "" {
ds.Condition = patch.Condition
}
if patch.SilenceTime > 0 {
ds.SilenceTime = patch.SilenceTime
}
if len(patch.SubRule) > 0 {
var newSubRule models.SubRule
for _, rule := range patch.SubRule {
newSubRule = append(newSubRule, models.Rule{
Trigger: rule.Trigger,
ProductId: rule.ProductId,
DeviceId: rule.DeviceId,
Option: rule.Option,
})
}
ds.SubRule = newSubRule
} else {
ds.SubRule = nil
}
if len(patch.Notify) > 0 {
var newNotify models.Notify
for _, notify := range patch.Notify {
newNotify = append(newNotify, models.SubNotify{
Name: notify.Name,
Option: notify.Option,
StartEffectTime: notify.StartEffectTime,
EndEffectTime: notify.EndEffectTime,
})
}
ds.Notify = newNotify
}
}
type SubRule struct {
Trigger constants.Trigger `json:"trigger"`
ProductId string `json:"product_id"`
DeviceId string `json:"device_id"`
Option map[string]string `json:"option"`
}
type RuleResponse struct {
Id string `json:"id"`
Name string `json:"name"`
AlertType constants.AlertType `json:"alert_type"`
AlertLevel constants.AlertLevel `json:"alert_level"`
Status constants.RuleStatus `json:"status"`
Condition constants.WorkerCondition `json:"condition"`
SubRule RuleSubRules `json:"sub_rule"`
Notify models.Notify `json:"notify"`
SilenceTime int64 `json:"silence_time"`
Description string `json:"description"`
Created int64 `json:"created"`
Modified int64 `json:"modified"`
}
type RuleSubRules []RuleSubRule
type RuleSubRule struct {
Trigger constants.Trigger `json:"trigger"` //触发方式
ProductId string `json:"product_id"`
ProductName string `json:"product_name"`
DeviceId string `json:"device_id"`
DeviceName string `json:"device_name"`
Code string `json:"code"`
Condition string `json:"condition"`
Option map[string]string `json:"option"`
}
//type RuleNotifys []RuleNotify
//
//type RuleNotify struct {
// Name constants.AlertWay `json:"name"` //告警方式
// Option map[string]string `json:"option"`
// StartEffectTime string `json:"start_effect_time"` //生效开始时间
// EndEffectTime string `json:"end_effect_time"` //生效结束时间
//}
type AlertRuleSearchQueryRequest struct {
BaseSearchConditionQuery `schema:",inline"`
Name string `schema:"name,omitempty"`
Status string `schema:"status,omitempty"`
Msg string `schema:"msg,omitempty"`
}
type AlertRuleSearchQueryResponse struct {
Id string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
AlertType constants.AlertType `json:"alert_type"`
AlertLevel constants.AlertLevel `json:"alert_level"`
Created int64 `json:"created"`
Status constants.RuleStatus `json:"status"`
SubRule []SubRule `json:"sub_rule"`
}
func RuleSearchQueryResponseFromModel(p models.AlertRule) AlertRuleSearchQueryResponse {
var subRule []SubRule
for _, rule := range p.SubRule {
subRule = append(subRule, SubRule{
Trigger: rule.Trigger,
ProductId: rule.ProductId,
DeviceId: rule.DeviceId,
Option: rule.Option,
})
}
return AlertRuleSearchQueryResponse{
Id: p.Id,
Name: p.Name,
Description: p.Description,
AlertType: p.AlertType,
AlertLevel: p.AlertLevel,
Status: p.Status,
Created: p.Created,
SubRule: subRule,
}
}
type AlertSearchQueryRequest struct {
BaseSearchConditionQuery `schema:",inline"`
Name string `schema:"name,omitempty"`
AlertLevel string `schema:"alert_level,omitempty"`
Status string `schema:"status,omitempty"`
TriggerStartTime int `schema:"trigger_start_time,omitempty"`
TriggerEndTime int `schema:"trigger_end_time,omitempty"`
}
type AlertSearchQueryResponse struct {
Id string `json:"id"`
Name string `json:"name"`
//Description string `json:"description"`
AlertResult string `json:"alert_result"`
AlertLevel constants.AlertLevel `json:"alert_level"`
TriggerTime int64 `json:"trigger_time"`
TreatedTime int64 `json:"treated_time"`
Status string `json:"status"`
Message string `json:"message"`
IsSend bool `json:"is_send"`
}
type AlertAddRequest struct {
DeviceId string `json:"device_id"`
TriggerTime int64 `json:"trigger_time"` //触发时间
RuleId string `json:"rule_id"`
Content string `json:"content"`
}
type AlertPlateQueryResponse struct {
Count int `json:"count"`
AlertLevel constants.AlertLevel `json:"alert_level"`
}