media_service.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. package media
  2. import (
  3. "errors"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. "eta/eta_mini_ht_api/common/utils/page"
  7. stringUtils "eta/eta_mini_ht_api/common/utils/string"
  8. configService "eta/eta_mini_ht_api/domian/config"
  9. permissionService "eta/eta_mini_ht_api/domian/config"
  10. mediaService "eta/eta_mini_ht_api/domian/media"
  11. productService "eta/eta_mini_ht_api/domian/merchant"
  12. userService "eta/eta_mini_ht_api/domian/user"
  13. mediaDao "eta/eta_mini_ht_api/models/media"
  14. productDao "eta/eta_mini_ht_api/models/merchant"
  15. userDao "eta/eta_mini_ht_api/models/user"
  16. "eta/eta_mini_ht_api/service/user"
  17. "fmt"
  18. "gorm.io/gorm"
  19. "strconv"
  20. "strings"
  21. "sync"
  22. )
  23. const (
  24. RiskLevelUnMatch = "unMatch"
  25. RiskLevelUnTest = "unTest"
  26. RiskLevelExpired = "expired"
  27. RiskLevelMatch = "match"
  28. defaultProductPrice = "0"
  29. )
  30. type RecordCount struct {
  31. UserId int
  32. Mobile string
  33. MediaId int
  34. TraceId string
  35. MediaType string
  36. IpAddress string
  37. Location string
  38. Referer string
  39. Additional string
  40. }
  41. func convertToMediaCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
  42. return userService.RecordCountDTO{
  43. UserId: record.UserId,
  44. TraceId: record.TraceId,
  45. Mobile: record.Mobile,
  46. SourceId: record.MediaId,
  47. }
  48. }
  49. func CountMedia(count RecordCount) (traceId string, err error) {
  50. meida, err := mediaService.GetMediaById(count.MediaType, count.MediaId)
  51. if err != nil {
  52. err = exception.New(exception.MediaFoundFailed)
  53. return
  54. }
  55. dto := convertToMediaCountDTO(count)
  56. return userService.CountMedia(dto, meida.MediaType)
  57. }
  58. func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
  59. if mediaType == "" {
  60. return
  61. }
  62. return mediaService.GetTotalPageCount(mediaType)
  63. }
  64. func GetTotalPageCountByAnalystId(mediaType string, analystId int) (total int64, latestId int64) {
  65. if mediaType == "" {
  66. return
  67. }
  68. return mediaService.GetTotalPageCountByAnalystId(mediaType, analystId)
  69. }
  70. func RangeSearchByAnalyst(mediaType string, analystId int, userId int) (total int64, latestId int64, ids []int) {
  71. var err error
  72. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  73. userProfile, userErr := user.GetUserProfile(userId)
  74. if userErr != nil {
  75. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  76. err = exception.New(exception.TemplateUserNotFound)
  77. } else {
  78. err = exception.New(exception.TemplateUserFoundFailed)
  79. }
  80. logger.Error("分页查询报告列表失败:%v", err)
  81. return
  82. }
  83. //获取产品风险等级
  84. if userProfile.RiskLevel == user.RiskUnTest {
  85. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  86. return
  87. }
  88. if userProfile.RiskLevelStatus == user.RiskExpired {
  89. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  90. return
  91. }
  92. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  93. if mappingErr != nil {
  94. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  95. return
  96. }
  97. var permissionList []permissionService.PermissionDTO
  98. //获取所有设置风险等级的品种
  99. permissionList, err = permissionService.GetPermissionListWithRisk()
  100. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  101. if len(permissionList) == 0 {
  102. return
  103. }
  104. var filterPermissionIds []int
  105. for _, permission := range permissionList {
  106. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  107. }
  108. return mediaService.GetAnalystMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds, analystId)
  109. }
  110. func RangeSearch(mediaType string, isLogin bool, userId int) (total int64, latestId int64, ids []int) {
  111. var err error
  112. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  113. if isLogin {
  114. userProfile, userErr := user.GetUserProfile(userId)
  115. if userErr != nil {
  116. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  117. err = exception.New(exception.TemplateUserNotFound)
  118. } else {
  119. err = exception.New(exception.TemplateUserFoundFailed)
  120. }
  121. logger.Error("分页查询报告列表失败:%v", err)
  122. return
  123. }
  124. //获取产品风险等级
  125. if userProfile.RiskLevel == user.RiskUnTest {
  126. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  127. return
  128. }
  129. if userProfile.RiskLevelStatus == user.RiskExpired {
  130. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  131. return
  132. }
  133. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  134. if mappingErr != nil {
  135. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  136. return
  137. }
  138. var permissionList []permissionService.PermissionDTO
  139. //获取所有设置风险等级的品种
  140. permissionList, err = permissionService.GetPermissionListWithRisk()
  141. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  142. if len(permissionList) == 0 {
  143. return
  144. }
  145. var filterPermissionIds []int
  146. for _, permission := range permissionList {
  147. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  148. }
  149. return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds, mapping.ProductRiskLevel)
  150. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  151. var permissionList []permissionService.PermissionDTO
  152. //获取所有设置风险等级的品种
  153. permissionList, err = permissionService.GetPermissionListWithRisk()
  154. if err != nil {
  155. logger.Error("根据ID查询品种列表失败:%v", err)
  156. }
  157. var filterPermissionIds []int
  158. for _, permission := range permissionList {
  159. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  160. }
  161. //查询品种
  162. return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds, "")
  163. }
  164. }
  165. func GetTotalPageCountByPermissionIds(mediaType string, permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids []int) {
  166. if mediaType == "" {
  167. return
  168. }
  169. var err error
  170. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  171. if isLogin {
  172. userProfile, userErr := user.GetUserProfile(userId)
  173. if userErr != nil {
  174. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  175. err = exception.New(exception.TemplateUserNotFound)
  176. } else {
  177. err = exception.New(exception.TemplateUserFoundFailed)
  178. }
  179. logger.Error("分页查询媒体列表失败:%v", err)
  180. return
  181. }
  182. //获取产品风险等级
  183. if userProfile.RiskLevel == user.RiskUnTest {
  184. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  185. return
  186. }
  187. if userProfile.RiskLevelStatus == user.RiskExpired {
  188. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  189. return
  190. }
  191. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  192. if mappingErr != nil {
  193. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  194. return
  195. }
  196. var permissionList []permissionService.PermissionDTO
  197. if len(permissionIds) == 0 {
  198. //获取所有设置风险等级的品种
  199. permissionList, err = permissionService.GetPermissionListWithRisk()
  200. } else {
  201. //更具id过滤设置了风险等级的品种
  202. permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
  203. }
  204. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  205. if len(permissionList) == 0 {
  206. return
  207. }
  208. var filterPermissionIds []int
  209. for _, permission := range permissionList {
  210. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  211. }
  212. return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds, mapping.ProductRiskLevel)
  213. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  214. var permissionList []permissionService.PermissionDTO
  215. if len(permissionIds) == 0 {
  216. //获取所有设置风险等级的品种
  217. permissionList, err = permissionService.GetPermissionListWithRisk()
  218. } else {
  219. //更具id过滤设置了风险等级的品种
  220. permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
  221. }
  222. if err != nil {
  223. logger.Error("根据ID查询品种列表失败:%v", err)
  224. }
  225. var filterPermissionIds []int
  226. for _, permission := range permissionList {
  227. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  228. }
  229. //查询品种
  230. return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds, "")
  231. }
  232. }
  233. func parseRiskLevel(level string) (int, error) {
  234. parts := strings.Split(level, "R")
  235. if len(parts) < 2 {
  236. return 0, fmt.Errorf("无效的风险等级: %s", level)
  237. }
  238. numberStr := parts[1]
  239. number, err := strconv.Atoi(numberStr)
  240. if err != nil {
  241. return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
  242. }
  243. return number, nil
  244. }
  245. func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, riskLevel string) (resultList []permissionService.PermissionDTO) {
  246. riskLevelNum, err := parseRiskLevel(riskLevel)
  247. if err != nil {
  248. logger.Error("风险等级解析失败:%v", err)
  249. return
  250. }
  251. for _, permission := range permissionList {
  252. pRiskNum, riskErr := parseRiskLevel(permission.RiskLevel)
  253. if riskErr != nil {
  254. logger.Error("解析品种风险等级失败 permission:%d,risk:%v", permission.PermissionId, permission.RiskLevel)
  255. continue
  256. }
  257. if pRiskNum <= riskLevelNum {
  258. resultList = append(resultList, permission)
  259. }
  260. }
  261. return
  262. }
  263. func SearchMaxMediaId(mediaType string, key string) (total int64, latestId int64) {
  264. return mediaService.SearchMaxMediaId(mediaType, key)
  265. }
  266. func GetMediaById(mediaType string, mediaId int, isLogin bool, userId int) (media mediaService.MediaDTO, err error) {
  267. media, err = mediaService.GetMediaById(mediaType, mediaId)
  268. if err != nil {
  269. logger.Error("获取媒体失败:%v", err)
  270. err = exception.New(exception.MediaFoundFailed)
  271. return
  272. }
  273. var status string
  274. status, err = matchRiskLevel(userId, media)
  275. if err != nil {
  276. logger.Error("匹配风险等级失败:%v", err)
  277. err = exception.New(exception.ReportRiskLevelUnSet)
  278. return
  279. }
  280. idStr := strings.Split(media.PermissionIDs, ",")
  281. var ids []int
  282. ids, err = stringUtils.StringToIntSlice(idStr)
  283. if err != nil {
  284. logger.Error("品种名称列表转换失败:%v", err)
  285. return
  286. }
  287. media.PermissionNames = getMediaPermissionNames(ids)
  288. if isLogin {
  289. media.Login = true
  290. if status != RiskLevelMatch {
  291. media.Src = ""
  292. }
  293. media.RiskLevelStatus = status
  294. } else {
  295. logger.Info("当前用户未登录,展示部分详情")
  296. media.Src = ""
  297. media.RiskLevelStatus = RiskLevelUnMatch
  298. media.Login = false
  299. }
  300. return
  301. }
  302. func matchRiskLevel(userId int, media mediaService.MediaDTO) (riskLevelMatch string, err error) {
  303. userProfile, userErr := user.GetUserProfile(userId)
  304. if userErr != nil {
  305. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  306. logger.Error("用户信息不存在,mobile:%d", userProfile.Mobile)
  307. err = exception.New(exception.TemplateUserNotFound)
  308. return
  309. } else {
  310. logger.Error("获取用户信息失败:%v", userErr)
  311. err = exception.New(exception.TemplateUserFoundFailed)
  312. return
  313. }
  314. }
  315. //比较风险等级
  316. if userProfile.RiskLevelStatus == user.RiskUnTest {
  317. logger.Info("客户风险等级未测试,mobile:%d", userProfile.Mobile)
  318. riskLevelMatch = RiskLevelUnTest
  319. return
  320. }
  321. if userProfile.RiskLevelStatus == user.RiskExpired {
  322. logger.Info("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  323. riskLevelMatch = RiskLevelExpired
  324. return
  325. }
  326. level, err := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  327. if err != nil {
  328. logger.Error("获取媒体风险等级设置失败:%v", err)
  329. return
  330. }
  331. var permissionIds []int
  332. permissionStrList := strings.Split(media.PermissionIDs, ",")
  333. permissionIds, err = stringUtils.StringToIntSlice(permissionStrList)
  334. if err != nil {
  335. logger.Error("解析媒体品种ID列表失败:%v", err)
  336. }
  337. permissionDTOs, err := permissionService.GetPermissionListByIds(permissionIds)
  338. if err != nil {
  339. logger.Error("获取品种风险等级失败:%v", err)
  340. return
  341. }
  342. //能够查看最高等级
  343. matchNum, err := parseRiskLevel(level.ProductRiskLevel)
  344. if err != nil {
  345. logger.Error("解析风险等级失败:%v", err)
  346. return
  347. }
  348. if len(permissionDTOs) == 0 {
  349. logger.Error("当前报告对应品种未设置风险等级")
  350. err = exception.New(exception.ReportRiskLevelUnSet)
  351. return
  352. }
  353. //能够查看需要的最小等级
  354. num := getLowestRiskLevel(permissionDTOs)
  355. if num > matchNum {
  356. riskLevelMatch = RiskLevelUnMatch
  357. return
  358. } else {
  359. riskLevelMatch = RiskLevelMatch
  360. return
  361. }
  362. }
  363. func getLowestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
  364. for _, permission := range permissions {
  365. pRiskNum, err := parseRiskLevel(permission.RiskLevel)
  366. if err != nil {
  367. logger.Error("解析风险等级失败:%v", err)
  368. continue
  369. }
  370. if riskLevelNum == 0 {
  371. riskLevelNum = pRiskNum
  372. } else {
  373. if riskLevelNum > pRiskNum {
  374. riskLevelNum = pRiskNum
  375. }
  376. }
  377. }
  378. return
  379. }
  380. func GetMediaPageByAnalystId(mediaType string, pageInfo page.PageInfo, analystId int, mediaIds []int) (list []mediaService.MediaDTO, err error) {
  381. list, err = mediaService.GetMediaPageByAnalystId(mediaType, pageInfo, analystId, mediaIds)
  382. if err != nil {
  383. err = exception.New(exception.GetAnalystMediaListFailed)
  384. return
  385. }
  386. if len(list) == 0 {
  387. logger.Info("研究员媒体列表为空")
  388. return
  389. }
  390. //并发获取媒体的标签
  391. var wg sync.WaitGroup
  392. wg.Add(len(list))
  393. for i := 0; i < len(list); i++ {
  394. go func(media *mediaService.MediaDTO) {
  395. defer wg.Done()
  396. idStr := strings.Split(media.PermissionIDs, ",")
  397. var ids []int
  398. ids, err = stringUtils.StringToIntSlice(idStr)
  399. if err != nil {
  400. logger.Error("品种名称列表转换失败:%v", err)
  401. }
  402. media.PermissionNames = getMediaPermissionNames(ids)
  403. }(&list[i])
  404. }
  405. wg.Wait()
  406. if err != nil {
  407. err = exception.New(exception.GetAnalystMediaListFailed)
  408. }
  409. return
  410. }
  411. func getMediaSecondPermissions(ids []int) (permissionDTOs []configService.PermissionDTO, err error) {
  412. return mediaService.GetSecondPermissionsByIds(ids)
  413. }
  414. func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int, isLogin bool, userId int) (list []mediaService.MediaDTO, err error) {
  415. list, err = mediaService.GetMediaPageByIds(mediaType, pageInfo, mediaIds)
  416. if err != nil {
  417. err = exception.New(exception.GetMediaListFailed)
  418. return
  419. }
  420. //并发获取媒体的标签
  421. var wg sync.WaitGroup
  422. wg.Add(len(list))
  423. for i := 0; i < len(list); i++ {
  424. go func(media *mediaService.MediaDTO) {
  425. defer wg.Done()
  426. idStr := strings.Split(media.PermissionIDs, ",")
  427. var ids []int
  428. ids, err = stringUtils.StringToIntSlice(idStr)
  429. if err != nil {
  430. logger.Error("品种名称列表转换失败:%v", err)
  431. }
  432. media.PermissionNames = getMediaPermissionNames(ids)
  433. //permissions, err := getMediaSecondPermissions(ids)
  434. if !isLogin {
  435. media.Src = ""
  436. }
  437. media.Login = isLogin
  438. var productType productDao.MerchantProductType
  439. switch media.MediaType {
  440. case string(mediaDao.Audio):
  441. productType = productDao.Audio
  442. case string(mediaDao.Video):
  443. productType = productDao.Video
  444. default:
  445. logger.Error("未知媒体类型:%s", media.MediaType)
  446. productType = ""
  447. }
  448. product, pdErr := productService.GetProductBySourceId(media.MediaId, productType)
  449. if pdErr != nil {
  450. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  451. media.Price = defaultProductPrice
  452. media.IsFree = true
  453. media.IsSubscribe = false
  454. } else {
  455. media.Price = defaultProductPrice
  456. media.IsFree = false
  457. media.IsSubscribe = false
  458. }
  459. return
  460. }
  461. media.Price = product.Price.String()
  462. media.IsFree = false
  463. if isLogin {
  464. subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
  465. if subscribeErr != nil {
  466. media.IsSubscribe = false
  467. } else {
  468. media.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  469. }
  470. }
  471. pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
  472. if parseErr != nil {
  473. return
  474. }
  475. rpRiskNum, parseErr := parseRiskLevel(media.RiskLevel)
  476. if parseErr != nil {
  477. return
  478. }
  479. if rpRiskNum <= pdRiskNum {
  480. media.RiskLevel = product.RiskLevel
  481. }
  482. }(&list[i])
  483. }
  484. wg.Wait()
  485. if err != nil {
  486. err = exception.New(exception.QueryReportPageFailed)
  487. }
  488. return
  489. }
  490. func getMediaPermissionNames(id []int) (labels []string) {
  491. permissions, err := mediaService.GetPermissionsByIds(id)
  492. if err != nil {
  493. logger.Error("查询品种名称列表失败:%v", err)
  494. labels = []string{}
  495. return
  496. }
  497. for _, permission := range permissions {
  498. labels = append(labels, permission.PermissionName)
  499. }
  500. return
  501. }
  502. // stringToIntSlice 将一个包含数字字符串的切片转换为整数切片
  503. func SearchMediaList(mediaType string, key string, mediaIds []int, pageInfo page.PageInfo, isLogin bool) (medias []mediaService.MediaDTO, err error) {
  504. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  505. medias, err = mediaService.SearchMediaList(mediaType, key, mediaIds, offset, pageInfo.PageSize, pageInfo.LatestId)
  506. var wg sync.WaitGroup
  507. wg.Add(len(medias))
  508. for i := 0; i < len(medias); i++ {
  509. go func(media *mediaService.MediaDTO) {
  510. defer wg.Done()
  511. idStr := strings.Split(media.PermissionIDs, ",")
  512. var ids []int
  513. ids, err = stringUtils.StringToIntSlice(idStr)
  514. if err != nil {
  515. logger.Error("获取品种列表失败:%v", err)
  516. }
  517. media.PermissionNames = getMediaPermissionNames(ids)
  518. if !isLogin {
  519. media.Src = ""
  520. }
  521. }(&medias[i])
  522. }
  523. wg.Wait()
  524. if err != nil {
  525. err = exception.New(exception.SearchReportPageFailed)
  526. }
  527. return
  528. }