package community import ( "errors" "fmt" "hongze/hongze_yb/models/request" "hongze/hongze_yb/models/response" "hongze/hongze_yb/models/tables/user_record" "hongze/hongze_yb/models/tables/yb_community_question" "hongze/hongze_yb/models/tables/yb_community_question_audio" "hongze/hongze_yb/services/company" "hongze/hongze_yb/services/user" "hongze/hongze_yb/services/wechat" "hongze/hongze_yb/utils" "time" ) // GetQuestionList 获取问答列表 func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStatus, replierUserId int, userInfo user.UserInfo) (resp *response.CommunityQuestionList, err error) { condition := make(map[string]interface{}) condition["is_deleted ="] = 0 // 用户身份 isAdmin, _, e := user.GetAdminByUserInfo(userInfo) if e != nil { err = errors.New("获取用户身份失败 Err:" + e.Error()) return } if replierUserId > 0 { condition["replier_user_id ="] = replierUserId // 回复列表 if replyStatus > 0 { condition["reply_status ="] = replyStatus } } else { // 问题列表 if onlyMine == 1 { if isAdmin { condition["replier_user_id ="] = userInfo.UserID } else { condition["user_id ="] = userInfo.UserID } } else { // 默认只展示已回复的 condition["reply_status ="] = 3 } } if chartPermissionId > 0 { condition["chart_permission_id ="] = chartPermissionId } // 问题列表 questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize) if e != nil { err = errors.New("获取问题列表失败 Err:" + e.Error()) return } listLen := len(questionList) if listLen == 0 { return } idArr := make([]int, 0) for i := 0; i < listLen; i++ { idArr = append(idArr, questionList[i].CommunityQuestionID) } // 音频列表 audioList, e := yb_community_question_audio.GetListByQuestrionIds(idArr) if e != nil { err = errors.New("获取音频列表失败 Err:" + e.Error()) return } // 用户权限 authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID)) if e != nil { err = errors.New("获取用户权限失败 Err:" + e.Error()) return } userId := int(userInfo.UserID) resp = new(response.CommunityQuestionList) respList := make([]*response.CommunityQuestionItem, 0) for _, v := range questionList { audios := make([]*response.CommunityQuestionAudioItem, 0) 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, }) } } replierRank := fmt.Sprintf("弘则%s研究员", v.ResearchGroupFirstName) item := &response.CommunityQuestionItem{ CommunityQuestionID: v.CommunityQuestionID, UserId: v.UserID, QuestionContent: v.QuestionContent, ReplierRealName: v.ReplierRealName, ReplierRank: replierRank, ReplierAvatar: v.ReplierAvatar, ChartPermissionID: v.CommunityQuestionID, ChartPermissionName: v.ChartPermissionName, IsRead: v.IsRead, CreateTime: v.CreateTime.Format(utils.FormatDateTime), ReplyTime: v.ReplyTime.Format(utils.FormatDateTime), AuthOk: authOk, PermissionInfo: permissionInfo, AudioList: audios, } if !isAdmin && item.IsRead == 0 && item.UserId == userId { item.IsTop = 1 } respList = append(respList, item) } resp.QuestionList = respList //resp.PermissionInfo = permissionInfo return } // GetQuestionDetail 获取问答详情 func GetQuestionDetail(questionId int, userInfo user.UserInfo) (item *response.CommunityQuestionItem, err error) { detail, e := yb_community_question.GetItemById(questionId) if e != nil { err = errors.New("获取问题详情失败 Err:" + e.Error()) return } audioList, e := yb_community_question_audio.GetListByQuestionId(questionId) if e != nil { err = errors.New("获取问题音频失败 Err:" + e.Error()) return } audios := make([]*response.CommunityQuestionAudioItem, 0) for _, a := range audioList { audios = append(audios, &response.CommunityQuestionAudioItem{ CommunityQuestionID: a.CommunityQuestionID, AudioURL: a.AudioURL, AudioPlaySeconds: a.AudioPlaySeconds, AudioSize: a.AudioSize, Sort: a.Sort, }) } replierRank := fmt.Sprintf("弘则%s研究员", detail.ResearchGroupFirstName) // 用户权限 authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID)) if e != nil { err = errors.New("获取用户权限失败 Err:" + e.Error()) return } item = &response.CommunityQuestionItem{ CommunityQuestionID: detail.CommunityQuestionID, UserId: detail.UserID, QuestionContent: detail.QuestionContent, ReplierRealName: detail.ReplierRealName, ReplierRank: replierRank, ReplierAvatar: detail.ReplierAvatar, ChartPermissionID: detail.ChartPermissionID, ChartPermissionName: detail.ChartPermissionName, IsRead: detail.IsRead, CreateTime: detail.CreateTime.Format(utils.FormatDateTime), ReplyTime: detail.ReplyTime.Format(utils.FormatDateTime), AuthOk: authOk, PermissionInfo: permissionInfo, AudioList: audios, } return } // CreateQuestion 新增问答 func CreateQuestion(userId int, mobile, realName, content string) (err error) { // 获取用户公众号openid, 获取不到则置空 userRecord, e := user_record.GetByUserId(userId, utils.USER_RECORD_PLATFORM_RDDP) if e != nil && e == utils.ErrNoRow { err = errors.New("获取用户公众号openid失败 Err:" + e.Error()) return } openid := "" if userRecord != nil { openid = userRecord.OpenID } item := &yb_community_question.YbCommunityQuestion{ UserID: userId, UserOpenid: openid, Mobile: mobile, RealName: realName, QuestionContent: content, ReplyStatus: 1, } if e := item.Create(); e != nil { err = errors.New("新增问题失败 Err:" + e.Error()) } return } // ReplyUserQuestion 回复问题 func ReplyUserQuestion(replierId, questionId int, audios []*request.ReplyReqAudioList) (err error) { item, e := yb_community_question.GetItemById(questionId) if e != nil { err = errors.New("获取提问信息失败 Err:" + e.Error()) return } if item.ReplyStatus < 2 { err = errors.New("回复状态有误") return } if item.ReplierUserID != replierId { err = errors.New(fmt.Sprintf("回复人与分配人不匹配, 回复人ID: %d, 分配人ID: %d", item.ReplierUserID, replierId)) return } // 问题 updateCols := make([]string, 0) updateCols = append(updateCols, "reply_status", "reply_time", "modify_time") nowTime := time.Now().Local() item.ReplyStatus = 3 item.ReplyTime = nowTime item.ModifyTime = nowTime // 音频 audioList := make([]*yb_community_question_audio.YbCommunityQuestionAudio, 0) for _, v := range audios { audioList = append(audioList, &yb_community_question_audio.YbCommunityQuestionAudio{ CommunityQuestionID: questionId, AudioURL: v.AudioUrl, AudioPlaySeconds: v.AudioPlaySeconds, AudioSize: v.AudioSize, Sort: v.Sort, CreateTime: nowTime, }) } if e := yb_community_question.UpdateQuestionAndAudioList(item, updateCols, audioList); e != nil { err = errors.New("UpdateQuestionAndAudioList Err:" + e.Error()) return } // 推送回复消息给用户 go wechat.SendQuestionReplyWxMsg(item.CommunityQuestionID, item.UserID, item.UserOpenid, item.QuestionContent) return } // ReadQuestionReply 回复已读 func ReadQuestionReply(userId int, questionId int) (err error) { item, e := yb_community_question.GetItemById(questionId) if e != nil { err = errors.New("获取提问信息失败 Err:" + e.Error()) return } if item.IsRead == 1 { return } if item.UserID == userId { updateCols := make([]string, 0) updateCols = append(updateCols, "is_read", "modify_time") item.IsRead = 1 item.ModifyTime = time.Now().Local() if e = item.Update(updateCols); e != nil { err = errors.New("更新问题已读失败 Err:" + e.Error()) } } return } // GetReplyListTotal 获取问答列表数量统计 func GetReplyListTotal(replierUserId int) (resp *response.CommunityReplyTotal, err error) { countList, e := yb_community_question.GetReplierQuestionCount(replierUserId) if e != nil { err = errors.New("获取回复人问题统计失败 Err:" + e.Error()) return } resp = new(response.CommunityReplyTotal) for _, v := range countList { if v.ReplyStatus == 2 { resp.Wait = v.Total continue } if v.ReplyStatus == 3 { resp.Replied = v.Total } } resp.Total = resp.Wait + resp.Replied return }