From 67872920515026bce138a64e5e7ec119f1254cd8 Mon Sep 17 00:00:00 2001 From: zhuhoujiu Date: Sat, 22 Mar 2025 10:19:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=91=8A=E8=AD=A6=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/alertcentreapp/alertapp.go | 9 +- internal/tools/notify/dingding/client.go | 23 +++-- internal/tools/notify/qiyeweixin/client.go | 96 ++++++++++++++++++- 3 files changed, 114 insertions(+), 14 deletions(-) diff --git a/internal/hummingbird/core/application/alertcentreapp/alertapp.go b/internal/hummingbird/core/application/alertcentreapp/alertapp.go index 75bc303..80b4a55 100644 --- a/internal/hummingbird/core/application/alertcentreapp/alertapp.go +++ b/internal/hummingbird/core/application/alertcentreapp/alertapp.go @@ -853,17 +853,14 @@ func (p alertApp) AddAlert(ctx context.Context, req map[string]interface{}) erro continue } weixinAlertClient := yiqiweixin.NewWeiXinClient(p.lc, p.dic) - //发送内容请用户自行完善 - text := "" - go weixinAlertClient.Send(notify.Option["webhook"], text) + go weixinAlertClient.Send(notify.Option["webhook"], alertRule.SubRule[0], device, product, alertRule.Name) case constants.DingDing: if !checkEffectTime(notify.StartEffectTime, notify.EndEffectTime) { continue } - weixinAlertClient := dingding.NewDingDingClient(p.lc, p.dic) + weixinAlertClient := dingding.NewDingDingClient(p.lc) //发送内容请用户自行完善 - text := "" - go weixinAlertClient.Send(notify.Option["webhook"], text) + go weixinAlertClient.Send(notify.Option["webhook"], alertRule.SubRule[0], device, product, alertRule.Name) case constants.FeiShu: if !checkEffectTime(notify.StartEffectTime, notify.EndEffectTime) { continue diff --git a/internal/tools/notify/dingding/client.go b/internal/tools/notify/dingding/client.go index 09a9042..0614f1f 100644 --- a/internal/tools/notify/dingding/client.go +++ b/internal/tools/notify/dingding/client.go @@ -16,27 +16,38 @@ package dingding import ( "bytes" + "fmt" "github.com/kirinlabs/HttpRequest" - "github.com/winc-link/hummingbird/internal/pkg/di" + "github.com/winc-link/hummingbird/internal/models" + "github.com/winc-link/hummingbird/internal/pkg/constants" "github.com/winc-link/hummingbird/internal/pkg/logger" + "strings" ) type DingDingClient struct { lc logger.LoggingClient - p *di.Container } -func NewDingDingClient(lc logger.LoggingClient, p *di.Container) *DingDingClient { +func NewDingDingClient(lc logger.LoggingClient) *DingDingClient { return &DingDingClient{ lc: lc, - p: p, } } -func (d *DingDingClient) Send(webhook string, text string) { +func dingDingTemplate(trigger constants.Trigger, deviceName string, ruleName string) string { + // 字符串拼接 + var rst strings.Builder + rst.WriteString("# 设备触发告警 \n\n") + rst.WriteString(fmt.Sprintf("设备名称:%s \n\n", deviceName)) + rst.WriteString(fmt.Sprintf("告警规则名称:%s \n\n", ruleName)) + rst.WriteString(fmt.Sprintf("触发方式:%s \n\n", string(trigger))) + return rst.String() +} + +func (d *DingDingClient) Send(webhook string, rule models.Rule, device models.Device, product models.Product, ruleName string) { req := HttpRequest.NewRequest() req.JSON() - resp, err := req.Post(webhook, bytes.NewBuffer([]byte(text))) + resp, err := req.Post(webhook, bytes.NewBuffer([]byte(dingDingTemplate(rule.Trigger, device.Name, ruleName)))) if err != nil { d.lc.Errorf("dingding send alert message error:", err.Error()) } diff --git a/internal/tools/notify/qiyeweixin/client.go b/internal/tools/notify/qiyeweixin/client.go index 200ddb8..23314c3 100644 --- a/internal/tools/notify/qiyeweixin/client.go +++ b/internal/tools/notify/qiyeweixin/client.go @@ -16,9 +16,14 @@ package yiqiweixin import ( "encoding/json" + "fmt" "github.com/kirinlabs/HttpRequest" + "github.com/winc-link/hummingbird/internal/dtos" + "github.com/winc-link/hummingbird/internal/models" + "github.com/winc-link/hummingbird/internal/pkg/constants" "github.com/winc-link/hummingbird/internal/pkg/di" "github.com/winc-link/hummingbird/internal/pkg/logger" + "time" ) type WeixinClient struct { @@ -42,13 +47,100 @@ type Markdown struct { Content string `json:"content"` } -func (d *WeixinClient) Send(webhook string, text string) { +func (d *WeixinClient) generateWeiXinTemplate(rule models.Rule, device models.Device, product models.Product, ruleName string) QiYeWeiXinTemplate { + var qt QiYeWeiXinTemplate + qt.Msgtype = "markdown" + switch rule.Trigger { + case constants.DeviceDataTrigger: + var code string + var propertyName string + var data interface{} + var unit string + if rule.Option["code"] != "" { + for _, property := range product.Properties { + if property.Code == rule.Option["code"] { + code = property.Code + propertyName = property.Name + break + } + } + var persisterReq dtos.ThingModelPropertyDataRequest + persisterReq.ThingModelDataBaseRequest.Last = true + persisterReq.DeviceId = device.Id + persisterReq.Code = rule.Option["code"] + } + if data == nil { + qt.Markdown.Content = fmt.Sprintf(`设备已触发数据告警 + >设备名称:%s + >告警规则:%s + >属性名称:%s + >触发时间:%s + `, device.Name, ruleName, fmt.Sprintf(propertyName+"[%s]", code), + time.Now().Format("2006-01-02 15:04:05")) + } else { + qt.Markdown.Content = fmt.Sprintf(`设备已触发数据告警 + >设备名称:%s + >告警规则:%s + >属性名称:%s + >当前属性值:%s + >触发时间:%s + `, device.Name, ruleName, fmt.Sprintf(propertyName+"[%s]", code), + fmt.Sprintf("%s(%s)", data, unit), + time.Now().Format("2006-01-02 15:04:05")) + } + case constants.DeviceEventTrigger: + var code string + var eventName string + var eventType string + var data interface{} + if rule.Option["code"] != "" { + for _, event := range product.Events { + if event.Code == rule.Option["code"] { + code = event.Code + eventName = event.Name + eventType = event.EventType + break + } + } + var persisterReq dtos.ThingModelEventDataRequest + persisterReq.ThingModelDataBaseRequest.Last = true + persisterReq.DeviceId = device.Id + persisterReq.EventCode = rule.Option["code"] + persisterReq.EventType = eventType + } + if data == nil { + qt.Markdown.Content = fmt.Sprintf(`设备已触发事件告警 + >设备名称:%s + >告警规则:%s + >事件名称:%s + >触发时间:%s + `, device.Name, ruleName, fmt.Sprintf(eventName+"[%s]", code), time.Now().Format("2006-01-02 15:04:05")) + } else { + qt.Markdown.Content = fmt.Sprintf(`设备已触发事件告警 + >设备名称:%s + >告警规则:%s + >事件名称:%s + >事件内容:%s + >触发时间:%s + `, device.Name, ruleName, fmt.Sprintf(eventName+"[%s]", code), data, time.Now().Format("2006-01-02 15:04:05")) + } + case constants.DeviceStatusTrigger: + qt.Markdown.Content = fmt.Sprintf(`设备已触发状态告警 + >设备名称:%s + >告警规则:%s + >设备状态:%s`, device.Name, ruleName, device.Status) + } + return qt +} + +func (d *WeixinClient) Send(webhook string, rule models.Rule, device models.Device, product models.Product, ruleName string) { if webhook == "" { return } req := HttpRequest.NewRequest() req.JSON() - context, _ := json.Marshal(text) + context, _ := json.Marshal(d.generateWeiXinTemplate(rule, device, product, ruleName)) + d.lc.Info("weixin sent context", string(context)) resp, err := req.Post(webhook, context) if err != nil { d.lc.Errorf("weixin send alert message error:", err.Error())