media_service.go 16 KB

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