yb_community_question.go 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package services
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "hongze/hongze_task/models"
  7. "hongze/hongze_task/models/yb"
  8. "hongze/hongze_task/services/alarm_msg"
  9. "hongze/hongze_task/utils"
  10. )
  11. // NotifyNeedAnswerQuestionToResearch 定时通知研究员回复新提问
  12. func NotifyNeedAnswerQuestionToResearch(ctx context.Context) (err error) {
  13. errmsg := ""
  14. //分页处理沙盘表
  15. defer func() {
  16. if err != nil {
  17. go alarm_msg.SendAlarmMsg("NotifyNeedAnswerQuestionToResearch,errmsg:"+errmsg+err.Error(), 3)
  18. }
  19. if errmsg != "" {
  20. utils.FileLog.Info(fmt.Sprintf("NotifyNeedAnswerQuestionToResearch,errmsg:" + errmsg))
  21. }
  22. }()
  23. condition := " AND reply_status = 2 AND replier_admin_id > 0"
  24. var pars []interface{}
  25. //遍历查询待回复的问答列表
  26. total, err := yb.GetCommunityQuestionTotalByCondition(condition, pars)
  27. if err != nil {
  28. err = fmt.Errorf("获取问题列表总数失败 Err:%s", err)
  29. return
  30. }
  31. if total == 0 {
  32. return
  33. }
  34. pageSize := 100
  35. // 根据沙盘列表总数,分页查询
  36. // 计算总页数
  37. totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数
  38. // 查询管理员信息列表
  39. adminInfoMap := make(map[int]*models.Admin)
  40. //查询沙盘列表
  41. for i := 0; i < totalPage; i += 1 {
  42. startSize := i * pageSize
  43. list, e := yb.GetCommunityQuestionListByCondition(condition, pars, "", startSize, pageSize)
  44. if e != nil {
  45. err = fmt.Errorf("查询沙盘列表失败 Err:%s\n", e)
  46. errmsg += err.Error()
  47. return
  48. }
  49. // 查询管理员信息列表,已查询过的不再重复查
  50. adminIds := make([]int, 0)
  51. for _, v := range list {
  52. if _, ok := adminInfoMap[v.ReplierAdminId]; !ok {
  53. adminIds = append(adminIds, v.ReplierAdminId)
  54. }
  55. }
  56. if len(adminIds) > 0 {
  57. //查询管理员信息列表
  58. adminList, e := models.GetAdminByAdminIds(adminIds)
  59. if e != nil {
  60. err = fmt.Errorf("查询管理员信息列表失败 Err:%s\n", e)
  61. errmsg += err.Error()
  62. return
  63. }
  64. for _, v := range adminList {
  65. adminInfoMap[v.AdminId] = v
  66. }
  67. }
  68. // 查询问答列表
  69. for _, item := range list {
  70. // 查询管理员信息列表
  71. adminInfo, ok := adminInfoMap[item.ReplierAdminId]
  72. if !ok {
  73. err = errors.New("发送失败, 研究员账号查询失败")
  74. errmsg += fmt.Sprintf("发送失败, 研究员账号查询失败, 研究员id:%d, 提问id:%d\n", item.ReplierAdminId, item.CommunityQuestionId)
  75. continue
  76. }
  77. if adminInfo.OpenId == "" {
  78. err = errors.New("该研究员未关注公众号,无法发送消息通知,回复人openid为空, 不可推送")
  79. errmsg += fmt.Sprintf("发送失败,该研究员未关注公众号,无法发送消息通知,回复人openid为空, 不可推送 研究员id:%d, 提问id:%d\n", item.ReplierAdminId, item.CommunityQuestionId)
  80. continue
  81. }
  82. // 发送模版消息给研究员
  83. if e := SendYbQuestionToResearcher(item.CommunityQuestionId, adminInfo.AdminId, adminInfo.OpenId, item.QuestionContent, ""); e != nil {
  84. errmsg += fmt.Sprintf("发送失败,推送模板消息失败 研究员id:%d, 提问id:%d\n", item.ReplierAdminId, item.CommunityQuestionId)
  85. return
  86. }
  87. }
  88. }
  89. return
  90. }