wechat.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_bridge/models"
  5. "eta/eta_mini_bridge/models/request"
  6. "eta/eta_mini_bridge/services"
  7. "eta/eta_mini_bridge/utils"
  8. "fmt"
  9. "html"
  10. "strconv"
  11. )
  12. type WeChatController struct {
  13. BaseAuthController
  14. }
  15. // @Title 发送微信模板接口
  16. // @Description 发送微信模板接口
  17. // @Param request body request.SendWxTemplateReq true "type json string"
  18. // @Success 200 {object} models.WechatSign
  19. // @router /send_template_msg [post]
  20. func (this *WeChatController) SendTemplateMsg() {
  21. br := new(models.BaseResponse).Init()
  22. defer func() {
  23. this.Data["json"] = br
  24. this.ServeJSON()
  25. }()
  26. var req request.SendWxTemplateReq
  27. if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
  28. br.Msg = "参数错误"
  29. br.ErrMsg = "参数解析错误,Err:" + err.Error()
  30. return
  31. }
  32. report, err := models.GetReportById(req.ReportId)
  33. if err != nil {
  34. br.Msg = "该报告已删除"
  35. br.ErrMsg = "获取报告详情失败,Err:" + err.Error()
  36. return
  37. }
  38. report.ContentSub = html.UnescapeString(report.ContentSub)
  39. report.Content = html.UnescapeString(report.Content)
  40. if report == nil {
  41. br.Msg = "报告不存在"
  42. return
  43. }
  44. reportChartPermissionIdStrs, err := models.GetChartPermissionIdsListByClassifyId(report.ClassifyIdSecond)
  45. if err != nil {
  46. br.Msg = "获取研报权限失败"
  47. br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
  48. return
  49. }
  50. chartPermissionList, err := models.GetChartPermissionIdsByIds(reportChartPermissionIdStrs)
  51. if err != nil {
  52. br.Msg = "获取研报权限失败"
  53. br.ErrMsg = "获取研报权限失败,Err:" + err.Error()
  54. return
  55. }
  56. permissionMapping, err := models.GetUserChartPermissionMapping()
  57. if err != nil {
  58. br.Msg = "获取用户权限失败"
  59. br.ErrMsg = "获取用户权限失败,Err:" + err.Error()
  60. return
  61. }
  62. // 获取不同二级品种分类下的的小程序用户列表映射
  63. permissionMap := make(map[int][]int)
  64. for _, v := range permissionMapping {
  65. if _, ok := permissionMap[v.ChartPermissionId]; !ok {
  66. permissionMap[v.ChartPermissionId] = make([]int, 0)
  67. } else {
  68. permissionMap[v.ChartPermissionId] = append(permissionMap[v.ChartPermissionId], v.UserId)
  69. }
  70. }
  71. var IsPublic bool
  72. for _, v := range chartPermissionList {
  73. if v.IsPublic == 1 {
  74. IsPublic = true
  75. break
  76. }
  77. }
  78. userList, err := models.GetUserBySubscribe()
  79. if err != nil {
  80. br.Msg = "获取用户列表失败"
  81. br.ErrMsg = "获取用户列表失败,Err:" + err.Error()
  82. return
  83. }
  84. var openIds []*services.OpenIdList
  85. if IsPublic {
  86. var unionIds []string
  87. userMap := make(map[int]*models.User)
  88. for _, v := range userList {
  89. unionIds = append(unionIds, v.UnionId)
  90. userMap[v.UserId] = v
  91. }
  92. // 给所有人,发送模板消息
  93. records, err := models.GetUserRecordByUnionids(unionIds)
  94. if err != nil {
  95. br.Msg = "获取用户记录失败"
  96. br.ErrMsg = "获取用户记录失败,Err:" + err.Error()
  97. return
  98. }
  99. for _, v := range records {
  100. openIds = append(openIds, &services.OpenIdList{
  101. OpenId: v.OpenId,
  102. UserId: v.UserId,
  103. })
  104. }
  105. } else {
  106. // 给指定用户,发送模板消息
  107. // 报告所属的二级品种分类
  108. var permissionIds []int
  109. for _, v := range reportChartPermissionIdStrs {
  110. vv, _ := strconv.Atoi(v)
  111. permissionIds = append(permissionIds, vv)
  112. }
  113. var sendUserIds []int
  114. // 获取报告所属的二级品种分类对应的用户列表
  115. for _, v := range permissionIds {
  116. if _, ok := permissionMap[v]; ok {
  117. sendUserIds = append(sendUserIds, permissionMap[v]...)
  118. }
  119. }
  120. unionIds, err := models.GetUserUnionIdListByIds(sendUserIds)
  121. if err != nil {
  122. br.Msg = "获取用户信息失败"
  123. br.ErrMsg = "获取用户unionId失败,Err:" + err.Error()
  124. return
  125. }
  126. records, err := models.GetUserRecordByUnionids(unionIds)
  127. if err != nil {
  128. br.Msg = "获取用户记录失败"
  129. br.ErrMsg = "获取用户记录失败,Err:" + err.Error()
  130. return
  131. }
  132. for _, v := range records {
  133. openIds = append(openIds, &services.OpenIdList{
  134. OpenId: v.OpenId,
  135. UserId: v.UserId,
  136. })
  137. }
  138. }
  139. sendMap := make(map[string]interface{})
  140. sendMap["template_id"] = utils.TEMPLATE_ID_BY_PRODUCT
  141. sendMap["first"] = fmt.Sprintf("Hi,最新一期%s已上线,欢迎查看", report.ClassifyNameFirst)
  142. sendMap["keyword1"] = map[string]interface{}{"value": fmt.Sprintf("弘则%s", report.ClassifyNameSecond), "color": "#173177"}
  143. sendMap["keyword2"] = map[string]interface{}{"value": report.ContentSub, "color": "#173177"}
  144. sendMap["keyword3"] = map[string]interface{}{"value": report.PublishTime, "color": "#173177"}
  145. sendMap["keyword4"] = map[string]interface{}{"value": report.Abstract, "color": "#173177"}
  146. sendMap["miniprogram"] = map[string]string{
  147. "appid": utils.WX_MINI_APPID,
  148. "pagepath": fmt.Sprintf("pages-report/reportDetail/index?id=%d", report.Id),
  149. }
  150. err = services.SendMultiTemplateMsg(sendMap, openIds, 1)
  151. if err != nil {
  152. br.Msg = "发送失败"
  153. br.ErrMsg = "发送失败,Err:" + err.Error()
  154. return
  155. }
  156. br.Ret = 200
  157. br.Msg = "发送成功"
  158. br.Success = true
  159. }