report_service.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. package report
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_ht_api/common/component/config"
  5. "eta/eta_mini_ht_api/common/component/es"
  6. logger "eta/eta_mini_ht_api/common/component/log"
  7. "eta/eta_mini_ht_api/common/contants"
  8. "eta/eta_mini_ht_api/common/utils/page"
  9. stringUtils "eta/eta_mini_ht_api/common/utils/string"
  10. analystService "eta/eta_mini_ht_api/domian/financial_analyst"
  11. userService "eta/eta_mini_ht_api/domian/user"
  12. "eta/eta_mini_ht_api/models"
  13. permissionDao "eta/eta_mini_ht_api/models/config"
  14. "eta/eta_mini_ht_api/models/eta"
  15. etaDao "eta/eta_mini_ht_api/models/eta"
  16. "eta/eta_mini_ht_api/models/ht"
  17. mediaDao "eta/eta_mini_ht_api/models/media"
  18. reportDao "eta/eta_mini_ht_api/models/report"
  19. userDao "eta/eta_mini_ht_api/models/user"
  20. "math/rand"
  21. "strconv"
  22. "strings"
  23. "time"
  24. )
  25. const (
  26. SourceETA = "ETA"
  27. SourceHT = "HT"
  28. DESC models.Order = "desc"
  29. ASC models.Order = "asc"
  30. ESColumn = "title"
  31. ESRangeColumn = "reportId"
  32. )
  33. var (
  34. sortField = []string{"_score:desc"}
  35. htConfig = config.GetConfig(contants.HT).(*config.HTBizConfig)
  36. )
  37. func elastic() *es.ESClient {
  38. return es.GetInstance()
  39. }
  40. // ESReport Report ES研报mapping
  41. type ESReport struct {
  42. ReportID int `json:"reportId"`
  43. OrgId int `json:"orgId"`
  44. Title string `json:"title"`
  45. Author string `json:"author"`
  46. Source reportDao.ReportSource `json:"source"`
  47. Abstract string `json:"abstract"`
  48. CoverSrc int `json:"coverSrc"`
  49. Status reportDao.ReportStatus `json:"status"`
  50. PublishedTime string `json:"publishedTime"`
  51. }
  52. type ReportDTO struct {
  53. ReportID int `json:"reportId"`
  54. OrgId int `json:"orgId"`
  55. Title string `json:"title"`
  56. Author string `json:"author"`
  57. AuthorInfo []Anthor `json:"authorInfo"`
  58. Source string `json:"source"`
  59. Abstract string `json:"abstract"`
  60. PublishedTime string `json:"publishedTime"`
  61. RiskLevel string `json:"riskLevel"`
  62. SecondPermission map[int]string `json:"-"`
  63. Permissions map[int]string `json:"-"`
  64. PermissionNames interface{} `json:"permissionNames"`
  65. Highlight []string `json:"highlight"`
  66. Detail json.RawMessage `json:"detail"`
  67. PdfUrl string `json:"pdfUrl"`
  68. CoverSrc int `json:"coverSrc"`
  69. CoverUrl string `json:"coverUrl"`
  70. Login bool `json:"login"`
  71. RiskLevelStatus string `json:"riskLevelStatus"`
  72. }
  73. type Detail struct {
  74. }
  75. type PermissionDTO struct {
  76. ID int
  77. Name string
  78. ParentID int
  79. }
  80. type Anthor struct {
  81. Id int `json:"id"`
  82. Name string `json:"name"`
  83. HeadImgUrl string `json:"headImgUrl"`
  84. }
  85. func GetGetReportById(reportId int) (ReportDTO ReportDTO, err error) {
  86. report, err := reportDao.GetReportById(reportId)
  87. if err != nil {
  88. return
  89. }
  90. ReportDTO = convertReportDTO(report, true)
  91. authorStr := ReportDTO.Author
  92. authorNames := strings.Split(authorStr, ",")
  93. authorNames = stringUtils.RemoveEmptyStrings(authorNames)
  94. var authorList []Anthor
  95. if len(authorNames) > 0 {
  96. for _, name := range authorNames {
  97. var author analystService.FinancialAnalystDTO
  98. author, err = analystService.GetAnalystByName(name)
  99. var item Anthor
  100. if err != nil {
  101. item = Anthor{
  102. Id: 0,
  103. Name: name,
  104. HeadImgUrl: "",
  105. }
  106. } else {
  107. item = Anthor{
  108. Id: author.Id,
  109. Name: author.Name,
  110. HeadImgUrl: author.HeadImgUrl,
  111. }
  112. }
  113. authorList = append(authorList, item)
  114. }
  115. }
  116. ReportDTO.AuthorInfo = authorList
  117. return
  118. }
  119. func GetTotalPageCount() (total int64, latestId int64, err error) {
  120. return reportDao.GetTotalPageCount()
  121. }
  122. func GetTotalPageCountByAnalyst(analyst string, permissionIds []int) (total int64, latestId int64, ids []int) {
  123. ids, err := reportDao.GetReportsByAnalyst(analyst)
  124. if err != nil {
  125. logger.Error("查询研究研报告列表id失败:%v", err)
  126. return
  127. }
  128. //查询这些包含在列表中的权限的报告ids
  129. htOrgIds, err := GetHTReportIdsByPermissionIds(permissionIds)
  130. if err != nil {
  131. logger.Error("品种筛选ht报告id失败:%v", err)
  132. htOrgIds = []int{}
  133. }
  134. etaOrgIds, err := GetETAReportIdsByPermissionIds(permissionIds)
  135. if err != nil {
  136. logger.Error("品种筛选eta报告id失败:%v", err)
  137. etaOrgIds = []int{}
  138. }
  139. if len(etaOrgIds) == 0 && len(htOrgIds) == 0 {
  140. logger.Info("没有符合权限的研报")
  141. return
  142. }
  143. orgIds := make(map[string][]int, 2)
  144. if len(etaOrgIds) == 0 {
  145. orgIds["ETA"] = []int{}
  146. } else {
  147. orgIds["ETA"] = etaOrgIds
  148. }
  149. if len(htOrgIds) == 0 {
  150. orgIds["HT"] = []int{}
  151. } else {
  152. orgIds["HT"] = htOrgIds
  153. }
  154. permitReportIds, err := reportDao.GetReportIdListByOrgIds(orgIds)
  155. if err != nil {
  156. logger.Error("根据原始报告id获取报告id列表失败:%v", err)
  157. return
  158. }
  159. var filterReportIds []int
  160. for _, id := range ids {
  161. for _, permitReportId := range permitReportIds {
  162. if id == permitReportId {
  163. filterReportIds = append(filterReportIds, id)
  164. }
  165. }
  166. }
  167. if len(filterReportIds) == 0 {
  168. logger.Info("没有符合权限的研究员研报")
  169. return
  170. }
  171. ids = filterReportIds
  172. total = int64(len(filterReportIds))
  173. latestId = int64(findMax(filterReportIds))
  174. return
  175. }
  176. // findMaxWithError 函数用于找到整型数组中的最大值,并返回错误信息
  177. func findMax(nums []int) (max int) {
  178. if len(nums) == 0 {
  179. return 0
  180. }
  181. // 初始化最大值为数组的第一个元素
  182. max = nums[0]
  183. // 遍历数组,找到最大值
  184. for _, num := range nums {
  185. if num > max {
  186. max = num
  187. }
  188. }
  189. return
  190. }
  191. func SearchMaxReportId(key string) (total int64, reportId int64) {
  192. sort := []string{"reportId:desc"}
  193. request := matchAll(sort, key)
  194. //同步es
  195. re, err := elastic().Count(request)
  196. if err != nil {
  197. logger.Error("es搜索异常:%v", err)
  198. }
  199. count := re.Count
  200. total = int64(count)
  201. if total > 0 {
  202. request = match(key, 0, count, sort)
  203. re, err = elastic().Search(request)
  204. if err != nil {
  205. logger.Error("es搜索异常:%v", err)
  206. }
  207. hits := elastic().GetSource(re.Hits)
  208. data := hits[0].Source
  209. report := ReportDTO{}
  210. err = json.Unmarshal(data, &report)
  211. if err != nil {
  212. logger.Error("获取当前最大研报id失败:%v", err)
  213. return
  214. }
  215. reportId = int64(report.ReportID)
  216. }
  217. return
  218. }
  219. func SearchReportList(key string, ids []int, from int, size int, max int64) (reports []ReportDTO, err error) {
  220. //同步es
  221. var docIds []string
  222. for _, id := range ids {
  223. docIds = append(docIds, strconv.Itoa(id))
  224. }
  225. sorts := append(sortField, "publishedTime:desc")
  226. request := matchRangeByDocId(key, from, size, max, sorts, docIds)
  227. re, err := elastic().Search(request)
  228. if err != nil {
  229. logger.Error("es搜索异常:%v", err)
  230. }
  231. hits := elastic().GetSource(re.Hits)
  232. if len(hits) == 0 {
  233. reports = []ReportDTO{}
  234. return
  235. }
  236. for _, hit := range hits {
  237. var content map[string][]string
  238. err = json.Unmarshal(hit.Highlight, &content)
  239. report := ReportDTO{}
  240. err = json.Unmarshal(hit.Source, &report)
  241. if err != nil {
  242. logger.Error("解析研报数据失败:%v", err)
  243. continue
  244. }
  245. report.Highlight = content[ESColumn]
  246. report.Title = report.Highlight[0]
  247. report.PublishedTime = report.PublishedTime[:10]
  248. reports = append(reports, report)
  249. }
  250. return
  251. }
  252. func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string, reportIds []int) (list []ReportDTO, err error) {
  253. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  254. reports, err := reportDao.GetReportPageByAnalyst(pageInfo.LatestId, pageInfo.PageSize, offset, analyst, reportIds)
  255. if err != nil {
  256. logger.Error("分页查询报告列表失败:%v", err)
  257. return
  258. }
  259. list = make([]ReportDTO, 0)
  260. if reports != nil {
  261. for _, report := range reports {
  262. dto := convertReportDTO(report, false)
  263. list = append(list, dto)
  264. }
  265. }
  266. return
  267. }
  268. func GetReportPageByOrgIds(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool) (list []ReportDTO, err error) {
  269. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  270. reports, err := reportDao.GetReportPageByOrgIds(pageInfo.LatestId, pageInfo.PageSize, offset, orgIds, searchAll)
  271. if err != nil {
  272. logger.Error("分页查询报告列表失败:%v", err)
  273. return
  274. }
  275. list = make([]ReportDTO, 0)
  276. if reports != nil {
  277. for _, report := range reports {
  278. dto := convertReportDTO(report, false)
  279. list = append(list, dto)
  280. }
  281. }
  282. return
  283. }
  284. func GetNewReportByPublishTime(time time.Time) (reports []ReportDTO) {
  285. list := reportDao.GetNewReportByPublishTime(time)
  286. if list != nil {
  287. for _, report := range list {
  288. dto := convertReportDTO(report, false)
  289. reports = append(reports, dto)
  290. }
  291. }
  292. return
  293. }
  294. func GetReportPage(pageInfo page.PageInfo) (list []ReportDTO, err error) {
  295. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  296. reports, err := reportDao.GetReportPage(pageInfo.LatestId, pageInfo.PageSize, offset)
  297. if err != nil {
  298. logger.Error("分页查询报告列表失败:%v", err)
  299. return
  300. }
  301. list = make([]ReportDTO, 0)
  302. if reports != nil {
  303. for _, report := range reports {
  304. dto := convertReportDTO(report, false)
  305. list = append(list, dto)
  306. }
  307. }
  308. return
  309. }
  310. func getETAReportFirstPermissions(id int) (permissionDTOs []PermissionDTO) {
  311. classifyId, err := etaDao.GetReportClassifyById(id)
  312. if err != nil || classifyId == 0 {
  313. logger.Error("获取研报分类信息失败:%v", err)
  314. return
  315. }
  316. permissions, err := etaDao.GetFirstPermissionsByClassifyID(classifyId)
  317. if err != nil {
  318. logger.Error("获取研报一级品种信息失败:%v", err)
  319. return
  320. }
  321. for _, permission := range permissions {
  322. permissionDTOs = append(permissionDTOs, convertPermissionDTO(permission))
  323. }
  324. return
  325. }
  326. func getHTReportFirstPermissions(id int) (permissionDTOs []PermissionDTO) {
  327. report, err := reportDao.GetReportByOrgId(id, SourceHT)
  328. if err != nil {
  329. logger.Error("获取报告失败:%v", err)
  330. }
  331. permissionName := report.PlateName
  332. plateName, err := reportDao.GetPlateNameByPermissionName(permissionName)
  333. if err != nil {
  334. return []PermissionDTO{}
  335. }
  336. return []PermissionDTO{
  337. {
  338. ID: 0,
  339. Name: plateName,
  340. ParentID: 0,
  341. },
  342. }
  343. }
  344. func getETAReportSecondPermissions(id int) (permissionDTOs []PermissionDTO) {
  345. classifyId, err := etaDao.GetReportClassifyById(id)
  346. if err != nil || classifyId == 0 {
  347. logger.Error("获取研报分类信息失败:%v", err)
  348. return
  349. }
  350. permissions, err := etaDao.GetSecondPermissionsByClassifyID(classifyId)
  351. if err != nil {
  352. logger.Error("获取研报二级品种信息失败:%v", err)
  353. return
  354. }
  355. for _, permission := range permissions {
  356. permissionDTOs = append(permissionDTOs, convertPermissionDTO(permission))
  357. }
  358. return
  359. }
  360. func getHTReportSecondPermissions(id int) (permissionDTOs []PermissionDTO) {
  361. report, err := reportDao.GetReportByOrgId(id, SourceHT)
  362. if err != nil {
  363. logger.Error("获取报告失败:%v", err)
  364. }
  365. var permission permissionDao.Permission
  366. if report.PlateName != "" {
  367. permission, err = permissionDao.GetPermissionByName(report.PlateName)
  368. if err != nil {
  369. logger.Error("获取品种信息失败:%v", err)
  370. }
  371. }
  372. return []PermissionDTO{
  373. {
  374. ID: permission.PermissionId,
  375. Name: report.PlateName,
  376. ParentID: permission.ParentId,
  377. },
  378. }
  379. }
  380. func (es ESReport) GetId() string {
  381. return strconv.Itoa(es.ReportID)
  382. }
  383. func GetETALatestReportId() (id int, err error) {
  384. return reportDao.GetLatestReportIdBySource(reportDao.SourceETA)
  385. }
  386. func GetHTLatestReportId() (id int, err error) {
  387. return reportDao.GetLatestReportIdBySource(reportDao.SourceHT)
  388. }
  389. func InitETAReportList(list []eta.ETAReport) (err error) {
  390. logger.Info("同步研报数量%d", len(list))
  391. var reports []reportDao.Report
  392. for _, etaRp := range list {
  393. var coverSrc int
  394. var permissions []etaDao.ChartPermission
  395. permissions, err = etaDao.GetSecondPermissionsByClassifyID(etaRp.ClassifyID)
  396. if err != nil || len(permissions) == 0 {
  397. logger.Error("获取研报二级品种信息失败:%v", err)
  398. coverSrc = 0
  399. } else {
  400. coverSrc = 0
  401. for _, permission := range permissions {
  402. permissionsId := permission.ChartPermissionID
  403. var ids []int
  404. ids, err = mediaDao.GetIdsByPermissionId(permissionsId)
  405. if err != nil {
  406. logger.Error("获取图片资源失败:%v", err)
  407. continue
  408. }
  409. if ids == nil || len(ids) == 0 {
  410. continue
  411. }
  412. src := rand.NewSource(time.Now().UnixNano())
  413. r := rand.New(src)
  414. // 从切片中随机选择一个元素
  415. randomIndex := r.Intn(len(ids))
  416. coverSrc = ids[randomIndex]
  417. break
  418. }
  419. }
  420. destRp := convertEtaReport(etaRp, reportDao.StatusPublish)
  421. //destRp.Author = authorName
  422. destRp.CoverSrc = coverSrc
  423. reports = append(reports, destRp)
  424. //}
  425. }
  426. err = reportDao.BatchInsertReport(&reports)
  427. if err != nil {
  428. logger.Error("同步ETA研报失败:%v", err)
  429. return
  430. }
  431. return initES(reports)
  432. }
  433. func etaStatus(status int) reportDao.ReportStatus {
  434. if status == etaDao.Passed || status == etaDao.Published {
  435. return reportDao.StatusPublish
  436. } else {
  437. return reportDao.StatusUnPublish
  438. }
  439. }
  440. func SyncETAReportList(list []eta.ETAReport) (err error) {
  441. logger.Info("同步研报数量%d", len(list))
  442. var reports []reportDao.Report
  443. for _, etaRp := range list {
  444. var coverSrc int
  445. var permissions []etaDao.ChartPermission
  446. permissions, err = etaDao.GetSecondPermissionsByClassifyID(etaRp.ClassifyID)
  447. if err != nil || len(permissions) == 0 {
  448. logger.Error("获取研报二级品种信息失败:%v", err)
  449. coverSrc = 0
  450. } else {
  451. coverSrc = 0
  452. for _, permission := range permissions {
  453. permissionsId := permission.ChartPermissionID
  454. var ids []int
  455. ids, err = mediaDao.GetIdsByPermissionId(permissionsId)
  456. if err != nil {
  457. logger.Error("获取图片资源失败:%v", err)
  458. continue
  459. }
  460. if ids == nil || len(ids) == 0 {
  461. continue
  462. }
  463. src := rand.NewSource(time.Now().UnixNano())
  464. r := rand.New(src)
  465. // 从切片中随机选择一个元素
  466. randomIndex := r.Intn(len(ids))
  467. coverSrc = ids[randomIndex]
  468. break
  469. }
  470. }
  471. status := etaStatus(etaRp.State)
  472. destRp := convertEtaReport(etaRp, status)
  473. destRp.CoverSrc = coverSrc
  474. reports = append(reports, destRp)
  475. }
  476. esList, err := reportDao.InsertOrUpdateReport(reports, SourceETA)
  477. if esList == nil {
  478. return
  479. }
  480. return syncESAndSendMessage(esList)
  481. }
  482. type UpdateESReport struct {
  483. Title string `json:"title"`
  484. Author string `json:"author"`
  485. Abstract string `json:"abstract"`
  486. PublishedTime string `json:"publishedTime"`
  487. Status string `json:"status"`
  488. }
  489. func syncESAndSendMessage(reports []reportDao.Report) (err error) {
  490. var esReports []es.ESBase
  491. for _, etaRp := range reports {
  492. esRp := convertEsReport(etaRp)
  493. esReports = append(esReports, esRp)
  494. }
  495. //同步es
  496. for _, report := range reports {
  497. var exist bool
  498. exist, err = elastic().Exist(htConfig.GetReportIndex(), report.ID)
  499. if err != nil {
  500. logger.Error("查询es失败,reportId::%d,err:%v", report.ID, err)
  501. }
  502. if exist {
  503. update := UpdateESReport{
  504. Title: report.Title,
  505. Author: report.Author,
  506. PublishedTime: report.PublishedTime,
  507. Abstract: report.Abstract,
  508. Status: string(report.Status),
  509. }
  510. success := elastic().Update(htConfig.GetReportIndex(), report.ID, update)
  511. if !success {
  512. logger.Error("更新es失败,reportId::%d,err:%v", report.ID, err)
  513. }
  514. if report.Status == reportDao.StatusUnPublish {
  515. //隐藏热度搜索
  516. err = userDao.HiddenFlows(report.ID, userDao.ReportSourceType)
  517. if err != nil {
  518. logger.Error("隐藏热度搜索失败,reportId::%d,err:%v", report.ID, err)
  519. }
  520. } else {
  521. err = userDao.ShowFlows(report.ID, userDao.ReportSourceType)
  522. if err != nil {
  523. logger.Error("重置热度搜索失败,reportId::%d,err:%v", report.ID, err)
  524. }
  525. }
  526. } else {
  527. insert := ESReport{
  528. ReportID: report.ID,
  529. OrgId: report.OrgID,
  530. Title: report.Title,
  531. Author: report.Author,
  532. Source: report.Source,
  533. Abstract: report.Abstract,
  534. CoverSrc: report.CoverSrc,
  535. Status: report.Status,
  536. PublishedTime: report.PublishedTime,
  537. }
  538. success := elastic().CreateDocument(htConfig.GetReportIndex(), report.ID, insert)
  539. if !success {
  540. logger.Error("创建es文档失败,reportId::%d,err:%v", report.ID, err)
  541. }
  542. }
  543. }
  544. //err = elastic().BulkInsert(htConfig.GetReportIndex(), esReports)
  545. if err != nil {
  546. logger.Error("同步ETA研报到es失败:%v", err)
  547. return
  548. }
  549. //生产meta信息
  550. logger.Info("生成推送META信息")
  551. for _, report := range reports {
  552. if report.Status == reportDao.StatusUnPublish {
  553. logger.Info("报告取消发布,不需要生成推送消息")
  554. continue
  555. }
  556. var From string
  557. switch report.Source {
  558. case SourceETA:
  559. From = "ETA"
  560. case SourceHT:
  561. From = "HT"
  562. default:
  563. From = "UNKNOWN"
  564. }
  565. authors := strings.Split(report.Author, ",")
  566. authors = stringUtils.RemoveEmptyStrings(authors)
  567. if len(authors) > 0 {
  568. for _, authorName := range authors {
  569. userIds := userService.GetPostUser(authorName, report.PublishedTime)
  570. if len(userIds) > 0 {
  571. logger.Info("推送META信息,用户ID:%v", userIds)
  572. var author analystService.FinancialAnalystDTO
  573. author, err = analystService.GetAnalystByName(authorName)
  574. if err != nil {
  575. logger.Error("获取研报作者失败:%v", err)
  576. continue
  577. }
  578. usersStr := stringUtils.IntToStringSlice(userIds)
  579. Meta := userService.MetaData{
  580. AuthorName: author.Name,
  581. AuthorId: author.Id,
  582. SourceId: report.ID,
  583. PublishedTime: report.PublishedTime,
  584. }
  585. metaStr, _ := json.Marshal(Meta)
  586. toStr := strings.Join(usersStr, ",")
  587. metaContent := userService.MetaInfoDTO{
  588. From: From,
  589. Meta: string(metaStr),
  590. MetaType: "USER_NOTICE",
  591. SourceType: "REPORT",
  592. To: toStr,
  593. }
  594. err = userService.CreateMetaInfo(metaContent)
  595. if err != nil {
  596. logger.Error("创建Meta信息失败:%v", err)
  597. return err
  598. }
  599. }
  600. }
  601. }
  602. }
  603. return
  604. }
  605. func initES(reports []reportDao.Report) (err error) {
  606. var esReports []es.ESBase
  607. for _, etaRp := range reports {
  608. esRp := convertEsReport(etaRp)
  609. esReports = append(esReports, esRp)
  610. }
  611. //同步es
  612. err = elastic().BulkInsert(htConfig.GetReportIndex(), esReports)
  613. if err != nil {
  614. logger.Error("同步ETA研报到es失败:%v", err)
  615. return
  616. }
  617. return
  618. }
  619. func InitHTReportList(list []ht.HTReport) (noRecord bool, err error) {
  620. var reports []reportDao.Report
  621. //获取系统中ht品种名
  622. permissions, err := reportDao.GetGLAuthorNames()
  623. if err != nil {
  624. logger.Error("获取钢联研报作者失败:%v", err)
  625. return
  626. }
  627. for _, htRp := range list {
  628. for _, permission := range permissions {
  629. if htRp.PermissionName == permission.Permission {
  630. if permission.AuthorNames != "" {
  631. htRp.PublishUserName = permission.AuthorNames
  632. }
  633. destRp := convertHTReport(htRp, reportDao.StatusPublish)
  634. var coverSrc int
  635. var permissionId int
  636. permissionId, err = etaDao.GetPermissionIdByName(htRp.PermissionName)
  637. if err != nil {
  638. logger.Error("HT获取eta品种id失败:%v", err)
  639. coverSrc = 0
  640. }
  641. var ids []int
  642. ids, err = mediaDao.GetIdsByPermissionId(permissionId)
  643. if err != nil {
  644. logger.Error("获取图片资源失败:%v", err)
  645. coverSrc = 0
  646. }
  647. if ids == nil || len(ids) == 0 {
  648. coverSrc = 0
  649. } else {
  650. src := rand.NewSource(time.Now().UnixNano())
  651. r := rand.New(src)
  652. // 从切片中随机选择一个元素
  653. randomIndex := r.Intn(len(ids))
  654. coverSrc = ids[randomIndex]
  655. }
  656. destRp.CoverSrc = coverSrc
  657. destRp.PlateName = htRp.PermissionName
  658. reports = append(reports, destRp)
  659. }
  660. //}
  661. }
  662. }
  663. if len(reports) == 0 {
  664. return true, nil
  665. } else {
  666. logger.Info("同步研报数量%d", len(reports))
  667. err = reportDao.BatchInsertReport(&reports)
  668. if err != nil {
  669. logger.Error("同步HT研报失败:%v", err)
  670. return false, err
  671. }
  672. return false, initES(reports)
  673. }
  674. }
  675. func htStatus(status int, isDelete int) reportDao.ReportStatus {
  676. if isDelete == 1 || status != ht.Publish {
  677. return reportDao.StatusUnPublish
  678. }
  679. return reportDao.StatusPublish
  680. }
  681. func SyncHTReportList(list []ht.HTReport) (noRecord bool, err error) {
  682. var reports []reportDao.Report
  683. permissions, err := reportDao.GetGLAuthorNames()
  684. if err != nil {
  685. logger.Error("获取钢联研报作者失败:%v", err)
  686. return
  687. }
  688. for _, htRp := range list {
  689. for _, permission := range permissions {
  690. if htRp.PermissionName == permission.Permission {
  691. if permission.AuthorNames != "" {
  692. htRp.PublishUserName = permission.AuthorNames
  693. }
  694. status := htStatus(htRp.Status, htRp.IsDelete)
  695. destRp := convertHTReport(htRp, status)
  696. var coverSrc int
  697. var permissionId int
  698. permissionId, err = etaDao.GetPermissionIdByName(htRp.PermissionName)
  699. if err != nil {
  700. logger.Error("HT获取eta品种id失败:%v", err)
  701. coverSrc = 0
  702. }
  703. var ids []int
  704. ids, err = mediaDao.GetIdsByPermissionId(permissionId)
  705. if err != nil {
  706. logger.Error("获取图片资源失败:%v", err)
  707. coverSrc = 0
  708. }
  709. if ids == nil || len(ids) == 0 {
  710. coverSrc = 0
  711. } else {
  712. src := rand.NewSource(time.Now().UnixNano())
  713. r := rand.New(src)
  714. // 从切片中随机选择一个元素
  715. randomIndex := r.Intn(len(ids))
  716. coverSrc = ids[randomIndex]
  717. }
  718. destRp.CoverSrc = coverSrc
  719. destRp.PlateName = htRp.PermissionName
  720. reports = append(reports, destRp)
  721. }
  722. //}
  723. }
  724. }
  725. if len(reports) == 0 {
  726. return true, nil
  727. } else {
  728. logger.Info("同步研报数量%d", len(list))
  729. }
  730. esList, err := reportDao.InsertOrUpdateReport(reports, SourceHT)
  731. if esList == nil {
  732. return false, err
  733. }
  734. return false, syncESAndSendMessage(reports)
  735. }
  736. func GetListOrderByConditionWeekly(week bool, column string, limit int, order models.Order) (dtoList []ReportDTO, err error) {
  737. reports, err := reportDao.GetListOrderByCondition(week, column, limit, order)
  738. if err != nil {
  739. logger.Error("获取研报失败:%v", err)
  740. return
  741. }
  742. for _, reportItem := range reports {
  743. dto := convertReportDTO(reportItem, false)
  744. dtoList = append(dtoList, dto)
  745. }
  746. return
  747. }
  748. func GetListByCondition[T any](column string, ids []T) (dtoList []ReportDTO, err error) {
  749. var values []interface{}
  750. for _, id := range ids {
  751. values = append(values, id)
  752. }
  753. reports, err := reportDao.GetListByCondition(column, ids)
  754. if err != nil {
  755. logger.Error("获取研报失败:%v", err)
  756. return
  757. }
  758. for _, reportItem := range reports {
  759. dto := convertReportDTO(reportItem, false)
  760. dtoList = append(dtoList, dto)
  761. }
  762. return
  763. }
  764. func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
  765. return reportDao.GetReportIdListByOrgIds(orgIds)
  766. }
  767. func GetTotalPageCountByPermissionIds(permissionIds []int) (total int64, latestId int64, ids map[string][]int) {
  768. htOrgIds, err := GetHTReportIdsByPermissionIds(permissionIds)
  769. if err != nil {
  770. logger.Error("品种筛选ht报告id失败:%v", err)
  771. htOrgIds = []int{}
  772. }
  773. etaOrgIds, err := GetETAReportIdsByPermissionIds(permissionIds)
  774. if err != nil {
  775. logger.Error("品种筛选eta报告id失败:%v", err)
  776. etaOrgIds = []int{}
  777. }
  778. totalCol := int64(len(etaOrgIds) + len(htOrgIds))
  779. if totalCol == 0 {
  780. latestId = 0
  781. return
  782. }
  783. ids = make(map[string][]int, 2)
  784. if len(etaOrgIds) == 0 {
  785. ids["ETA"] = []int{}
  786. } else {
  787. ids["ETA"] = etaOrgIds
  788. }
  789. if len(htOrgIds) == 0 {
  790. ids["HT"] = []int{}
  791. } else {
  792. ids["HT"] = htOrgIds
  793. }
  794. //ids = append(etaIds, htIds...)
  795. total, latestId, err = reportDao.GetMaxIdByPermissionIds(ids)
  796. if err != nil {
  797. logger.Error("获取筛选报告的最大记录和记录数失败:%v", err)
  798. return
  799. }
  800. return
  801. }
  802. func convertEtaReport(etaRp eta.ETAReport, status reportDao.ReportStatus) reportDao.Report {
  803. return reportDao.Report{
  804. OrgID: etaRp.ID,
  805. Title: etaRp.Title,
  806. Abstract: etaRp.Abstract,
  807. Author: etaRp.Author,
  808. CoverSrc: 0,
  809. PublishedTime: etaRp.PublishTime.Format(time.DateTime),
  810. Source: reportDao.SourceETA,
  811. SendStatus: reportDao.UNSEND,
  812. Status: status,
  813. }
  814. }
  815. func convertHTReport(etaRp ht.HTReport, status reportDao.ReportStatus) reportDao.Report {
  816. return reportDao.Report{
  817. OrgID: etaRp.Id,
  818. Title: etaRp.ReportName,
  819. Author: etaRp.PublishUserName,
  820. PublishedTime: etaRp.PublishedTime,
  821. CoverSrc: 0,
  822. Source: reportDao.SourceHT,
  823. SendStatus: reportDao.UNSEND,
  824. Status: status,
  825. }
  826. }
  827. func convertEsReport(report reportDao.Report) ESReport {
  828. return ESReport{
  829. ReportID: report.ID,
  830. Title: report.Title,
  831. OrgId: report.OrgID,
  832. Author: report.Author,
  833. Source: report.Source,
  834. Abstract: report.Abstract,
  835. Status: report.Status,
  836. CoverSrc: report.CoverSrc,
  837. PublishedTime: report.PublishedTime,
  838. }
  839. }
  840. func convertReportDTO(report reportDao.Report, fullTime bool) (reportDTO ReportDTO) {
  841. reportDTO = ReportDTO{
  842. ReportID: report.ID,
  843. Title: report.Title,
  844. OrgId: report.OrgID,
  845. Author: report.Author,
  846. Source: string(report.Source),
  847. CoverSrc: report.CoverSrc,
  848. Abstract: report.Abstract,
  849. PublishedTime: report.PublishedTime,
  850. }
  851. publishDate, err := time.Parse(time.DateTime, reportDTO.PublishedTime)
  852. if err == nil && !fullTime {
  853. reportDTO.PublishedTime = publishDate.Format(time.DateOnly)
  854. }
  855. return
  856. }
  857. func matchAll(sorts []string, key string) (request *es.ESQueryRequest) {
  858. req := new(es.ESQueryRequest)
  859. return req.CreateESQueryRequest(htConfig.GetReportIndex(), ESColumn, key, 0, 1, sorts, es.MatchAllByCondition).ByCondition("status", "PUBLISH")
  860. }
  861. func match(key string, from int, to int, sorts []string) (request *es.ESQueryRequest) {
  862. req := new(es.ESQueryRequest)
  863. return req.CreateESQueryRequest(htConfig.GetReportIndex(), ESColumn, key, from, to, sorts, es.MatchAllByCondition).ByCondition("status", "PUBLISH")
  864. }
  865. func matchRange(key string, from int, to int, max int64, sorts []string) (request *es.ESQueryRequest) {
  866. req := new(es.ESQueryRequest)
  867. return req.CreateESQueryRequest(htConfig.GetReportIndex(), ESColumn, key, from, to, sorts, es.RangeByCondition).Range(0, max, ESRangeColumn).ByCondition("status", "PUBLISH")
  868. }
  869. func matchRangeByDocId(key string, from int, to int, max int64, sorts []string, docIds []string) (request *es.ESQueryRequest) {
  870. req := new(es.ESQueryRequest)
  871. return req.CreateESQueryRequest(htConfig.GetReportIndex(), ESColumn, key, from, to, sorts, es.RangeByConditionWithDocIds).Range(0, max, ESRangeColumn).ByCondition("status", "PUBLISH").WithDocs(docIds)
  872. }