Browse Source

Merge branch 'bzq1/monitor_custom_cf' of eta_server/eta_api into debug

鲍自强 5 months ago
parent
commit
d6979acffa

+ 1 - 0
controllers/edb_monitor/edb_monitor.go

@@ -20,6 +20,7 @@ type EdbMonitorController struct {
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   ClassifyId   query   string  true       "分类ID,多选用逗号分隔"
 // @Param   Level   query   string  true       "预警等级,多选用逗号分隔"
+// @Param   State   query   string  true       "预警状态,多选用逗号分隔"
 // @Param   UserId   query   string  true       "创建人ID,多选用逗号分隔"
 // @Success 200 {object} response.EdbMonitorInfoListResp
 // @router /list [get]

+ 156 - 5
controllers/edb_monitor/edb_monitor_message.go

@@ -1,15 +1,20 @@
 package edb_monitor
 
 import (
+	"encoding/json"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
+	"eta/eta_api/models/edb_monitor/request"
 	edbmonitor "eta/eta_api/services/edb_monitor"
+	"eta/eta_api/utils"
 	"net/http"
+	"strconv"
+	"time"
 
 	"github.com/gorilla/websocket"
 )
 
-type EdbMonitorMessage struct {
+type EdbMonitorMessageController struct {
 	controllers.BaseAuthController
 }
 
@@ -28,8 +33,8 @@ var edbMonitorMessageClient = make(map[int]*websocket.Conn)
 // @Description 预警管理消息
 // @Param   request body request.EdbMonitorSaveRequest  true  "每页数据条数"
 // @Success 200 {object} models.EnglishReportEmailPageListResp
-// @router /message [get]
-func (m *EdbMonitorController) Message() {
+// @router /message/connect [get]
+func (m *EdbMonitorMessageController) Connect() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		m.Data["json"] = br
@@ -42,15 +47,161 @@ func (m *EdbMonitorController) Message() {
 		br.Ret = 408
 		return
 	}
-	conn, err := upgrader.Upgrade(m.Ctx.ResponseWriter, m.Ctx.Request, nil)
+
+	var conn *websocket.Conn
+	connKey := edbmonitor.EDB_MONITOR_MESSAGE_CONNECT_CACHE + strconv.Itoa(sysUser.AdminId)
+	ok := utils.Rc.IsExist(connKey)
+	if !ok {
+		conn = edbMonitorMessageClient[sysUser.AdminId]
+		if conn != nil {
+			conn.Close()
+		}
+	}
+	err := utils.Rc.Put(connKey, "1", time.Minute*3)
+	if err != nil {
+		br.Msg = "系统错误"
+		br.ErrMsg = "连接失败,err:" + err.Error()
+		return
+	}
+	conn, err = upgrader.Upgrade(m.Ctx.ResponseWriter, m.Ctx.Request, nil)
 	if err != nil {
+		br.Msg = "连接失败"
+		br.ErrMsg = "连接失败,err:" + err.Error()
 		return
 	}
+
 	edbMonitorMessageClient[sysUser.AdminId] = conn
 	conn.SetCloseHandler(func(code int, text string) error {
 		delete(edbMonitorMessageClient, sysUser.AdminId)
+		utils.Rc.Delete(connKey)
 		return nil
 	})
-	edbmonitor.SendMessages(conn, sysUser.AdminId)
+	for {
+		ok = utils.Rc.IsExist(connKey)
+		if !ok {
+			br.Msg = "连接已断开"
+			return
+		}
+		err = edbmonitor.SendMessages(conn, sysUser.AdminId)
+		if err != nil {
+			utils.FileLog.Error("指标预警信息发送失败,err:%s, adminId:%d", err.Error(), sysUser.AdminId)
+		}
+		time.Sleep(1 * time.Minute)
+	}
+}
+
+// Health
+// @Title 预警管理消息
+// @Description 预警管理消息
+// @Param   request body request.EdbMonitorSaveRequest  true  "每页数据条数"
+// @Success 200 {object} models.EnglishReportEmailPageListResp
+// @router /message/health [post]
+func (m *EdbMonitorMessageController) Health() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		m.Data["json"] = br
+		m.ServeJSON()
+	}()
+	sysUser := m.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	conn := edbMonitorMessageClient[sysUser.AdminId]
+	if conn == nil {
+		br.Msg = "系统错误"
+		br.ErrMsg = "健康检查失败,err:连接已断开"
+		return
+	}
+
+	healthKey := edbmonitor.EDB_MONITOR_MESSAGE_CONNECT_CACHE + strconv.Itoa(sysUser.AdminId)
+	err := utils.Rc.Put(healthKey, "1", time.Minute*3)
+	if err != nil {
+		br.Msg = "系统错误"
+		br.ErrMsg = "健康检查失败,err:" + err.Error()
+		return
+	}
+
+	br.Msg = "成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// Close
+// @Title 预警管理消息
+// @Description 预警管理消息
+// @Param   request body request.EdbMonitorSaveRequest  true  "每页数据条数"
+// @Success 200 {object} models.EnglishReportEmailPageListResp
+// @router /message/close [post]
+func (m *EdbMonitorMessageController) Close() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		m.Data["json"] = br
+		m.ServeJSON()
+	}()
+	sysUser := m.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	conn := edbMonitorMessageClient[sysUser.AdminId]
+	if conn != nil {
+		conn.Close()
+	}
+
+	br.Msg = "关闭成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// Read
+// @Title 预警管理消息已读
+// @Description 预警管理消息已读
+// @Param   request body request.EdbMonitorSaveRequest  true  "每页数据条数"
+// @Success 200 {object} models.EnglishReportEmailPageListResp
+// @router /message/read [post]
+func (m *EdbMonitorMessageController) Read() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		m.Data["json"] = br
+		m.ServeJSON()
+	}()
+
+	sysUser := m.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req request.EdbMonitorMessageReadReq
+	if err := json.Unmarshal(m.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,err:" + err.Error()
+		return
+	}
+	if req.EdbMonitorMessageId <= 0 {
+		br.Msg = "参数错误"
+		return
+	}
+
+	msg, err := edbmonitor.ReadEdbMonitorMessage(req.EdbMonitorMessageId, sysUser.AdminId)
+	if err != nil {
+		if msg == "" {
+			msg = "系统错误"
+		}
+		br.Msg = msg
+		br.ErrMsg = "读取消息失败,err:" + err.Error()
+		return
+	}
 
+	br.Msg = "已读成功"
+	br.Ret = 200
+	br.Success = true
 }

+ 1 - 0
models/db.go

@@ -649,6 +649,7 @@ func initEdbMonitor() {
 	orm.RegisterModel(
 		new(edbmonitor.EdbMonitorInfo),     // 预警管理表
 		new(edbmonitor.EdbMonitorClassify), // 预警管理分类表
+		new(edbmonitor.EdbMonitorMessage),  // 预警管理消息表
 	)
 }
 

+ 17 - 4
models/edb_monitor/edb_monitor_message.go

@@ -18,14 +18,27 @@ type EdbMonitorMessage struct {
 }
 
 func (m *EdbMonitorMessage) Insert() (insertId int64, err error) {
-	o := orm.NewOrm()
+	o := orm.NewOrmUsingDB("data")
 	insertId, err = o.Insert(m)
 	return
 }
 
-func GetEdbMonitorMessageByAdminId(adminId int) (items []*EdbMonitorMessage, err error) {
+func (m *EdbMonitorMessage) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func GetEdbMonitorMessageById(id int) (item *EdbMonitorMessage, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM edb_monitor_message WHERE edb_monitor_message_id =?"
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func GetEdbMonitorMessageByAdminId(adminId int) (item *EdbMonitorMessage, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := "SELECT * FROM edb_monitor_message WHERE admin_id =? AND is_read = 0 ORDER BY is_read ASC, create_time DESC"
-	_, err = o.Raw(sql, adminId).QueryRows(&items)
+	sql := "SELECT * FROM edb_monitor_message WHERE admin_id =? AND is_read = 0 ORDER BY create_time DESC LIMIT 1"
+	err = o.Raw(sql, adminId).QueryRow(&item)
 	return
 }

+ 5 - 0
models/edb_monitor/request/edb_monitor_message.go

@@ -0,0 +1,5 @@
+package request
+
+type EdbMonitorMessageReadReq struct {
+	EdbMonitorMessageId int `description:"预警消息id"`
+}

+ 5 - 17
models/edb_monitor/response/edb_monitor_message.go

@@ -1,21 +1,9 @@
 package response
 
-import "time"
-
 type EdbMonitorMessageResp struct {
-	EdbInfoId   int    `description:"指标id"`
-	EdbInfoType int    `description:"指标类型:0-普通指标;1-预测指标"`
-	Message     string `description:"消息内容"`
-	TriggerTime string `description:"触发时间"`
-}
-
-type EdbMonitorMessageListResp struct {
-	EdbMonitorMessageId int       `orm:"column(edb_monitor_message_id);pk"`
-	EdbInfoId           int       `description:"指标id"`
-	EdbInfoType         int       `description:"指标类型: 0-普通指标;1-预测指标"`
-	AdminId             int       `description:"用户id"`
-	IsRead              int       `description:"是否已读: 0-未读;1-已读"`
-	Message             string    `description:"消息内容"`
-	MonitorTriggerTime  string    `description:"预警触发时间"`
-	CreateTime          time.Time `description:"创建时间"`
+	EdbMonitorMessageId int    `description:"消息id"`
+	EdbInfoId           int    `description:"指标id"`
+	EdbInfoType         int    `description:"指标类型:0-普通指标;1-预测指标"`
+	Message             string `description:"消息内容"`
+	TriggerTime         string `description:"触发时间"`
 }

+ 36 - 9
routers/commentsRouter.go

@@ -6793,15 +6793,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorController"],
-        beego.ControllerComments{
-            Method: "Message",
-            Router: `/message`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorController"],
         beego.ControllerComments{
             Method: "GetMonitorLevel",
@@ -6829,6 +6820,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"],
+        beego.ControllerComments{
+            Method: "Close",
+            Router: `/message/close`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"],
+        beego.ControllerComments{
+            Method: "Connect",
+            Router: `/message/connect`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"],
+        beego.ControllerComments{
+            Method: "Health",
+            Router: `/message/health`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/edb_monitor:EdbMonitorMessageController"],
+        beego.ControllerComments{
+            Method: "Read",
+            Router: `/message/read`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
             Method: "Add",

+ 1 - 1
routers/router.go

@@ -411,7 +411,7 @@ func init() {
 			web.NSInclude(
 				&edb_monitor.EdbMonitorController{},
 				&edb_monitor.EdbMonitorClassifyController{},
-				&edb_monitor.EdbMonitorMessage{},
+				&edb_monitor.EdbMonitorMessageController{},
 			),
 		),
 		web.NSNamespace("/bi_dashborad",

+ 38 - 19
services/edb_monitor/edb_monitor_message.go

@@ -1,7 +1,7 @@
 package edbmonitor
 
 import (
-	"encoding/json"
+	"errors"
 	edbmonitor "eta/eta_api/models/edb_monitor"
 	"eta/eta_api/models/edb_monitor/response"
 	"eta/eta_api/utils"
@@ -10,10 +10,32 @@ import (
 	"github.com/gorilla/websocket"
 )
 
-func GetEdbMonitorMessageList(adminId int) {
-
-	edbmonitor.GetEdbMonitorMessageByAdminId(adminId)
+var (
+	EDB_MONITOR_MESSAGE_CONNECT_CACHE = "edb_monitor_message_cache:"
+)
 
+func ReadEdbMonitorMessage(messageId, adminId int) (msg string, err error) {
+	message, err := edbmonitor.GetEdbMonitorMessageById(messageId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			msg = "消息不存在"
+			return
+		}
+		msg = "获取消息失败"
+		return
+	}
+	if message.AdminId != adminId {
+		msg = "您没有权限查看该消息"
+		err = errors.New("no permission")
+		return
+	}
+	message.IsRead = 1
+	err = message.Update([]string{"IsRead"})
+	if err != nil {
+		msg = "已读失败"
+		return
+	}
+	return
 }
 
 func LogMessage(content string, triggerTime time.Time, edbInfoId, edbInfoType, adminId int) (err error) {
@@ -31,20 +53,17 @@ func LogMessage(content string, triggerTime time.Time, edbInfoId, edbInfoType, a
 	return err
 }
 
-func SendMessages(conn *websocket.Conn, adminId int) {
-	for {
-
-		messageList, _ := edbmonitor.GetEdbMonitorMessageByAdminId(adminId)
-		for _, message := range messageList {
-			msg := response.EdbMonitorMessageResp{
-				EdbInfoId:   message.EdbInfoId,
-				EdbInfoType: message.EdbInfoType,
-				Message:     message.Message,
-				TriggerTime: utils.TimeTransferString(utils.FormatDateTime, message.MonitorTriggerTime),
-			}
-			b, _ := json.Marshal(msg)
-			conn.WriteMessage(websocket.TextMessage, b)
-		}
-		time.Sleep(5 * time.Minute)
+func SendMessages(conn *websocket.Conn, adminId int) (err error) {
+	message, err := edbmonitor.GetEdbMonitorMessageByAdminId(adminId)
+	if err != nil {
+		return
+	}
+	msg := response.EdbMonitorMessageResp{
+		EdbMonitorMessageId: message.EdbMonitorMessageId,
+		EdbInfoId:           message.EdbInfoId,
+		EdbInfoType:         message.EdbInfoType,
+		Message:             message.Message,
+		TriggerTime:         utils.TimeTransferString(utils.FormatDateTime, message.MonitorTriggerTime),
 	}
+	return conn.WriteJSON(msg)
 }