package services import ( "context" "errors" "fmt" "hongze/hongze_task/models" "hongze/hongze_task/models/yb" "hongze/hongze_task/services/alarm_msg" "hongze/hongze_task/utils" ) // NotifyNeedAnswerQuestionToResearch 定时通知研究员回复新提问 func NotifyNeedAnswerQuestionToResearch(ctx context.Context) (err error) { errmsg := "" //分页处理沙盘表 defer func() { if err != nil { go alarm_msg.SendAlarmMsg("NotifyNeedAnswerQuestionToResearch,errmsg:"+errmsg+err.Error(), 3) } if errmsg != "" { utils.FileLog.Info(fmt.Sprintf("NotifyNeedAnswerQuestionToResearch,errmsg:" + errmsg)) } }() condition := " AND reply_status = 2 AND replier_admin_id > 0" var pars []interface{} //遍历查询待回复的问答列表 total, err := yb.GetCommunityQuestionTotalByCondition(condition, pars) if err != nil { err = fmt.Errorf("获取问题列表总数失败 Err:%s", err) return } if total == 0 { return } pageSize := 100 // 根据沙盘列表总数,分页查询 // 计算总页数 totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数 // 查询管理员信息列表 adminInfoMap := make(map[int]*models.Admin) //查询沙盘列表 for i := 0; i < totalPage; i += 1 { startSize := i * pageSize list, e := yb.GetCommunityQuestionListByCondition(condition, pars, "", startSize, pageSize) if e != nil { err = fmt.Errorf("查询沙盘列表失败 Err:%s\n", e) errmsg += err.Error() return } // 查询管理员信息列表,已查询过的不再重复查 adminIds := make([]int, 0) for _, v := range list { if _, ok := adminInfoMap[v.ReplierAdminId]; !ok { adminIds = append(adminIds, v.ReplierAdminId) } } if len(adminIds) > 0 { //查询管理员信息列表 adminList, e := models.GetAdminByAdminIds(adminIds) if e != nil { err = fmt.Errorf("查询管理员信息列表失败 Err:%s\n", e) errmsg += err.Error() return } for _, v := range adminList { adminInfoMap[v.AdminId] = v } } // 查询问答列表 for _, item := range list { // 查询管理员信息列表 adminInfo, ok := adminInfoMap[item.ReplierAdminId] if !ok { err = errors.New("发送失败, 研究员账号查询失败") errmsg += fmt.Sprintf("发送失败, 研究员账号查询失败, 研究员id:%d, 提问id:%d\n", item.ReplierAdminId, item.CommunityQuestionId) continue } if adminInfo.OpenId == "" { err = errors.New("该研究员未关注公众号,无法发送消息通知,回复人openid为空, 不可推送") errmsg += fmt.Sprintf("发送失败,该研究员未关注公众号,无法发送消息通知,回复人openid为空, 不可推送 研究员id:%d, 提问id:%d\n", item.ReplierAdminId, item.CommunityQuestionId) continue } // 发送模版消息给研究员 if err = SendYbQuestionToResearcher(item.CommunityQuestionId, adminInfo.AdminId, adminInfo.OpenId, item.QuestionContent, ""); err != nil { errmsg += fmt.Sprintf("发送失败,推送模板消息失败 研究员id:%d, 提问id:%d\n", item.ReplierAdminId, item.CommunityQuestionId) return } } } return }