dxc лет назад: 2
Родитель
Сommit
0b7e7263da
2 измененных файлов с 45 добавлено и 49 удалено
  1. 42 47
      internal/logic/callback/callbackmsglogic.go
  2. 3 2
      model/cbcustomermodel.go

+ 42 - 47
internal/logic/callback/callbackmsglogic.go

@@ -224,35 +224,34 @@ func KfAccountAuthChangeHandle(svcCtx *svc.ServiceContext, ct types.EventContent
 // 消息额外处理
 func msgTypeTextHandle(svcCtx *svc.ServiceContext, msg *model.CbMsg) {
 	key := fmt.Sprintf("cb_user_state:%v", msg.ExternalUserid)
-	v, _ := svcCtx.Redis.Get(key)
 	c, err := svcCtx.CbCustomerModel.GetCustomerByExternalUserid(msg.OpenKfid, msg.ExternalUserid)
+	v := strconv.FormatInt(c.ServiceState, 10)
 	if err != nil || c == nil || c.Id == 0 {
+		logx.Error("GetCustomerByExternalUserid fail ", err, c, msg.OpenKfid, msg.ExternalUserid)
 		//新增用户
-		if err != nil || c.Id == 0 {
-			//此处因为该接口查询多个用户时,如果其中一个超过24小时不回复,会导致所有信息都不会返回,因此这里单独请求
-			err, clist := svcCtx.WxApi.GetCustomerList([]string{msg.ExternalUserid})
-			if err != nil || len(clist) == 0 {
-				logx.Error("GetCustomerList fail ", err)
-				return
-			}
-			c.ServiceState = -1
-			c.OpenKfid = msg.OpenKfid
-			c.ExternalUserid = clist[0].ExternalUserid
-			c.Nickname = clist[0].Nickname
-			c.Avatar = clist[0].Avatar
-			c.Gender = int64(clist[0].Gender)
-			cnow := time.Now()
-			c.CreatedAt = cnow
-			c.UpdatedAt = cnow
-			c.LastMsgTime = msg.SendTime
-			_, err = svcCtx.CbCustomerModel.Insert(nil, c)
-			if err != nil {
-				logx.Error("Insert cb_customer fail ", err)
-				return
-			} else {
-				_ = svcCtx.Redis.Set(key, fmt.Sprintf("%v", c.ServiceState))
-				v = fmt.Sprintf("%v", c.ServiceState)
-			}
+		//此处因为该接口查询多个用户时,如果其中一个超过24小时不回复,会导致所有信息都不会返回,因此这里单独请求
+		err, clist := svcCtx.WxApi.GetCustomerList([]string{msg.ExternalUserid})
+		if err != nil || len(clist) == 0 {
+			logx.Error("GetCustomerList fail ", err)
+			return
+		}
+		c.ServiceState = -1
+		c.OpenKfid = msg.OpenKfid
+		c.ExternalUserid = clist[0].ExternalUserid
+		c.Nickname = clist[0].Nickname
+		c.Avatar = clist[0].Avatar
+		c.Gender = int64(clist[0].Gender)
+		cnow := time.Now()
+		c.CreatedAt = cnow
+		c.UpdatedAt = cnow
+		c.LastMsgTime = msg.SendTime
+		_, err = svcCtx.CbCustomerModel.Insert(nil, c)
+		if err != nil {
+			logx.Error("Insert cb_customer fail ", err)
+			return
+		} else {
+			_ = svcCtx.Redis.Set(key, fmt.Sprintf("%v", c.ServiceState))
+			v = fmt.Sprintf("%v", c.ServiceState)
 		}
 	} else {
 		//超过2天把状态设置成0
@@ -339,30 +338,26 @@ func InitCustomerState(svcCtx *svc.ServiceContext) {
 		}
 		for _, customer := range all {
 			key := fmt.Sprintf("cb_user_state:%v", customer.ExternalUserid)
-			v, _ := svcCtx.Redis.Get(key)
-			//状态不一致则同步
-			if v != fmt.Sprintf("%v", customer.ServiceState) {
-				//获取会话状态
-				err, sessionState := svcCtx.WxApi.GetSessionState(customer.OpenKfid, customer.ExternalUserid)
-				if err != nil {
-					logx.Error("GetSessionState fail ", err)
-					continue
-				}
-				if sessionState.ServiceState == 0 {
-					//进入会话事件,加入消息流转池
-					err := svcCtx.WxApi.UpdateSessionState(customer.OpenKfid, customer.ExternalUserid, "", 2)
-					if err != nil {
-						logx.Error("UpdateSessionState fail ", err)
-					}
-					sessionState.ServiceState = 2
-				}
-				err = svcCtx.CbCustomerModel.UpdateCustomerState(customer.OpenKfid, customer.ExternalUserid, sessionState.ServiceState)
+			//获取会话状态
+			err, sessionState := svcCtx.WxApi.GetSessionState(customer.OpenKfid, customer.ExternalUserid)
+			if err != nil {
+				logx.Error("GetSessionState fail ", err)
+				continue
+			}
+			if sessionState.ServiceState == 0 {
+				//进入会话事件,加入消息流转池
+				err := svcCtx.WxApi.UpdateSessionState(customer.OpenKfid, customer.ExternalUserid, "", 2)
 				if err != nil {
-					logx.Error("UpdateCustomerState fail ", err)
-					continue
+					logx.Error("UpdateSessionState fail ", err)
 				}
-				_ = svcCtx.Redis.Set(key, fmt.Sprintf("%v", sessionState.ServiceState))
+				sessionState.ServiceState = 2
+			}
+			err = svcCtx.CbCustomerModel.UpdateCustomerState(customer.OpenKfid, customer.ExternalUserid, sessionState.ServiceState)
+			if err != nil {
+				logx.Error("UpdateCustomerState fail ", err)
+				continue
 			}
+			_ = svcCtx.Redis.Set(key, fmt.Sprintf("%v", sessionState.ServiceState))
 		}
 		page++
 	}

+ 3 - 2
model/cbcustomermodel.go

@@ -3,6 +3,7 @@ package model
 import (
 	"fmt"
 	"github.com/zeromicro/go-zero/core/stores/sqlx"
+	"time"
 )
 
 var _ CbCustomerModel = (*customCbCustomerModel)(nil)
@@ -51,7 +52,7 @@ func (m *customCbCustomerModel) UpdateCustomerLastMsgTime(openKfid, externalUser
 }
 
 func (m *customCbCustomerModel) GetCustomerByPage(page, size int) (list []CbCustomer, err error) {
-	query := fmt.Sprintf("select * from %s where service_state != 4 limit ?,?", m.table)
-	err = m.conn.QueryRows(&list, query, (page-1)*size, size)
+	query := fmt.Sprintf("select * from %s where service_state != 4 OR last_msg_time > ? limit ?,?", m.table)
+	err = m.conn.QueryRows(&list, query, time.Now().AddDate(0, 0, -2).Unix(), (page-1)*size, size)
 	return
 }