Selaa lähdekoodia

Merge branch 'yb/5.1' into debug

xiexiaoyuan 2 vuotta sitten
vanhempi
commit
3c3ae453c9

+ 31 - 1
controller/community/question.go

@@ -26,7 +26,7 @@ import (
 // @Param page_size				query int false "每页数量"
 // @Param only_mine				query int false "只看我的"
 // @Param chart_permission_id	query int false "品种权限ID"
-// @Param reply_status			query int false "回复状态 0-全部 2-待回答 3-已回答"
+// @Param reply_status			query int false "回复状态 0-全部 2-未回答 3-已回答,4-待回答(研究员)"
 // @Success 200 {object} []respond.CommunityQuestionItem
 // @failure 400 {string} string "获取失败"
 // @Router /question/list [get]
@@ -293,4 +293,34 @@ func ResearchGroupList(c *gin.Context)  {
 		return
 	}
 	response.OkData("获取成功", list, c)
+}
+
+// AddAudioLog 添加用户点击音频日志
+// @Tags 问答社区模块
+// @Description 添加用户点击音频日志
+// @Param community_question_audio_id  query  int  true  "音频ID"
+// @Param source_agent  query  int  true  "操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc"
+// @Success 200 {string} string "操作成功"
+// @failure 400 {string} string "操作失败"
+// @Router /AddAudioLog [post]
+func AddAudioLog(c *gin.Context) {
+	var req request.CommunityAudioListenLogReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.CommunityQuestionAudioID == 0 {
+		response.Fail("请输入音频ID", c)
+		return
+	}
+	if req.SourceAgent == 0 {
+		response.Fail("请输入操作来源", c)
+		return
+	}
+	userinfo := user.GetInfoByClaims(c)
+	if err := community.AddAudioListenLog(userinfo, req.CommunityQuestionAudioID, req.SourceAgent); err != nil {
+		response.Fail("操作失败: "+ err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
 }

+ 5 - 0
models/request/community.go

@@ -36,3 +36,8 @@ type QuestionReadReq struct {
 type ReplyListTotalReq struct {
 	ReplierUserId int `json:"replier_user_id" form:"replier_user_id"`
 }
+
+type CommunityAudioListenLogReq struct {
+	CommunityQuestionAudioID int `json:"community_question_audio_id"` //音频ID
+	SourceAgent              int `json:"source_agent"`                //操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
+}

+ 10 - 8
models/response/community.go

@@ -23,17 +23,19 @@ type CommunityQuestionItem struct {
 }
 
 type CommunityQuestionAudioItem struct {
-	CommunityQuestionID int    `json:"community_question_id"`
-	AudioURL            string `json:"audio_url"`
-	AudioPlaySeconds    string `json:"audio_play_seconds"`
-	AudioSize           string `json:"audio_size"`
-	Sort                int    `json:"sort"`
+	CommunityQuestionAudioID int    `json:"community_question_audio_id"`
+	CommunityQuestionID      int    `json:"community_question_id"`
+	AudioURL                 string `json:"audio_url"`
+	AudioPlaySeconds         string `json:"audio_play_seconds"`
+	AudioSize                string `json:"audio_size"`
+	Sort                     int    `json:"sort"`
 }
 
 type CommunityQuestionListTotal struct {
-	Wait    int `json:"wait"`
-	Replied int `json:"replied"`
-	Total   int `json:"total"`
+	Wait       int `json:"wait"`       //未回答的数量
+	Replied    int `json:"replied"`    //已回答的数量
+	Total      int `json:"total"`      //全部的数量
+	Distribute int `json:"distribute"` //待回答的数量
 }
 
 type CommunityQuestionAudioUpload struct {

+ 18 - 0
models/tables/yb_community_audio_listen_log/entity.go

@@ -0,0 +1,18 @@
+package yb_community_audio_listen_log
+
+import "time"
+
+// YbCommunityAudioListenLog 社区语音回答点击日志
+type YbCommunityAudioListenLog struct {
+	Id                       int       `gorm:"primaryKey;column:id;type:int(10) unsigned;not null" json:"-"`
+	CommunityQuestionAudioID int       `gorm:"column:community_question_audio_id;type:int(10) unsigned;not null" json:"community_question_audio_id"` //问答音频ID
+	CommunityQuestionID      int       `gorm:"column:community_question_id;type:int(10) unsigned;not null;default:0" json:"community_question_id"`   // 社区问题ID
+	UserID                   int       `gorm:"index:idx_user_id;column:user_id;type:int(10) unsigned;not null;default:0" json:"user_id"`             // 点击音频的用户ID
+	SourceAgent              int       `gorm:"column:source_agent;type:tinyint(4);default:1" json:"source_agent"`                                    // 操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
+	CreateTime               time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"create_time"`                        // 创建日志时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (l *YbCommunityAudioListenLog) TableName() string {
+	return "yb_community_audio_listen_log"
+}

+ 9 - 0
models/tables/yb_community_audio_listen_log/model.go

@@ -0,0 +1,9 @@
+package yb_community_audio_listen_log
+
+import "hongze/hongze_yb/global"
+
+func (l *YbCommunityAudioListenLog) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(l).Error
+	return
+}
+

+ 14 - 29
models/tables/yb_community_question/model.go

@@ -1,10 +1,8 @@
 package yb_community_question
 
 import (
-	"errors"
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/models/tables/yb_community_question_audio"
-	"hongze/hongze_yb/utils"
 	"time"
 )
 
@@ -19,14 +17,9 @@ func (item *YbCommunityQuestion) Update(updateCols []string) (err error) {
 }
 
 // GetPageListByCondition 获取问答列表-分页
-func GetPageListByCondition(where map[string]interface{}, pageIndex, pageSize int) (list []*YbCommunityQuestion, err error) {
-	cond, vals, e := utils.WhereBuild(where)
-	if e != nil {
-		err = errors.New("系统异常,生成查询语句失败")
-		return
-	}
+func GetPageListByCondition(condition string, pars []interface{},pageIndex, pageSize int) (list []*YbCommunityQuestion, err error) {
 	offset := (pageIndex - 1) * pageSize
-	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(cond, vals...).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(condition, pars...).Offset(offset).Limit(pageSize).Order("create_time DESC").Scan(&list).Error
 	return
 }
 
@@ -62,40 +55,32 @@ func UpdateQuestionAndAudioList(item *YbCommunityQuestion, updateCols []string,
 }
 
 type QuestionListCount struct {
-	ReplyStatus int `json:"reply_status"`
-	Total       int `json:"total"`
+	ReplierUserId uint64 `json:"replier_user_id"`
+	UserId        uint64 `json:"user_id"`
+	ReplyStatus   int `json:"reply_status"`
+	Total         int `json:"total"`
 }
 
 // GetQuestionListCount 获取问答数量统计
-func GetQuestionListCount(where map[string]interface{}) (list []*QuestionListCount, err error) {
-	cond, vals, e := utils.WhereBuild(where)
-	if e != nil {
-		err = errors.New("系统异常,GetQuestionListCount 生成查询语句失败")
-		return
-	}
+func GetQuestionListCount(condition string, pars []interface{}) (list []*QuestionListCount, err error) {
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
-		Select("reply_status, COUNT(1) total").
-		Where(cond, vals...).
-		Group("reply_status").
+		Select("reply_status, replier_user_id, user_id, COUNT(1) total").
+		Where(condition, pars...).
+		Group("reply_status, replier_user_id, user_id").
 		Scan(&list).Error
 	return
 }
 
 // GetUnreadNum 获取未读数
-func GetUnreadNum(where map[string]interface{}) (num int64, err error) {
-	cond, vals, e := utils.WhereBuild(where)
-	if e != nil {
-		err = errors.New("系统异常,GetUnreadNum 生成查询语句失败")
-		return
-	}
-	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(cond, vals...).Count(&num).Error
+func GetUnreadNum(condition string, pars []interface{}) (num int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).Where(condition, pars...).Count(&num).Error
 	return
 }
 
 // UpdateReplierRead 更新回复人已读
 func UpdateReplierRead(replierUserId int, questionIds []int) (err error) {
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
-		Where("replier_user_id = ? AND community_question_id IN (?)", replierUserId, questionIds).
+		Where("replier_user_id = ? AND community_question_id IN (?) AND replier_is_read=0", replierUserId, questionIds).
 		Updates(YbCommunityQuestion{
 			ReplierIsRead: 1,
 			ModifyTime: time.Now().Local(),
@@ -106,7 +91,7 @@ func UpdateReplierRead(replierUserId int, questionIds []int) (err error) {
 // UpdateUserRead 更新用户已读
 func UpdateUserRead(userId int, questionIds []int) (err error) {
 	err = global.DEFAULT_MYSQL.Model(YbCommunityQuestion{}).
-		Where("user_id = ? AND community_question_id IN (?)", userId, questionIds).
+		Where("user_id = ? AND community_question_id IN (?) AND is_read=0", userId, questionIds).
 		Updates(YbCommunityQuestion{
 			IsRead: 1,
 			ModifyTime: time.Now().Local(),

+ 12 - 2
models/tables/yb_community_question_audio/model.go

@@ -15,7 +15,7 @@ func GetListByQuestrionIds(idArr []int) (list []*YbCommunityQuestionAudio, err e
 	}
 	err = global.DEFAULT_MYSQL.
 		Model(YbCommunityQuestionAudio{}).
-		Select("community_question_id, audio_url, audio_play_seconds, audio_size, sort").
+		Select("community_question_audio_id, community_question_id, audio_url, audio_play_seconds, audio_size, sort").
 		Where("community_question_id IN ?", idArr).
 		Order("community_question_id ASC, sort ASC").
 		Scan(&list).Error
@@ -25,9 +25,19 @@ func GetListByQuestrionIds(idArr []int) (list []*YbCommunityQuestionAudio, err e
 func GetListByQuestionId(questionId int) (list []*YbCommunityQuestionAudio, err error) {
 	err = global.DEFAULT_MYSQL.
 		Model(YbCommunityQuestionAudio{}).
-		Select("community_question_id, audio_url, audio_play_seconds, audio_size, sort").
+		Select("community_question_audio_id, community_question_id, audio_url, audio_play_seconds, audio_size, sort").
 		Where("community_question_id = ?", questionId).
 		Order("sort ASC").
 		Scan(&list).Error
 	return
+}
+
+// GetByAudioId 根据问答音频ID, 查询音频详情
+func GetByAudioId(audioId int)(item *YbCommunityQuestionAudio, err error)  {
+	err = global.DEFAULT_MYSQL.
+		Model(YbCommunityQuestionAudio{}).
+		Select("community_question_audio_id, community_question_id, audio_url, audio_play_seconds, audio_size, sort").
+		Where("community_question_audio_id = ?", audioId).
+		First(&item).Error
+	return
 }

+ 1 - 0
routers/community.go

@@ -17,4 +17,5 @@ func InitCommunity(r *gin.Engine)  {
 	rGroup.POST("/question/reply/upload_audio", community.QuestionUploadAudio)
 	rGroup.GET("/question/unread", community.QuestionUnread)
 	rGroup.GET("/question/research_group", community.ResearchGroupList)
+	rGroup.POST("/question/audio/log", community.AddAudioLog)
 }

+ 114 - 53
services/community/question.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hongze_yb/models/response"
 	"hongze/hongze_yb/models/tables/research_group"
 	"hongze/hongze_yb/models/tables/user_record"
+	"hongze/hongze_yb/models/tables/yb_community_audio_listen_log"
 	"hongze/hongze_yb/models/tables/yb_community_question"
 	"hongze/hongze_yb/models/tables/yb_community_question_audio"
 	"hongze/hongze_yb/services/user"
@@ -19,8 +20,8 @@ import (
 
 // GetQuestionList 获取问答列表
 func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStatus, groupId int, userInfo user.UserInfo) (resp []*response.CommunityQuestionItem, err error) {
-	condition := make(map[string]interface{})
-	condition["is_deleted ="] = 0
+	condition := " is_deleted = 0"
+	var pars []interface{}
 	// 用户身份
 	isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
 	if e != nil {
@@ -28,34 +29,41 @@ func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStat
 		return
 	}
 	if onlyMine == 1 {
-		if isResearcher {
-			condition["replier_user_id ="] = userInfo.UserID
-		} else {
-			condition["user_id ="] = userInfo.UserID
-		}
-	}
-	if replyStatus > 0 {
-		if replyStatus == 2 && !isResearcher {
-			// 普通用户待回答为待分配和待回答
-			condition["reply_status >"] = 0
-			condition["reply_status <"] = 3
+		if isResearcher {  //如果是研究员
+			if replyStatus == 4  {  //分配给研究员未回答的问题
+				condition += " and replier_user_id=? and reply_status = 2"
+				pars = append(pars, userInfo.UserID)
+			} else if replyStatus == 2 { //研究员提问的问题未分配或者未回答的问题
+				condition += " and user_id=? and reply_status >0 and reply_status <3"
+				pars = append(pars, userInfo.UserID)
+			} else if replyStatus == 3 { //分配给研究员的已回答和研究员提问的被回答的问题
+				condition += " and (replier_user_id=? or user_id=?) and reply_status =3"
+				pars = append(pars, userInfo.UserID, userInfo.UserID)
+			}else if replyStatus == 0 {  //分配给研究员或者研究员提问的所以问题
+				condition += " and (replier_user_id=? or user_id=?)"
+				pars = append(pars, userInfo.UserID, userInfo.UserID)
+			}
 		} else {
-			condition["reply_status ="] = replyStatus
-		}
-	} else {
-		if isResearcher {
-			// 不展示未分配的
-			condition["reply_status >"] = 1
+			condition += " and user_id=?"
+			pars = append(pars, userInfo.UserID)
+			if replyStatus == 2 {  // 普通用户未回答为待分配和未回答
+				condition += " and reply_status >0 and reply_status <3"
+			} else if replyStatus == 3{
+				condition += " and reply_status = 3"
+			}
 		}
 	}
+
 	if chartPermissionId > 0 {
-		condition["chart_permission_id ="] = chartPermissionId
+		condition += " and chart_permission_id =?"
+		pars = append(pars, chartPermissionId)
 	}
 	if groupId > 0 {
-		condition["research_group_second_id ="] = groupId
+		condition += " and research_group_second_id =?"
+		pars = append(pars, groupId)
 	}
 	// 问题列表
-	questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize)
+	questionList, e := yb_community_question.GetPageListByCondition(condition, pars, pageIndex, pageSize)
 	if e != nil {
 		err = errors.New("获取问题列表失败 Err:" + e.Error())
 		return
@@ -88,11 +96,12 @@ func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStat
 		for _, a := range audioList {
 			if a.CommunityQuestionID == v.CommunityQuestionID {
 				audios = append(audios, &response.CommunityQuestionAudioItem{
-					CommunityQuestionID: a.CommunityQuestionID,
-					AudioURL:            a.AudioURL,
-					AudioPlaySeconds:    a.AudioPlaySeconds,
-					AudioSize:           a.AudioSize,
-					Sort:                a.Sort,
+					CommunityQuestionAudioID: a.CommunityQuestionAudioID,
+					CommunityQuestionID:      a.CommunityQuestionID,
+					AudioURL:                 a.AudioURL,
+					AudioPlaySeconds:         a.AudioPlaySeconds,
+					AudioSize:                a.AudioSize,
+					Sort:                     a.Sort,
 				})
 			}
 		}
@@ -121,7 +130,7 @@ func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStat
 			//PermissionInfo:          permissionInfo,
 			AudioList:               audios,
 		}
-		if !isResearcher && item.IsRead == 0 && item.UserId == userId {
+		if item.IsRead == 0 && item.UserId == userId {
 			item.IsTop = 1
 		}
 		resp = append(resp, item)
@@ -291,8 +300,16 @@ func ReadQuestionReply(questionIds string, userInfo user.UserInfo) (err error) {
 		return
 	}
 	if isResearcher {
+		// 设置分配给研究员的问答已读
 		e = yb_community_question.UpdateReplierRead(int(userInfo.UserID), questionIdArr)
+		if e != nil {
+			err = errors.New("更新问答已读失败 Err:" + e.Error())
+			return
+		}
+		// 设置研究员提问的问答已读
+		e = yb_community_question.UpdateUserRead(int(userInfo.UserID), questionIdArr)
 	} else {
+		// 设置普通用户的问答已读
 		e = yb_community_question.UpdateUserRead(int(userInfo.UserID), questionIdArr)
 	}
 	if e != nil {
@@ -308,38 +325,52 @@ func GetQuestionListTotal(userInfo user.UserInfo) (resp *response.CommunityQuest
 		err = errors.New("获取用户身份失败 Err:" + e.Error())
 		return
 	}
-	condition := make(map[string]interface{}, 0)
-	condition["is_deleted ="] = 0
+	condition := " is_deleted = 0"
+	var pars []interface{}
 	if isResearcher {
-		condition["replier_user_id ="] = userInfo.UserID
+		condition += " and (replier_user_id=? or user_id=?)"
+		pars = append(pars, userInfo.UserID, userInfo.UserID)
 	} else {
-		condition["user_id ="] = userInfo.UserID
+		condition += " and user_id=?"
+		pars = append(pars, userInfo.UserID)
 	}
-	countList, e := yb_community_question.GetQuestionListCount(condition)
+	countList, e := yb_community_question.GetQuestionListCount(condition, pars)
 	if e != nil {
 		err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
 		return
 	}
 	resp = new(response.CommunityQuestionListTotal)
-	var distribute, wait, replied int
+	var distribute, wait, replied, total int
 	for _, v := range countList {
-		if v.ReplyStatus == 1 {
-			distribute = v.Total
-		}
-		if v.ReplyStatus == 2 {
-			wait = v.Total
-		}
-		if v.ReplyStatus == 3 {
-			replied = v.Total
+		total += v.Total
+		if isResearcher {
+			if v.UserId == userInfo.UserID {
+				if v.ReplyStatus == 1 || v.ReplyStatus == 2 {  //研究员提问的待分配的问题
+					wait += v.Total
+				}
+			}
+			if v.ReplierUserId == userInfo.UserID  && v.ReplyStatus == 2{ //分配给研究员的未回答的问题
+				distribute += v.Total
+			}
+			if v.ReplyStatus == 3 {
+				replied += v.Total
+			}
+		}else{
+			if v.ReplyStatus == 1 || v.ReplyStatus == 2 {  //未分配和未回答的数量
+				wait += v.Total
+			}else if v.ReplyStatus == 3 {  //已回答的数量
+				replied += v.Total
+			}
 		}
+
 	}
 	if isResearcher {
-		resp.Wait = wait
-	} else {
-		resp.Wait = distribute + wait
+		resp.Distribute = distribute
 	}
+	resp.Wait = wait
 	resp.Replied = replied
-	resp.Total = resp.Wait + resp.Replied
+	resp.Total = total
+
 	return
 }
 
@@ -350,16 +381,16 @@ func GetMyQuestionUnread(userInfo user.UserInfo) (total int, err error) {
 		err = errors.New("获取用户身份失败 Err:" + e.Error())
 		return
 	}
-	condition := make(map[string]interface{}, 0)
-	condition["is_deleted ="] = 0
+	condition := " is_deleted = 0"
+	var pars []interface{}
 	if isResearcher {
-		condition["replier_user_id ="] = userInfo.UserID
-		condition["replier_is_read ="] = 0
+		condition += " and ((replier_user_id=? and replier_is_read=0) or (user_id=? and is_read=0))"
+		pars = append(pars, userInfo.UserID, userInfo.UserID)
 	} else {
-		condition["user_id ="] = userInfo.UserID
-		condition["is_read ="] = 0
+		condition += " and user_id=? and is_read=0"
+		pars = append(pars, userInfo.UserID)
 	}
-	num, e := yb_community_question.GetUnreadNum(condition)
+	num, e := yb_community_question.GetUnreadNum(condition, pars)
 	if e != nil {
 		err = errors.New("获取我的未读数失败 Err:" + e.Error())
 		return
@@ -412,3 +443,33 @@ func GetResearchGroupTree() (respList []*response.ResearchGroupItem, err error)
 	respList = firstList
 	return
 }
+
+// AddAudioListenLog 添加用户点击音频日志
+func AddAudioListenLog(userInfo user.UserInfo, audioId int, sourceAgent int) (err error)  {
+	//1. 查询音频是否存在
+	audio, err := yb_community_question_audio.GetByAudioId(audioId)
+	if err != nil && err != utils.ErrNoRow {
+		err = errors.New("查询音频信息失败 Err:" + err.Error())
+		return
+	}
+	if err == utils.ErrNoRow {
+		err = errors.New("音频不存在")
+		return
+	}
+	if audio == nil {
+		err = errors.New("音频不存在")
+		return
+	}
+	//3. 添加点击日志
+	item := &yb_community_audio_listen_log.YbCommunityAudioListenLog{
+		CommunityQuestionAudioID: audio.CommunityQuestionAudioID,
+		CommunityQuestionID:      audio.CommunityQuestionID,
+		UserID:                   int(userInfo.UserID),
+		SourceAgent:              sourceAgent,
+	}
+	if err = item.Create(); err != nil {
+		err = errors.New("新增点击日志失败 Err:" + err.Error())
+		return
+	}
+	return
+}