media_service.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package media
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_ht_api/common/component/es"
  5. logger "eta/eta_mini_ht_api/common/component/log"
  6. "eta/eta_mini_ht_api/common/utils/page"
  7. reportService "eta/eta_mini_ht_api/domian/report"
  8. "eta/eta_mini_ht_api/models"
  9. mediaDao "eta/eta_mini_ht_api/models/media"
  10. "sort"
  11. "time"
  12. )
  13. const (
  14. DESC models.Order = "desc"
  15. ASC models.Order = "asc"
  16. ESIndex = "media_index"
  17. ESColumn = "mediaName"
  18. ESRangeColumn = "mediaId"
  19. ConditionColumn = "mediaType"
  20. )
  21. var (
  22. sortField = []string{"_score:desc"}
  23. )
  24. func elastic() *es.ESClient {
  25. return es.GetInstance()
  26. }
  27. type MediaDTO struct {
  28. MediaId int `json:"mediaId"`
  29. AuthorId int `json:"authorId"`
  30. AuthorName string `json:"authorName,omitempty"`
  31. MediaType string `json:"mediaType"`
  32. Src string `json:"src"`
  33. MediaName string `json:"mediaName"`
  34. SourceType string `json:"sourceType"`
  35. MediaPlaySeconds int `json:"-"`
  36. MediaPlayMillisSeconds int `json:"mediaPlayMillisSeconds"`
  37. PublishedTime string `json:"publishedTime"`
  38. PermissionIDs string `json:"permissionIds"`
  39. PermissionNames []string `json:"permissionNames,omitempty"`
  40. Highlight []string `json:"highlight,omitempty"`
  41. }
  42. func SearchMediaList(mediaType string, key string, from int, size int, max int64) (reports []MediaDTO, err error) {
  43. //同步es
  44. sorts := append(sortField, "publishedTime:desc")
  45. request := matchRangeByCondition(key, from, size, max, sorts, ConditionColumn, mediaType)
  46. re, err := elastic().Search(request)
  47. if err != nil {
  48. logger.Error("es搜索失败:%v", err)
  49. }
  50. hits := elastic().GetSource(re.Hits)
  51. for _, hit := range hits {
  52. var content map[string][]string
  53. err = json.Unmarshal(hit.Highlight, &content)
  54. meida := MediaDTO{}
  55. err = json.Unmarshal(hit.Source, &meida)
  56. if err != nil {
  57. logger.Error("解析媒体数据失败:%v", err)
  58. continue
  59. }
  60. meida.Highlight = content[ESColumn]
  61. meida.PublishedTime = meida.PublishedTime[:10]
  62. meida.MediaPlayMillisSeconds = meida.MediaPlaySeconds * 1000
  63. reports = append(reports, meida)
  64. }
  65. return
  66. }
  67. func SearchMaxMediaId(mediaType string, key string) (total int64, latestId int64) {
  68. sort := []string{"mediaId:desc"}
  69. request := matchAllByCondition(sort, key, ConditionColumn, mediaType)
  70. //同步es
  71. //re, err := elastic().Search(request)
  72. re, err := elastic().Count(request)
  73. if err != nil {
  74. logger.Error("es搜索失败:%v", err)
  75. }
  76. count := re.Count
  77. total = int64(count)
  78. if total > 0 {
  79. request = matchByCondition(sort, key, ConditionColumn, mediaType, 0, count)
  80. re, err = elastic().Search(request)
  81. if err != nil {
  82. logger.Error("es搜索异常:%v", err)
  83. }
  84. hits := elastic().GetSource(re.Hits)
  85. data := hits[0].Source
  86. media := MediaDTO{}
  87. err = json.Unmarshal(data, &media)
  88. if err != nil {
  89. logger.Error("获取当前最大媒体id失败:%v", err)
  90. return
  91. }
  92. total = int64(len(hits))
  93. latestId = int64(media.MediaId)
  94. return
  95. }
  96. return
  97. }
  98. func GetMediaPermissionMappingByPermissionIds(mediaType string, permissionIds []int) (total int64, latestId int64, ids []int) {
  99. ids, err := mediaDao.GetMediaPermissionMappingByPermissionId(mediaType, permissionIds)
  100. if err != nil {
  101. logger.Error("获取当前最大媒体id失败:%v", err)
  102. return 0, 0, ids
  103. }
  104. sort.Slice(ids, func(i, j int) bool {
  105. return ids[i] > ids[j]
  106. })
  107. return int64(len(ids)), int64(ids[0]), ids
  108. }
  109. func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
  110. return mediaDao.GetCountByMediaType(mediaType)
  111. }
  112. func GetTotalPageCountByAnalystId(mediaType string, analystId int) (count int64, latestId int64) {
  113. return mediaDao.GetCountByMediaTypeByAnalystId(mediaType, analystId)
  114. }
  115. func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int) (list []MediaDTO, err error) {
  116. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  117. medias, err := mediaDao.GetMediaPageByIds(pageInfo.LatestId, pageInfo.PageSize, offset, mediaType, mediaIds)
  118. if err == nil && medias != nil {
  119. for _, media := range medias {
  120. dto := convertMediaDTO(media)
  121. list = append(list, dto)
  122. }
  123. }
  124. return
  125. }
  126. func GetMediaPageByAnalystId(mediaType string, pageInfo page.PageInfo, analystId int) (list []MediaDTO, err error) {
  127. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  128. medias, err := mediaDao.GetMediaPageByAnalystId(pageInfo.LatestId, pageInfo.PageSize, offset, mediaType, analystId)
  129. if err == nil && medias != nil {
  130. for _, media := range medias {
  131. dto := convertMediaDTO(media)
  132. list = append(list, dto)
  133. }
  134. }
  135. return
  136. }
  137. func convertMediaDTO(media mediaDao.Media) MediaDTO {
  138. return MediaDTO{
  139. MediaId: media.Id,
  140. AuthorId: media.AuthorID,
  141. AuthorName: media.AuthorName,
  142. MediaType: string(media.MediaType),
  143. Src: media.Src,
  144. MediaName: media.MediaName,
  145. SourceType: media.SourceType,
  146. MediaPlaySeconds: media.MediaPlayMilliseconds,
  147. MediaPlayMillisSeconds: media.MediaPlayMilliseconds,
  148. PermissionIDs: media.PermissionIDs,
  149. PublishedTime: media.PublishedTime.Format(time.DateOnly),
  150. }
  151. }
  152. func GetMediaById(mediaType string, mediaId int) (mediaDTO MediaDTO, err error) {
  153. media, err := mediaDao.GetMediaById(mediaType, mediaId)
  154. if err != nil {
  155. logger.Error("查询媒体信息失败:%v", err)
  156. return
  157. }
  158. mediaDTO = convertMediaDTO(media)
  159. return
  160. }
  161. func GetPermissionsByIds(ids []int) (permissionDTOs []reportService.PermissionDTO, err error) {
  162. return reportService.GetFirstPermissionsByIds(ids)
  163. }
  164. func matchAllByCondition(sorts []string, key string, column string, value string) (request *es.ESQueryRequest) {
  165. req := new(es.ESQueryRequest)
  166. return req.CreateESQueryRequest(ESIndex, ESColumn, key, 0, 1, sorts, es.MatchAllByCondition).ByCondition(column, value)
  167. }
  168. func matchByCondition(sorts []string, key string, column string, value string, from int, to int) (request *es.ESQueryRequest) {
  169. req := new(es.ESQueryRequest)
  170. return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.MatchAllByCondition).ByCondition(column, value)
  171. }
  172. func matchRangeByCondition(key string, from int, to int, max int64, sorts []string, column string, value string) (request *es.ESQueryRequest) {
  173. req := new(es.ESQueryRequest)
  174. return req.CreateESQueryRequest(ESIndex, ESColumn, key, from, to, sorts, es.RangeByCondition).Range(0, max, ESRangeColumn).ByCondition(column, value)
  175. }