Yearning外接工單通知實現思路

技术颜良發表於2024-06-07

背景概述

上篇我們講解了一下Yearning如何使用飛書傳送工單通知,但是我最初的想法不僅僅是飛書、釘釘這些媒介,更多的是希望可以自定義整合渠道,因此想到了PrometheusAlert,這樣我們就不用重新造輪子了。

大致配置

圖片image-20240606110115965

我們拿到Yearning傳送的資料,當然這個資料需要我們修改一下程式碼哦,當我們有源資料了,那麼我們就可以自定義通知渠道了,如果還不會可以掃描下方二維碼一起學習交流。

環境準備

Go版本:1.20

開發工具:Goland

資料庫:mysql

原始碼:

https://github.com/cookieY/gemini-next.git

https://github.com/cookieY/Yearning.git

大致實現

修改程式碼

src/lib/ding.go

func dingMsgTplHandler(state string, generic interface{}) string {
var order imCryGeneric
// 新增
type SendOrder struct {
Order imCryGeneric
Status string `json:"status"`
}
switch v := generic.(type) {
case model.CoreSqlOrder:
order = imCryGeneric{
Assigned: v.Assigned,
WorkId: v.WorkId,
Source: v.Source,
Username: v.Username,
Text: v.Text,
}
case model.CoreQueryOrder:
order = imCryGeneric{
Assigned: v.Assigned,
WorkId: v.WorkId + i18n.DefaultLang.Load(i18n.INFO_QUERY),
Source: i18n.DefaultLang.Load(i18n.ER_QUERY_NO_DATA_SOURCE),
Username: v.Username,
Text: v.Text,
}
}

if !stateHandler(state) {
order.Assigned = "無"
}
msg := SendOrder{
Order: order,
Status: state,
}

jsonData, _ := json.Marshal(msg)
return string(jsonData)
}

src/handler/order/audit/impl.go

func ExecuteOrder(u *Confirm, user string) common.Resp {
var order model.CoreSqlOrder
var source model.CoreDataSource
model.DB().Where("work_id =?", u.WorkId).First(&order)

if order.Status != 2 && order.Status != 5 {
return common.ERR_COMMON_TEXT_MESSAGE(i18n.DefaultLang.Load(i18n.ORDER_NOT_SEARCH))
}
order.Assigned = user

model.DB().Model(model.CoreDataSource{}).Where("source_id =?", order.SourceId).First(&source)
rule, err := lib.CheckDataSourceRule(source.RuleId)
if err != nil {
logger.DefaultLogger.Error(err)
}

var isCall bool
if client := lib.NewRpc(); client != nil {
if err := client.Call("Engine.Exec", &ExecArgs{
Order: &order,
Rules: *rule,
IP: source.IP,
Port: source.Port,
Username: source.Username,
Password: lib.Decrypt(model.JWT, source.Password),
CA: source.CAFile,
Cert: source.Cert,
Key: source.KeyFile,
//Message: model.GloMessage,
}, &isCall); err != nil {
return common.ERR_RPC
}
model.DB().Create(&model.CoreWorkflowDetail{
WorkId: u.WorkId,
Username: user,
Time: time.Now().Format("2006-01-02 15:04"),
Action: i18n.DefaultLang.Load(i18n.ORDER_EXECUTE_STATE),
})
// 新增
lib.MessagePush(u.WorkId, 1, "")
return common.SuccessPayLoadToMessage(i18n.DefaultLang.Load(i18n.ORDER_EXECUTE_STATE))
}
return common.ERR_RPC

}

驗證

  1. 提交工單

    圖片image-20240606111001505圖片image-20240606111021035
  2. 稽核工單

    圖片image-20240606111137782圖片image-20240606111146046
  3. 執行工單

    圖片圖片

  4. 駁回工單

    圖片image-20240606111802580

PrometheusAlert配置

模板內容

### Yearning工單通知
**工單編號:** {{.Order.WorkId}}

**提交人員:** {{.Order.Username}}

**資料來源:** {{.Order.Source}}

**下一步操作人:** {{.Order.Assigned}}

{{ if eq .Order.Assigned "執行成功" }}
**狀態:** <font color="#1abefa"> {{.status}} </font>
{{ else }}
**狀態:** {{.status}}
{{ end }}
**工單說明:**
> {{.Order.Text}}

訊息協議JSON內容

{
"Order": {
"Assigned": "無",
"WorkId": "1f452500-2e7f-445e-96a8-648205f20876",
"Source": "test",
"Username": "zxl",
"Text": "123456"
},
"status": "執行成功"
}

我們可以根據訊息JSON來自定義通知渠道,例如:釘釘、企業微信、飛書等等。

總結

承諾以上內容僅供學習。這樣依賴我們就可以實現大部分渠道的通知了,即便prometheusAlert不涉及的渠道我們也可以自己寫一個webhook來自定義通知。

相關文章