media_service.go 6.8 KB

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