12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085 |
- package report
- import (
- "encoding/json"
- "errors"
- logger "eta/eta_mini_ht_api/common/component/log"
- "eta/eta_mini_ht_api/common/exception"
- "eta/eta_mini_ht_api/common/utils/date"
- "eta/eta_mini_ht_api/common/utils/page"
- permissionService "eta/eta_mini_ht_api/domian/config"
- mediaService "eta/eta_mini_ht_api/domian/media"
- productService "eta/eta_mini_ht_api/domian/merchant"
- reportService "eta/eta_mini_ht_api/domian/report"
- userService "eta/eta_mini_ht_api/domian/user"
- productDao "eta/eta_mini_ht_api/models/merchant"
- userDao "eta/eta_mini_ht_api/models/user"
- user "eta/eta_mini_ht_api/service/user"
- "fmt"
- "gorm.io/gorm"
- "strconv"
- "strings"
- "sync"
- "time"
- )
- const (
- SourceETA = "ETA"
- SourceHT = "HT"
- RiskLevelUnMatch = "unMatch"
- RiskLevelUnTest = "unTest"
- RiskLevelExpired = "expired"
- RiskLevelMatch = "match"
- defaultProductPrice = "0"
- )
- type PublishRankedReport struct {
- Id int `json:"reportId"`
- OrgId int `json:"orgId"`
- Title string `json:"title"`
- Abstract string `json:"abstract"`
- SecondPermissions map[int]string `json:"-"`
- Permissions map[int]string `json:"-"`
- PermissionNames interface{} `json:"permissionNames,omitempty"`
- PublishedTime string `json:"publishedTime"`
- CoverUrl string `json:"coverUrl"`
- RiskLevel string `json:"riskLevel"`
- IsFree bool `json:"isFree"`
- Price string `json:"price"`
- IsSubscribe bool `json:"isSubscribe"`
- Login bool `json:"login"`
- }
- type HotRankedReport struct {
- Id int `json:"reportId"`
- OrgId int `json:"orgId"`
- Abstract string `json:"abstract"`
- Count int `json:"count"`
- Title string `json:"title"`
- PublishedTime string `json:"publishedTime"`
- SecondPermissions map[int]string `json:"-"`
- Permissions map[int]string `json:"-"`
- PermissionNames interface{} `json:"permissionNames,omitempty"`
- CoverUrl string `json:"coverUrl"`
- RiskLevel string `json:"riskLevel"`
- IsFree bool `json:"isFree"`
- Price string `json:"price"`
- IsSubscribe bool `json:"isSubscribe"`
- Login bool `json:"login"`
- }
- //type PermissionNode struct {
- // ID int `json:"id"`
- // Name string `json:"name"`
- // ParentID int `json:"parentId"`
- // Children []*PermissionNode `json:"children,omitempty"`
- //}
- type RecordCount struct {
- UserId int
- TraceId string
- Mobile string
- ReportId int
- IpAddress string
- Location string
- Referer string
- Additional string
- }
- func matchRiskLevel(userId int, report reportService.ReportDTO) (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:%v", userProfile.Mobile)
- riskLevelMatch = RiskLevelExpired
- return
- }
- level, err := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
- if err != nil {
- logger.Error("获取eta报告风险等级失败:%v", err)
- return
- }
- permissions := reportService.GetReportSecondPermissionsById(report.OrgId, report.Source)
- if len(permissions) == 0 {
- logger.Error("获取eta报告分类失败:%v", err)
- riskLevelMatch = RiskLevelUnMatch
- return
- }
- var permissionIds []int
- for _, permission := range permissions {
- permissionIds = append(permissionIds, permission.PermissionId)
- }
- 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 getHighestRiskLevel(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 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 GetReportById(reportId int, login bool, userId int) (report reportService.ReportDTO, err error) {
- report, err = reportService.GetGetReportById(reportId)
- if err != nil {
- logger.Error("获取研报失败:%v", err)
- err = exception.New(exception.GetReportFailed)
- return
- }
- var status string
- status, err = matchRiskLevel(userId, report)
- if err != nil {
- logger.Error("匹配风险等级失败:%v", err)
- err = exception.New(exception.ReportRiskLevelUnSet)
- return
- }
- var pdfUrl string
- switch report.Source {
- case SourceETA:
- var detail reportService.ETAReportDTO
- detail, err = getETAReportDetail(&report)
- if err != nil {
- logger.Error("获取研报详情失败失败:%v", err)
- err = exception.New(exception.GetReportFailed)
- return
- }
- if !login {
- detail.Content = ""
- report.RiskLevelStatus = RiskLevelUnMatch
- report.Login = false
- } else {
- if status != RiskLevelMatch {
- detail.Content = ""
- }
- report.RiskLevelStatus = status
- report.Login = true
- }
- var jsonStr []byte
- jsonStr, err = json.Marshal(detail)
- if err != nil {
- logger.Error("生成研报详情失败:%v", err)
- err = exception.New(exception.GetReportFailed)
- }
- report.Detail = jsonStr
- return
- case SourceHT:
- pdfUrl, err = getHTReportDetail(&report)
- if err != nil {
- logger.Error("获取研报详情失败失败:%v")
- err = exception.New(exception.GetReportFailed)
- return
- }
- if !login {
- report.PdfUrl = ""
- report.RiskLevelStatus = RiskLevelUnMatch
- report.Login = false
- } else {
- if status == RiskLevelMatch {
- report.PdfUrl = pdfUrl
- }
- report.RiskLevelStatus = status
- report.Login = true
- }
- return
- default:
- logger.Error("不支持的研报来演:%v")
- err = exception.New(exception.GetReportFailed)
- return
- }
- }
- func getETAReportDetail(report *reportService.ReportDTO) (etaReport reportService.ETAReportDTO, err error) {
- return reportService.GetETAReport(report.OrgId)
- }
- func getHTReportDetail(report *reportService.ReportDTO) (url string, err error) {
- return reportService.GetHtReport(report.OrgId)
- }
- func GetTotalPageCountByPermissionIds(permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids map[string][]int) {
- return getCount(permissionIds, isLogin, userId)
- //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 reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, mapping.ProductRiskLevel)
- //} 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 reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, "")
- //}
- }
- 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
- }
- // ParseRiskLevel 解析风险等级字符串,并返回数字部分
- 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 SearchReportList(key string, Ids []int, pageInfo page.PageInfo, isLogin bool, userId int) (list []reportService.ReportDTO, err error) {
- offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
- var reports []reportService.ReportDTO
- reports, err = reportService.SearchReportList(key, Ids, offset, pageInfo.PageSize, pageInfo.LatestId)
- list, err = dealReportInfo(reports, isLogin, userId)
- //var wg sync.WaitGroup
- //wg.Add(len(reports))
- //for i := 0; i < len(reports); i++ {
- // go func(report *reportService.ReportDTO) {
- // defer wg.Done()
- // report.Login = isLogin
- // report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
- // permissions := getReportSecondPermissions(report.OrgId, report.Source)
- // if len(permissions) == 0 {
- // return
- // }
- // riskNum := getHighestRiskLevel(permissions)
- // report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- // var src string
- // src, err = mediaService.GetImageSrc(report.CoverSrc)
- // if err != nil {
- // logger.Error("获取图片地址失败:%v", err)
- // src = ""
- // } else {
- // report.CoverUrl = src
- // }
- // //下查询产品信息
- // product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- // if pdErr != nil {
- // if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- // report.Price = defaultProductPrice
- // report.IsFree = true
- // report.IsSubscribe = false
- // } else {
- // report.Price = defaultProductPrice
- // report.IsFree = false
- // report.IsSubscribe = false
- // }
- // } else {
- // report.Price = product.Price.String()
- // report.IsFree = false
- // if isLogin {
- // subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
- // if subscribeErr != nil {
- // report.IsSubscribe = false
- // } else {
- // report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
- // }
- // }
- // pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
- // if parseErr != nil {
- // return
- // }
- // rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
- // if parseErr != nil {
- // return
- // }
- // if rpRiskNum <= pdRiskNum {
- // report.RiskLevel = product.RiskLevel
- // }
- // }
- // list = append(list, *report)
- // }(&reports[i])
- //}
- //wg.Wait()
- if err != nil {
- err = exception.New(exception.SearchReportPageFailed)
- }
- return
- }
- func RangeSearchByAnalyst(analystName string, userId int) (total int64, latestId int64, ids []int) {
- return getCountByAnalyst(nil, true, userId, analystName)
- ////登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
- //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:%v", userProfile.Mobile)
- // return
- //}
- //if userProfile.RiskLevelStatus == user.RiskExpired {
- // logger.Error("客户风险等级已过期,mobile:%v", 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 reportService.GetTotalPageCountByAnalyst(analystName, filterPermissionIds)
- }
- func RangeSearch(isLogin bool, userId int) (total int64, latestId int64, orgIds map[string][]int) {
- return getCount(nil, isLogin, userId)
- }
- func dealReportInfo(list []reportService.ReportDTO, isLogin bool, userId int) (resultList []reportService.ReportDTO, err error) {
- var wg sync.WaitGroup
- wg.Add(len(list))
- for i := 0; i < len(list); i++ {
- go func(report *reportService.ReportDTO) {
- defer wg.Done()
- report.Login = isLogin
- report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
- permissions := getReportSecondPermissions(report.OrgId, report.Source)
- if len(permissions) == 0 {
- return
- }
- riskNum := getHighestRiskLevel(permissions)
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- var src string
- src, err = mediaService.GetImageSrc(report.CoverSrc)
- if err != nil {
- logger.Error("获取图片地址失败:%v", err)
- src = ""
- } else {
- report.CoverUrl = src
- }
- //下查询产品信息
- product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- if pdErr != nil {
- if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- report.Price = defaultProductPrice
- report.IsFree = true
- report.IsSubscribe = false
- } else {
- report.Price = defaultProductPrice
- report.IsFree = false
- report.IsSubscribe = false
- }
- } else {
- report.Price = product.Price.String()
- report.IsFree = false
- if isLogin {
- subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
- if subscribeErr != nil {
- report.IsSubscribe = false
- } else {
- report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
- }
- }
- pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
- if parseErr != nil {
- return
- }
- rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
- if parseErr != nil {
- return
- }
- if rpRiskNum <= pdRiskNum {
- report.RiskLevel = product.RiskLevel
- }
- }
- }(&list[i])
- }
- wg.Wait()
- resultList = list
- return
- }
- // GetReportPage 分页获取报告列表
- func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool, isLogin bool, userId int) (reports []reportService.ReportDTO, err error) {
- var list []reportService.ReportDTO
- list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
- reports, err = dealReportInfo(list, isLogin, userId)
- ////并发获取研报的标签
- //var wg sync.WaitGroup
- //wg.Add(len(list))
- //for i := 0; i < len(list); i++ {
- // go func(report *reportService.ReportDTO) {
- // defer wg.Done()
- // report.Login = isLogin
- // report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
- // permissions := getReportSecondPermissions(report.OrgId, report.Source)
- // if len(permissions) == 0 {
- // return
- // }
- // riskNum := getHighestRiskLevel(permissions)
- // report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- // var src string
- // src, err = mediaService.GetImageSrc(report.CoverSrc)
- // if err != nil {
- // logger.Error("获取图片地址失败:%v", err)
- // src = ""
- // } else {
- // report.CoverUrl = src
- // }
- // //下查询产品信息
- // product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- // if pdErr != nil {
- // if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- // report.Price = defaultProductPrice
- // report.IsFree = true
- // report.IsSubscribe = false
- // } else {
- // report.Price = defaultProductPrice
- // report.IsFree = false
- // report.IsSubscribe = false
- // }
- // } else {
- // report.Price = product.Price.String()
- // report.IsFree = false
- // if isLogin {
- // subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
- // if subscribeErr != nil {
- // report.IsSubscribe = false
- // } else {
- // report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
- // }
- // }
- // pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
- // if parseErr != nil {
- // return
- // }
- // rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
- // if parseErr != nil {
- // return
- // }
- // if rpRiskNum <= pdRiskNum {
- // report.RiskLevel = product.RiskLevel
- // }
- // }
- // reports = append(reports, *report)
- // }(&list[i])
- //}
- //wg.Wait()
- if err != nil {
- err = exception.New(exception.QueryReportPageFailed)
- }
- return
- }
- // func GetTotalPageCountByAnalyst(analyst string) (total int64, latestId int64) {
- // return reportService.GetTotalPageCountByAnalyst(analyst)
- // }
- func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string, reportIds []int) (list []reportService.ReportDTO, err error) {
- list, err = reportService.GetReportPageByAnalyst(pageInfo, analyst, reportIds)
- //并发获取研报的标签
- var wg sync.WaitGroup
- wg.Add(len(list))
- for i := 0; i < len(list); i++ {
- go func(report *reportService.ReportDTO) {
- defer wg.Done()
- report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
- }(&list[i])
- }
- wg.Wait()
- if err != nil {
- err = exception.New(exception.QueryReportPageFailed)
- }
- return
- }
- func CountReport(count RecordCount) (traceId string, err error) {
- dto := convertToRecordCountDTO(count)
- return userService.CountReport(dto)
- }
- func GetRandedReportByWeeklyHot(limit int, isLogin bool, userId int, pdRiskLevel string) (reports []HotRankedReport, err error) {
- end := time.Now()
- begin := date.GetBeginOfTheWeek(end, time.Monday)
- hotReports := userService.GetHotReports(begin.Format(time.DateOnly), end.Format(time.DateOnly), limit)
- if len(hotReports) > 0 {
- var dtoList []reportService.ReportDTO
- var ids []int
- for i := 0; i < len(hotReports); i++ {
- ids = append(ids, hotReports[i].ReportId)
- }
- dtoList, err = reportService.GetListByCondition("id", ids)
- if err != nil {
- logger.Error("获取本周最热研报列表失败:%v", err)
- err = exception.New(exception.GetHotRandListFailed)
- return
- }
- var filterList []reportService.ReportDTO
- if pdRiskLevel != "" {
- for _, report := range dtoList {
- product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- if pdErr != nil {
- if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- report.Price = defaultProductPrice
- report.IsFree = true
- report.IsSubscribe = false
- } else {
- logger.Error("查询产品失败:%v", pdErr)
- report.Price = defaultProductPrice
- report.IsFree = false
- report.IsSubscribe = false
- }
- filterList = append(filterList, report)
- } else {
- pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
- if paresErr != nil {
- logger.Error("解析风险等级失败:%v", err)
- continue
- }
- reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
- if paresErr != nil {
- logger.Error("解析风险等级失败:%v", err)
- continue
- }
- report.RiskLevel = product.RiskLevel
- if isLogin {
- subscribe, subErr := userService.GetUserSubscribe(product.Id, userId)
- if subErr != nil {
- logger.Error("查询用户订阅信息失败:%v,productId:%v,userId:%v", err, product.Id, userId)
- report.Price = product.Price.String()
- report.IsFree = false
- report.IsSubscribe = false
- } else {
- report.Price = product.Price.String()
- report.IsFree = false
- report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
- }
- }
- if pdRiskNum <= reRiskNum {
- filterList = append(filterList, report)
- }
- }
- }
- } else {
- filterList = dtoList
- for _, report := range filterList {
- product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- if pdErr != nil {
- if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- report.Price = defaultProductPrice
- report.IsFree = true
- report.IsSubscribe = false
- } else {
- logger.Error("查询产品失败:%v", pdErr)
- report.Price = defaultProductPrice
- report.IsFree = false
- report.IsSubscribe = false
- }
- } else {
- report.Price = product.Price.String()
- report.IsFree = false
- report.IsSubscribe = false
- report.RiskLevel = product.RiskLevel
- }
- }
- }
- var wg sync.WaitGroup
- wg.Add(len(filterList))
- for i := 0; i < len(filterList); i++ {
- go func(report *reportService.ReportDTO) {
- defer wg.Done()
- report.Login = isLogin
- report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
- report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
- permissions := getReportSecondPermissions(report.OrgId, report.Source)
- var riskNum int
- if len(permissions) == 0 {
- riskNum = 0
- } else {
- riskNum = getHighestRiskLevel(permissions)
- }
- if report.RiskLevel == "" {
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- } else {
- reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
- if paresErr != nil {
- logger.Error("解析风险等级失败:%v", err)
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- } else {
- if reRiskNum <= riskNum {
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- }
- }
- }
- var label []string
- for _, permission := range report.Permissions {
- label = append(label, permission)
- }
- report.PermissionNames = label
- }(&filterList[i])
- }
- wg.Wait()
- reports = make([]HotRankedReport, len(ids))
- for i := 0; i < len(filterList); i++ {
- risk, parseErr := parseRiskLevel(filterList[i].RiskLevel)
- if parseErr != nil || risk == 0 {
- continue
- }
- report := convertToHotRankedReport(filterList[i])
- for j := 0; j < len(hotReports); j++ {
- if hotReports[j].ReportId == report.Id {
- report.Count = hotReports[j].Count
- reports[j] = report
- break
- }
- }
- }
- } else {
- reports = []HotRankedReport{}
- }
- return
- }
- func GetRandedReportByPublishTimeWeekly(limit int, week bool, isLogin bool, userId int, pdRiskLevel string) (reports []PublishRankedReport, err error) {
- dtoList, err := reportService.GetListOrderByConditionWeekly(week, "published_time", limit, reportService.DESC)
- if err != nil {
- logger.Error("获取最新发布的研报列表失败:%v", err)
- err = exception.New(exception.GetPublishedRandListFailed)
- return
- }
- var filterList []reportService.ReportDTO
- if pdRiskLevel != "" {
- for _, report := range dtoList {
- product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- if pdErr != nil {
- if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- report.Price = defaultProductPrice
- report.IsFree = true
- report.IsSubscribe = false
- } else {
- logger.Error("查询产品失败:%v", pdErr)
- report.Price = defaultProductPrice
- report.IsFree = false
- report.IsSubscribe = false
- }
- filterList = append(filterList, report)
- } else {
- pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
- if paresErr != nil {
- logger.Error("解析风险等级失败:%v", err)
- continue
- }
- reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
- if paresErr != nil {
- logger.Error("解析风险等级失败:%v", err)
- continue
- }
- report.RiskLevel = product.RiskLevel
- if isLogin {
- subscribe, subErr := userService.GetUserSubscribe(product.Id, userId)
- if subErr != nil {
- logger.Error("查询用户订阅信息失败:%v,productId:%v,userId:%v", err, product.Id, userId)
- report.Price = product.Price.String()
- report.IsFree = false
- report.IsSubscribe = false
- } else {
- report.Price = product.Price.String()
- report.IsFree = false
- report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
- }
- }
- if pdRiskNum <= reRiskNum {
- filterList = append(filterList, report)
- }
- }
- }
- } else {
- filterList = dtoList
- for _, report := range filterList {
- product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
- if pdErr != nil {
- if errors.Is(pdErr, gorm.ErrRecordNotFound) {
- report.Price = defaultProductPrice
- report.IsFree = true
- report.IsSubscribe = false
- } else {
- logger.Error("查询产品失败:%v", pdErr)
- report.Price = defaultProductPrice
- report.IsFree = false
- report.IsSubscribe = false
- }
- } else {
- report.Price = product.Price.String()
- report.IsFree = false
- report.IsSubscribe = false
- report.RiskLevel = product.RiskLevel
- }
- }
- }
- //并发获取研报的标签
- var wg sync.WaitGroup
- wg.Add(len(filterList))
- for i := 0; i < len(filterList); i++ {
- go func(report *reportService.ReportDTO) {
- defer wg.Done()
- report.Login = isLogin
- report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
- report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
- report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
- var riskNum int
- permissions := getReportSecondPermissions(report.OrgId, report.Source)
- if len(permissions) == 0 {
- riskNum = 0
- } else {
- riskNum = getHighestRiskLevel(permissions)
- }
- if report.RiskLevel == "" {
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- } else {
- reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
- if paresErr != nil {
- logger.Error("解析风险等级失败:%v", err)
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- } else {
- if reRiskNum <= riskNum {
- report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
- }
- }
- }
- }(&filterList[i])
- }
- wg.Wait()
- reports = convertToPublishRankedReportList(filterList)
- return
- }
- func getReportPermissionNames(id int, source string) (labels []string) {
- permissions := reportService.GetReportPermissionsById(id, source)
- for _, permission := range permissions {
- labels = append(labels, permission.PermissionName)
- }
- return
- }
- func getReportSecondPermissionsMap(id int, source string) (permissionMap map[int]string) {
- permissionMap = make(map[int]string)
- permissions := reportService.GetReportSecondPermissionsById(id, source)
- for _, permission := range permissions {
- permissionMap[permission.PermissionId] = permission.PermissionName
- }
- return
- }
- func getReportSecondPermissions(id int, source string) (permissionList []permissionService.PermissionDTO) {
- return reportService.GetReportSecondPermissionsById(id, source)
- }
- func getReportPermissionsMap(id int, source string) (permissionMap map[int]string) {
- permissionMap = make(map[int]string)
- permissions := reportService.GetReportPermissionsById(id, source)
- for _, permission := range permissions {
- permissionMap[permission.PermissionId] = permission.PermissionName
- }
- return
- }
- func GetPermissionList() (root *permissionService.PermissionNode, err error) {
- return permissionService.GetPermissionList()
- }
- func convertToHotRankedReport(dto reportService.ReportDTO) (report HotRankedReport) {
- src, err := mediaService.GetImageSrc(dto.CoverSrc)
- if err != nil {
- logger.Error("获取封面图片失败:%v", err)
- src = ""
- }
- report = HotRankedReport{
- Id: dto.ReportID,
- OrgId: dto.OrgId,
- Abstract: dto.Abstract,
- PublishedTime: dto.PublishedTime,
- Title: dto.Title,
- SecondPermissions: dto.SecondPermission,
- Permissions: dto.Permissions,
- PermissionNames: dto.PermissionNames,
- CoverUrl: src,
- IsSubscribe: dto.IsSubscribe,
- IsFree: dto.IsFree,
- Price: dto.Price,
- RiskLevel: dto.RiskLevel,
- Login: dto.Login,
- }
- return
- }
- func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
- reports = []PublishRankedReport{}
- for _, dto := range dtoList {
- risk, err := parseRiskLevel(dto.RiskLevel)
- if err != nil || risk == 0 {
- continue
- }
- src, err := mediaService.GetImageSrc(dto.CoverSrc)
- if err != nil {
- logger.Error("获取封面图片失败:%v", err)
- src = ""
- }
- report := PublishRankedReport{
- Id: dto.ReportID,
- OrgId: dto.OrgId,
- PublishedTime: dto.PublishedTime,
- Abstract: dto.Abstract,
- Title: dto.Title,
- Permissions: dto.Permissions,
- SecondPermissions: dto.SecondPermission,
- PermissionNames: dto.PermissionNames,
- CoverUrl: src,
- IsSubscribe: dto.IsSubscribe,
- IsFree: dto.IsFree,
- Price: dto.Price,
- RiskLevel: dto.RiskLevel,
- Login: dto.Login,
- }
- reports = append(reports, report)
- }
- return
- }
- func convertToRecordCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
- return userService.RecordCountDTO{
- UserId: record.UserId,
- TraceId: record.TraceId,
- Mobile: record.Mobile,
- SourceId: record.ReportId,
- IpAddress: record.IpAddress,
- Location: record.Location,
- Referer: record.Referer,
- Additional: record.Additional,
- }
- }
- func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
- ids, err = reportService.GetReportByIdListByOrgIds(orgIds)
- if err != nil {
- logger.Error("获取报告ID列表失败:%v", err)
- err = exception.New(exception.GetReportSearchRangeFailed)
- }
- return
- }
- func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, riskLevel string, err error) {
- return checkUserRisk(nil, isLogin, userId)
- }
- func checkUserRisk(permissionIds []int, isLogin bool, userId int) (filterPermissionIds []int, riskLevel string, 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.Warn("客户未做风险等级测评,mobile:%v", userProfile.Mobile)
- }
- if userProfile.RiskLevelStatus == user.RiskExpired {
- logger.Warn("客户风险等级已过期,mobile:%v", userProfile.Mobile)
- }
- mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
- if mappingErr != nil {
- logger.Error("查询产品风险等级映射失败:%v", mappingErr)
- err = 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)
- riskLevel = mapping.ProductRiskLevel
- if len(permissionList) == 0 {
- return
- }
- for _, permission := range permissionList {
- filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
- }
- return
- } 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)
- }
- for _, permission := range permissionList {
- filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
- }
- //查询品种
- return
- }
- }
- func getCount(permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids map[string][]int) {
- filterPermissionIds, riskLevel, err := checkUserRisk(permissionIds, isLogin, userId)
- if err != nil {
- logger.Error("校验用户风险等级失败:%v", err)
- return
- }
- return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, riskLevel)
- }
- func getCountByAnalyst(permissionIds []int, isLogin bool, userId int, analystName string) (total int64, latestId int64, ids []int) {
- filterPermissionIds, riskLevel, err := checkUserRisk(permissionIds, isLogin, userId)
- if err != nil {
- logger.Error("校验用户风险等级失败:%v", err)
- return
- }
- return reportService.GetTotalPageCountByAnalyst(analystName, filterPermissionIds, riskLevel)
- }
|