ソースを参照

保存消息rpc、api提交

renjiaojiao 1 年間 前
コミット
4bdb7bd5cb

+ 44 - 23
rpc/internal/common/bigmapMsgService.go → rpc/internal/common/msglistService.go

@@ -7,6 +7,7 @@ import (
 	"app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/redis"
 	"context"
+	"errors"
 	"fmt"
 	"log"
 	"strconv"
@@ -21,7 +22,6 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 	userAllMsgArr, userReadArr, userUnreadArr, err := GetUserMsgSummary(this.UserId)
 	if len(userAllMsgArr) == 0 && err != nil {
 		fmt.Printf("此用户暂无消息 : %s", err.Error())
-		return data, nil
 	}
 	//用户分类消息
 	_, userClassMsgMap := FindUserClassMsg(this.UserId)
@@ -52,7 +52,7 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 						lastMsgId = classMsg[len(classMsg)-1]
 					}
 				}
-				lastMsg := GlobMsgMap[int(lastMsgId)]
+				lastMsg := GlobMsgMap[lastMsgId]
 				if lastMsg == nil || len(lastMsg) <= 0 {
 					m := entity.Mysql.FindOne("message_send_log", map[string]interface{}{"id": int(lastMsgId)}, "id,msg_type,title,content,send_time,link,menu_name,group_id", "")
 					if m != nil && len(*m) > 0 {
@@ -79,13 +79,14 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 	var columnData []*message.AllSortData
 	if this.IsColumn && this.MsgType > 0 && this.IsClassSearch {
 		// 获取小分类下的未读数
-		sortUnread, _ := BitmapCountClassUnread(this.UserId, this.MsgType, classUnreadCountMap)
+		sortUnread, total := BitmapCountClassUnread(this.UserId, this.MsgType, classUnreadCountMap)
 		columnArr := []entity.MsgClass{}
 		if !this.IsColumnNewMsg { // 用于区分分类列表页和分类详情页   根据不同情况
 			columnArr = append(columnArr, entity.ClassMap[this.MsgType])
 		} else {
 			columnArr = entity.ClassSearchMap[this.MsgType]
 		}
+		unread += total
 		for i := 0; i < len(columnArr); i++ {
 			tmp := columnArr[i]
 			var column message.AllSortData
@@ -95,14 +96,14 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 			// 消息未读数
 			msgType := common.InterfaceToStr(tmp.MsgType)
 			column.UnreadMessages = sortUnread[msgType]
-			unread += sortUnread[msgType]
 			column.Data = sData[msgType]
 			column.IsClassSearch = true
 			columnData = append(columnData, &column)
 		}
 	} else if this.IsColumn {
 		//获取所有分类未读数 不初始化
-		sortUnread, _ := BitmapCountUnread(this.UserId, classUnreadCountMap, false)
+		sortUnread, total := BitmapCountUnread(this.UserId, classUnreadCountMap, false)
+		unread += total
 		for _, v := range entity.MessageColumn {
 			var column message.AllSortData
 			column.Name = common.InterfaceToStr(v["name"])
@@ -114,7 +115,6 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 				//消息未读数
 				msgType := common.InterfaceToStr(v["group_id"])
 				column.UnreadMessages = sortUnread[msgType]
-				unread += sortUnread[msgType]
 				column.Data = sData[msgType]
 			}
 			if _, ok := entity.ClassSearchMap[column.MsgType]; ok {
@@ -124,6 +124,10 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 		}
 	}
 	data.SortData = columnData
+	if len(userAllMsgArr) == 0 {
+		fmt.Printf("此用户暂无消息 : %s", err.Error())
+		return data, nil
+	}
 	count = int64(len(userAllMsgArr))
 	//pc列表数据、移动端分类列表
 	if this.IsMsgList {
@@ -211,10 +215,11 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 			unread += unreadMsg(this)
 		}
 	}
-	data.Unread = int64(len(userUnreadArr))
+	data.Unread = unread
 	//置顶消息
 	if len(classUnreadMsgMap[1]) > 0 {
-		res2 := BitmapMessageGetLast(this, classUnreadMsgMap[1][len(classUnreadMsgMap)-1])
+		activeMsgArr := classUnreadMsgMap[1]
+		res2 := BitmapMessageGetLast(this, activeMsgArr[len(activeMsgArr)-1])
 		return data, res2
 	}
 	return data, nil
@@ -226,6 +231,12 @@ func BitmapMessageGetLast(this *message.UserMsgListReq, msgId int) *message.Mess
 		return nil
 	}
 	lastMsg := GlobMsgMap[msgId]
+	if lastMsg == nil && len(lastMsg) <= 0 {
+		m := entity.Mysql.FindOne("message_send_log", map[string]interface{}{"id": msgId}, "id,msg_type,title,content,send_time,link,menu_name,group_id", "")
+		if m != nil && len(*m) > 0 {
+			lastMsg = *m
+		}
+	}
 	if lastMsg != nil && len(lastMsg) > 0 {
 		msg := message.Messages{
 			Id:         common.InterfaceToStr(lastMsg["id"]),
@@ -243,8 +254,8 @@ func BitmapMessageGetLast(this *message.UserMsgListReq, msgId int) *message.Mess
 }
 
 type UserClassUnread struct {
-	GroupId   int
-	UnreadArr []uint32
+	GroupId   int32    `ch:"group_id"`
+	UnreadArr []uint32 `ch:"unreadArr"`
 }
 
 // BitmapCountUnread 未读消息合计 isRedis 是否需要初始化redis
@@ -277,7 +288,7 @@ func BitmapCountUnread(userId string, classUnreadCountMap map[int]int, isRedis b
 				}
 				if isRedis {
 					//用户分类未读
-					fmt.Println(util.IntAll(val["group_id"]))
+					//fmt.Println(util.IntAll(val["group_id"]))
 					key := fmt.Sprintf(MsgCountKey, userId, util.IntAll(val["group_id"]))
 					redis.Put(redisModule, key, oneClassUnread, 60*60)
 				}
@@ -325,14 +336,14 @@ func BitmapCountClassUnread(userId string, groupId int64, classUnreadCountMap ma
 
 //FindUserClassUnread 查询用户分类未读消息id
 func FindUserClassUnread(userId string) (map[int]int, map[int][]int) {
-	sql := fmt.Sprintf("SELECT bitmapToArray(bitmapAnd(bitmapAndnot(mus.allMsg,mus.readMsg),ms.msg_bitmap)) AS msgArr,ms.group_id  FROM messageCenter.message_user_summary mus, messageCenter.message_summary ms WHERE mus.userId = '%s'", userId)
+	sql := fmt.Sprintf("SELECT bitmapToArray(bitmapAnd(bitmapAndnot(mus.allMsg,mus.readMsg),ms.msg_bitmap)) AS unreadArr,ms.group_id  FROM messageCenter.message_user_summary mus, messageCenter.message_summary ms WHERE mus.userId = '%s'", userId)
 	rows, err := entity.ClickhouseConn.Query(context.Background(), sql)
 	if err != nil {
 		log.Println("获取各分类未读消息数组出错:", err)
 		return nil, nil
 	}
-	var classUnreadCountMap map[int]int
-	var classUnreadMsgMap map[int][]int
+	classUnreadCountMap := map[int]int{}
+	classUnreadMsgMap := map[int][]int{}
 	for rows.Next() {
 		group := UserClassUnread{}
 		err = rows.ScanStruct(&group)
@@ -340,22 +351,22 @@ func FindUserClassUnread(userId string) (map[int]int, map[int][]int) {
 			log.Println("获取各分类读取分类数据出错:", err)
 			return nil, nil
 		}
-		classUnreadCountMap[group.GroupId] = len(group.UnreadArr)
-		classUnreadMsgMap[group.GroupId] = Uint32ArrToIntArr(group.UnreadArr)
+		classUnreadCountMap[int(group.GroupId)] = len(group.UnreadArr)
+		classUnreadMsgMap[int(group.GroupId)] = Uint32ArrToIntArr(group.UnreadArr)
 	}
 	return classUnreadCountMap, classUnreadMsgMap
 }
 
 //FindUserClassMsg 查询用户分类所有消息id
 func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
-	sql := fmt.Sprintf("SELECT bitmapToArray(bitmapAnd(mus.allMsg,ms.msg_bitmap)) AS msgArr,ms.group_id  FROM messageCenter.message_user_summary mus, messageCenter.message_summary ms WHERE mus.userId = '%s'", userId)
+	sql := fmt.Sprintf("SELECT bitmapToArray(bitmapAnd(mus.allMsg,ms.msg_bitmap)) AS unreadArr,ms.group_id  FROM messageCenter.message_user_summary mus, messageCenter.message_summary ms WHERE mus.userId = '%s'", userId)
 	rows, err := entity.ClickhouseConn.Query(context.Background(), sql)
 	if err != nil {
 		log.Println("获取各分类未读消息数组出错:", err)
 		return nil, nil
 	}
-	var classCountMap map[int]int
-	var classMsgMap map[int][]int
+	classCountMap := map[int]int{}
+	classMsgMap := map[int][]int{}
 	for rows.Next() {
 		group := UserClassUnread{}
 		err = rows.ScanStruct(&group)
@@ -363,18 +374,28 @@ func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
 			log.Println("获取各分类读取分类数据出错:", err)
 			return nil, nil
 		}
-		classCountMap[group.GroupId] = len(group.UnreadArr)
-		classMsgMap[group.GroupId] = Uint32ArrToIntArr(group.UnreadArr)
+		//fmt.Println(int(group.GroupId), len(group.UnreadArr))
+		classCountMap[int(group.GroupId)] = len(group.UnreadArr)
+		classMsgMap[int(group.GroupId)] = Uint32ArrToIntArr(group.UnreadArr)
 	}
 	return classCountMap, classMsgMap
 }
 
 // GetUserMsgSummary 从用户消息汇总表取数据
 func GetUserMsgSummary(userId string) (userAllMsg, userReadMsg, userUnreadMsg []uint32, err error) {
-	row := entity.ClickhouseConn.QueryRow(context.Background(), fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from messageCenter.message_user_summary where userId ='%s'", userId))
+	var count int
+	row1, err := entity.ClickhouseConn.Query(context.Background(), fmt.Sprintf("SELECT COUNT(*) from message_user_summary WHERE userId = '%s'", userId))
+	row1.Scan(&count)
+	if count == 0 {
+		err = errors.New("用户暂无数据")
+		return
+	}
+	sql := fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from messageCenter.message_user_summary where userId ='%s'", userId)
+	fmt.Println(sql)
+	row := entity.ClickhouseConn.QueryRow(context.Background(), sql)
 	err = row.Scan(&userAllMsg, &userReadMsg, &userUnreadMsg)
 	if err != nil {
-		log.Println("GetUserMsgSummary获取用户消息数据出错:", err)
+		log.Println("此用户暂无数据:", err)
 	}
 	return
 }

+ 0 - 64
rpc/internal/common/newSendMsgService.go

@@ -3,7 +3,6 @@ package common
 import (
 	"app.yhyue.com/moapp/MessageCenter/entity"
 	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
-	"app.yhyue.com/moapp/MessageCenter/util"
 	"app.yhyue.com/moapp/jybase/common"
 	"context"
 	"errors"
@@ -36,69 +35,6 @@ func SetMsgSummary(newMsg, groupId, msgType int64) error {
 	return nil
 }
 
-func MultSave11(this *message.MultipleSaveMsgReq) (int64, string) {
-	userIdArr := strings.Split(this.UserIds, ",")
-	positionIdArr := strings.Split(this.PositionIds, ",")
-	if len(userIdArr) == 0 {
-		return 0, "无效的用户id"
-	}
-	wg := &sync.WaitGroup{}
-	group_id := MsgGroupIdMap[int(this.MsgType)]
-
-	for i := 0; i < len(userIdArr); i++ {
-		if userIdArr[i] == "" {
-			continue
-		}
-		//查询
-		wg.Add(1)
-		entity.SaveConcurrencyChan <- 1
-		var positionId int64
-		if len(positionIdArr) == len(userIdArr) {
-			positionId = common.Int64All(positionIdArr[i])
-		}
-
-		go func(v string, positionId int64) {
-			defer func() {
-				<-entity.SaveConcurrencyChan
-				wg.Done()
-			}()
-			//消息数组
-			nTime := time.Now().Format("2006-01-02 15:04:05")
-			sql3 := `INSERT INTO message(appid,receive_userid,receive_name,send_userid,send_name,title,content,msg_type,link,cite_id,createtime,isRead,isdel,msg_log_id,show_buoy,show_content,group_id,position_id) values ("%s",'%s','%s','%s','%s','%s','%s',%d,'%s',0,'%s',0,1,%d,%d,'%s',%d,?);`
-			sql3 = fmt.Sprintf(sql3, this.Appid, v, "", this.SendUserId, this.SendName, this.Title, this.Content, this.MsgType, this.Link, nTime, this.MsgLogId, this.ShowBuoy, this.ShowContent, group_id)
-			in := entity.Mysql.InsertBySql(sql3, common.If(positionId != 0, positionId, nil))
-			logx.Info("插入消息返回 in1 id:", in, "消息类型:", this.MsgType, "用户id:", v)
-			if in > -1 {
-				ok := MsgCountAdd(v, this.Appid, util.Int64All(group_id), this.MsgType)
-				if !ok {
-					log.Println("存redis:", ok, v)
-				}
-			}
-
-			if in > -1 {
-				//微信推送模板消息、app push
-				pushData := WxTmplAndPush{
-					MsgType:     this.MsgType,
-					Title:       this.Title,
-					Content:     this.Content,
-					WxPushUrl:   this.WxPushUrl,
-					AppPushUrl:  this.AppPushUrl,
-					ProductName: this.ProductName,
-					OrderId:     this.OrderId,
-					OrderMoney:  this.OrderMoney,
-					Row4:        this.Row4,
-					SendUserId:  this.SendUserId,
-				}
-				SentWxTmplAndAppPush(pushData, v, group_id)
-			} else {
-				logx.Error(fmt.Sprintf("SendAppMsg uId %s  发送消息失败", v))
-			}
-		}(userIdArr[i], positionId)
-	}
-	wg.Wait()
-	return 0, ""
-}
-
 func NewUserSendMsg(in *message.NewUserInsertMsgReq) string {
 	userIdArr := strings.Split(in.UserIds, ",")
 	positionIdArr := strings.Split(in.PositionIds, ",")

+ 1 - 1
rpc/internal/common/sendMsg.go

@@ -130,7 +130,7 @@ func UserMsgList(this *message.UserMsgListReq) *message.UserMsgList {
 	//获取栏目下的数据
 	sData := make(map[string][]*message.Messages)
 	t := time.Now()
-	if this.IsColumnNewMsg && this.SortSize > 0 {
+	if this.IsColumnNewMsg && this.SortSize > 0 { //this.SortSize app分类展示最新一条消息
 		var sortData *[]map[string]interface{}
 		if this.IsClassSearch { // p436 增加
 			sortDataQ := fmt.Sprintf(`SELECT title,createtime,msg_type as group_id ,id FROM (

+ 7 - 0
rpc/internal/common/sendWxTmplMsg.go

@@ -59,6 +59,13 @@ func MessageType() (func() map[int64]WxTmplConfig, []map[string]interface{}) {
 		groupId := util.IntAll(group.GroupId)
 		switchs := util.ObjToString(group.Switch)
 		appMsgType[groupId] = switchs
+		data = append(data, map[string]interface{}{
+			"group_id": groupId,
+			"name":     group.Name,
+			"switch":   group.Switch,
+			"img":      group.Img,
+			"sequence": group.Sequence,
+		})
 	}
 	AppPushMsgType = appMsgType
 

+ 1 - 1
rpc/internal/common/task.go

@@ -22,7 +22,7 @@ func LoadTask() {
 func LoadMsgOnTime() {
 	fmt.Println("开始执行")
 	msgMap := make(map[int]map[string]interface{})
-	m := entity.Mysql.SelectBySql("SELECT id,msg_type,title,content,send_time,link,menu_name,group_id FROM message_send_log WHERE send_status = 4 AND isdel = 1 ORDER BY send_time DESC limit 2000")
+	m := entity.Mysql.SelectBySql("SELECT id,msg_type,title,content,send_time,menu_name,link,group_id FROM message_send_log WHERE send_status = 4 AND isdel = 1 ORDER BY send_time DESC limit 2000")
 	if m != nil && len(*m) > 0 {
 		for _, val := range *m {
 			msgMap[common.IntAll(val["id"])] = val

+ 3 - 2
rpc/internal/logic/usermsglistlogic.go

@@ -28,8 +28,9 @@ func NewUserMsgListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserM
 // new用户消息列表
 func (l *UserMsgListLogic) UserMsgList(in *message.UserMsgListReq) (*message.UserMsgListRes, error) {
 	data := new(message.UserMsgListRes)
-	res1 := service.UserMsgList(in)    //具体信息
-	res2 := service.MessageGetLast(in) //最新信息
+	/*res1 := service.UserMsgList(in)    //具体信息
+	res2 := service.MessageGetLast(in) //最新信息*/
+	res1, res2 := service.BitmapUserMsgList(in)
 	var finalData []*message.Messages
 	if res1 != nil && res1.Data != nil {
 		for _, v := range res1.Data {

+ 11 - 0
rpc/message.go

@@ -66,6 +66,17 @@ func init() {
 		log.Println("初始化clickhouse出错:", err)
 	}
 
+	//初始化mysql
+	entity.Mysql = &mysql.Mysql{
+		Address:      config.ConfigJson.DataSource.Address,
+		UserName:     config.ConfigJson.DataSource.UserName,
+		PassWord:     config.ConfigJson.DataSource.PassWord,
+		DBName:       config.ConfigJson.DataSource.DbName,
+		MaxOpenConns: config.ConfigJson.DataSource.MaxOpenConns,
+		MaxIdleConns: config.ConfigJson.DataSource.MaxIdleConns,
+	}
+	entity.Mysql.Init()
+
 	common.AllMsgType, entity.MessageColumn = common.MessageType()
 	// 初始化需要展示消息细化分类的groupid 和对应的class信息
 	common.InitClassSearchMap()