article.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package cygx
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/PuerkitoBio/goquery"
  6. "hongze/hz_crm_api/models/company"
  7. "hongze/hz_crm_api/models/cygx"
  8. "hongze/hz_crm_api/services"
  9. "hongze/hz_crm_api/services/alarm_msg"
  10. "hongze/hz_crm_api/utils"
  11. "html"
  12. "strconv"
  13. "strings"
  14. )
  15. func ArticlePublishDate(publishDate string) (newPublishDate string) {
  16. newPublishDate = strings.Replace(publishDate, "00:00:00", "", -1)
  17. newPublishDate = strings.Replace(newPublishDate, " ", "", -1)
  18. return
  19. }
  20. func GetReportContentTextSubNew(content string) (contentSub string, err error) {
  21. content = html.UnescapeString(content)
  22. doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(content))
  23. if errdoc != nil {
  24. err = errdoc
  25. return
  26. }
  27. docText := doc.Text()
  28. bodyRune := []rune(docText)
  29. bodyRuneLen := len(bodyRune)
  30. body := string(bodyRune[:bodyRuneLen])
  31. contentSub = body
  32. contentSub = strings.Replace(contentSub, "Powered by Froala Editor", "", -1)
  33. contentSub = strings.Replace(contentSub, " ", "", -1)
  34. contentSub = strings.Replace(contentSub, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sanered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
  35. return
  36. }
  37. func ArticleComPanyLabelToStr(companyLabel []string) (label string) {
  38. for _, v := range companyLabel {
  39. label += v + "{|}"
  40. }
  41. label = strings.TrimRight(label, "{|}")
  42. return
  43. }
  44. // GetArticleStockMap 获取个股标签所对应的文章ID
  45. func GetArticleStockMap() (mapResp map[string]int, err error) {
  46. defer func() {
  47. if err != nil {
  48. go alarm_msg.SendAlarmMsg("获取个股标签所对应的文章ID失败"+err.Error(), 2)
  49. }
  50. }()
  51. list, err := cygx.GetArticleStock()
  52. if err != nil && err.Error() != utils.ErrNoRow() {
  53. return
  54. }
  55. mapResp = make(map[string]int, 0)
  56. if len(list) > 0 {
  57. //一对一精准匹配
  58. for _, v := range list {
  59. sliceSubjects := strings.Split(v.Stock, "/")
  60. if len(sliceSubjects) > 0 {
  61. for _, vSubject := range sliceSubjects {
  62. sliceKuohao := strings.Split(vSubject, "(") //过滤括号
  63. sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
  64. subject := sliceXiahuaxian[0]
  65. mapResp[subject] = v.ArticleId
  66. }
  67. }
  68. }
  69. }
  70. return
  71. }
  72. // 处理文章来源类型
  73. func GetArticleSourcePlatform(SourcePlatform string) (sourcePlatformResp int) {
  74. //SourcePlatform string `description:"来源 'MOBILE:移动端小程序','PC:PC端小程序','CELUE:上海策略平台','WEB:查研观向网页版'"`
  75. if SourcePlatform == "MOBILE" || SourcePlatform == "PC" {
  76. sourcePlatformResp = 1
  77. } else if SourcePlatform == "WEB" {
  78. sourcePlatformResp = 2
  79. } else if SourcePlatform == "CELUE" {
  80. sourcePlatformResp = 3
  81. } else if SourcePlatform == "1" {
  82. sourcePlatformResp = 1
  83. } else if SourcePlatform == "2" {
  84. sourcePlatformResp = 2
  85. }
  86. return
  87. }
  88. //
  89. //func init() {
  90. // SendWxMsgWithroadshowEssence(1000546)
  91. //}
  92. // 路演精华的文章做模板消息推送
  93. func SendWxMsgWithroadshowEssence(articleId int) (err error) {
  94. defer func() {
  95. if err != nil {
  96. fmt.Println(err)
  97. go alarm_msg.SendAlarmMsg("路演精华的文章做模板消息推送送,发送模版消息失败,Err:"+err.Error(), 3)
  98. utils.FileLog.Info(fmt.Sprintf("路演精华的文章做模板消息推送失败,Err:%s,%s", err.Error()))
  99. }
  100. }()
  101. detail, e := cygx.GetArticleRoadshowEssenceDetail(articleId)
  102. if e != nil {
  103. err = errors.New("获取详情失败" + e.Error())
  104. return
  105. }
  106. if detail == nil {
  107. err = errors.New("获取详情失败")
  108. return
  109. }
  110. //fmt.Println(detail)
  111. permissionStr, e := company.GetPermissionIdById(strconv.Itoa(detail.ChartPermissionId))
  112. if e != nil {
  113. err = errors.New("获取主客观权限失败" + e.Error())
  114. return
  115. }
  116. // 获取所有有权的用户的 openid
  117. openidPowerList, e := cygx.GetCygxUserRecordPower(permissionStr)
  118. if e != nil {
  119. err = errors.New("获取所有有权的用户的 openid失败" + e.Error())
  120. return
  121. }
  122. //获取关注对应产业的用户信息
  123. industryFllowList, e := cygx.GetCygxUserFllowOpenid(articleId)
  124. if e != nil {
  125. err = errors.New("获取关注对应产业的用户信息失败 " + e.Error())
  126. return
  127. }
  128. mapOpenidFllow := make(map[int]string)
  129. for _, v := range industryFllowList {
  130. mapOpenidFllow[v.UserId] = v.OpenId
  131. }
  132. //获取拒绝接收推送的的用户的 openid
  133. mapOpenidRefuset := make(map[int]string)
  134. openidRefusetList, e := cygx.GetCygxUserRefusetOpenid()
  135. if e != nil && e.Error() != utils.ErrNoRow() {
  136. err = errors.New("获取拒绝接收推送的的用户的 openid 失败" + e.Error())
  137. return
  138. }
  139. for _, v := range openidRefusetList {
  140. mapOpenidRefuset[v.UserId] = v.OpenId
  141. }
  142. //获取提交过推送规则的用户的 openid
  143. mapUserIdChooseSend := make(map[int]int)
  144. chooseSendtList, err := cygx.GetCygxXzsChooseSend("")
  145. if err != nil && err.Error() != utils.ErrNoRow() {
  146. return err
  147. }
  148. for _, v := range chooseSendtList {
  149. mapUserIdChooseSend[v.UserId] = v.UserId
  150. }
  151. openIdArr := make([]string, len(openidPowerList))
  152. for i, v := range openidPowerList {
  153. if _, ok := mapOpenidRefuset[v.UserId]; ok {
  154. continue //如果用户选择了拒绝推送消息,那么就不做模板消息推送
  155. }
  156. if _, ok := mapUserIdChooseSend[v.UserId]; ok {
  157. if _, ok := mapOpenidFllow[v.UserId]; !ok {
  158. continue //如果用户提交过关注信息,而且这个产业他没有关注,那么不做推送
  159. }
  160. }
  161. openIdArr[i] = v.OpenId
  162. }
  163. fmt.Println(openIdArr)
  164. first := "【路演精华】已发布,欢迎查看"
  165. keyword1 := detail.Title
  166. keyword2 := "已发布"
  167. keyword3 := detail.PublishDate
  168. keyword4 := detail.Abstract
  169. remark := "点击查看详情"
  170. redirectUrl := utils.WX_MSG_PATH_ROAD_ESSENCE + strconv.Itoa(detail.ArticleId) + "&IsSendWx=1"
  171. sendInfo := new(services.SendWxTemplate)
  172. sendInfo.First = first
  173. sendInfo.Keyword1 = keyword1
  174. sendInfo.Keyword2 = keyword2
  175. sendInfo.Keyword3 = keyword3
  176. sendInfo.Keyword4 = keyword4
  177. sendInfo.Remark = remark
  178. sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
  179. sendInfo.RedirectUrl = redirectUrl
  180. sendInfo.RedirectTarget = 3
  181. sendInfo.Resource = strconv.Itoa(detail.ArticleId)
  182. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ROADSHOW_VIDEO
  183. sendInfo.OpenIdArr = openIdArr
  184. e = services.SendTemplateMsg(sendInfo)
  185. if e != nil {
  186. err = errors.New("推送模板消息失败" + e.Error())
  187. return
  188. }
  189. return
  190. }