123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- package media
- import (
- "errors"
- logger "eta/eta_mini_ht_api/common/component/log"
- "eta/eta_mini_ht_api/common/exception"
- "eta/eta_mini_ht_api/common/utils/page"
- stringUtils "eta/eta_mini_ht_api/common/utils/string"
- permissionService "eta/eta_mini_ht_api/domian/config"
- mediaService "eta/eta_mini_ht_api/domian/media"
- userService "eta/eta_mini_ht_api/domian/user"
- "eta/eta_mini_ht_api/service/user"
- "fmt"
- "gorm.io/gorm"
- "strconv"
- "strings"
- "sync"
- )
- const (
- RiskLevelUnMatch = "unMatch"
- RiskLevelUnTest = "unTest"
- RiskLevelExpired = "expired"
- RiskLevelMatch = "match"
- )
- type RecordCount struct {
- UserId int
- Mobile string
- MediaId int
- MediaType string
- IpAddress string
- Location string
- Referer string
- Additional string
- }
- func convertToMediaCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
- return userService.RecordCountDTO{
- UserId: record.UserId,
- Mobile: record.Mobile,
- SourceId: record.MediaId,
- }
- }
- func CountMedia(count RecordCount) (err error) {
- meida, err := mediaService.GetMediaById(count.MediaType, count.MediaId)
- if err != nil {
- err = exception.New(exception.MediaFoundFailed)
- return
- }
- dto := convertToMediaCountDTO(count)
- return userService.CountMedia(dto, meida.MediaType)
- }
- func GetTotalPageCount(mediaType string) (count int64, latestId int64) {
- if mediaType == "" {
- return
- }
- return mediaService.GetTotalPageCount(mediaType)
- }
- func GetTotalPageCountByAnalystId(mediaType string, analystId int) (total int64, latestId int64) {
- if mediaType == "" {
- return
- }
- return mediaService.GetTotalPageCountByAnalystId(mediaType, analystId)
- }
- func RangeSearch(mediaType string, isLogin bool, userId int) (total int64, latestId int64, ids []int) {
- var err error
- //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
- if isLogin {
- userProfile, userErr := user.GetUserProfile(userId)
- if userErr != nil {
- if errors.Is(userErr, gorm.ErrRecordNotFound) {
- err = exception.New(exception.TemplateUserNotFound)
- } else {
- err = exception.New(exception.TemplateUserFoundFailed)
- }
- logger.Error("分页查询报告列表失败:%v", err)
- return
- }
- //获取产品风险等级
- if userProfile.RiskLevel == user.RiskUnTest {
- logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
- return
- }
- if userProfile.RiskLevelStatus == user.RiskExpired {
- logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
- return
- }
- mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
- if mappingErr != nil {
- logger.Error("查询产品风险等级映射失败:%v", mappingErr)
- return
- }
- var permissionList []permissionService.PermissionDTO
- //获取所有设置风险等级的品种
- permissionList, err = permissionService.GetPermissionListWithRisk()
- permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
- if len(permissionList) == 0 {
- return
- }
- var filterPermissionIds []int
- for _, permission := range permissionList {
- filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
- }
- return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds)
- } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
- var permissionList []permissionService.PermissionDTO
- //获取所有设置风险等级的品种
- permissionList, err = permissionService.GetPermissionListWithRisk()
- if err != nil {
- logger.Error("根据ID查询品种列表失败:%v", err)
- }
- var filterPermissionIds []int
- for _, permission := range permissionList {
- filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
- }
- //查询品种
- return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds)
- }
- }
- func GetTotalPageCountByPermissionIds(mediaType string, permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids []int) {
- if mediaType == "" {
- return
- }
- var err error
- //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
- if isLogin {
- userProfile, userErr := user.GetUserProfile(userId)
- if userErr != nil {
- if errors.Is(userErr, gorm.ErrRecordNotFound) {
- err = exception.New(exception.TemplateUserNotFound)
- } else {
- err = exception.New(exception.TemplateUserFoundFailed)
- }
- logger.Error("分页查询媒体列表失败:%v", err)
- return
- }
- //获取产品风险等级
- if userProfile.RiskLevel == user.RiskUnTest {
- logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
- return
- }
- if userProfile.RiskLevelStatus == user.RiskExpired {
- logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
- return
- }
- mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
- if mappingErr != nil {
- logger.Error("查询产品风险等级映射失败:%v", mappingErr)
- return
- }
- var permissionList []permissionService.PermissionDTO
- if len(permissionIds) == 0 {
- //获取所有设置风险等级的品种
- permissionList, err = permissionService.GetPermissionListWithRisk()
- } else {
- //更具id过滤设置了风险等级的品种
- permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
- }
- permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
- if len(permissionList) == 0 {
- return
- }
- var filterPermissionIds []int
- for _, permission := range permissionList {
- filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
- }
- return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds)
- } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
- var permissionList []permissionService.PermissionDTO
- if len(permissionIds) == 0 {
- //获取所有设置风险等级的品种
- permissionList, err = permissionService.GetPermissionListWithRisk()
- } else {
- //更具id过滤设置了风险等级的品种
- permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
- }
- if err != nil {
- logger.Error("根据ID查询品种列表失败:%v", err)
- }
- var filterPermissionIds []int
- for _, permission := range permissionList {
- filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
- }
- //查询品种
- return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, filterPermissionIds)
- }
- //if len(permissionIds) == 0 {
- // total, latestId = mediaService.GetTotalPageCount(mediaType)
- // ids = []int{}
- // return
- //}
- //return mediaService.GetMediaPermissionMappingByPermissionIds(mediaType, permissionIds)
- }
- func parseRiskLevel(level string) (int, error) {
- parts := strings.Split(level, "R")
- if len(parts) < 2 {
- return 0, fmt.Errorf("无效的风险等级: %s", level)
- }
- numberStr := parts[1]
- number, err := strconv.Atoi(numberStr)
- if err != nil {
- return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
- }
- return number, nil
- }
- func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, riskLevel string) (resultList []permissionService.PermissionDTO) {
- riskLevelNum, err := parseRiskLevel(riskLevel)
- if err != nil {
- logger.Error("风险等级解析失败:%v", err)
- return
- }
- for _, permission := range permissionList {
- pRiskNum, riskErr := parseRiskLevel(permission.RiskLevel)
- if riskErr != nil {
- logger.Error("解析品种风险等级失败 permission:%d,risk:%v", permission.PermissionId, permission.RiskLevel)
- continue
- }
- if pRiskNum <= riskLevelNum {
- resultList = append(resultList, permission)
- }
- }
- return
- }
- func SearchMaxMediaId(mediaType string, key string) (total int64, latestId int64) {
- return mediaService.SearchMaxMediaId(mediaType, key)
- }
- func GetMediaById(mediaType string, mediaId int, isLogin bool, userId int) (media mediaService.MediaDTO, err error) {
- media, err = mediaService.GetMediaById(mediaType, mediaId)
- if err != nil {
- logger.Error("获取媒体失败:%v", err)
- err = exception.New(exception.MediaFoundFailed)
- return
- }
- var status string
- status, err = matchRiskLevel(userId, media)
- if err != nil {
- logger.Error("匹配风险等级失败:%v", err)
- err = exception.New(exception.ReportRiskLevelUnSet)
- return
- }
- idStr := strings.Split(media.PermissionIDs, ",")
- var ids []int
- ids, err = stringUtils.StringToIntSlice(idStr)
- if err != nil {
- logger.Error("品种名称列表转换失败:%v", err)
- return
- }
- media.PermissionNames = getMediaPermissionNames(ids)
- if isLogin {
- media.Login = true
- if status != RiskLevelMatch {
- media.Src = ""
- }
- media.RiskLevelStatus = status
- } else {
- logger.Info("当前用户未登录,展示部分详情")
- media.Src = ""
- media.RiskLevelStatus = RiskLevelUnMatch
- media.Login = false
- }
- return
- }
- func matchRiskLevel(userId int, media mediaService.MediaDTO) (riskLevelMatch string, err error) {
- userProfile, userErr := user.GetUserProfile(userId)
- if userErr != nil {
- if errors.Is(userErr, gorm.ErrRecordNotFound) {
- logger.Error("用户信息不存在,mobile:%d", userProfile.Mobile)
- err = exception.New(exception.TemplateUserNotFound)
- return
- } else {
- logger.Error("获取用户信息失败:%v", userErr)
- err = exception.New(exception.TemplateUserFoundFailed)
- return
- }
- }
- //比较风险等级
- if userProfile.RiskLevelStatus == user.RiskUnTest {
- logger.Info("客户风险等级未测试,mobile:%d", userProfile.Mobile)
- riskLevelMatch = RiskLevelUnTest
- return
- }
- if userProfile.RiskLevelStatus == user.RiskExpired {
- logger.Info("客户风险等级已过期,mobile:%d", userProfile.Mobile)
- riskLevelMatch = RiskLevelExpired
- return
- }
- level, err := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
- if err != nil {
- logger.Error("获取媒体风险等级设置失败:%v", err)
- return
- }
- var permissionIds []int
- permissionStrList := strings.Split(media.PermissionIDs, ",")
- permissionIds, err = stringUtils.StringToIntSlice(permissionStrList)
- if err != nil {
- logger.Error("解析媒体品种ID列表失败:%v", err)
- }
- permissionDTOs, err := permissionService.GetPermissionListByIds(permissionIds)
- if err != nil {
- logger.Error("获取品种风险等级失败:%v", err)
- return
- }
- //能够查看最高等级
- matchNum, err := parseRiskLevel(level.ProductRiskLevel)
- if err != nil {
- logger.Error("解析风险等级失败:%v", err)
- return
- }
- if len(permissionDTOs) == 0 {
- logger.Error("当前报告对应品种未设置风险等级")
- err = exception.New(exception.ReportRiskLevelUnSet)
- return
- }
- //能够查看需要的最小等级
- num := getLowestRiskLevel(permissionDTOs)
- if num > matchNum {
- riskLevelMatch = RiskLevelUnMatch
- return
- } else {
- riskLevelMatch = RiskLevelMatch
- return
- }
- }
- func getLowestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
- for _, permission := range permissions {
- pRiskNum, err := parseRiskLevel(permission.RiskLevel)
- if err != nil {
- logger.Error("解析风险等级失败:%v", err)
- continue
- }
- if riskLevelNum == 0 {
- riskLevelNum = pRiskNum
- } else {
- if riskLevelNum > pRiskNum {
- riskLevelNum = pRiskNum
- }
- }
- }
- return
- }
- func GetMediaPageByAnalystId(mediaType string, pageInfo page.PageInfo, analystId int) (list []mediaService.MediaDTO, err error) {
- list, err = mediaService.GetMediaPageByAnalystId(mediaType, pageInfo, analystId)
- if err != nil {
- err = exception.New(exception.GetAnalystMediaListFailed)
- return
- }
- list = make([]mediaService.MediaDTO, 0)
- //并发获取媒体的标签
- var wg sync.WaitGroup
- wg.Add(len(list))
- for i := 0; i < len(list); i++ {
- go func(media *mediaService.MediaDTO) {
- defer wg.Done()
- idStr := strings.Split(media.PermissionIDs, ",")
- var ids []int
- ids, err = stringUtils.StringToIntSlice(idStr)
- if err != nil {
- logger.Error("品种名称列表转换失败:%v", err)
- }
- media.PermissionNames = getMediaPermissionNames(ids)
- }(&list[i])
- }
- wg.Wait()
- if err != nil {
- err = exception.New(exception.QueryReportPageFailed)
- }
- return
- }
- func GetMediaPageByIds(mediaType string, pageInfo page.PageInfo, mediaIds []int, isLogin bool) (list []mediaService.MediaDTO, err error) {
- list, err = mediaService.GetMediaPageByIds(mediaType, pageInfo, mediaIds)
- if err != nil {
- err = exception.New(exception.GetMediaListFailed)
- return
- }
- //并发获取媒体的标签
- var wg sync.WaitGroup
- wg.Add(len(list))
- for i := 0; i < len(list); i++ {
- go func(media *mediaService.MediaDTO) {
- defer wg.Done()
- idStr := strings.Split(media.PermissionIDs, ",")
- var ids []int
- ids, err = stringUtils.StringToIntSlice(idStr)
- if err != nil {
- logger.Error("品种名称列表转换失败:%v", err)
- }
- media.PermissionNames = getMediaPermissionNames(ids)
- if !isLogin {
- media.Src = ""
- }
- }(&list[i])
- }
- wg.Wait()
- if err != nil {
- err = exception.New(exception.QueryReportPageFailed)
- }
- return
- }
- func getMediaPermissionNames(id []int) (labels []string) {
- permissions, err := mediaService.GetPermissionsByIds(id)
- if err != nil {
- logger.Error("查询品种名称列表失败:%v", err)
- labels = []string{}
- return
- }
- for _, permission := range permissions {
- labels = append(labels, permission.Name)
- }
- return
- }
- // stringToIntSlice 将一个包含数字字符串的切片转换为整数切片
- func SearchMediaList(mediaType string, key string, mediaIds []int, pageInfo page.PageInfo, isLogin bool) (medias []mediaService.MediaDTO, err error) {
- offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
- medias, err = mediaService.SearchMediaList(mediaType, key, mediaIds, offset, pageInfo.PageSize, pageInfo.LatestId)
- var wg sync.WaitGroup
- wg.Add(len(medias))
- for i := 0; i < len(medias); i++ {
- go func(media *mediaService.MediaDTO) {
- defer wg.Done()
- idStr := strings.Split(media.PermissionIDs, ",")
- var ids []int
- ids, err = stringUtils.StringToIntSlice(idStr)
- if err != nil {
- logger.Error("获取品种列表失败:%v", err)
- }
- media.PermissionNames = getMediaPermissionNames(ids)
- if !isLogin {
- media.Src = ""
- }
- }(&medias[i])
- }
- wg.Wait()
- if err != nil {
- err = exception.New(exception.SearchReportPageFailed)
- }
- return
- }
|