From c092e2cd853c88541d3e6a9650154931fb8bf3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E5=B0=B9=E5=B2=9A?= <770236076@qq.com> Date: Mon, 30 Nov 2020 14:41:17 +0800 Subject: [PATCH] weiduxiaoxi --- business/jxstore/event/event.go | 40 +++++++++++++++++++++++++++++++-- business/model/dao/dao_user.go | 14 +++++++++--- business/model/dao/event.go | 20 +++++++++++++++++ controllers/event_controller.go | 21 +++++++++++++++++ globals/beegodb/beegodb.go | 1 + 5 files changed, 91 insertions(+), 5 deletions(-) diff --git a/business/jxstore/event/event.go b/business/jxstore/event/event.go index dde95c1c1..2a09d9c0f 100644 --- a/business/jxstore/event/event.go +++ b/business/jxstore/event/event.go @@ -179,7 +179,16 @@ func CreateMessageGroup(ctx *jxcontext.Context, userID, userID2, groupName strin messageGroupRead2 := messageGroupRead messageGroupRead2.UserID = userID2 dao.CreateEntity(db, messageGroupRead) - dao.CreateEntity(db, messageGroupRead2) + if err = dao.CreateEntity(db, messageGroupRead2); err == nil { + if messageGroupReads, err := dao.GetMessageGroupRead(db, userID2, model.SysGroupID); len(messageGroupReads) == 0 && err == nil { + messageGroupRead := &model.MessageGroupRead{ + GroupID: model.SysGroupID, + UserID: userID2, + } + dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName()) + dao.CreateEntity(db, messageGroupRead) + } + } } } else { userMembers, err := dao.GetUserMember(db, userID, model.MemberTypeNormal) @@ -216,6 +225,16 @@ func CreateMessageGroup(ctx *jxcontext.Context, userID, userID2, groupName strin dao.CreateEntity(db, messageGroupRead) } } + if err == nil { + if messageGroupReads, err := dao.GetMessageGroupRead(db, userID, model.SysGroupID); len(messageGroupReads) == 0 && err == nil { + messageGroupRead := &model.MessageGroupRead{ + GroupID: model.SysGroupID, + UserID: userID, + } + dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName()) + dao.CreateEntity(db, messageGroupRead) + } + } return messageGroupResult, err } @@ -263,6 +282,14 @@ func GetMessageGroupByUser(ctx *jxcontext.Context, userID string) (messageGroupR err = nil return messageGroups, err } + //该用户各组的未读消息数 + var unReadCount int + if messageGroupReads, err := dao.GetMessageGroupRead(db, v.UserID, v.GroupID); err == nil && len(messageGroupReads) > 0 { + for _, vv := range messageGroupReads { + unReadCount += vv.UnReadCount + } + } + v.UnReadMessageCount = unReadCount } return messageGroups, err } @@ -306,7 +333,16 @@ func AddMessageGroup(ctx *jxcontext.Context, groupID int, userID string) (err er UserID: userID, } dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName()) - dao.CreateEntity(db, messageGroupRead) + if err = dao.CreateEntity(db, messageGroupRead); err == nil { + if messageGroupReads, err := dao.GetMessageGroupRead(db, userID, model.SysGroupID); len(messageGroupReads) == 0 && err == nil { + messageGroupRead := &model.MessageGroupRead{ + GroupID: model.SysGroupID, + UserID: userID, + } + dao.WrapAddIDCULEntity(messageGroupRead, ctx.GetUserName()) + dao.CreateEntity(db, messageGroupRead) + } + } } return err } diff --git a/business/model/dao/dao_user.go b/business/model/dao/dao_user.go index 959645bdb..ddd6fde60 100644 --- a/business/model/dao/dao_user.go +++ b/business/model/dao/dao_user.go @@ -21,9 +21,10 @@ type UserDeliveryAddressEx struct { type GetSelfInfoResult struct { model.User model.UserBill - WaitCashPrice int `json:"waitCashPrice"` - UserMembers []*model.UserMember `json:"userMembers"` - PopedUserName string `json:"popedUserName"` + WaitCashPrice int `json:"waitCashPrice"` + UserMembers []*model.UserMember `json:"userMembers"` + PopedUserName string `json:"popedUserName"` + UnReadMessageCount int `json:"unReadMessageCount"` } func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err error) { @@ -58,6 +59,13 @@ func GetUserByIDWithMembers(db *DaoDB, fieldName, fieldValue string) (getSelfInf } // globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false)) err = GetRow(db, &getSelfInfoResult, sql, sqlParams...) + if messageGroupReads, err := GetMessageGroupRead(db, getSelfInfoResult.User.UserID, 0); err == nil { + var unReadCount int + for _, v := range messageGroupReads { + unReadCount += v.UnReadCount + } + getSelfInfoResult.UnReadMessageCount = unReadCount + } return getSelfInfoResult, err } diff --git a/business/model/dao/event.go b/business/model/dao/event.go index 2a9b7c2c6..48ca8a963 100644 --- a/business/model/dao/event.go +++ b/business/model/dao/event.go @@ -206,6 +206,7 @@ type GetMessageGroupsResult struct { LastTime time.Time `json:"lastTime"` LastUserName string `json:"lastUserName"` UserName string `json:"userName"` + UnReadMessageCount int `json:"unReadMessageCount"` MessageGroupMembers []*GetMessageGroupsMemberResult `json:"messageGroupMembers"` } @@ -303,3 +304,22 @@ func GetUserMessageGroups(db *DaoDB, userID string) (messageGroup []*model.Messa err = GetRows(db, &messageGroup, sql, sqlParams) return messageGroup, err } + +func GetMessageGroupRead(db *DaoDB, userID string, groupID int) (messageGroupReads []*model.MessageGroupRead, err error) { + sql := ` + SELECT * + FROM message_group_read a + WHERE 1 = 1 + ` + sqlParams := []interface{}{} + if userID != "" { + sql += ` AND a.user_id = ?` + sqlParams = append(sqlParams, userID) + } + if groupID != 0 { + sql += ` AND a.group_id = ?` + sqlParams = append(sqlParams, groupID) + } + err = GetRows(db, &messageGroupReads, sql, sqlParams...) + return messageGroupReads, err +} diff --git a/controllers/event_controller.go b/controllers/event_controller.go index 212cacfba..93b2799f8 100644 --- a/controllers/event_controller.go +++ b/controllers/event_controller.go @@ -111,6 +111,26 @@ func (c *EventController) TestWebsocket() { //接受消息 业务逻辑 broadcast <- s utils.CallFuncAsync(func() { + //发聊天消息时,这个组所有的成员包括创建者都在userIDs里 + userIDs := []string{} + if results, err := dao.GetMessageGroups(db, "", s.GroupID, 0, true, ""); err == nil { + for _, v := range results { + userIDs = append(userIDs, v.UserID) + for _, vv := range v.MessageGroupMembers { + userIDs = append(userIDs, vv.UserID) + } + } + } + //如果这些人不在这个组的ws池子里就打上未读标记 + for _, v := range userIDs { + if clients[s.GroupID][v] == nil { + messageGroupReads, _ := dao.GetMessageGroupRead(db, v, s.GroupID) + for _, vv := range messageGroupReads { + vv.UnReadCount++ + dao.UpdateEntity(db, vv, "UnReadCount") + } + } + } dao.WrapAddIDCULDEntity(s, "") dao.CreateEntity(db, s) }) @@ -161,6 +181,7 @@ func handleMessages() { func (c *EventController) GetImMessageRecord() { c.callGetImMessageRecord(func(params *tEventGetImMessageRecordParams) (retVal interface{}, errCode string, err error) { retVal, err = dao.GetImMessageRecord(dao.GetDB(), params.GroupID, "", 0, -1, utils.Str2Time(params.FromTime), utils.Str2Time(params.ToTime), params.Offset, params.PageSize) + //清除此用户组所有的未读标记 return retVal, "", err }) } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index d70bcfda6..710297618 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -27,6 +27,7 @@ func Init() { orm.RegisterModel(&model.JobTimer{}) //聊天 orm.RegisterModel(&model.ImMessageRecord{}, &model.MessageGroup{}, &model.MessageGroupMember{}) + orm.RegisterModel(&model.MessageGroupRead{}) orm.RegisterModel(&model.Place{}) orm.RegisterModel(&model.OperateEventDetail{})