report_service.go 27 KB

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