media_service.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  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. configDomain "eta/eta_mini_ht_api/domian/config"
  10. merchantService "eta/eta_mini_ht_api/domian/merchant"
  11. reportService "eta/eta_mini_ht_api/domian/report"
  12. "eta/eta_mini_ht_api/models"
  13. configDao "eta/eta_mini_ht_api/models/config"
  14. "eta/eta_mini_ht_api/models/image"
  15. mediaDao "eta/eta_mini_ht_api/models/media"
  16. merchantDao "eta/eta_mini_ht_api/models/merchant"
  17. productDao "eta/eta_mini_ht_api/models/merchant"
  18. configService "eta/eta_mini_ht_api/service/config"
  19. "sort"
  20. "strconv"
  21. "time"
  22. )
  23. var (
  24. htConfig = config.GetConfig(contants.HT).(*config.HTBizConfig)
  25. )
  26. const (
  27. DESC models.Order = "desc"
  28. ASC models.Order = "asc"
  29. ESColumn = "mediaName"
  30. ESRangeColumn = "mediaId"
  31. ConditionColumn = "mediaType"
  32. )
  33. var (
  34. sortField = []string{"_score:desc"}
  35. transProductMap = map[string]merchantDao.MerchantProductType{
  36. "report": merchantDao.Report,
  37. "video": merchantDao.Video,
  38. "audio": merchantDao.Audio,
  39. "package": merchantDao.Package,
  40. }
  41. )
  42. func elastic() *es.ESClient {
  43. return es.GetInstance()
  44. }
  45. type MediaDTO struct {
  46. Type string `json:"type"`
  47. MediaId int `json:"mediaId"`
  48. AuthorId int `json:"authorId"`
  49. AuthorName string `json:"authorName,omitempty"`
  50. MediaType string `json:"mediaType"`
  51. Src string `json:"src"`
  52. MediaName string `json:"mediaName"`
  53. MediaTitle string `json:"mediaTitle,omitempty"`
  54. CoverSrc string `json:"coverSrc"`
  55. SourceType string `json:"sourceType"`
  56. MediaPlayMilliseconds int `json:"mediaPlayMilliseconds"`
  57. PublishedTime string `json:"publishedTime"`
  58. PermissionIDs string `json:"permissionIds"`
  59. PermissionNames []string `json:"permissionNames,omitempty"`
  60. Highlight []string `json:"highlight,omitempty"`
  61. Login bool `json:"login"`
  62. RiskLevelStatus string `json:"riskLevelStatus"`
  63. IsFree bool `json:"isFree"`
  64. Price string `json:"price"`
  65. IsSubscribe bool `json:"isSubscribe"`
  66. IsPackage bool `json:"isPackage"`
  67. RiskLevel string `json:"riskLevel"`
  68. ProductId int `json:"productId"`
  69. Score float64 `json:"score"`
  70. }
  71. func SearchMediaList(_ string, key string, mediaIds []int, from int, size int, max int64) (medias []MediaDTO, err error) {
  72. //同步es
  73. var docIds []string
  74. for _, id := range mediaIds {
  75. docIds = append(docIds, strconv.Itoa(id))
  76. }
  77. sorts := append(sortField, "publishedTime:desc")
  78. request := matchRangeWithDocIds(key, from, size, max, sorts, docIds)
  79. re, err := elastic().Search(request)
  80. if err != nil {
  81. logger.Error("es搜索失败:%v", err)
  82. }
  83. hits := elastic().GetSource(re.Hits)
  84. for _, hit := range hits {
  85. var content map[string][]string
  86. err = json.Unmarshal(hit.Highlight, &content)
  87. media := MediaDTO{}
  88. err = json.Unmarshal(hit.Source, &media)
  89. if err != nil {
  90. logger.Error("解析媒体数据失败:%v", err)
  91. continue
  92. }
  93. media.Highlight = content[ESColumn]
  94. media.PublishedTime = media.PublishedTime[:10]
  95. media.MediaTitle = media.Highlight[0]
  96. medias = append(medias, media)
  97. }
  98. return
  99. }
  100. func SearchMaxMediaId(mediaType string, key string) (total int64, latestId int64) {
  101. mediaSort := []string{"mediaId:desc"}
  102. request := matchAllByCondition(mediaSort, key, ConditionColumn, mediaType)
  103. //同步es
  104. //re, err := elastic().Search(request)
  105. re, err := elastic().Count(request)
  106. if err != nil {
  107. logger.Error("es搜索失败:%v", err)
  108. }
  109. count := re.Count
  110. total = int64(count)
  111. if total > 0 {
  112. request = matchByCondition(mediaSort, key, ConditionColumn, mediaType, 0, count)
  113. re, err = elastic().Search(request)
  114. if err != nil {
  115. logger.Error("es搜索异常:%v", err)
  116. }
  117. hits := elastic().GetSource(re.Hits)
  118. data := hits[0].Source
  119. media := MediaDTO{}
  120. err = json.Unmarshal(data, &media)
  121. if err != nil {
  122. logger.Error("获取当前最大媒体id失败:%v", err)
  123. return
  124. }
  125. total = int64(len(hits))
  126. latestId = int64(media.MediaId)
  127. return
  128. }
  129. return
  130. }
  131. func GetMediaPermissionMappingByPermissionIds(mediaType string, permissionIds []int, riskLevel string) (total int64, latestId int64, ids []int, mappingPdRisk string) {
  132. //获取一下下架的报告产品
  133. var offSaleProducts []merchantDao.MerchantProduct
  134. offSaleProducts, err := merchantDao.GetOffSaleProducts([]merchantDao.MerchantProductType{transProductMap[mediaType], merchantDao.Package})
  135. var disCardMediaIds []int
  136. var filterPermissionIds []int
  137. var ProductPermissionIds []int
  138. var filterIds []int
  139. if err != nil {
  140. logger.Error("获取下架的报告产品失败:%v", err)
  141. } else {
  142. for _, product := range offSaleProducts {
  143. if product.Type == "package" {
  144. ProductPermissionIds = append(ProductPermissionIds, product.SourceId)
  145. }
  146. if product.Type == transProductMap[mediaType] {
  147. disCardMediaIds = append(disCardMediaIds, product.SourceId)
  148. }
  149. }
  150. }
  151. if len(ProductPermissionIds) > 0 {
  152. var disCardIds []int
  153. disCardIds, err = mediaDao.GetMediaPermissionMappingByPermissionId(mediaType, filterPermissionIds)
  154. if len(disCardMediaIds) > 0 {
  155. disCardMediaIds = append(disCardMediaIds, disCardIds...)
  156. }
  157. }
  158. //对数据去重
  159. disCardMediaIds = uniqueArray(disCardMediaIds)
  160. ids, err = mediaDao.GetMediaPermissionMappingByPermissionId(mediaType, filterPermissionIds)
  161. if err != nil {
  162. logger.Error("获取配置品种的媒体列表信息失败:%v", err)
  163. return 0, 0, ids, riskLevel
  164. }
  165. //获取媒体中还包含上架套餐的id
  166. if len(disCardMediaIds) > 0 {
  167. reportIdsSalePackage, _ := merchantDao.GetMediaOnSalePackageIds(disCardMediaIds, transProductMap[mediaType])
  168. reportIdsSaleProduct, _ := merchantDao.GetOnSaleMediaIds(disCardMediaIds, transProductMap[mediaType])
  169. showReportMap := make(map[int]bool)
  170. disCardMap := make(map[int]bool)
  171. for _, reportId := range reportIdsSalePackage {
  172. showReportMap[reportId] = true
  173. }
  174. for _, reportId := range reportIdsSaleProduct {
  175. showReportMap[reportId] = true
  176. }
  177. var filterDisCardReportIds []int
  178. for _, id := range disCardMediaIds {
  179. if _, ok := showReportMap[id]; !ok {
  180. filterDisCardReportIds = append(filterDisCardReportIds, id)
  181. disCardMap[id] = true
  182. }
  183. }
  184. disCardMediaIds = filterDisCardReportIds
  185. var cardReportIds []int
  186. for _, id := range filterIds {
  187. if _, ok := disCardMap[id]; !ok {
  188. cardReportIds = append(cardReportIds, id)
  189. }
  190. }
  191. filterIds = cardReportIds
  192. }
  193. if len(filterIds) > 0 {
  194. sort.Slice(filterIds, func(i, j int) bool {
  195. return filterIds[i] > filterIds[j]
  196. })
  197. return int64(len(filterIds)), int64(filterIds[0]), filterIds, riskLevel
  198. }
  199. return 0, 0, []int{}, riskLevel
  200. }
  201. func uniqueArray(arr []int) []int {
  202. uniqueMap := make(map[int]bool)
  203. var result []int
  204. for _, value := range arr {
  205. if _, exists := uniqueMap[value]; !exists {
  206. uniqueMap[value] = true
  207. result = append(result, value)
  208. }
  209. }
  210. return result
  211. }
  212. func GetAnalystMediaPermissionMappingByPermissionIds(mediaType string, permissionIds []int, analystId int, mappingRiskLevel string) (total int64, latestId int64, ids []int, riskLevel string) {
  213. ids, err := mediaDao.GetMediaPermissionMappingByPermissionId(mediaType, permissionIds)
  214. if err != nil {
  215. logger.Error("获取当前最大媒体id失败:%v", err)
  216. return 0, 0, ids, mappingRiskLevel
  217. }
  218. ids, err = mediaDao.GetAnalystMediaRangeReportIds(mediaType, ids, analystId)
  219. if err != nil {
  220. logger.Error("根据研究员过滤媒体列表id失败:%v", err)
  221. return 0, 0, ids, mappingRiskLevel
  222. }
  223. if len(ids) == 0 {
  224. logger.Info("根据研究员过滤媒体列表id为空")
  225. return 0, 0, ids, mappingRiskLevel
  226. }
  227. var offSaleProducts []merchantService.MerchantProductDTO
  228. offSaleProducts, err = merchantService.GetOffSaleProducts([]string{"report", "package"})
  229. var disCardMediaIds []int
  230. var disCardPermissionIds []int
  231. var filterPermissionIds []int
  232. var filterIds []int
  233. if err != nil {
  234. logger.Error("获取下架的报告产品失败:%v", err)
  235. } else {
  236. for _, product := range offSaleProducts {
  237. if product.Type == "package" {
  238. disCardPermissionIds = append(disCardPermissionIds, product.SourceId)
  239. }
  240. if product.Type == "audio" || product.Type == "video" {
  241. disCardMediaIds = append(disCardMediaIds, product.SourceId)
  242. }
  243. }
  244. }
  245. for _, permissionId := range permissionIds {
  246. find := false
  247. for _, disCardPermissionId := range disCardPermissionIds {
  248. if permissionId == disCardPermissionId {
  249. find = true
  250. break
  251. }
  252. }
  253. if !find {
  254. filterPermissionIds = append(filterPermissionIds, permissionId)
  255. }
  256. }
  257. if mappingRiskLevel != "" {
  258. var productList []productDao.MerchantProduct
  259. //现加入没有产品的报告
  260. productList, err = productDao.GetProductListBySourceIds(ids, true, productDao.Audio, productDao.Video)
  261. for _, mediaId := range ids {
  262. find := false
  263. for _, product := range productList {
  264. if product.SourceId == mediaId {
  265. find = true
  266. break
  267. }
  268. }
  269. if !find {
  270. ids = append(ids, mediaId)
  271. }
  272. }
  273. riskNum, parseErr := configService.ParseRiskLevel(mappingRiskLevel)
  274. if parseErr != nil {
  275. logger.Error("解析风险等级失败:%v", err)
  276. return
  277. }
  278. //再把符合风险等级的产品加入
  279. for _, mediaId := range ids {
  280. for _, product := range productList {
  281. if product.SourceId == mediaId {
  282. pdRiskNum, pdErr := configService.ParseRiskLevel(product.RiskLevel)
  283. if pdErr != nil {
  284. logger.Error("解析产品风险等级失败:%v,产品id:%v", pdErr, product.Id)
  285. continue
  286. }
  287. if pdRiskNum <= riskNum && product.SaleStatus == productDao.OnSale {
  288. ids = append(ids, mediaId)
  289. }
  290. }
  291. }
  292. }
  293. }
  294. for _, mediaId := range ids {
  295. find := false
  296. for _, discardMediaId := range disCardMediaIds {
  297. if mediaId == discardMediaId {
  298. find = true
  299. break
  300. }
  301. }
  302. if !find {
  303. filterIds = append(filterIds, mediaId)
  304. }
  305. }
  306. if len(filterIds) > 0 {
  307. sort.Slice(filterIds, func(i, j int) bool {
  308. return filterIds[i] > filterIds[j]
  309. })
  310. return int64(len(filterIds)), int64(filterIds[0]), filterIds, riskLevel
  311. }
  312. return 0, 0, []int{}, mappingRiskLevel
  313. }
  314. func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
  315. return mediaDao.GetCountByMediaType(mediaType)
  316. }
  317. func GetTotalPageCountByAnalystId(mediaType string, analystId int) (count int64, latestId int64) {
  318. return mediaDao.GetCountByMediaTypeByAnalystId(mediaType, analystId)
  319. }
  320. func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int) (list []MediaDTO, err error) {
  321. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  322. medias, err := mediaDao.GetMediaPageByIds(pageInfo.LatestId, pageInfo.PageSize, offset, mediaType, mediaIds)
  323. if err == nil && medias != nil {
  324. for _, media := range medias {
  325. dto := convertMediaDTO(media, false)
  326. list = append(list, dto)
  327. }
  328. }
  329. return
  330. }
  331. func GetMediaPageByAnalystId(mediaType string, pageInfo page.PageInfo, analystId int, mediaIds []int) (list []MediaDTO, err error) {
  332. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  333. medias, err := mediaDao.GetMediaPageByAnalystId(pageInfo.LatestId, pageInfo.PageSize, offset, mediaType, analystId, mediaIds)
  334. if err == nil && medias != nil {
  335. for _, media := range medias {
  336. dto := convertMediaDTO(media, false)
  337. list = append(list, dto)
  338. }
  339. }
  340. return
  341. }
  342. func convertMediaDTO(media mediaDao.Media, fullTime bool) MediaDTO {
  343. if fullTime {
  344. return MediaDTO{
  345. MediaId: media.Id,
  346. AuthorId: media.AuthorID,
  347. AuthorName: media.AuthorName,
  348. MediaType: string(media.MediaType),
  349. Src: media.Src,
  350. MediaName: media.MediaName,
  351. SourceType: media.SourceType,
  352. CoverSrc: media.CoverSrc,
  353. MediaPlayMilliseconds: media.MediaPlayMilliseconds,
  354. PermissionIDs: media.PermissionIDs,
  355. PublishedTime: media.PublishedTime.Format(time.DateTime),
  356. }
  357. } else {
  358. return MediaDTO{
  359. MediaId: media.Id,
  360. AuthorId: media.AuthorID,
  361. AuthorName: media.AuthorName,
  362. MediaType: string(media.MediaType),
  363. Src: media.Src,
  364. MediaName: media.MediaName,
  365. SourceType: media.SourceType,
  366. CoverSrc: media.CoverSrc,
  367. MediaPlayMilliseconds: media.MediaPlayMilliseconds,
  368. PermissionIDs: media.PermissionIDs,
  369. PublishedTime: media.PublishedTime.Format(time.DateOnly),
  370. }
  371. }
  372. }
  373. func GetMediaById(mediaType string, mediaId int) (mediaDTO MediaDTO, err error) {
  374. media, err := mediaDao.GetMediaById(mediaType, mediaId)
  375. if err != nil {
  376. logger.Error("查询媒体信息失败:%v", err)
  377. return
  378. }
  379. mediaDTO = convertMediaDTO(media, true)
  380. return
  381. }
  382. func GetPermissionsByIds(ids []int) (permissionDTOs []configDomain.PermissionDTO, err error) {
  383. return reportService.GetFirstPermissionsByIds(ids)
  384. }
  385. func GetSecondPermissionsByIds(ids []int) (permissionDTOs []configDomain.PermissionDTO, err error) {
  386. return reportService.GetPermissionsByPermissionIds(ids)
  387. }
  388. func matchAllByCondition(sorts []string, key string, column string, value string) (request *es.ESQueryRequest) {
  389. req := new(es.ESQueryRequest)
  390. //return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, 0, 1, sorts, es.MatchAllByCondition).ByCondition(column, value)
  391. return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, 0, 1, sorts, es.MatchAll)
  392. }
  393. func matchByCondition(sorts []string, key string, column string, value string, from int, to int) (request *es.ESQueryRequest) {
  394. req := new(es.ESQueryRequest)
  395. //return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, from, to, sorts, es.MatchAllByCondition).ByCondition(column, value)
  396. return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, from, to, sorts, es.MatchAll)
  397. }
  398. func matchRangeByCondition(key string, from int, to int, max int64, sorts []string, column string, value string) (request *es.ESQueryRequest) {
  399. req := new(es.ESQueryRequest)
  400. //return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, from, to, sorts, es.RangeByCondition).Range(0, max, ESRangeColumn).ByCondition(column, value)
  401. return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, from, to, sorts, es.Range).Range(0, max, ESRangeColumn)
  402. }
  403. func matchRangeWithDocIds(key string, from int, to int, max int64, sorts []string, docIds []string) (request *es.ESQueryRequest) {
  404. req := new(es.ESQueryRequest)
  405. //return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, from, to, sorts, es.RangeByCondition).Range(0, max, ESRangeColumn).ByCondition(column, value)
  406. return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, from, to, sorts, es.Range).Range(0, max, ESRangeColumn).WithDocs(docIds)
  407. }
  408. func matchLimitByScore(key string, limit int, score float64, docIds []string) (request *es.ESQueryRequest) {
  409. req := new(es.ESQueryRequest)
  410. return req.CreateESQueryRequest(htConfig.GetMediaIndex(), ESColumn, key, 0, limit, sortField, es.LimitByScore).WithScore(score).WithDocs(docIds)
  411. }
  412. func GetImageSrc(id int) (src string, err error) {
  413. return image.GetImageSrc(id)
  414. }
  415. func SearchMediaProduct(key string, limit int, score float64, docIds []int) (medias []MediaDTO, err error) {
  416. var docStrIds []string
  417. for _, docId := range docIds {
  418. docStrIds = append(docStrIds, strconv.Itoa(docId))
  419. }
  420. request := matchLimitByScore(key, limit, score, docStrIds)
  421. re, err := elastic().Search(request)
  422. if err != nil {
  423. logger.Error("es搜索异常:%v", err)
  424. }
  425. hits := elastic().GetSource(re.Hits)
  426. if len(hits) == 0 {
  427. medias = []MediaDTO{}
  428. return
  429. }
  430. for _, hit := range hits {
  431. var content map[string][]string
  432. err = json.Unmarshal(hit.Highlight, &content)
  433. media := MediaDTO{}
  434. err = json.Unmarshal(hit.Source, &media)
  435. if err != nil {
  436. logger.Error("解析研报数据失败:%v", err)
  437. continue
  438. }
  439. media.Score = hit.Score
  440. media.Highlight = content[ESColumn]
  441. media.PublishedTime = media.PublishedTime[:10]
  442. media.MediaTitle = media.Highlight[0]
  443. medias = append(medias, media)
  444. }
  445. return
  446. }
  447. func CountPermissionWeight(ids []int) (list []configDao.PermissionWeight, err error) {
  448. return mediaDao.CountPermissionWeight(ids)
  449. }