report_rai.go 8.5 KB

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