Browse Source

消息相关

xiexiaoyuan 2 years ago
parent
commit
edf081c2f6

+ 113 - 0
controller/message/message.go

@@ -0,0 +1,113 @@
+package message
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	message2 "hongze/hongze_yb/models/request/message"
+	"hongze/hongze_yb/services/message"
+	userService "hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"strconv"
+	"strings"
+)
+
+func List(c *gin.Context)  {
+	reqType := c.DefaultQuery("type", "0")
+	reqPageIndex := c.DefaultQuery("current_index", "1")
+	reqPageSize := c.DefaultQuery("page_size", strconv.Itoa(utils.PageSize20))
+
+	if !strings.Contains("0,1,2", reqType) {
+		response.Fail("请输入正确的消息类型", c)
+		return
+	}
+	msgtype, err := strconv.Atoi(reqType)
+	if err != nil {
+		response.Fail("请输入正确的消息类型", c)
+		return
+	}
+
+	pageIndex, err := strconv.Atoi(reqPageIndex)
+	if err != nil {
+		response.Fail("请输入正确的条数限制", c)
+		return
+	}
+	pageSize, err := strconv.Atoi(reqPageSize)
+	if err != nil {
+		response.Fail("请输入正确的页码", c)
+		return
+	}
+	userInfo := userService.GetInfoByClaims(c)
+	data, err := message.GetList(userInfo, msgtype, pageIndex, pageSize)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", data, c)
+	return
+}
+
+// BatchRead 一键已读
+func BatchRead(c *gin.Context)  {
+	var req message2.ReqMessageBatch
+	if c.ShouldBind(&req) !=nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	if !strings.Contains("0,1,2", strconv.Itoa(req.Type)) {
+		response.Fail("请输入正确的消息类型", c)
+		return
+	}
+
+	userInfo := userService.GetInfoByClaims(c)
+    err := message.BatchRead(userInfo, req)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+	return
+}
+
+// SingleRead 设置单条消息已读
+func SingleRead(c *gin.Context)  {
+	var req message2.ReqMessage
+	if c.ShouldBind(&req) !=nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	if req.MsgId <=0 {
+		response.Fail("请输入正确的消息Id", c)
+		return
+	}
+
+	userInfo := userService.GetInfoByClaims(c)
+	err := message.SingleRead(userInfo, req)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+	return
+}
+
+// SingleDelete 删除单条消息
+func SingleDelete(c *gin.Context)  {
+	var req message2.ReqMessage
+	if c.ShouldBind(&req) !=nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	if req.MsgId <=0 {
+		response.Fail("请输入正确的消息Id", c)
+		return
+	}
+
+	userInfo := userService.GetInfoByClaims(c)
+	err := message.SingleDelete(userInfo, req)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+	return
+}

+ 2 - 0
init_serve/router.go

@@ -56,5 +56,7 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitLike(r)
 	// 研报留言相关路由
 	routers.InitComment(r)
+	// 研报消息相关路由
+	routers.InitMessage(r)
 	return
 }

+ 9 - 0
logic/user/user.go

@@ -10,6 +10,7 @@ import (
 	"hongze/hongze_yb/models/tables/rddp/msg_code"
 	"hongze/hongze_yb/models/tables/wx_user"
 	"hongze/hongze_yb/models/tables/yb_apply_record"
+	"hongze/hongze_yb/models/tables/yb_message"
 	"hongze/hongze_yb/services"
 	companyService "hongze/hongze_yb/services/company"
 	"hongze/hongze_yb/services/user"
@@ -109,6 +110,7 @@ type Detail struct {
 	PermissionList []CompanyPermission `json:"permission_list" description:"权限列表"`
 	IsInner		   int				   `json:"is_inner" description:"是否为内部员工"`
 	AdminInfo      *admin2.Admin	   `json:"admin_info" description:"系统管理员信息"`
+	UnRead         int64                 `json:"un_read" description:"消息未读数"`
 }
 
 // GetUserInfo 获取用户我的页面详情数据
@@ -205,6 +207,12 @@ func GetUserInfo(userInfo user.UserInfo) (userDetail Detail, err error, errMsg s
 		isInner = 1
 	}
 
+	// 查询消息未读数
+	unRead, err := yb_message.GetUnreadByUserId(userInfo.UserID)
+	if err != nil {
+		errMsg = "查询消息未读数失败"
+		return
+	}
 	userDetail = Detail{
 		CompanyName:    companyName, 		//客户名称(公司名称)
 		Status:         status,      		//产品状态
@@ -217,6 +225,7 @@ func GetUserInfo(userInfo user.UserInfo) (userDetail Detail, err error, errMsg s
 		PermissionList: list,				//权限列表
 		IsInner: 		isInner,			// 是否为内部员工
 		AdminInfo: 		adminInfo,			// 系统管理员信息
+		UnRead:         unRead,
 	}
 
 	return

+ 1 - 0
models/request/like/like.go

@@ -5,4 +5,5 @@ type ReqLike struct {
 	ReportChapterId        int `description:"报告章节ID" json:"report_chapter_id" `
 	OldReportId            int `description:"老后台报告ID" json:"old_report_id" `
 	OldReportChapterId     int `description:"老后台报告章节ID" json:"old_report_chapter_id" `
+	SourceAgent            int  `description:"留言入口来源,1:小程序,2:pc" json:"source_agent"`
 }

+ 9 - 0
models/request/message/message.go

@@ -0,0 +1,9 @@
+package message
+
+type ReqMessageBatch struct {
+	Type    int `description:"消息类型:1-留言回复通知,2-精选留言通知" json:"type"`
+}
+
+type ReqMessage struct {
+	MsgId   uint64 `description:"消息ID" json:"msg_id"`
+}

+ 21 - 0
models/response/message.go

@@ -0,0 +1,21 @@
+package response
+
+import "time"
+
+type RespMessageItem struct {
+	MsgId               uint64 `description:"消息ID" json:"msg_id"`
+	UserId              uint64 `description:"用户ID" json:"user_id"`
+	Type                int8   `description:"消息类型:1-留言回复通知,2-精选留言通知" json:"type"`
+	CreateTime          time.Time `description:"创建时间" json:"create_time"`
+	ContentFirst        string `description:"消息第一行留言内容" json:"content_first"`
+	ContentSecond       string `description:"消息第二行内容" json:"content_second"`
+	IsRead              int8   `description:"是否已读 0-未读,1-已读" json:"is_read"`
+	ReportId            int `description:"报告ID"  json:"report_id" `
+	ReportChapterId     int `description:"报告章节ID" json:"report_chapter_id" `
+	Img                 string `description:"左边头像" json:"img"`
+}
+
+type RespMessageList struct {
+	List []*RespMessageItem         `json:"list"`
+	Paging     *PagingItem  		`json:"paging"`
+}

+ 1 - 1
models/tables/yb_comment/query.go

@@ -55,4 +55,4 @@ func GetSimpleByCommentId(commentId uint64)(item *YbComment, err error)  {
 		err = nil
 	}
 	return
-}
+}

+ 1 - 0
models/tables/yb_like/yb_like.go

@@ -11,6 +11,7 @@ type YbLike struct {
 	ModifyTime             time.Time `gorm:"column:modify_time"  json:"modify_time" ` //修改时间
 	ReportId               int `gorm:"column:report_id"  json:"report_id" ` //报告ID
 	ReportChapterId        int `gorm:"column:report_chapter_id" json:"report_chapter_id" ` //报告章节ID
+	SourceAgent            int `gorm:"column:source_agent"` //留言入口来源,1:小程序,2:pc
 }
 
 func (yl *YbLike) TableName() string {

+ 55 - 0
models/tables/yb_message/query.go

@@ -0,0 +1,55 @@
+package yb_message
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetUnreadByUserId 获取用户的未读数
+func GetUnreadByUserId(UserId uint64) (total int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbMessage{}).
+		Where("user_id = ? and enabled = 1 and is_read=0", UserId).
+		Count(&total).Error
+	return
+}
+
+// GetListByType 根据消息类型查询用户消息列表
+func GetListByType(userId uint64, msgType int, offset, limit int) (list []*YbMessage, err error) {
+	var pars []interface{}
+	pars = append(pars, userId)
+	sql := ` SELECT * FROM yb_message 
+WHERE user_id = ? and enabled = 1 `
+	if msgType > 0 {
+		sql += " and type= ?"
+		pars = append(pars, msgType)
+	}
+	sql += " GROUP BY create_time desc, msg_id desc LIMIT ?,? "
+	pars = append(pars, offset, limit)
+	err = global.DEFAULT_MYSQL.Raw(sql, pars...).Scan(&list).Error
+	return
+}
+
+// GetListTotalByType 根据消息类型查询用户消息列表总数
+func GetListTotalByType(userId uint64, msgType int) (total int64, err error) {
+	var pars []interface{}
+	pars = append(pars, userId)
+	sql := ` SELECT count(*) FROM yb_message 
+WHERE user_id = ? and enabled = 1 `
+	if msgType > 0 {
+		sql += " and type= ?"
+		pars = append(pars, msgType)
+	}
+	err = global.DEFAULT_MYSQL.Raw(sql, pars...).Count(&total).Error
+	return
+}
+
+// GetMsgByMsgId 根据消息ID查询消息详情
+func GetMsgByMsgId(userId, msgId uint64) (item *YbMessage, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbMessage{}).
+		Where("user_id = ? and msg_id = ?", userId, msgId).
+		First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}

+ 25 - 0
models/tables/yb_message/update.go

@@ -0,0 +1,25 @@
+package yb_message
+
+import (
+	"hongze/hongze_yb/global"
+)
+
+// Update 更新对应字段数据
+func (ym *YbMessage) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(ym).Select(updateCols).Updates(*ym).Error
+	return
+}
+
+// SetBatchRead 批量设置已读
+func SetBatchRead(userId uint64, msgType int)(err error) {
+	var pars []interface{}
+	pars = append(pars, userId)
+	sql := ` UPDATE yb_message set is_read = 0, modify_time=NOW()
+WHERE user_id = ? and is_read = 1 `
+	if msgType > 0 {
+		sql += " and type= ?"
+		pars = append(pars, msgType)
+	}
+	err = global.DEFAULT_MYSQL.Exec(sql, pars...).Error
+	return
+}

+ 23 - 0
models/tables/yb_message/yb_message.go

@@ -0,0 +1,23 @@
+package yb_message
+
+import "time"
+
+// 研报 消息表
+type YbMessage struct {
+	MsgId               uint64 `gorm:"primaryKey;column:msg_id"` //消息序号
+	UserId              uint64 `gorm:"column:user_id"` //用户id
+	Type                int8 `gorm:"column:type"` //消息类型:1-留言回复通知,2-精选留言通知
+	Enabled             int8 `gorm:"column:enabled"` //是否有效, 0-无效 1-有效
+	CreateTime          time.Time `gorm:"column:create_time"` //创建时间
+	ModifyTime          time.Time `gorm:"column:modify_time"` //修改时间
+	CommentId           uint64 `gorm:"column:comment_id"` //留言ID
+	IsRead              int8 `gorm:"column:is_read"` //是否已读 0-未读,1-已读
+	ContentFirst        string `gorm:"column:content_first"` //消息第一行留言内容
+	ContentSecond       string `gorm:"column:content_second"` //消息第二行内容
+	ReportId            int `gorm:"column:report_id"` //报告ID
+	ReportChapterId     int `gorm:"column:report_chapter_id"` //报告章节ID
+}
+
+func (ym *YbMessage) TableName() string {
+	return "yb_message"
+}

+ 15 - 0
routers/message.go

@@ -0,0 +1,15 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/message"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitMessage(r *gin.Engine)  {
+	rGroup := r.Group("/api/message").Use(middleware.Token())
+	rGroup.GET("/list", message.List)
+	rGroup.POST("/batch/read", message.BatchRead)
+	rGroup.POST("/read", message.SingleRead)
+	rGroup.POST("/delete", message.SingleDelete)
+}

+ 5 - 1
services/like/like.go

@@ -19,7 +19,10 @@ func SetLike(user user.UserInfo, req like.ReqLike) (resp response.RespLike, err
 			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
 		}
 	}()
-
+	if req.SourceAgent == 0 {
+		err = errors.New("请输入点赞来源")
+		return
+	}
 	//todo 判断是否是老报告
 	if req.ReportChapterId <=0 && req.ReportId <=0 {
 		err = errors.New("请输入报告ID")
@@ -45,6 +48,7 @@ func SetLike(user user.UserInfo, req like.ReqLike) (resp response.RespLike, err
 			Enabled:         1,
 			CreateTime:     now,
 			ModifyTime:     now,
+			SourceAgent:    req.SourceAgent,
 		}
 		err = likeItem.Create()
 		if err != nil {

+ 148 - 0
services/message/message.go

@@ -0,0 +1,148 @@
+package message
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/request/message"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/yb_message"
+	"hongze/hongze_yb/services/user"
+	"time"
+)
+
+// GetList 查询消息列表
+func GetList(user user.UserInfo, msgType, pageIndex, pageSize int) (ret response.RespMessageList, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	//校验入参
+	//查询消息列表
+	offset := (pageIndex - 1) * pageSize
+	msgList, err := yb_message.GetListByType(user.UserID, msgType, offset, pageSize)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询消息列表出错")
+		return
+	}
+
+	total, err := yb_message.GetListTotalByType(user.UserID, msgType)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询消息列表总数出错")
+		return
+	}
+
+	//处理列表返回值
+	var list []*response.RespMessageItem
+	for _, v := range msgList {
+		tmp := new(response.RespMessageItem)
+		tmp.MsgId = v.MsgId
+		tmp.IsRead = v.IsRead
+		tmp.UserId = v.UserId
+		tmp.Type = v.Type
+		tmp.CreateTime = v.CreateTime
+		tmp.ReportChapterId = v.ReportChapterId
+		tmp.ReportId = v.ReportId
+		tmp.ContentFirst = v.ContentFirst
+		tmp.ContentSecond = v.ContentSecond
+		tmp.Img = ""
+		list = append(list, tmp)
+	}
+	
+	ret.List = list
+	ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	return
+}
+
+// BatchRead 一键已读
+func BatchRead(user user.UserInfo, req message.ReqMessageBatch) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	//根据类型设置一键已读
+    err = yb_message.SetBatchRead(user.UserID, req.Type)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("一键已读设置失败")
+		return
+	}
+	return
+}
+
+// SingleRead 单条消息设置已读
+func SingleRead(user user.UserInfo, req message.ReqMessage) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	//查询当前消息
+	msgInfo, err := yb_message.GetMsgByMsgId(user.UserID, req.MsgId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询消息出错")
+		return
+	}
+	if msgInfo.MsgId <= 0 {
+		err = errors.New("消息不存在")
+		return
+	}
+	if msgInfo.IsRead == 0 {
+		return
+	}
+	msgInfo.IsRead = 0
+	msgInfo.ModifyTime = time.Now()
+	//根据类型设置一键已读
+	err = msgInfo.Update([]string{"is_read","modify_time"})
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("已读设置失败")
+		return
+	}
+	return
+}
+
+
+// SingleDelete 单条消息删除
+func SingleDelete(user user.UserInfo, req message.ReqMessage) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	//查询当前消息
+	msgInfo, err := yb_message.GetMsgByMsgId(user.UserID, req.MsgId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询消息出错")
+		return
+	}
+	if msgInfo.MsgId <= 0 {
+		err = errors.New("消息不存在")
+		return
+	}
+	if msgInfo.Enabled == 0 {
+		return
+	}
+	msgInfo.Enabled = 0
+	msgInfo.ModifyTime = time.Now()
+	//根据类型设置一键已读
+	err = msgInfo.Update([]string{"enabled","modify_time"})
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("删除消息失败")
+		return
+	}
+	return
+}