report_rai.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package services
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/report"
  6. "eta/eta_api/services/alarm_msg"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "html"
  10. "io/ioutil"
  11. "net/http"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. func AutoInsertRaiReport() {
  17. for {
  18. utils.Rc.Brpop(utils.FICC_ARTICLE_UPDATE_KEY, func(b []byte) {
  19. var log models.RaiReportNotifyRedis
  20. if err := json.Unmarshal(b, &log); err != nil {
  21. utils.FileLog.Info("获取权益报告并更新处理Redis队列消息失败: json unmarshal wrong!", err.Error())
  22. go alarm_msg.SendAlarmMsg(fmt.Sprintf("获取权益报告并更新处理Redis队列消息失败: json unmarshal wrong! %s", err.Error()), 2)
  23. }
  24. // 这里直接go出去会出现并发,导致文章md5ID唯一索引限制报错
  25. err := HandleInsertRaiReport(log.ArticleId)
  26. if err != nil {
  27. utils.FileLog.Info("获取权益报告并更新处理Redis队列消息失败: HandleInsertRaiReport ", err.Error())
  28. go alarm_msg.SendAlarmMsg(fmt.Sprintf("获取权益报告并更新处理Redis队列消息失败: HandleInsertRaiReport %s", err.Error()), 2)
  29. }
  30. })
  31. }
  32. }
  33. func HandleInsertRaiReport(raiReportId int) (err error) {
  34. // 设置缓存,防止重复处理
  35. cacheKey := fmt.Sprintf("rai_report_notify_redis_%d", raiReportId)
  36. cacheValue := utils.Rc.GetStr(cacheKey)
  37. if cacheValue != "" {
  38. return nil
  39. }
  40. utils.Rc.SetNX(cacheKey, "1", 10*time.Second)
  41. defer func() {
  42. if err != nil {
  43. msg := fmt.Sprintf("处理同步过来的文章失败"+"HandleArticleListByApi ErrMsg:%s artcleId:%d", err.Error(), raiReportId)
  44. utils.FileLog.Info(msg, 2)
  45. go alarm_msg.SendAlarmMsg(msg, 2)
  46. }
  47. utils.Rc.Delete(cacheKey)
  48. }()
  49. var clueApiUrl string
  50. clueApiUrl = fmt.Sprint(utils.RaiReportLibUrl, "articles/", raiReportId)
  51. fmt.Println(clueApiUrl)
  52. body, err := getRaiReportLib(clueApiUrl)
  53. if err != nil {
  54. fmt.Println(err)
  55. return
  56. }
  57. var articleResultDate models.ArticleDetailResultApi
  58. err = json.Unmarshal(body, &articleResultDate)
  59. if err != nil {
  60. fmt.Println("Getres.PublicGetDate Err:", err.Error())
  61. return err
  62. }
  63. articleResult := articleResultDate.Data
  64. // 判断是否是固收研究
  65. if articleResult.IndustrId != 12 {
  66. return nil
  67. }
  68. // 根据分类名称查找分类信息
  69. classifyItemList, e := models.GetReportClassifyByClassifyName([]string{articleResult.Industry.Name, articleResult.Series.Name})
  70. if e != nil {
  71. err = fmt.Errorf("GetReportClassifyByClassifyName err: %s", e.Error())
  72. return err
  73. }
  74. classifyMap := make(map[string]*models.Classify)
  75. for _, v := range classifyItemList {
  76. classifyMap[v.ClassifyName] = v
  77. }
  78. classifyFirst, ok := classifyMap[articleResult.Industry.Name]
  79. if !ok {
  80. err = fmt.Errorf("一级分类不存在")
  81. return err
  82. }
  83. classifySecond, ok := classifyMap[articleResult.Series.Name]
  84. if !ok {
  85. // 新增二级分类
  86. err, _, _ = AddReportClassify(articleResult.Series.Name, classifyFirst.Id, []int{})
  87. if err != nil {
  88. err = fmt.Errorf("添加二级分类失败, Err: %s", err.Error())
  89. return err
  90. }
  91. item, err := models.GetClassifyByName(articleResult.Series.Name, classifyFirst.Id)
  92. if err != nil {
  93. err = fmt.Errorf("添加二级分类失败, Err: %s", err.Error())
  94. return err
  95. }
  96. classifySecond = item
  97. }
  98. // 判断分类的层级关系是否合理
  99. if classifyFirst.Id != classifySecond.ParentId {
  100. err = fmt.Errorf("分类层级关系不合理")
  101. return err
  102. }
  103. // 判断报告是否已存在, 如果存在则更新报告,如果不存在则创建报告
  104. reportInfo, err := models.GetReportByRaiReportId(articleResult.ArticleId)
  105. if err != nil && err.Error() != utils.ErrNoRow() {
  106. return err
  107. }
  108. if err == nil && reportInfo.Id > 0 {
  109. var contentSub string
  110. if articleResult.Content.Body != "" {
  111. contentSub, err = GetReportContentSub(articleResult.Content.Body)
  112. if err != nil {
  113. go alarm_msg.SendAlarmMsg("ContentSub 失败,Err:"+err.Error(), 3)
  114. }
  115. }
  116. state := reportInfo.State
  117. // 报告已存在,更新报告
  118. if (articleResult.PublishStatus == 2 || articleResult.PublishStatus == 4) && articleResult.IsActive {
  119. // 报告状态为未发布,则更新报告
  120. state = models.ReportStatePublished
  121. reportInfo.PublishTime = articleResult.PublishDate
  122. }else if articleResult.IsActive == false {
  123. // 删除报告
  124. err = models.DeleteReport(reportInfo.Id)
  125. if err != nil {
  126. err = fmt.Errorf("删除报告失败, Err: %s", err.Error())
  127. return
  128. }
  129. go UpdateReportEs(reportInfo.Id, 1)
  130. }else {
  131. // 报告状态为未发布,则更新报告
  132. state = models.ReportStateUnpublished
  133. reportInfo.PublishTime = articleResult.PublishDate
  134. }
  135. // 过滤Abstracthtml标签,把<p>标签去掉
  136. abstract := strings.ReplaceAll(articleResult.Content.Abstract, "<p>", "")
  137. abstract = strings.ReplaceAll(abstract, "</p>", "")
  138. reportInfo.ClassifyIdFirst = classifyFirst.Id
  139. reportInfo.ClassifyNameFirst = articleResult.Industry.Name
  140. reportInfo.ClassifyIdSecond = classifySecond.Id
  141. reportInfo.ClassifyNameSecond = articleResult.Series.Name
  142. reportInfo.Title = articleResult.Title
  143. reportInfo.Abstract = abstract
  144. reportInfo.Author = articleResult.Author.Name
  145. reportInfo.Frequency = articleResult.Frequency
  146. reportInfo.State = state
  147. reportInfo.Content = html.EscapeString(articleResult.Content.Body)
  148. reportInfo.ContentSub = html.EscapeString(contentSub)
  149. updateTime, _ := time.ParseInLocation(utils.FormatDate, articleResult.UpdateDate, time.Local)
  150. reportInfo.ModifyTime = updateTime
  151. // 报告更新
  152. updateCols := []string{"ClassifyIdFirst","ClassifyNameFirst","ClassifyIdSecond","ClassifyNameSecond","Title","Abstract","Author","Frequency","State","Content","ContentSub","ModifyTime","PublishTime"}
  153. err = reportInfo.UpdateReport(updateCols)
  154. if err != nil {
  155. err = fmt.Errorf("更新报告失败, Err: %s", err.Error())
  156. return
  157. }
  158. go UpdateReportEs(reportInfo.Id, state)
  159. if state == models.ReportStatePublished {
  160. // 报告权限处理
  161. go handleReportPermission(int64(reportInfo.Id), reportInfo.ClassifyIdSecond)
  162. }else {
  163. // 重置小程序详情页海报
  164. _ = ResetMiniProgramReportDetailCover(reportInfo.Id)
  165. }
  166. }else if reportInfo.Id == 0 {
  167. // 报告不存在,创建报告
  168. // 判断状态
  169. if (articleResult.PublishStatus == 2 || articleResult.PublishStatus == 4) && articleResult.IsActive {
  170. var contentSub string
  171. if articleResult.Content.Body != "" {
  172. contentSub, err = GetReportContentSub(articleResult.Content.Body)
  173. if err != nil {
  174. go alarm_msg.SendAlarmMsg("ContentSub 失败,Err:"+err.Error(), 3)
  175. }
  176. }
  177. // 已发布状态
  178. state := models.ReportStatePublished
  179. // 协作方式,1:个人,2:多人协作。默认:1
  180. collaborateType := 1
  181. // 报告布局,1:常规布局,2:智能布局。默认:1
  182. reportLayout := 1
  183. // 是否公开发布,1:是,2:否
  184. isPublicPublish := 1
  185. abstract := strings.ReplaceAll(articleResult.Content.Abstract, "<p>", "")
  186. abstract = strings.ReplaceAll(abstract, "</p>", "")
  187. item := new(models.Report)
  188. item.AddType = 1
  189. item.ReportVersion = 2
  190. item.ClassifyIdFirst = classifyFirst.Id
  191. item.ClassifyNameFirst = articleResult.Industry.Name
  192. item.ClassifyIdSecond = classifySecond.Id
  193. item.ClassifyNameSecond = articleResult.Series.Name
  194. item.Title = articleResult.Title
  195. item.Abstract = abstract
  196. item.Author = articleResult.Author.Name
  197. item.Frequency = articleResult.Frequency
  198. item.State = state
  199. item.Content = html.EscapeString(articleResult.Content.Body)
  200. item.Stage = 0
  201. item.ContentSub = html.EscapeString(contentSub)
  202. item.CreateTime = time.Now().Format(utils.FormatDateTime)
  203. updateTime, _ := time.ParseInLocation(utils.FormatDate, articleResult.UpdateDate, time.Local)
  204. item.ModifyTime = updateTime
  205. item.ReportVersion = 2
  206. item.AdminId = 0
  207. item.AdminRealName = ""
  208. item.PublishTime = articleResult.PublishDate
  209. item.ClassifyIdThird = 0
  210. item.ClassifyNameThird = ""
  211. item.LastModifyAdminId = 0
  212. item.LastModifyAdminName = ""
  213. item.ContentModifyTime = time.Now()
  214. item.NeedSplice = 1
  215. item.ContentStruct = ""
  216. item.HeadImg = ""
  217. item.EndImg = ""
  218. item.CanvasColor = ""
  219. item.HeadResourceId = 0
  220. item.EndResourceId = 0
  221. item.CollaborateType = int8(collaborateType)
  222. item.ReportLayout = int8(reportLayout)
  223. item.IsPublicPublish = int8(isPublicPublish)
  224. createTime, _ := time.ParseInLocation(utils.FormatDate, articleResult.CreateDate, time.Local)
  225. item.ReportCreateTime = createTime
  226. item.RaiReportId = articleResult.ArticleId
  227. // 新增报告及章节
  228. var reportId int64
  229. allGrantUserList := make([]*report.ReportGrant, 0)
  230. reportId, err = models.AddReportAndChapter(item, allGrantUserList, []models.AddReportChapter{})
  231. if err != nil {
  232. err = fmt.Errorf("新增报告及章节失败, Err: " + err.Error())
  233. return
  234. }
  235. reportCode := utils.MD5(strconv.Itoa(int(reportId)))
  236. item.ReportCode = reportCode
  237. // 修改唯一编码
  238. {
  239. go models.ModifyReportCode(reportId, reportCode)
  240. }
  241. // 报告权限处理
  242. go handleReportPermission(reportId, item.ClassifyIdSecond)
  243. // 更新报告Es
  244. _ = UpdateReportEs(int(reportId), 2)
  245. }
  246. }
  247. return
  248. }
  249. // get公共请求方法
  250. func getRaiReportLib(url string) (body []byte, err error) {
  251. if url == "" {
  252. err = fmt.Errorf("url is empty")
  253. return
  254. }
  255. if utils.RaiReportLibAuthorization == "" {
  256. err = fmt.Errorf("authorization is empty")
  257. return
  258. }
  259. defer func() {
  260. if err != nil {
  261. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", url+"Get ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  262. }
  263. }()
  264. method := "GET"
  265. client := &http.Client{}
  266. req, err := http.NewRequest(method, url, nil)
  267. if err != nil {
  268. return
  269. }
  270. req.Header.Add("Authorization", utils.RaiReportLibAuthorization)
  271. res, err := client.Do(req)
  272. if err != nil {
  273. return
  274. }
  275. defer res.Body.Close()
  276. body, err = ioutil.ReadAll(res.Body)
  277. if err != nil {
  278. return
  279. }
  280. return
  281. }