report_service.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package report
  2. import (
  3. "encoding/json"
  4. "eta_mini_ht_api/common/component/es"
  5. logger "eta_mini_ht_api/common/component/log"
  6. "eta_mini_ht_api/common/utils/page"
  7. "eta_mini_ht_api/models"
  8. "eta_mini_ht_api/models/eta"
  9. etaDao "eta_mini_ht_api/models/eta"
  10. reportDao "eta_mini_ht_api/models/report"
  11. "strconv"
  12. "time"
  13. )
  14. const (
  15. indexName = "report_index"
  16. SourceETA = "ETA"
  17. SourceHT = "HT"
  18. DESC models.Order = "desc"
  19. ASC models.Order = "asc"
  20. ESIndex = "report_index"
  21. ESColumn = "abstract"
  22. ESRangeColumn = "report_id"
  23. )
  24. var (
  25. sortField = []string{"_score:desc"}
  26. )
  27. func elastic() *es.ESClient {
  28. return es.GetInstance()
  29. }
  30. // ESReport Report ES研报mapping
  31. type ESReport struct {
  32. ReportID int `json:"report_id"`
  33. OrgId int `json:"org_id"`
  34. Author string `json:"author"`
  35. Source reportDao.ReportSource `json:"source"`
  36. Abstract string `json:"abstract"`
  37. Status reportDao.ReportStatus `json:"status"`
  38. PublishedTime string `json:"published_time"`
  39. }
  40. type ReportDTO struct {
  41. ReportID int `json:"report_id"`
  42. OrgId int `json:"org_id"`
  43. Title string `json:"title"`
  44. Author string `json:"author"`
  45. Source string `json:"source"`
  46. Abstract string `json:"abstract"`
  47. PublishedTime string `json:"published_time"`
  48. PermissionNames interface{} `json:"permissionNames,omitempty"`
  49. Highlight []string `json:"highlight,omitempty"`
  50. }
  51. type PermissionDTO struct {
  52. ID int
  53. Name string
  54. ParentID int
  55. }
  56. type RecordCountDTO struct {
  57. UserId int
  58. Mobile string
  59. ReportId int
  60. IpAddress string
  61. Location string
  62. Referer string
  63. Additional string
  64. }
  65. func GetTotalPageCount() (total int64) {
  66. return reportDao.GetTotalPageCount()
  67. }
  68. func SearchMaxReportId() (reportId int64) {
  69. sortField = []string{"report_id:desc"}
  70. request := matchAll(sortField)
  71. //同步es
  72. re, err := elastic().Search(request)
  73. if err != nil {
  74. logger.Error("es:%v", err)
  75. }
  76. hits := elastic().GetSource(re.Hits)
  77. data := hits[0].Source
  78. report := ReportDTO{}
  79. err = json.Unmarshal(data, &report)
  80. if err != nil {
  81. logger.Error("获取当前最大研报id失败:%v", err)
  82. return 0
  83. }
  84. return int64(report.ReportID)
  85. }
  86. func SearchReportList(key string, from int, size int, max int64) (reports []ReportDTO, err error) {
  87. //同步es
  88. sorts := append(sortField, "report_id:desc")
  89. request := matchRange(key, from, size, max, sorts)
  90. re, err := elastic().Search(request)
  91. if err != nil {
  92. logger.Error("es:%v", err)
  93. }
  94. hits := elastic().GetSource(re.Hits)
  95. for _, hit := range hits {
  96. var content map[string][]string
  97. err = json.Unmarshal(hit.Highlight, &content)
  98. report := ReportDTO{}
  99. report.Highlight = content[ESColumn]
  100. err = json.Unmarshal(hit.Source, &report)
  101. if err != nil {
  102. logger.Error("解析研报数据失败:%v", err)
  103. continue
  104. }
  105. reports = append(reports, report)
  106. }
  107. return
  108. }
  109. func GetReportPage(pageInfo page.PageInfo) (list []ReportDTO, err error) {
  110. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  111. reports, err := reportDao.GetReportPage(pageInfo.LatestId, pageInfo.PageSize, offset)
  112. if err == nil && reports != nil {
  113. for _, report := range reports {
  114. dto := convertReportDTO(report)
  115. list = append(list, dto)
  116. }
  117. }
  118. return
  119. }
  120. func getETAReportFirstPermissions(id int) (permissionDTOs []PermissionDTO) {
  121. classifyId, err := etaDao.GetReportClassifyById(id)
  122. if err != nil || classifyId == 0 {
  123. logger.Error("获取研报分类信息失败:%v", err)
  124. return
  125. }
  126. permissions, err := etaDao.GetFirstPermissionsByClassifyID(classifyId)
  127. if err != nil {
  128. logger.Error("获取研报一级品种信息失败:%v", err)
  129. return
  130. }
  131. for _, permission := range permissions {
  132. permissionDTOs = append(permissionDTOs, convertPermissionDTO(permission))
  133. }
  134. return
  135. }
  136. func (es ESReport) GetId() string {
  137. return strconv.Itoa(es.ReportID)
  138. }
  139. func GetETALatestReportId() (id int, err error) {
  140. return reportDao.GetETALatestReportId()
  141. }
  142. func SyncETAReportList(list []eta.ETAReport) (err error) {
  143. logger.Info("同步研报数量%d", len(list))
  144. var reports []reportDao.Report
  145. var esReports []es.ESBase
  146. for _, etaRp := range list {
  147. destRp := convertEtaReport(etaRp)
  148. reports = append(reports, destRp)
  149. }
  150. err = reportDao.BatchInsertReport(&reports)
  151. if err != nil {
  152. logger.Error("同步ETA研报失败:%v", err)
  153. return
  154. }
  155. for _, etaRp := range reports {
  156. esRp := convertEsReport(etaRp)
  157. esReports = append(esReports, esRp)
  158. }
  159. //同步es
  160. err = elastic().BulkInsert(indexName, esReports)
  161. if err != nil {
  162. logger.Error("同步ETA研报到es失败:%v", err)
  163. return
  164. }
  165. return
  166. }
  167. func GetListOrderByCondition(column string, limit int, order models.Order) (dtoList []ReportDTO, err error) {
  168. reports, err := reportDao.GetListOrderByCondition(column, limit, order)
  169. if err != nil {
  170. logger.Error("获取研报失败:%v", err)
  171. return
  172. }
  173. for _, report := range reports {
  174. dto := convertReportDTO(report)
  175. dtoList = append(dtoList, dto)
  176. }
  177. return
  178. }
  179. func GetListByCondition[T any](column string, ids []T) (dtoList []ReportDTO, err error) {
  180. var values []interface{}
  181. for _, id := range ids {
  182. values = append(values, id)
  183. }
  184. reports, err := reportDao.GetListByCondition(column, ids)
  185. if err != nil {
  186. logger.Error("获取研报失败:%v", err)
  187. return
  188. }
  189. for _, report := range reports {
  190. dto := convertReportDTO(report)
  191. dtoList = append(dtoList, dto)
  192. }
  193. return
  194. }
  195. func convertEtaReport(etaRp eta.ETAReport) reportDao.Report {
  196. return reportDao.Report{
  197. OrgID: etaRp.ID,
  198. Title: etaRp.Title,
  199. Abstract: etaRp.Abstract,
  200. Author: etaRp.Author,
  201. PublishedTime: etaRp.PublishTime,
  202. Source: reportDao.SourceETA,
  203. Status: reportDao.StatusInit,
  204. }
  205. }
  206. func convertEsReport(report reportDao.Report) ESReport {
  207. return ESReport{
  208. ReportID: report.ID,
  209. OrgId: report.OrgID,
  210. Author: report.Author,
  211. Source: report.Source,
  212. Abstract: report.Abstract,
  213. Status: report.Status,
  214. PublishedTime: report.PublishedTime,
  215. }
  216. }
  217. func convertReportDTO(report reportDao.Report) (reportDTO ReportDTO) {
  218. reportDTO = ReportDTO{
  219. ReportID: report.ID,
  220. Title: report.Title,
  221. OrgId: report.OrgID,
  222. Author: report.Author,
  223. Source: string(report.Source),
  224. Abstract: report.Abstract,
  225. PublishedTime: report.PublishedTime,
  226. }
  227. publishDate, err := time.Parse(time.DateTime, reportDTO.PublishedTime)
  228. if err == nil {
  229. reportDTO.PublishedTime = publishDate.Format(time.DateOnly)
  230. }
  231. return
  232. }
  233. func matchAll(sorts []string) (request *es.ESQueryRequest) {
  234. req := new(es.ESQueryRequest)
  235. return req.CreateESQueryRequest(ESIndex, "", "", 0, 1, sorts, es.MatchAll)
  236. }
  237. func matchRange(key string, from int, to int, max int64, sorts []string) (request *es.ESQueryRequest) {
  238. req := new(es.ESQueryRequest)
  239. return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.Range).Range(0, max, ESRangeColumn)
  240. }