media_service.go 16 KB

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