edb_monitor_message.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package edbmonitor
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/global"
  6. "eta/eta_api/models"
  7. edbmonitor "eta/eta_api/models/edb_monitor"
  8. "eta/eta_api/models/edb_monitor/response"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "time"
  12. "github.com/rdlucklib/rdluck_tools/paging"
  13. )
  14. func ReadEdbMonitorMessage(messageId, adminId int) (msg string, err error) {
  15. message, err := edbmonitor.GetEdbMonitorMessageById(messageId)
  16. if err != nil {
  17. if utils.IsErrNoRow(err) {
  18. msg = "消息不存在"
  19. return
  20. }
  21. msg = "获取消息失败"
  22. return
  23. }
  24. if message.AdminId != adminId {
  25. msg = "您没有权限查看该消息"
  26. err = errors.New("no permission")
  27. return
  28. }
  29. message.IsRead = 1
  30. err = message.Update([]string{"IsRead"})
  31. if err != nil {
  32. msg = "已读失败"
  33. return
  34. }
  35. return
  36. }
  37. func ReadEdbMonitorMessageList(messageId []int, adminId int) (msg string, err error) {
  38. err = edbmonitor.BatchModifyEdbMonitorMessageIsRead(messageId, adminId)
  39. if err != nil {
  40. msg = "已读失败"
  41. return
  42. }
  43. return
  44. }
  45. // func EdbMonitorMessageHealth(adminId int) (isClose bool, err error) {
  46. // conn := MonitorMessageConn[adminId]
  47. // if conn == nil {
  48. // err = errors.New("no connection")
  49. // isClose = true
  50. // return
  51. // }
  52. // _, msg, err := conn.ReadMessage()
  53. // if err != nil {
  54. // isClose = true
  55. // return
  56. // }
  57. // if string(msg) == "ping" {
  58. // healthKey := EDB_MONITOR_MESSAGE_CONNECT_CACHE + strconv.Itoa(adminId)
  59. // err = utils.Rc.Put(healthKey, "1", time.Minute*1)
  60. // if err != nil {
  61. // return
  62. // }
  63. // }
  64. // return
  65. // }
  66. func LogMessage(content, uniqueCode string, triggerTime time.Time, edbInfoId, edbInfoType, adminId, isRead, classifyId int) (err error) {
  67. message := &edbmonitor.EdbMonitorMessage{
  68. EdbInfoId: edbInfoId,
  69. EdbInfoType: edbInfoType,
  70. EdbUniqueCode: uniqueCode,
  71. EdbClassifyId: classifyId,
  72. AdminId: adminId,
  73. IsRead: isRead,
  74. Message: content + "触发预警",
  75. MonitorTriggerTime: triggerTime,
  76. CreateTime: time.Now(),
  77. }
  78. _, err = message.Insert()
  79. return err
  80. }
  81. func SendMessages(adminId, edbInfoId, edbInfoType int, classifyId int, edbUniqueCode, message string, triggerTime string) (err error) {
  82. conn := global.AdminWebSocketConnMap[adminId]
  83. if conn == nil {
  84. err = errors.New("no connection")
  85. return
  86. }
  87. resp := models.WebsocketMessageResponse{
  88. MessageType: 0,
  89. Data: response.EdbMonitorMessageResp{
  90. EdbInfoId: edbInfoId,
  91. EdbInfoType: edbInfoType,
  92. EdbUniqueCode: edbUniqueCode,
  93. EdbClassifyId: classifyId,
  94. Message: message,
  95. TriggerTime: triggerTime,
  96. },
  97. }
  98. jsonData, err := json.Marshal(resp)
  99. if err != nil {
  100. err = fmt.Errorf("json marshal failed, err:%s", err.Error())
  101. return
  102. }
  103. ok := conn.Send(jsonData)
  104. if !ok {
  105. err = fmt.Errorf("send message failed, err:%s", err.Error())
  106. return
  107. }
  108. return
  109. }
  110. func GetHistoryMessages(adminId int) (items []*response.EdbMonitorMessageResp, err error) {
  111. messageList, err := edbmonitor.GetEdbMonitorMessageByAdminId(adminId)
  112. if err != nil {
  113. return
  114. }
  115. items = toEdbMonitorMessageResp(messageList)
  116. return
  117. }
  118. func GetMessageList(adminid int, currentIndex, pageSize int) (resp response.EdbMonitorMessageListResp, err error) {
  119. startSize := utils.StartIndex(currentIndex, pageSize)
  120. total, err := edbmonitor.GetEdbMonitorMessageCountByAdminId(adminid)
  121. if err != nil {
  122. return
  123. }
  124. if total == 0 {
  125. resp.List = make([]*response.EdbMonitorMessageResp, 0)
  126. resp.Paging = paging.GetPaging(currentIndex, pageSize, total)
  127. return
  128. }
  129. messageList, err := edbmonitor.GetEdbMonitorMessagePageByAdminId(adminid, startSize, pageSize)
  130. if err != nil {
  131. return
  132. }
  133. resp.List = toEdbMonitorMessageResp(messageList)
  134. resp.Paging = paging.GetPaging(currentIndex, pageSize, total)
  135. return
  136. }
  137. func toEdbMonitorMessageResp(items []*edbmonitor.EdbMonitorMessage) (list []*response.EdbMonitorMessageResp) {
  138. list = make([]*response.EdbMonitorMessageResp, 0)
  139. for _, message := range items {
  140. item := response.EdbMonitorMessageResp{
  141. EdbMonitorMessageId: message.EdbMonitorMessageId,
  142. EdbInfoId: message.EdbInfoId,
  143. EdbInfoType: message.EdbInfoType,
  144. EdbUniqueCode: message.EdbUniqueCode,
  145. EdbClassifyId: message.EdbClassifyId,
  146. IsRead: message.IsRead,
  147. Message: message.Message,
  148. TriggerTime: utils.TimeTransferString(utils.FormatDateTime, message.MonitorTriggerTime),
  149. }
  150. list = append(list, &item)
  151. }
  152. return
  153. }
  154. func AutoCheckMonitorMessageList() (err error) {
  155. defer func() {
  156. if err != nil {
  157. utils.FileLog.Error("指标预警信息发送失败,err:%s", err.Error())
  158. }
  159. }()
  160. ticker := time.NewTicker(time.Second * 10)
  161. defer ticker.Stop()
  162. for {
  163. select {
  164. case <-ticker.C:
  165. autoCheckMonitorMessageList()
  166. }
  167. }
  168. }
  169. func autoCheckMonitorMessageList() (err error){
  170. defer func() {
  171. if err != nil {
  172. utils.FileLog.Error("指标预警信息检查失败,err:%s", err.Error())
  173. }
  174. }()
  175. utils.FileLog.Info("检查是否有预警信息")
  176. admins := make([]int, 0)
  177. for adminId, conn := range global.AdminWebSocketConnMap {
  178. if conn == nil {
  179. continue
  180. }
  181. admins = append(admins, adminId)
  182. }
  183. if len(admins) == 0 {
  184. return
  185. }
  186. messageList, er := edbmonitor.GetEdbMonitorMessageUnreadListByAdminIds(admins)
  187. if er != nil {
  188. err = fmt.Errorf("获取指标预警信息历史失败,err:%s", er.Error())
  189. return
  190. }
  191. readList := make([]int, 0)
  192. adminMsgMap := make(map[int]int)
  193. for _, msg := range messageList {
  194. if _, ok := adminMsgMap[msg.AdminId]; !ok {
  195. adminMsgMap[msg.AdminId] = msg.EdbMonitorMessageId
  196. triggerTime := utils.TimeTransferString(utils.FormatDateTime, msg.MonitorTriggerTime)
  197. err := SendMessages(msg.AdminId, msg.EdbInfoId, msg.EdbInfoType, msg.EdbClassifyId, msg.EdbUniqueCode, msg.Message, triggerTime)
  198. if err != nil {
  199. utils.FileLog.Error("指标预警信息发送失败,err:%s, adminId:%d", err.Error(), msg.AdminId)
  200. }
  201. }else {
  202. readList = append(readList, msg.EdbMonitorMessageId)
  203. }
  204. }
  205. err = edbmonitor.SetEdbMonitorMessageReadByIds(readList)
  206. if err != nil {
  207. err = fmt.Errorf("指标预警信息已读失败,err:%s", err.Error())
  208. return
  209. }
  210. return
  211. }
  212. func AutoCheckMonitorMessageListByAdminId(adminId int) (err error){
  213. // 设置缓存防止重复发送
  214. cacheKey := fmt.Sprintf("%s%d", utils.CACHE_EDB_MONITOR_MESSAGE, adminId)
  215. if !utils.Rc.SetNX(cacheKey, 1, 10*time.Minute) {
  216. err = fmt.Errorf("系统处理中,请稍后重试!")
  217. utils.FileLog.Error("指标预警信息检查失败,err:%s", err.Error())
  218. return
  219. }
  220. defer func() {
  221. if err != nil {
  222. utils.FileLog.Error("指标预警信息检查失败,err:%s", err.Error())
  223. }
  224. _ = utils.Rc.Delete(cacheKey)
  225. }()
  226. utils.FileLog.Info("检查是否有预警信息")
  227. messageList, er := edbmonitor.GetEdbMonitorMessageUnreadByAdminId(adminId)
  228. if er != nil {
  229. err = fmt.Errorf("获取指标预警信息历史失败,err:%s", er.Error())
  230. return
  231. }
  232. if len(messageList) == 0 {
  233. return
  234. }
  235. readList := make([]int, 0)
  236. for k, msg := range messageList {
  237. if k == 0 {
  238. triggerTime := utils.TimeTransferString(utils.FormatDateTime, msg.MonitorTriggerTime)
  239. err := SendMessages(msg.AdminId, msg.EdbInfoId, msg.EdbInfoType, msg.EdbClassifyId, msg.EdbUniqueCode, msg.Message, triggerTime)
  240. if err != nil {
  241. utils.FileLog.Error("指标预警信息发送失败,err:%s, adminId:%d", err.Error(), msg.AdminId)
  242. }
  243. }
  244. readList = append(readList, msg.EdbMonitorMessageId)
  245. }
  246. err = edbmonitor.SetEdbMonitorMessageReadByAdminId(adminId, readList)
  247. if err != nil {
  248. err = fmt.Errorf("指标预警信息已读失败,err:%s", err.Error())
  249. return
  250. }
  251. return
  252. }