|
@@ -9,7 +9,7 @@ import (
|
|
|
m "app.yhyue.com/moapp/jybase/mongodb"
|
|
|
"app.yhyue.com/moapp/jybase/redis"
|
|
|
"context"
|
|
|
- "errors"
|
|
|
+ "encoding/json"
|
|
|
"fmt"
|
|
|
"log"
|
|
|
"strconv"
|
|
@@ -27,9 +27,13 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
|
|
|
fmt.Printf("此用户暂无消息 : %s", err.Error())
|
|
|
}
|
|
|
//用户分类消息
|
|
|
- _, userClassMsgMap := FindUserClassMsg(this.UserId)
|
|
|
- //用户分类未读消息
|
|
|
- classUnreadCountMap, classUnreadMsgMap := FindUserClassUnread(this.UserId)
|
|
|
+ //_, userClassMsgMap := FindUserClassMsg(this.UserId)
|
|
|
+ ////用户分类未读消息
|
|
|
+ //classUnreadCountMap, classUnreadMsgMap := FindUserClassUnread(this.UserId)
|
|
|
+ classUnreadCountMap, classUnreadMsgMap, userClassMsgMap, err := FindUserClassUnreadAndClassAllMsg(this.UserId)
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil
|
|
|
+ }
|
|
|
//fmt.Println("用户所有消息数:", userAllMsgArr, "已读消息数:", userReadArr, "未读消息数:", userUnreadArr)
|
|
|
//导航未读消息总数
|
|
|
if !this.IsMsgList && !this.IsColumnNewMsg && !this.IsColumn { //消息未读数统计
|
|
@@ -297,9 +301,10 @@ func BitmapMessageGetLast(this *message.UserMsgListReq, msgId int) *message.Mess
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-type UserClassUnread struct {
|
|
|
- GroupId int32 `ch:"group_id"`
|
|
|
- UnreadArr []uint32 `ch:"unreadArr"`
|
|
|
+type UserClassSummary struct {
|
|
|
+ GroupId int32 `ch:"group_id"`
|
|
|
+ ClassUnread []uint32 `ch:"unreadArr"`
|
|
|
+ ClassAll []uint32 `ch:"classMsgArr"`
|
|
|
}
|
|
|
|
|
|
// BitmapCountUnread 未读消息合计 isRedis 是否需要初始化redis
|
|
@@ -378,35 +383,53 @@ func BitmapCountClassUnread(userId string, groupId int64, classUnreadCountMap ma
|
|
|
return data, count
|
|
|
}
|
|
|
|
|
|
-//FindUserClassUnread 查询用户分类未读消息id
|
|
|
-func FindUserClassUnread(userId string) (map[int]int, map[int][]int) {
|
|
|
- sql := fmt.Sprintf(`select a2.group_id,bitmapToArray(bitmapAnd(a1.unreadArr,a2.msg_bitmap)) as unreadArr from
|
|
|
- (SELECT bitmapAndnot(mus.allMsg,mus.readMsg) unreadArr FROM message_user_summary mus WHERE mus.userId = '%s') a1,
|
|
|
- (select msg_bitmap,group_id from message_summary ms where 1=1 limit 10) a2`, userId)
|
|
|
- fmt.Println("FindUserClassUnread", sql)
|
|
|
+//FindUserClassUnreadAndClassAllMsg 查询用户分类未读消息id
|
|
|
+func FindUserClassUnreadAndClassAllMsg(userId string) (classUnreadCountMap map[int]int, classUnreadMsgMap, classAllMsgMap map[int][]int, err error) {
|
|
|
+ redisKey := fmt.Sprintf(UserClassMapKey, userId)
|
|
|
+ redisData := redis.Get(redisModule, redisKey)
|
|
|
+ findRes := []UserClassSummary{}
|
|
|
+ if redisData != nil {
|
|
|
+ if data, err1 := json.Marshal(redisData); err1 == nil {
|
|
|
+ json.Unmarshal(data, &findRes)
|
|
|
+ for _, v := range findRes {
|
|
|
+ classUnreadCountMap[int(v.GroupId)] = len(v.ClassUnread)
|
|
|
+ classUnreadMsgMap[int(v.GroupId)] = Uint32ArrToIntArr(v.ClassUnread)
|
|
|
+ //classAllCountMap[int(v.GroupId)] = len(v.ClassAll)
|
|
|
+ classAllMsgMap[int(v.GroupId)] = Uint32ArrToIntArr(v.ClassAll)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sql := fmt.Sprintf(`select a2.group_id,bitmapToArray(bitmapAnd(a1.unreadArr,a2.msg_bitmap)) as unreadArr,bitmapToArray(bitmapAnd(a1.allMsg,a2.msg_bitmap)) as classMsgArr from
|
|
|
+ (SELECT bitmapAndnot(mus.allMsg,mus.readMsg) unreadArr,mus.allMsg FROM message_user_summary mus WHERE mus.userId = '%s') a1,
|
|
|
+ (select msg_bitmap,group_id from message_summary ms where 1=1 limit 10) a2`, userId)
|
|
|
+ log.Println("FindUserClassUnreadAndClassAllMsg", sql)
|
|
|
rows, err := entity.ClickhouseConn.Query(context.Background(), sql)
|
|
|
if err != nil {
|
|
|
log.Println("获取各分类未读消息数组出错:", err)
|
|
|
- return nil, nil
|
|
|
+ return
|
|
|
}
|
|
|
- classUnreadCountMap := map[int]int{}
|
|
|
- classUnreadMsgMap := map[int][]int{}
|
|
|
for rows.Next() {
|
|
|
- group := UserClassUnread{}
|
|
|
+ group := UserClassSummary{}
|
|
|
err = rows.ScanStruct(&group)
|
|
|
if err != nil {
|
|
|
log.Println("获取各分类读取分类数据出错:", err)
|
|
|
- return nil, nil
|
|
|
+ return
|
|
|
}
|
|
|
- classUnreadCountMap[int(group.GroupId)] = len(group.UnreadArr)
|
|
|
- classUnreadMsgMap[int(group.GroupId)] = Uint32ArrToIntArr(group.UnreadArr)
|
|
|
+ findRes = append(findRes, group)
|
|
|
+ classUnreadCountMap[int(group.GroupId)] = len(group.ClassUnread)
|
|
|
+ classUnreadMsgMap[int(group.GroupId)] = Uint32ArrToIntArr(group.ClassUnread)
|
|
|
+ //classAllCountMap[int(group.GroupId)] = len(group.ClassAll)
|
|
|
+ classAllMsgMap[int(group.GroupId)] = Uint32ArrToIntArr(group.ClassAll)
|
|
|
}
|
|
|
- return classUnreadCountMap, classUnreadMsgMap
|
|
|
+ if findRes != nil && len(findRes) > 0 { //缓存
|
|
|
+ redis.Put(redisModule, redisKey, findRes, config.ConfigJson.RedisFailureTime)
|
|
|
+ }
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
//FindUserClassMsg 查询用户分类所有消息id
|
|
|
-func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
|
|
|
- sql := fmt.Sprintf(`select a2.group_id,bitmapToArray(bitmapAnd(a1.allMsg,a2.msg_bitmap)) as unreadArr from
|
|
|
+/*func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
|
|
|
+ sql := fmt.Sprintf(`select a2.group_id,bitmapToArray(bitmapAnd(a1.allMsg,a2.msg_bitmap)) as unreadArr from
|
|
|
(SELECT mus.allMsg as allMsg FROM message_user_summary mus WHERE mus.userId = '%s') a1,
|
|
|
(select msg_bitmap,group_id from message_summary ms where 1=1 limit 10) a2`, userId)
|
|
|
fmt.Println("FindUserClassMsg", sql)
|
|
@@ -418,7 +441,7 @@ func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
|
|
|
classCountMap := map[int]int{}
|
|
|
classMsgMap := map[int][]int{}
|
|
|
for rows.Next() {
|
|
|
- group := UserClassUnread{}
|
|
|
+ group := UserClassSummary{}
|
|
|
err = rows.ScanStruct(&group)
|
|
|
if err != nil {
|
|
|
log.Println("获取各分类读取分类数据出错:", err)
|
|
@@ -429,19 +452,21 @@ func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
|
|
|
classMsgMap[int(group.GroupId)] = Uint32ArrToIntArr(group.UnreadArr)
|
|
|
}
|
|
|
return classCountMap, classMsgMap
|
|
|
-}
|
|
|
+}*/
|
|
|
|
|
|
// GetUserMsgSummary 从用户消息汇总表取数据
|
|
|
func GetUserMsgSummary(userId string, isfilterActive bool) (userAllMsg, userReadMsg, userUnreadMsg []uint32, err error) {
|
|
|
- var count uint64
|
|
|
- sqlc := ""
|
|
|
- sqlc = fmt.Sprintf("SELECT COUNT(*) as count from message_user_summary WHERE userId = '%s'", userId)
|
|
|
- log.Println("GetUserMsgSummary selcet ", sqlc)
|
|
|
- row1 := entity.ClickhouseConn.QueryRow(context.Background(), sqlc)
|
|
|
- err = row1.Scan(&count)
|
|
|
- if count == 0 {
|
|
|
- err = errors.New("用户暂无数据")
|
|
|
- return
|
|
|
+ key := fmt.Sprintf(UserMsgSummery, userId)
|
|
|
+ redisData := redis.Get(redisModule, key)
|
|
|
+ if redisData != nil {
|
|
|
+ if d, err1 := json.Marshal(redisData); err1 == nil {
|
|
|
+ var userData map[string][]uint32
|
|
|
+ json.Unmarshal(d, &userData)
|
|
|
+ userAllMsg = userData["userAllMsg"]
|
|
|
+ userReadMsg = userData["userReadMsg"]
|
|
|
+ userUnreadMsg = userData["userUnreadMsg"]
|
|
|
+ return
|
|
|
+ }
|
|
|
}
|
|
|
var sql string
|
|
|
isfilterActive = config.ConfigJson.IsFilterActive
|
|
@@ -450,13 +475,23 @@ func GetUserMsgSummary(userId string, isfilterActive bool) (userAllMsg, userRead
|
|
|
} else {
|
|
|
sql = fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from message_user_summary where userId ='%s'", userId)
|
|
|
}
|
|
|
- //sql := fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from message_user_summary where userId ='%s'", userId)
|
|
|
+ // 在这里可以使用 lock 对共享资源进行保护
|
|
|
+ lock := UserLocksMap.GetLock(userId)
|
|
|
+ lock.Lock()
|
|
|
+ defer lock.Unlock()
|
|
|
log.Println("GetUserMsgSummary selcet2 ", sql)
|
|
|
row := entity.ClickhouseConn.QueryRow(context.Background(), sql)
|
|
|
err = row.Scan(&userAllMsg, &userReadMsg, &userUnreadMsg)
|
|
|
if err != nil {
|
|
|
log.Println("此用户暂无数据:", err)
|
|
|
+ return
|
|
|
}
|
|
|
+ //缓存
|
|
|
+ redis.Put(redisModule, key, map[string][]uint32{
|
|
|
+ "userAllMsg": userAllMsg,
|
|
|
+ "userReadMsg": userReadMsg,
|
|
|
+ "userUnreadMsg": userUnreadMsg,
|
|
|
+ }, config.ConfigJson.RedisFailureTime)
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -499,6 +534,18 @@ type UserMsg struct {
|
|
|
}
|
|
|
|
|
|
func WorkDeskList(in *message.WorkingDesktopReq) (res1, res2 []*message.Messages, err error) {
|
|
|
+ redisKey := fmt.Sprintf(UserWorkDeskKey, in.UserId)
|
|
|
+ redisData := redis.Get(redisModule, redisKey)
|
|
|
+ if redisData != nil {
|
|
|
+ if d, err1 := json.Marshal(redisData); err1 == nil {
|
|
|
+ var userData map[string][]*message.Messages
|
|
|
+ json.Unmarshal(d, &userData)
|
|
|
+ res1 = userData["res1"]
|
|
|
+ res2 = userData["res2"]
|
|
|
+ //fmt.Println("=====", userData)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
//待办查询
|
|
|
sqlStr := ""
|
|
|
needDo := map[int][]uint32{} //msgType对应的消息id
|
|
@@ -510,6 +557,9 @@ func WorkDeskList(in *message.WorkingDesktopReq) (res1, res2 []*message.Messages
|
|
|
(select msg_bitmap,group_id from message_summary ms where group_id = %d %s) a2`, in.UserId, in.MsgType, sqlStr)
|
|
|
|
|
|
log.Println("WorkDeskList", sql)
|
|
|
+ lock := UserLocksMap.GetLock(in.UserId)
|
|
|
+ lock.Lock()
|
|
|
+ defer lock.Unlock()
|
|
|
rows, err := entity.ClickhouseConn.Query(context.Background(), sql)
|
|
|
if err != nil {
|
|
|
return nil, nil, err
|
|
@@ -540,6 +590,17 @@ func WorkDeskList(in *message.WorkingDesktopReq) (res1, res2 []*message.Messages
|
|
|
needMsgArr := IntArrSort(Uint32ArrToIntArr(totalMsg))
|
|
|
res2 = GetMsgList(needMsgArr, int(in.PageSize), in.UserId, readMsgMap)
|
|
|
}
|
|
|
+ //缓存
|
|
|
+ res := map[string][]*message.Messages{}
|
|
|
+ if res1 != nil {
|
|
|
+ res["res1"] = res1
|
|
|
+ }
|
|
|
+ if res2 != nil {
|
|
|
+ res["res2"] = res2
|
|
|
+ }
|
|
|
+ if res != nil {
|
|
|
+ redis.Put(redisModule, redisKey, res, config.ConfigJson.RedisFailureTime)
|
|
|
+ }
|
|
|
return res1, res2, nil
|
|
|
}
|
|
|
|