Просмотр исходного кода

新增自动流转到会话池功能

dxc лет назад: 2
Родитель
Сommit
f9fe48bc5a

+ 28 - 6
internal/logic/callback/callbackmsglogic.go

@@ -132,11 +132,11 @@ func KfMsgOrEventHandle(svcCtx *svc.ServiceContext, ct types.EventContent) {
 			}
 			//消息额外处理
 			if cbMsg.Msgtype == types.MsgTypeText {
-				go msgTypeTextHandle(svcCtx, cbMsg)
+				msgTypeTextHandle(svcCtx, cbMsg)
 			}
 			//事件消息额外处理
 			if cbMsg.Msgtype == types.MsgTypeEvent {
-				go msgTypeEventHandle(svcCtx, cbMsg)
+				msgTypeEventHandle(svcCtx, cbMsg)
 			}
 		}
 		go updateCustomerList(svcCtx, userIds)
@@ -254,6 +254,25 @@ func updateCustomerList(svcCtx *svc.ServiceContext, userIds pie.Strings) {
 
 // 消息额外处理
 func msgTypeTextHandle(svcCtx *svc.ServiceContext, msg *model.CbMsg) {
+	key := fmt.Sprintf("cb_user_state:%v", msg.ExternalUserid)
+	v, _ := svcCtx.Redis.Get(key)
+	if v == "" || v == "4" {
+		//获取会话状态
+		err, sessionState := svcCtx.WxApi.GetSessionState(msg.OpenKfid, msg.ExternalUserid)
+		if err != nil {
+			logx.Error("GetSessionState fail ", err)
+		}
+		_ = svcCtx.Redis.Set(key, fmt.Sprintf("%v", sessionState.ServiceState))
+		return
+	}
+	if v == "0" {
+		//进入会话事件,加入消息流转池
+		err := svcCtx.WxApi.UpdateSessionState(msg.OpenKfid, msg.ExternalUserid, "", 2)
+		if err != nil {
+			logx.Error("UpdateSessionState fail ", err)
+		}
+		return
+	}
 	return
 }
 
@@ -265,12 +284,15 @@ func msgTypeEventHandle(svcCtx *svc.ServiceContext, msg *model.CbMsg) {
 	}
 	eventType := content.GetStringBytes("event_type")
 	switch string(eventType) {
-	case types.EventTypeEnterSession:
-		//进入会话事件,加入消息流转池
-		err := svcCtx.WxApi.UpdateSessionState(msg.OpenKfid, msg.ExternalUserid, "", 2)
+	case types.EventTypeSessionStatusChange:
+		key := fmt.Sprintf("cb_user_state:%v", msg.ExternalUserid)
+		//获取会话状态
+		err, sessionState := svcCtx.WxApi.GetSessionState(msg.OpenKfid, msg.ExternalUserid)
 		if err != nil {
-			logx.Error("UpdateSessionState fail ", err)
+			logx.Error("GetSessionState fail ", err)
 		}
+		_ = svcCtx.Redis.Set(key, fmt.Sprintf("%v", sessionState.ServiceState))
 		return
+	case types.EventTypeEnterSession:
 	}
 }

+ 12 - 0
pkg/wxwork/wxapi/bean.go

@@ -103,3 +103,15 @@ type UpdateSessionStateResp struct {
 	Errmsg  string `json:"errmsg"`
 	MsgCode string `json:"msg_code"`
 }
+
+type GetSessionStateParam struct {
+	OpenKfid       string `json:"open_kfid"`
+	ExternalUserid string `json:"external_userid"`
+}
+
+type GetSessionStateResp struct {
+	Errcode        int    `json:"errcode"`
+	Errmsg         string `json:"errmsg"`
+	ServiceState   int    `json:"service_state"`
+	ServicerUserid string `json:"servicer_userid"`
+}

+ 35 - 0
pkg/wxwork/wxapi/wxapi.go

@@ -292,3 +292,38 @@ func (a *WxApi) UpdateSessionState(openKfid, externalUserid, servicerUserid stri
 	}
 	return
 }
+
+// 获取会话状态
+func (a *WxApi) GetSessionState(openKfid, externalUserid string) (err error, d GetSessionStateResp) {
+	err = a.refreshAccessToken()
+	if err != nil {
+		return
+	}
+	url := GetSessionStateUrl
+	url = strings.ReplaceAll(url, "ACCESS_TOKEN", a.accessToken)
+	body := GetSessionStateParam{
+		OpenKfid:       openKfid,
+		ExternalUserid: externalUserid,
+	}
+	bts, _ := json.Marshal(body)
+	res, err := http.Post(url, "application/json", bytes.NewReader(bts))
+	if err != nil {
+		return
+	}
+	defer res.Body.Close()
+	bodyBts, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		return
+	}
+	var data GetSessionStateResp
+	err = json.Unmarshal(bodyBts, &data)
+	if err != nil {
+		return
+	}
+	if data.Errcode != 0 {
+		err = errors.New(fmt.Sprintf("errcode: %v,errmsg: %v", data.Errcode, data.Errmsg))
+		return
+	}
+	d = data
+	return
+}

+ 6 - 0
pkg/wxwork/wxapi/wxapi_test.go

@@ -45,3 +45,9 @@ func Test_GetMsgList(t *testing.T) {
 		}
 	}
 }
+
+func Test_GetSessionState(t *testing.T) {
+	err, list := wxApi.GetSessionState("wkcvcABwAAv4c-1Acoxcmy63yONrFSDw", "wmcvcABwAA2yO9tBuwQ0XK6chDfOEMZg")
+	marshal, _ := json.Marshal(list)
+	fmt.Println(err, string(marshal))
+}

+ 2 - 2
test/redis_test.go

@@ -8,9 +8,9 @@ import (
 
 func TestName(t *testing.T) {
 	newRedis, err := redis.NewRedis(redis.RedisConf{
-		Host:     "10.8.230.17:6379",
+		Host:     "120.92.140.224:16379",
 		Type:     "node",
-		Pass:     "",
+		Pass:     "123456",
 		Tls:      false,
 		NonBlock: false,
 	})