report_sync.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. package services
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hz_eta_api/models"
  6. "hongze/hz_eta_api/services/alarm_msg"
  7. "hongze/hz_eta_api/utils"
  8. "html"
  9. "regexp"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. func AutoSyncOldReport() {
  15. defer func() {
  16. if err := recover(); err != nil {
  17. fmt.Println("[AutoSyncOldReport]", err)
  18. }
  19. }()
  20. for {
  21. utils.Rc.Brpop(utils.CACHE_KEY_OLD_REPORT_PUBLISH, func(b []byte) {
  22. reportId, _ := strconv.Atoi(string(b))
  23. if reportId > 0 {
  24. if err := SyncOldReport(reportId); err != nil {
  25. fmt.Println("AutoSyncOldReport: ", err.Error(), "reportId: ", reportId)
  26. }
  27. }
  28. })
  29. }
  30. }
  31. // SyncOldReport 同步老后台报告
  32. func SyncOldReport(reportId int) (err error) {
  33. defer func() {
  34. if err != nil {
  35. utils.FileLog.Error("SyncOldReport, reportId:%s, Err:%s", strconv.Itoa(reportId), err.Error())
  36. go alarm_msg.SendAlarmMsg("同步老后台报告失败, 报告ID: "+strconv.Itoa(reportId)+", Err: "+err.Error(), 3)
  37. }
  38. }()
  39. // 查询报告信息
  40. if reportId <= 0 {
  41. return
  42. }
  43. reportInfo, e := models.GetResearchReportById(reportId)
  44. if e != nil {
  45. err = errors.New("报告信息有误" + e.Error())
  46. return
  47. }
  48. if reportInfo.Status != "report" {
  49. return
  50. }
  51. // 20220615-周报不做同步了
  52. if reportInfo.Type == utils.REPORT_TYPE_WEEK {
  53. return
  54. }
  55. // 若已存在报告,则后续更新报告信息
  56. existReport, e := models.GetNewReportExist(reportId)
  57. if e != nil && e.Error() != utils.ErrNoRow() {
  58. err = errors.New("获取报告是否已同步失败" + e.Error())
  59. return
  60. }
  61. // 报告分类
  62. classifyList, e := models.GetAllClassify()
  63. if e != nil {
  64. err = errors.New("获取报告分类失败" + e.Error())
  65. return
  66. }
  67. classifyIdName := make(map[int]string, 0)
  68. classifyNameId := make(map[string]int, 0)
  69. classifyIdParentId := make(map[int]int, 0)
  70. classifyLen := len(classifyList)
  71. for i := 0; i < classifyLen; i++ {
  72. classifyIdName[classifyList[i].Id] = classifyList[i].ClassifyName
  73. classifyNameId[classifyList[i].ClassifyName] = classifyList[i].Id
  74. classifyIdParentId[classifyList[i].Id] = classifyList[i].ParentId
  75. }
  76. // 获取报告章节
  77. reportTypeList, e := models.GetResearchReportTypeListByReportId(reportId)
  78. if e != nil {
  79. err = errors.New("获取报告章节失败" + e.Error())
  80. return
  81. }
  82. reportTypeListLen := len(reportTypeList)
  83. if reportTypeListLen == 0 {
  84. return
  85. }
  86. // 获取章节内容
  87. typeIdArr := make([]string, 0)
  88. for i := 0; i < reportTypeListLen; i++ {
  89. typeIdArr = append(typeIdArr, strconv.Itoa(reportTypeList[i].ResearchReportTypeId))
  90. }
  91. typeIdStr := strings.Join(typeIdArr, ",")
  92. reportContentList, e := models.GetResearchReportTypeContentListByReportTypeIds(typeIdStr)
  93. if e != nil {
  94. err = errors.New("获取章节内容失败" + e.Error())
  95. return
  96. }
  97. reportContentListLen := len(reportContentList)
  98. if reportContentListLen == 0 {
  99. return
  100. }
  101. // 报告章节内容map
  102. reportContentListMap := make(map[int][]*models.ResearchReportTypeContent, 0)
  103. for i := 0; i < reportTypeListLen; i++ {
  104. rtid := reportTypeList[i].ResearchReportTypeId
  105. reportContentMap := make([]*models.ResearchReportTypeContent, 0)
  106. for ii := 0; ii < reportContentListLen; ii++ {
  107. if rtid == reportContentList[ii].ResearchReportTypeId {
  108. reportContentMap = append(reportContentMap, reportContentList[ii])
  109. }
  110. }
  111. reportContentListMap[rtid] = reportContentMap
  112. }
  113. frequencyMap := map[string]string{
  114. "day": "日度",
  115. "week": "周度",
  116. "two_week": "双周度",
  117. "month": "月度",
  118. "other": "不定时",
  119. }
  120. newReport := new(models.Report)
  121. newReport.AddType = 1
  122. // 标题去掉【】
  123. re, _ := regexp.Compile("^【[^】]*】")
  124. newTitle := re.ReplaceAllString(reportInfo.ResearchReportName, "")
  125. newReport.Title = newTitle
  126. newReport.Author = reportInfo.Author
  127. newReport.Frequency = frequencyMap[reportInfo.Type]
  128. newReport.CreateTime = reportInfo.CreatedTime
  129. modifyTime, _ := time.ParseInLocation(utils.FormatDateTime, reportInfo.CreatedTime, time.Local)
  130. newReport.ModifyTime = modifyTime
  131. newReport.State = 2
  132. newReport.PublishTime = reportInfo.ResearchReportDate
  133. newReport.Stage = reportInfo.Periods
  134. //newReport.MsgIsSend = 1
  135. //newReport.ThsMsgIsSend = 1
  136. newReport.ReportVersion = 1
  137. newReport.OldReportId = reportInfo.ResearchReportId
  138. // 判断报告类型
  139. newReportId := 0
  140. if reportInfo.Type == utils.REPORT_TYPE_DAY || reportInfo.Type == utils.REPORT_TYPE_WEEK {
  141. // 晨周报
  142. newReport.HasChapter = 1
  143. newReport.ChapterType = reportInfo.Type
  144. // 章节类型
  145. typeList, tmpErr := models.GetReportChapterTypeList()
  146. if tmpErr != nil {
  147. err = errors.New("获取晨周报章节类型失败" + tmpErr.Error())
  148. return
  149. }
  150. typeIdName := make(map[int]string, 0)
  151. typeIdSort := make(map[int]int, 0)
  152. for i := 0; i < len(typeList); i++ {
  153. typeIdName[typeList[i].ReportChapterTypeId] = typeList[i].ReportChapterTypeName
  154. typeIdSort[typeList[i].ReportChapterTypeId] = typeList[i].Sort
  155. }
  156. // 分类
  157. classifyIdFirst := 0
  158. classifyNameFirst := ""
  159. if reportInfo.Type == utils.REPORT_TYPE_DAY {
  160. newReport.ClassifyIdFirst = classifyNameId["晨报"]
  161. newReport.ClassifyNameFirst = "晨报"
  162. classifyIdFirst = classifyNameId["晨报"]
  163. classifyNameFirst = "晨报"
  164. } else {
  165. newReport.ClassifyIdFirst = classifyNameId["周报"]
  166. newReport.ClassifyNameFirst = "周报"
  167. classifyIdFirst = classifyNameId["周报"]
  168. classifyNameFirst = "周报"
  169. }
  170. // 报告已存在时的更新报告及章节,否则新增
  171. if existReport != nil {
  172. // 更新报告
  173. existReport.Title = newTitle
  174. existReport.Author = reportInfo.Author
  175. existReport.PublishTime = reportInfo.ResearchReportDate
  176. existReport.ModifyTime = time.Now()
  177. var updateReportCol, updateChapterCol []string
  178. updateReportCol = append(updateReportCol, "Title", "Author", "PublishTime", "ModifyTime")
  179. if tmpErr = existReport.UpdateReport(updateReportCol); tmpErr != nil {
  180. err = errors.New("更新已存在的报告失败" + tmpErr.Error())
  181. return
  182. }
  183. // 章节
  184. existChapterList, tmpErr := models.GetChapterListByReportId(existReport.Id)
  185. if tmpErr != nil {
  186. err = errors.New("获取已存在的报告章节失败" + tmpErr.Error())
  187. return
  188. }
  189. typeChapterMap := make(map[int]*models.ResearchReportType, 0)
  190. for i := 0; i < reportTypeListLen; i++ {
  191. typeChapterMap[reportTypeList[i].TypeId] = reportTypeList[i]
  192. }
  193. for _, exChapter := range existChapterList {
  194. chapter := typeChapterMap[exChapter.TypeId]
  195. if chapter == nil {
  196. continue
  197. }
  198. // 章节内容
  199. chapterContents := ""
  200. contentList := reportContentListMap[chapter.ResearchReportTypeId]
  201. for _, contents := range contentList {
  202. // 2022-08-09加上段落标题
  203. if contents.ContentType != "" {
  204. chapterContents += `<p><br></p><p style="font-size: 16px; text-align: left;"><strong>`
  205. chapterContents += contents.ContentType
  206. chapterContents += `</strong></p><p><br></p>`
  207. }
  208. chapterContents += contents.Content
  209. }
  210. chapterContents, tmpErr := replaceReportBase64ToImg(chapterContents)
  211. if tmpErr != nil {
  212. err = errors.New("章节存在base64图片转换失败" + tmpErr.Error())
  213. return
  214. }
  215. contentClean, e := FilterReportContentBr(chapterContents)
  216. if e != nil {
  217. err = errors.New("内容去除前后空格失败, Err: " + e.Error())
  218. return
  219. }
  220. chapterContents = contentClean
  221. contentSub, tmpErr := GetReportContentSub(chapterContents)
  222. if tmpErr != nil {
  223. err = errors.New("解析章节ContentSub失败" + tmpErr.Error())
  224. return
  225. }
  226. exChapter.Title = chapter.ResearchReportTypeTitle
  227. exChapter.Content = html.EscapeString(chapterContents)
  228. exChapter.ContentSub = html.EscapeString(contentSub)
  229. exChapter.ModifyTime = time.Now()
  230. updateChapterCol = append(updateChapterCol, "Title", "Content", "ContentSub", "ModifyTime")
  231. updateTickerList := make([]*models.ReportChapterTicker, 0)
  232. // 晨报数据指标
  233. if reportInfo.Type == utils.REPORT_TYPE_DAY {
  234. // 获取章节ticker
  235. reportTickerList, tmpErr := models.GetResearchReportTypeTickerListByReportTypeIds(typeIdStr)
  236. if tmpErr != nil {
  237. err = errors.New("获取报告Ticker失败" + tmpErr.Error())
  238. return
  239. }
  240. reportTickerListMap := make(map[int][]*models.ResearchReportTypeTicker, 0)
  241. for i := 0; i < len(reportTypeList); i++ {
  242. // 报告Ticker
  243. tid := reportTypeList[i].ResearchReportTypeId
  244. reportTickerMap := make([]*models.ResearchReportTypeTicker, 0)
  245. for iii := 0; iii < len(reportTickerList); iii++ {
  246. if tid == reportTickerList[iii].ResearchReportTypeId {
  247. reportTickerMap = append(reportTickerMap, reportTickerList[iii])
  248. }
  249. }
  250. reportTickerListMap[tid] = reportTickerMap
  251. }
  252. tickerList := reportTickerListMap[chapter.ResearchReportTypeId]
  253. for _, ticker := range tickerList {
  254. updateTickerList = append(updateTickerList, &models.ReportChapterTicker{
  255. Sort: ticker.Sort,
  256. Ticker: ticker.Ticker,
  257. CreateTime: ticker.CreatedTime,
  258. UpdateTime: ticker.LastUpdatedTime,
  259. })
  260. }
  261. }
  262. // 更新章节
  263. if tmpErr = models.UpdateChapterAndTicker(exChapter, updateChapterCol, updateTickerList); tmpErr != nil {
  264. err = errors.New("UpdateChapterAndTicker更新已存在的章节失败" + tmpErr.Error())
  265. return
  266. }
  267. }
  268. } else {
  269. newDayWeekReport := new(models.CreateDayWeekReport)
  270. newChapterList := make([]*models.CreateDayWeekReportChapter, 0)
  271. for _, chapter := range reportTypeList {
  272. chapterAndTicker := new(models.CreateDayWeekReportChapter)
  273. tmpTickerList := make([]*models.ReportChapterTicker, 0)
  274. chapterContents := ""
  275. // 章节内容列表
  276. contentList := reportContentListMap[chapter.ResearchReportTypeId]
  277. for _, contents := range contentList {
  278. // 2022-08-09加上段落标题
  279. if contents.ContentType != "" {
  280. chapterContents += `<p><br></p><p style="font-size: 16px; text-align: left;"><strong>`
  281. chapterContents += contents.ContentType
  282. chapterContents += `</strong></p><p><br></p>`
  283. }
  284. chapterContents += contents.Content
  285. }
  286. chapterContents, tmpErr := replaceReportBase64ToImg(chapterContents)
  287. if tmpErr != nil {
  288. err = errors.New("章节存在base64图片转换失败" + tmpErr.Error())
  289. return
  290. }
  291. state := 2
  292. if chapterContents == "" {
  293. state = 1
  294. }
  295. contentClean, e := FilterReportContentBr(chapterContents)
  296. if e != nil {
  297. err = errors.New("内容去除前后空格失败, Err: " + e.Error())
  298. return
  299. }
  300. chapterContents = contentClean
  301. contentSub, tmpErr := GetReportContentSub(chapterContents)
  302. if tmpErr != nil {
  303. err = errors.New("解析章节ContentSub失败" + tmpErr.Error())
  304. return
  305. }
  306. chapterContents = html.EscapeString(chapterContents)
  307. contentSub = html.EscapeString(contentSub)
  308. chapterAndTicker.Chapter = &models.ReportChapter{
  309. ReportType: reportInfo.Type,
  310. ClassifyIdFirst: classifyIdFirst,
  311. ClassifyNameFirst: classifyNameFirst,
  312. TypeId: chapter.TypeId,
  313. TypeName: typeIdName[chapter.TypeId],
  314. Sort: typeIdSort[chapter.TypeId],
  315. Title: chapter.ResearchReportTypeTitle,
  316. AddType: 1,
  317. Author: reportInfo.Author,
  318. Content: chapterContents,
  319. ContentSub: contentSub,
  320. Stage: reportInfo.Periods,
  321. Trend: chapter.Trend,
  322. IsEdit: 1,
  323. PublishState: state,
  324. PublishTime: chapter.LastUpdatedTime,
  325. CreateTime: chapter.CreatedTime,
  326. ModifyTime: chapter.LastUpdatedTime,
  327. }
  328. // 晨报数据指标
  329. if reportInfo.Type == utils.REPORT_TYPE_DAY {
  330. // 获取章节ticker
  331. reportTickerList, tmpErr := models.GetResearchReportTypeTickerListByReportTypeIds(typeIdStr)
  332. if tmpErr != nil {
  333. err = errors.New("获取报告Ticker失败" + tmpErr.Error())
  334. return
  335. }
  336. reportTickerListMap := make(map[int][]*models.ResearchReportTypeTicker, 0)
  337. for i := 0; i < len(reportTypeList); i++ {
  338. // 报告Ticker
  339. tid := reportTypeList[i].ResearchReportTypeId
  340. reportTickerMap := make([]*models.ResearchReportTypeTicker, 0)
  341. for iii := 0; iii < len(reportTickerList); iii++ {
  342. if tid == reportTickerList[iii].ResearchReportTypeId {
  343. reportTickerMap = append(reportTickerMap, reportTickerList[iii])
  344. }
  345. }
  346. reportTickerListMap[tid] = reportTickerMap
  347. }
  348. tickerList := reportTickerListMap[chapter.ResearchReportTypeId]
  349. for _, ticker := range tickerList {
  350. tmpTickerList = append(tmpTickerList, &models.ReportChapterTicker{
  351. Sort: ticker.Sort,
  352. Ticker: ticker.Ticker,
  353. CreateTime: ticker.CreatedTime,
  354. UpdateTime: ticker.LastUpdatedTime,
  355. })
  356. }
  357. }
  358. chapterAndTicker.TickerList = tmpTickerList
  359. newChapterList = append(newChapterList, chapterAndTicker)
  360. }
  361. newDayWeekReport.Report = newReport
  362. newDayWeekReport.ChapterList = newChapterList
  363. // 新增晨周报
  364. newReportId, tmpErr = models.CreateMigrateNewDayWeekReport(newDayWeekReport)
  365. if tmpErr != nil {
  366. err = errors.New("新增晨周报失败" + tmpErr.Error())
  367. return
  368. }
  369. }
  370. } else {
  371. // 非晨周报
  372. if reportInfo.ReportVariety == "铁矿库存点评" {
  373. reportInfo.ReportVariety = "铁矿库存数据点评"
  374. }
  375. //newReport.Abstract = newTitle
  376. newReport.ClassifyIdSecond = classifyNameId[reportInfo.ReportVariety]
  377. newReport.ClassifyNameSecond = reportInfo.ReportVariety
  378. newReport.ClassifyIdFirst = classifyIdParentId[newReport.ClassifyIdSecond]
  379. newReport.ClassifyNameFirst = classifyIdName[newReport.ClassifyIdFirst]
  380. // 忽略分类匹配不上的
  381. if newReport.ClassifyIdFirst == 0 || newReport.ClassifyIdSecond == 0 || newReport.ClassifyNameFirst == "" || newReport.ClassifyNameSecond == "" {
  382. fmt.Printf("分类匹配不上,忽略报告, FirstClassify:%s, SecondClassify:%s", newReport.ClassifyNameFirst, newReport.ClassifyNameSecond)
  383. return
  384. }
  385. reportContents := ""
  386. for _, chapter := range reportTypeList {
  387. // 章节内容列表
  388. contentList := reportContentListMap[chapter.ResearchReportTypeId]
  389. for _, contents := range contentList {
  390. // 2022-08-09加上段落标题
  391. if contents.ContentType != "" {
  392. reportContents += `<p><br></p><p style="font-size: 16px; text-align: left;"><strong>`
  393. reportContents += contents.ContentType
  394. reportContents += `</strong></p><p><br></p>`
  395. }
  396. reportContents += contents.Content
  397. }
  398. }
  399. reportContents, tmpErr := replaceReportBase64ToImg(reportContents)
  400. if tmpErr != nil {
  401. err = errors.New("报告存在base64图片转换失败" + tmpErr.Error())
  402. return
  403. }
  404. newReport.State = 2
  405. if reportContents == "" {
  406. newReport.State = 1
  407. }
  408. contentClean, e := FilterReportContentBr(reportContents)
  409. if e != nil {
  410. err = errors.New("内容去除前后空格失败, Err: " + e.Error())
  411. return
  412. }
  413. reportContents = contentClean
  414. reportContentSub, tmpErr := GetReportContentSub(reportContents)
  415. if tmpErr != nil {
  416. err = errors.New("解析ContentSub失败" + tmpErr.Error())
  417. return
  418. }
  419. newReport.Content = html.EscapeString(reportContents)
  420. newReport.ContentSub = html.EscapeString(reportContentSub)
  421. // 报告已存在则更新部分字段
  422. if existReport != nil {
  423. existReport.Title = newTitle
  424. existReport.Abstract = newReport.Abstract
  425. existReport.Author = newReport.Author
  426. existReport.Content = newReport.Content
  427. existReport.ContentSub = newReport.ContentSub
  428. existReport.PublishTime = reportInfo.ResearchReportDate
  429. existReport.ModifyTime = time.Now()
  430. existReport.ClassifyIdFirst = newReport.ClassifyIdFirst
  431. existReport.ClassifyNameFirst = newReport.ClassifyNameFirst
  432. existReport.ClassifyIdSecond = newReport.ClassifyIdSecond
  433. existReport.ClassifyNameSecond = newReport.ClassifyNameSecond
  434. updateCol := make([]string, 0)
  435. updateCol = append(updateCol, "Title", "Abstract", "Author", "Content", "ContentSub", "PublishTime", "ModifyTime", "ClassifyIdFirst", "ClassifyNameFirst", "ClassifyIdSecond", "ClassifyNameSecond")
  436. tmpErr = existReport.UpdateReport(updateCol)
  437. if tmpErr != nil {
  438. err = errors.New("更新报告失败" + tmpErr.Error())
  439. return
  440. }
  441. } else {
  442. // 获取非晨周报权限mapping
  443. reportPermissionList, tmpErr := models.GetChapterPermissionMappingByResearchReportIds(strconv.Itoa(reportId))
  444. if tmpErr != nil {
  445. err = errors.New("获取报告权限mapping失败" + tmpErr.Error())
  446. return
  447. }
  448. // 新增非晨周报
  449. newReportId, tmpErr = models.CreateMigrateNewOtherReport(newReport, reportPermissionList)
  450. if tmpErr != nil {
  451. err = errors.New("新增非晨周报失败" + tmpErr.Error())
  452. return
  453. }
  454. }
  455. }
  456. if existReport != nil {
  457. newReportId = existReport.Id
  458. }
  459. if newReportId == 0 {
  460. err = errors.New("同步报告失败")
  461. return
  462. }
  463. if existReport == nil {
  464. // 更新音频
  465. if e = UpdateReportVideo(newReportId); e != nil {
  466. err = errors.New("更新音频失败" + e.Error())
  467. return
  468. }
  469. }
  470. // 更新ES
  471. if e = UpdateReportEs(newReportId, 2); e != nil {
  472. err = errors.New("更新报告ES失败" + e.Error())
  473. return
  474. }
  475. return
  476. }
  477. // UpdateSyncReport (一次性)更新已同步的报告
  478. func UpdateSyncReport() (err error) {
  479. defer func() {
  480. if err != nil {
  481. fmt.Println(err.Error())
  482. }
  483. }()
  484. reportList, e := models.GetMigrateReportList()
  485. if e != nil {
  486. err = errors.New("获取今年报告失败, Err: " + e.Error())
  487. return
  488. }
  489. lenReport := len(reportList)
  490. for i := 0; i < lenReport; i++ {
  491. if e = SyncOldReport(reportList[i].ResearchReportId); e != nil {
  492. err = errors.New("同步报告失败, ResearchReportId: " + strconv.Itoa(reportList[i].ResearchReportId) + ", Err: " + e.Error())
  493. return
  494. }
  495. }
  496. return
  497. }