From fba199b6ff614b8c8b941b3c928baad28410c67e Mon Sep 17 00:00:00 2001 From: taoshihan1991 <630892807@qq.com> Date: Tue, 1 Dec 2020 14:53:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=AE=A2=E6=9C=8D=E8=BD=AC?= =?UTF-8?q?=E6=8E=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/kefu.go | 25 ++++++++++++++++ controller/message.go | 1 + models/visitors.go | 4 +++ router/api.go | 1 + static/html/chat_main.html | 2 +- static/js/chat-main.js | 7 +++-- ws/user.go | 26 +++++++++++++++++ ws/visitor.go | 59 +++++++++++++++++++++++++++++--------- ws/ws.go | 4 +++ 9 files changed, 111 insertions(+), 18 deletions(-) diff --git a/controller/kefu.go b/controller/kefu.go index aacbb37..0968ca1 100644 --- a/controller/kefu.go +++ b/controller/kefu.go @@ -34,6 +34,7 @@ func GetOtherKefuList(c *gin.Context) { idStr, _ := c.Get("kefu_id") id := idStr.(float64) result := make([]interface{}, 0) + ws.SendPingToKefuClient() kefus := models.FindUsers() for _, kefu := range kefus { if uint(id) == kefu.ID { @@ -42,6 +43,7 @@ func GetOtherKefuList(c *gin.Context) { item := make(map[string]interface{}) item["name"] = kefu.Name + item["nickname"] = kefu.Nickname item["avator"] = kefu.Avator item["status"] = "offline" kefus, ok := ws.KefuList[kefu.Name] @@ -56,6 +58,29 @@ func GetOtherKefuList(c *gin.Context) { "result": result, }) } +func PostTransKefu(c *gin.Context) { + kefuId := c.Query("kefu_id") + visitorId := c.Query("visitor_id") + curKefuId, _ := c.Get("kefu_name") + user := models.FindUser(kefuId) + visitor := models.FindVisitorByVistorId(visitorId) + if user.Name == "" || visitor.Name == "" { + c.JSON(200, gin.H{ + "code": 400, + "msg": "访客或客服不存在", + }) + return + } + models.UpdateVisitorKefu(visitorId, kefuId) + ws.UpdateVisitorUser(visitorId, kefuId) + go ws.VisitorOnline(kefuId, visitor) + go ws.VisitorOffline(curKefuId.(string), visitor.VisitorId, visitor.Name) + go ws.VisitorNotice(visitor.VisitorId, "客服转接到"+user.Nickname) + c.JSON(200, gin.H{ + "code": 200, + "msg": "转移成功", + }) +} func GetKefuInfoSetting(c *gin.Context) { kefuId := c.Query("kefu_id") user := models.FindUserById(kefuId) diff --git a/controller/message.go b/controller/message.go index 9bef130..793e358 100644 --- a/controller/message.go +++ b/controller/message.go @@ -148,6 +148,7 @@ func SendMessageV2(c *gin.Context) { var msg TypeMessage if cType == "kefu" { guest, ok := ws.ClientList[vistorInfo.VisitorId] + if guest != nil && ok { conn := guest.Conn diff --git a/models/visitors.go b/models/visitors.go index b2bb79a..19f730f 100644 --- a/models/visitors.go +++ b/models/visitors.go @@ -74,6 +74,10 @@ func UpdateVisitor(visitorId string, status uint, clientIp string, sourceIp stri } DB.Model(visitor).Where("visitor_id = ?", visitorId).Update(visitor) } +func UpdateVisitorKefu(visitorId string, kefuId string) { + visitor := Visitor{} + DB.Model(&visitor).Where("visitor_id = ?", visitorId).Update("to_id", kefuId) +} //查询条数 func CountVisitors() uint { diff --git a/router/api.go b/router/api.go index b9fad16..fee8668 100644 --- a/router/api.go +++ b/router/api.go @@ -50,6 +50,7 @@ func InitApiRouter(engine *gin.Engine) { engine.DELETE("/kefuinfo", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.DeleteKefuInfo) engine.GET("/kefulist", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetKefuList) engine.GET("/other_kefulist", middleware.JwtApiMiddleware, controller.GetOtherKefuList) + engine.GET("/trans_kefu", middleware.JwtApiMiddleware, controller.PostTransKefu) //角色列表 engine.GET("/roles", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetRoleList) engine.POST("/role", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostRole) diff --git a/static/html/chat_main.html b/static/html/chat_main.html index fa6e014..ae7589c 100644 --- a/static/html/chat_main.html +++ b/static/html/chat_main.html @@ -224,7 +224,7 @@ :data="otherKefus" style="width: 100%"> 0 { + KefuList[kefuId] = newKefuConns + } else { + delete(KefuList, kefuId) + } + } +} diff --git a/ws/visitor.go b/ws/visitor.go index 23d2e9a..70d2e1e 100644 --- a/ws/visitor.go +++ b/ws/visitor.go @@ -3,6 +3,7 @@ package ws import ( "encoding/json" "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" "github.com/taoshihan1991/imaptool/models" "log" ) @@ -40,21 +41,11 @@ func NewVisitorServer(c *gin.Context) { var receive []byte messageType, receive, err := conn.ReadMessage() if err != nil { - for uid, visitor := range ClientList { + for _, visitor := range ClientList { if visitor.Conn == conn { - log.Println("删除用户", uid) - delete(ClientList, uid) - models.UpdateVisitorStatus(uid, 0) - userInfo := make(map[string]string) - userInfo["uid"] = uid - userInfo["name"] = visitor.Name - msg := TypeMessage{ - Type: "userOffline", - Data: userInfo, - } - str, _ := json.Marshal(msg) - //新版 - OneKefuMessage(user.To_id, str) + log.Println("删除用户", visitor.Id) + delete(ClientList, visitor.Id) + VisitorOffline(visitor.To_id, visitor.Id, visitor.Name) } } log.Println(err) @@ -90,3 +81,43 @@ func AddVisitorToList(user *User) { //新版 OneKefuMessage(user.To_id, str) } +func VisitorOnline(kefuId string, visitor models.Visitor) { + lastMessage := models.FindLastMessageByVisitorId(visitor.VisitorId) + userInfo := make(map[string]string) + userInfo["uid"] = visitor.VisitorId + userInfo["username"] = visitor.Name + userInfo["avator"] = visitor.Avator + userInfo["last_message"] = lastMessage.Content + if userInfo["last_message"] == "" { + userInfo["last_message"] = "新访客" + } + msg := TypeMessage{ + Type: "userOnline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + OneKefuMessage(kefuId, str) +} +func VisitorOffline(kefuId string, visitorId string, visitorName string) { + + models.UpdateVisitorStatus(visitorId, 0) + userInfo := make(map[string]string) + userInfo["uid"] = visitorId + userInfo["name"] = visitorName + msg := TypeMessage{ + Type: "userOffline", + Data: userInfo, + } + str, _ := json.Marshal(msg) + //新版 + OneKefuMessage(kefuId, str) +} +func VisitorNotice(visitorId string, notice string) { + msg := TypeMessage{ + Type: "notice", + Data: notice, + } + str, _ := json.Marshal(msg) + visitor := ClientList[visitorId] + visitor.Conn.WriteMessage(websocket.TextMessage, str) +} diff --git a/ws/ws.go b/ws/ws.go index 0e66459..4c897e4 100644 --- a/ws/ws.go +++ b/ws/ws.go @@ -123,3 +123,7 @@ func WsServerBackend() { } } +func UpdateVisitorUser(visitorId string, toId string) { + guest, _ := ClientList[visitorId] + guest.To_id = toId +}