media_service.go 14 KB

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