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
+}