Yearning外置工单通知实现思路


背景概述

上篇我们讲解了一下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来自定义通知。

posted @ 2024-06-07 09:35  技术颜良  阅读(9)  评论(0编辑  收藏  举报