report_service.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020
  1. package report
  2. import (
  3. "encoding/json"
  4. "errors"
  5. logger "eta/eta_mini_ht_api/common/component/log"
  6. "eta/eta_mini_ht_api/common/exception"
  7. "eta/eta_mini_ht_api/common/utils/date"
  8. "eta/eta_mini_ht_api/common/utils/page"
  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. reportService "eta/eta_mini_ht_api/domian/report"
  13. userService "eta/eta_mini_ht_api/domian/user"
  14. productDao "eta/eta_mini_ht_api/models/merchant"
  15. userDao "eta/eta_mini_ht_api/models/user"
  16. user "eta/eta_mini_ht_api/service/user"
  17. "fmt"
  18. "gorm.io/gorm"
  19. "strconv"
  20. "strings"
  21. "sync"
  22. "time"
  23. )
  24. const (
  25. SourceETA = "ETA"
  26. SourceHT = "HT"
  27. RiskLevelUnMatch = "unMatch"
  28. RiskLevelUnTest = "unTest"
  29. RiskLevelExpired = "expired"
  30. RiskLevelMatch = "match"
  31. defaultProductPrice = "0"
  32. )
  33. type PublishRankedReport struct {
  34. Id int `json:"reportId"`
  35. OrgId int `json:"orgId"`
  36. Title string `json:"title"`
  37. Abstract string `json:"abstract"`
  38. SecondPermissions map[int]string `json:"-"`
  39. Permissions map[int]string `json:"-"`
  40. PermissionNames interface{} `json:"permissionNames,omitempty"`
  41. PublishedTime string `json:"publishedTime"`
  42. CoverUrl string `json:"coverUrl"`
  43. RiskLevel string `json:"riskLevel"`
  44. IsFree bool `json:"isFree"`
  45. Price string `json:"price"`
  46. IsSubscribe bool `json:"isSubscribe"`
  47. Login bool `json:"login"`
  48. }
  49. type HotRankedReport struct {
  50. Id int `json:"reportId"`
  51. OrgId int `json:"orgId"`
  52. Abstract string `json:"abstract"`
  53. Count int `json:"count"`
  54. Title string `json:"title"`
  55. PublishedTime string `json:"publishedTime"`
  56. SecondPermissions map[int]string `json:"-"`
  57. Permissions map[int]string `json:"-"`
  58. PermissionNames interface{} `json:"permissionNames,omitempty"`
  59. CoverUrl string `json:"coverUrl"`
  60. RiskLevel string `json:"riskLevel"`
  61. IsFree bool `json:"isFree"`
  62. Price string `json:"price"`
  63. IsSubscribe bool `json:"isSubscribe"`
  64. Login bool `json:"login"`
  65. }
  66. //type PermissionNode struct {
  67. // ID int `json:"id"`
  68. // Name string `json:"name"`
  69. // ParentID int `json:"parentId"`
  70. // Children []*PermissionNode `json:"children,omitempty"`
  71. //}
  72. type RecordCount struct {
  73. UserId int
  74. TraceId string
  75. Mobile string
  76. ReportId int
  77. IpAddress string
  78. Location string
  79. Referer string
  80. Additional string
  81. }
  82. func matchRiskLevel(userId int, report reportService.ReportDTO) (riskLevelMatch string, err error) {
  83. userProfile, userErr := user.GetUserProfile(userId)
  84. if userErr != nil {
  85. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  86. logger.Error("用户信息不存在,mobile:%d", userProfile.Mobile)
  87. err = exception.New(exception.TemplateUserNotFound)
  88. return
  89. } else {
  90. logger.Error("获取用户信息失败:%v", userErr)
  91. err = exception.New(exception.TemplateUserFoundFailed)
  92. return
  93. }
  94. }
  95. //比较风险等级
  96. if userProfile.RiskLevelStatus == user.RiskUnTest {
  97. logger.Info("客户风险等级未测试,mobile:%d", userProfile.Mobile)
  98. riskLevelMatch = RiskLevelUnTest
  99. return
  100. }
  101. if userProfile.RiskLevelStatus == user.RiskExpired {
  102. logger.Info("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  103. riskLevelMatch = RiskLevelExpired
  104. return
  105. }
  106. level, err := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  107. if err != nil {
  108. logger.Error("获取eta报告风险等级失败:%v", err)
  109. return
  110. }
  111. permissions := reportService.GetReportSecondPermissionsById(report.OrgId, report.Source)
  112. if len(permissions) == 0 {
  113. logger.Error("获取eta报告分类失败:%v", err)
  114. riskLevelMatch = RiskLevelUnMatch
  115. return
  116. }
  117. var permissionIds []int
  118. for _, permission := range permissions {
  119. permissionIds = append(permissionIds, permission.PermissionId)
  120. }
  121. permissionDTOs, err := permissionService.GetPermissionListByIds(permissionIds)
  122. if err != nil {
  123. logger.Error("获取品种风险等级失败:%v", err)
  124. return
  125. }
  126. //能够查看最高等级
  127. matchNum, err := parseRiskLevel(level.ProductRiskLevel)
  128. if err != nil {
  129. logger.Error("解析风险等级失败:%v", err)
  130. return
  131. }
  132. if len(permissionDTOs) == 0 {
  133. logger.Error("当前报告对应品种未设置风险等级")
  134. err = exception.New(exception.ReportRiskLevelUnSet)
  135. return
  136. }
  137. //能够查看需要的最小等级
  138. num := getLowestRiskLevel(permissionDTOs)
  139. if num > matchNum {
  140. riskLevelMatch = RiskLevelUnMatch
  141. return
  142. } else {
  143. riskLevelMatch = RiskLevelMatch
  144. return
  145. }
  146. }
  147. func getHighestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
  148. for _, permission := range permissions {
  149. pRiskNum, err := parseRiskLevel(permission.RiskLevel)
  150. if err != nil {
  151. logger.Error("解析风险等级失败:%v", err)
  152. continue
  153. }
  154. if riskLevelNum == 0 {
  155. riskLevelNum = pRiskNum
  156. } else {
  157. if riskLevelNum < pRiskNum {
  158. riskLevelNum = pRiskNum
  159. }
  160. }
  161. }
  162. return
  163. }
  164. func getLowestRiskLevel(permissions []permissionService.PermissionDTO) (riskLevelNum int) {
  165. for _, permission := range permissions {
  166. pRiskNum, err := parseRiskLevel(permission.RiskLevel)
  167. if err != nil {
  168. logger.Error("解析风险等级失败:%v", err)
  169. continue
  170. }
  171. if riskLevelNum == 0 {
  172. riskLevelNum = pRiskNum
  173. } else {
  174. if riskLevelNum > pRiskNum {
  175. riskLevelNum = pRiskNum
  176. }
  177. }
  178. }
  179. return
  180. }
  181. func GetReportById(reportId int, login bool, userId int) (report reportService.ReportDTO, err error) {
  182. report, err = reportService.GetGetReportById(reportId)
  183. if err != nil {
  184. logger.Error("获取研报失败:%v", err)
  185. err = exception.New(exception.GetReportFailed)
  186. return
  187. }
  188. var status string
  189. status, err = matchRiskLevel(userId, report)
  190. if err != nil {
  191. logger.Error("匹配风险等级失败:%v", err)
  192. err = exception.New(exception.ReportRiskLevelUnSet)
  193. return
  194. }
  195. var pdfUrl string
  196. switch report.Source {
  197. case SourceETA:
  198. var detail reportService.ETAReportDTO
  199. detail, err = getETAReportDetail(&report)
  200. if err != nil {
  201. logger.Error("获取研报详情失败失败:%v", err)
  202. err = exception.New(exception.GetReportFailed)
  203. return
  204. }
  205. if !login {
  206. detail.Content = ""
  207. report.RiskLevelStatus = RiskLevelUnMatch
  208. report.Login = false
  209. } else {
  210. if status != RiskLevelMatch {
  211. detail.Content = ""
  212. }
  213. report.RiskLevelStatus = status
  214. report.Login = true
  215. }
  216. var jsonStr []byte
  217. jsonStr, err = json.Marshal(detail)
  218. if err != nil {
  219. logger.Error("生成研报详情失败:%v", err)
  220. err = exception.New(exception.GetReportFailed)
  221. }
  222. report.Detail = jsonStr
  223. return
  224. case SourceHT:
  225. pdfUrl, err = getHTReportDetail(&report)
  226. if err != nil {
  227. logger.Error("获取研报详情失败失败:%v")
  228. err = exception.New(exception.GetReportFailed)
  229. return
  230. }
  231. if !login {
  232. report.PdfUrl = ""
  233. report.RiskLevelStatus = RiskLevelUnMatch
  234. report.Login = false
  235. } else {
  236. if status == RiskLevelMatch {
  237. report.PdfUrl = pdfUrl
  238. }
  239. report.RiskLevelStatus = status
  240. report.Login = true
  241. }
  242. return
  243. default:
  244. logger.Error("不支持的研报来演:%v")
  245. err = exception.New(exception.GetReportFailed)
  246. return
  247. }
  248. }
  249. func getETAReportDetail(report *reportService.ReportDTO) (etaReport reportService.ETAReportDTO, err error) {
  250. return reportService.GetETAReport(report.OrgId)
  251. }
  252. func getHTReportDetail(report *reportService.ReportDTO) (url string, err error) {
  253. return reportService.GetHtReport(report.OrgId)
  254. }
  255. func GetTotalPageCount() (total int64, latestId int64, err error) {
  256. return reportService.GetTotalPageCount()
  257. }
  258. func GetTotalPageCountByPermissionIds(permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids map[string][]int) {
  259. var err error
  260. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  261. if isLogin {
  262. userProfile, userErr := user.GetUserProfile(userId)
  263. if userErr != nil {
  264. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  265. err = exception.New(exception.TemplateUserNotFound)
  266. } else {
  267. err = exception.New(exception.TemplateUserFoundFailed)
  268. }
  269. logger.Error("分页查询报告列表失败:%v", err)
  270. return
  271. }
  272. //获取产品风险等级
  273. if userProfile.RiskLevel == user.RiskUnTest {
  274. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  275. return
  276. }
  277. if userProfile.RiskLevelStatus == user.RiskExpired {
  278. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  279. return
  280. }
  281. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  282. if mappingErr != nil {
  283. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  284. return
  285. }
  286. var permissionList []permissionService.PermissionDTO
  287. if len(permissionIds) == 0 {
  288. //获取所有设置风险等级的品种
  289. permissionList, err = permissionService.GetPermissionListWithRisk()
  290. } else {
  291. //更具id过滤设置了风险等级的品种
  292. permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
  293. }
  294. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  295. if len(permissionList) == 0 {
  296. return
  297. }
  298. var filterPermissionIds []int
  299. for _, permission := range permissionList {
  300. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  301. }
  302. return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, mapping.ProductRiskLevel)
  303. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  304. var permissionList []permissionService.PermissionDTO
  305. if len(permissionIds) == 0 {
  306. //获取所有设置风险等级的品种
  307. permissionList, err = permissionService.GetPermissionListWithRisk()
  308. } else {
  309. //更具id过滤设置了风险等级的品种
  310. permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
  311. }
  312. if err != nil {
  313. logger.Error("根据ID查询品种列表失败:%v", err)
  314. }
  315. var filterPermissionIds []int
  316. for _, permission := range permissionList {
  317. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  318. }
  319. //查询品种
  320. return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, "")
  321. }
  322. }
  323. func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, riskLevel string) (resultList []permissionService.PermissionDTO) {
  324. riskLevelNum, err := parseRiskLevel(riskLevel)
  325. if err != nil {
  326. logger.Error("风险等级解析失败:%v", err)
  327. return
  328. }
  329. for _, permission := range permissionList {
  330. pRiskNum, riskErr := parseRiskLevel(permission.RiskLevel)
  331. if riskErr != nil {
  332. logger.Error("解析品种风险等级失败 permission:%d,risk:%v", permission.PermissionId, permission.RiskLevel)
  333. continue
  334. }
  335. if pRiskNum <= riskLevelNum {
  336. resultList = append(resultList, permission)
  337. }
  338. }
  339. return
  340. }
  341. // ParseRiskLevel 解析风险等级字符串,并返回数字部分
  342. func parseRiskLevel(level string) (int, error) {
  343. parts := strings.Split(level, "R")
  344. if len(parts) < 2 {
  345. return 0, fmt.Errorf("无效的风险等级: %s", level)
  346. }
  347. numberStr := parts[1]
  348. number, err := strconv.Atoi(numberStr)
  349. if err != nil {
  350. return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
  351. }
  352. return number, nil
  353. }
  354. func SearchReportList(key string, Ids []int, pageInfo page.PageInfo, isLogin bool, userId int) (reports []reportService.ReportDTO, err error) {
  355. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  356. reports, err = reportService.SearchReportList(key, Ids, offset, pageInfo.PageSize, pageInfo.LatestId)
  357. var wg sync.WaitGroup
  358. wg.Add(len(reports))
  359. for i := 0; i < len(reports); i++ {
  360. go func(report *reportService.ReportDTO) {
  361. defer wg.Done()
  362. report.Login = isLogin
  363. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  364. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  365. riskNum := getHighestRiskLevel(permissions)
  366. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  367. var src string
  368. src, err = mediaService.GetImageSrc(report.CoverSrc)
  369. if err != nil {
  370. logger.Error("获取图片地址失败:%v", err)
  371. src = ""
  372. } else {
  373. report.CoverUrl = src
  374. }
  375. //下查询产品信息
  376. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  377. if pdErr != nil {
  378. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  379. report.Price = defaultProductPrice
  380. report.IsFree = true
  381. report.IsSubscribe = false
  382. } else {
  383. report.Price = defaultProductPrice
  384. report.IsFree = false
  385. report.IsSubscribe = false
  386. }
  387. return
  388. }
  389. report.Price = product.Price.String()
  390. report.IsFree = false
  391. subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
  392. if subscribeErr != nil {
  393. report.IsSubscribe = false
  394. return
  395. }
  396. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  397. pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
  398. if parseErr != nil {
  399. return
  400. }
  401. rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
  402. if parseErr != nil {
  403. return
  404. }
  405. if rpRiskNum <= pdRiskNum {
  406. report.RiskLevel = product.RiskLevel
  407. }
  408. }(&reports[i])
  409. }
  410. wg.Wait()
  411. if err != nil {
  412. err = exception.New(exception.SearchReportPageFailed)
  413. }
  414. return
  415. }
  416. func SearchMaxReportId(key string) (total int64, id int64) {
  417. return reportService.SearchMaxReportId(key)
  418. }
  419. func RangeSearchByAnalyst(analystName string, userId int) (total int64, latestId int64, ids []int) {
  420. var err error
  421. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  422. userProfile, userErr := user.GetUserProfile(userId)
  423. if userErr != nil {
  424. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  425. err = exception.New(exception.TemplateUserNotFound)
  426. } else {
  427. err = exception.New(exception.TemplateUserFoundFailed)
  428. }
  429. logger.Error("分页查询报告列表失败:%v", err)
  430. return
  431. }
  432. //获取产品风险等级
  433. if userProfile.RiskLevel == user.RiskUnTest {
  434. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  435. return
  436. }
  437. if userProfile.RiskLevelStatus == user.RiskExpired {
  438. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  439. return
  440. }
  441. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  442. if mappingErr != nil {
  443. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  444. return
  445. }
  446. var permissionList []permissionService.PermissionDTO
  447. //获取所有设置风险等级的品种
  448. permissionList, err = permissionService.GetPermissionListWithRisk()
  449. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  450. if len(permissionList) == 0 {
  451. return
  452. }
  453. var filterPermissionIds []int
  454. for _, permission := range permissionList {
  455. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  456. }
  457. return reportService.GetTotalPageCountByAnalyst(analystName, filterPermissionIds)
  458. }
  459. func RangeSearch(isLogin bool, userId int) (total int64, latestId int64, orgIds map[string][]int) {
  460. var err error
  461. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  462. if isLogin {
  463. userProfile, userErr := user.GetUserProfile(userId)
  464. if userErr != nil {
  465. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  466. err = exception.New(exception.TemplateUserNotFound)
  467. } else {
  468. err = exception.New(exception.TemplateUserFoundFailed)
  469. }
  470. logger.Error("分页查询报告列表失败:%v", err)
  471. return
  472. }
  473. //获取产品风险等级
  474. if userProfile.RiskLevel == user.RiskUnTest {
  475. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  476. return
  477. }
  478. if userProfile.RiskLevelStatus == user.RiskExpired {
  479. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  480. return
  481. }
  482. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  483. if mappingErr != nil {
  484. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  485. return
  486. }
  487. var permissionList []permissionService.PermissionDTO
  488. //获取所有设置风险等级的品种
  489. permissionList, err = permissionService.GetPermissionListWithRisk()
  490. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  491. if len(permissionList) == 0 {
  492. return
  493. }
  494. var filterPermissionIds []int
  495. for _, permission := range permissionList {
  496. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  497. }
  498. return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, mapping.ProductRiskLevel)
  499. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  500. var permissionList []permissionService.PermissionDTO
  501. //获取所有设置风险等级的品种
  502. permissionList, err = permissionService.GetPermissionListWithRisk()
  503. if err != nil {
  504. logger.Error("根据ID查询品种列表失败:%v", err)
  505. }
  506. var filterPermissionIds []int
  507. for _, permission := range permissionList {
  508. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  509. }
  510. //查询品种
  511. return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, "")
  512. }
  513. }
  514. // GetReportPage 分页获取报告列表
  515. func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool, isLogin bool, userId int) (list []reportService.ReportDTO, err error) {
  516. list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
  517. //并发获取研报的标签
  518. var wg sync.WaitGroup
  519. wg.Add(len(list))
  520. for i := 0; i < len(list); i++ {
  521. go func(report *reportService.ReportDTO) {
  522. defer wg.Done()
  523. report.Login = isLogin
  524. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  525. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  526. riskNum := getHighestRiskLevel(permissions)
  527. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  528. var src string
  529. src, err = mediaService.GetImageSrc(report.CoverSrc)
  530. if err != nil {
  531. logger.Error("获取图片地址失败:%v", err)
  532. src = ""
  533. } else {
  534. report.CoverUrl = src
  535. }
  536. //下查询产品信息
  537. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  538. if pdErr != nil {
  539. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  540. report.Price = defaultProductPrice
  541. report.IsFree = true
  542. report.IsSubscribe = false
  543. } else {
  544. report.Price = defaultProductPrice
  545. report.IsFree = false
  546. report.IsSubscribe = false
  547. }
  548. return
  549. }
  550. report.Price = product.Price.String()
  551. report.IsFree = false
  552. subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
  553. if subscribeErr != nil {
  554. report.IsSubscribe = false
  555. return
  556. }
  557. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  558. pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
  559. if parseErr != nil {
  560. return
  561. }
  562. rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
  563. if parseErr != nil {
  564. return
  565. }
  566. if rpRiskNum <= pdRiskNum {
  567. report.RiskLevel = product.RiskLevel
  568. }
  569. }(&list[i])
  570. }
  571. wg.Wait()
  572. if err != nil {
  573. err = exception.New(exception.QueryReportPageFailed)
  574. }
  575. return
  576. }
  577. // func GetTotalPageCountByAnalyst(analyst string) (total int64, latestId int64) {
  578. // return reportService.GetTotalPageCountByAnalyst(analyst)
  579. // }
  580. func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string, reportIds []int) (list []reportService.ReportDTO, err error) {
  581. list, err = reportService.GetReportPageByAnalyst(pageInfo, analyst, reportIds)
  582. //并发获取研报的标签
  583. var wg sync.WaitGroup
  584. wg.Add(len(list))
  585. for i := 0; i < len(list); i++ {
  586. go func(report *reportService.ReportDTO) {
  587. defer wg.Done()
  588. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  589. }(&list[i])
  590. }
  591. wg.Wait()
  592. if err != nil {
  593. err = exception.New(exception.QueryReportPageFailed)
  594. }
  595. return
  596. }
  597. func CountReport(count RecordCount) (traceId string, err error) {
  598. dto := convertToRecordCountDTO(count)
  599. return userService.CountReport(dto)
  600. }
  601. func GetRandedReportByWeeklyHot(limit int, isLogin bool, userId int, pdRiskLevel string) (reports []HotRankedReport, err error) {
  602. end := time.Now()
  603. begin := date.GetBeginOfTheWeek(end, time.Monday)
  604. hotReports := userService.GetHotReports(begin.Format(time.DateOnly), end.Format(time.DateOnly), limit)
  605. if len(hotReports) > 0 {
  606. var dtoList []reportService.ReportDTO
  607. var ids []int
  608. for i := 0; i < len(hotReports); i++ {
  609. ids = append(ids, hotReports[i].ReportId)
  610. }
  611. dtoList, err = reportService.GetListByCondition("id", ids)
  612. if err != nil {
  613. logger.Error("获取本周最热研报列表失败:%v", err)
  614. err = exception.New(exception.GetHotRandListFailed)
  615. return
  616. }
  617. var filterList []reportService.ReportDTO
  618. if pdRiskLevel != "" {
  619. for _, report := range dtoList {
  620. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  621. if pdErr != nil {
  622. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  623. report.Price = defaultProductPrice
  624. report.IsFree = true
  625. report.IsSubscribe = false
  626. } else {
  627. logger.Error("查询产品失败:%v", pdErr)
  628. report.Price = defaultProductPrice
  629. report.IsFree = false
  630. report.IsSubscribe = false
  631. }
  632. filterList = append(filterList, report)
  633. } else {
  634. pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
  635. if paresErr != nil {
  636. logger.Error("解析风险等级失败:%v", err)
  637. continue
  638. }
  639. reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
  640. if paresErr != nil {
  641. logger.Error("解析风险等级失败:%v", err)
  642. continue
  643. }
  644. report.RiskLevel = product.RiskLevel
  645. if isLogin {
  646. subscribe, subErr := userService.GetUserSubscribe(product.Id, userId)
  647. if subErr != nil {
  648. logger.Error("查询用户订阅信息失败:%v,productId:%v,userId:%v", err, product.Id, userId)
  649. report.Price = product.Price.String()
  650. report.IsFree = false
  651. report.IsSubscribe = false
  652. } else {
  653. report.Price = product.Price.String()
  654. report.IsFree = false
  655. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  656. }
  657. }
  658. if pdRiskNum <= reRiskNum {
  659. filterList = append(filterList, report)
  660. }
  661. }
  662. }
  663. } else {
  664. filterList = dtoList
  665. for _, report := range filterList {
  666. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  667. if pdErr != nil {
  668. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  669. report.Price = defaultProductPrice
  670. report.IsFree = true
  671. report.IsSubscribe = false
  672. } else {
  673. logger.Error("查询产品失败:%v", pdErr)
  674. report.Price = defaultProductPrice
  675. report.IsFree = false
  676. report.IsSubscribe = false
  677. }
  678. } else {
  679. report.Price = product.Price.String()
  680. report.IsFree = false
  681. report.IsSubscribe = false
  682. report.RiskLevel = product.RiskLevel
  683. }
  684. }
  685. }
  686. var wg sync.WaitGroup
  687. wg.Add(len(filterList))
  688. for i := 0; i < len(filterList); i++ {
  689. go func(report *reportService.ReportDTO) {
  690. defer wg.Done()
  691. report.Login = isLogin
  692. report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
  693. report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
  694. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  695. riskNum := getHighestRiskLevel(permissions)
  696. if report.RiskLevel == "" {
  697. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  698. } else {
  699. reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
  700. if paresErr != nil {
  701. logger.Error("解析风险等级失败:%v", err)
  702. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  703. } else {
  704. if reRiskNum <= riskNum {
  705. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  706. }
  707. }
  708. }
  709. var label []string
  710. for _, permission := range report.Permissions {
  711. label = append(label, permission)
  712. }
  713. report.PermissionNames = label
  714. }(&filterList[i])
  715. }
  716. wg.Wait()
  717. reports = make([]HotRankedReport, len(ids))
  718. for i := 0; i < len(filterList); i++ {
  719. report := convertToHotRankedReport(filterList[i])
  720. for j := 0; j < len(hotReports); j++ {
  721. if hotReports[j].ReportId == report.Id {
  722. report.Count = hotReports[j].Count
  723. reports[j] = report
  724. break
  725. }
  726. }
  727. }
  728. } else {
  729. reports = []HotRankedReport{}
  730. }
  731. return
  732. }
  733. func GetRandedReportByPublishTimeWeekly(limit int, week bool, isLogin bool, userId int, pdRiskLevel string) (reports []PublishRankedReport, err error) {
  734. dtoList, err := reportService.GetListOrderByConditionWeekly(week, "published_time", limit, reportService.DESC)
  735. if err != nil {
  736. logger.Error("获取最新发布的研报列表失败:%v", err)
  737. err = exception.New(exception.GetPublishedRandListFailed)
  738. return
  739. }
  740. var filterList []reportService.ReportDTO
  741. if pdRiskLevel != "" {
  742. for _, report := range dtoList {
  743. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  744. if pdErr != nil {
  745. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  746. report.Price = defaultProductPrice
  747. report.IsFree = true
  748. report.IsSubscribe = false
  749. } else {
  750. logger.Error("查询产品失败:%v", pdErr)
  751. report.Price = defaultProductPrice
  752. report.IsFree = false
  753. report.IsSubscribe = false
  754. }
  755. filterList = append(filterList, report)
  756. } else {
  757. pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
  758. if paresErr != nil {
  759. logger.Error("解析风险等级失败:%v", err)
  760. continue
  761. }
  762. reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
  763. if paresErr != nil {
  764. logger.Error("解析风险等级失败:%v", err)
  765. continue
  766. }
  767. report.RiskLevel = product.RiskLevel
  768. if isLogin {
  769. subscribe, subErr := userService.GetUserSubscribe(product.Id, userId)
  770. if subErr != nil {
  771. logger.Error("查询用户订阅信息失败:%v,productId:%v,userId:%v", err, product.Id, userId)
  772. report.Price = product.Price.String()
  773. report.IsFree = false
  774. report.IsSubscribe = false
  775. } else {
  776. report.Price = product.Price.String()
  777. report.IsFree = false
  778. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  779. }
  780. }
  781. if pdRiskNum <= reRiskNum {
  782. filterList = append(filterList, report)
  783. }
  784. }
  785. }
  786. } else {
  787. filterList = dtoList
  788. for _, report := range filterList {
  789. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  790. if pdErr != nil {
  791. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  792. report.Price = defaultProductPrice
  793. report.IsFree = true
  794. report.IsSubscribe = false
  795. } else {
  796. logger.Error("查询产品失败:%v", pdErr)
  797. report.Price = defaultProductPrice
  798. report.IsFree = false
  799. report.IsSubscribe = false
  800. }
  801. } else {
  802. report.Price = product.Price.String()
  803. report.IsFree = false
  804. report.IsSubscribe = false
  805. report.RiskLevel = product.RiskLevel
  806. }
  807. }
  808. }
  809. //并发获取研报的标签
  810. var wg sync.WaitGroup
  811. wg.Add(len(filterList))
  812. for i := 0; i < len(filterList); i++ {
  813. go func(report *reportService.ReportDTO) {
  814. defer wg.Done()
  815. report.Login = isLogin
  816. report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
  817. report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
  818. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  819. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  820. riskNum := getHighestRiskLevel(permissions)
  821. if report.RiskLevel == "" {
  822. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  823. } else {
  824. reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
  825. if paresErr != nil {
  826. logger.Error("解析风险等级失败:%v", err)
  827. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  828. } else {
  829. if reRiskNum <= riskNum {
  830. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  831. }
  832. }
  833. }
  834. }(&filterList[i])
  835. }
  836. wg.Wait()
  837. reports = convertToPublishRankedReportList(filterList)
  838. return
  839. }
  840. func getReportPermissionNames(id int, source string) (labels []string) {
  841. permissions := reportService.GetReportPermissionsById(id, source)
  842. for _, permission := range permissions {
  843. labels = append(labels, permission.PermissionName)
  844. }
  845. return
  846. }
  847. func getReportSecondPermissionsMap(id int, source string) (permissionMap map[int]string) {
  848. permissionMap = make(map[int]string)
  849. permissions := reportService.GetReportSecondPermissionsById(id, source)
  850. for _, permission := range permissions {
  851. permissionMap[permission.PermissionId] = permission.PermissionName
  852. }
  853. return
  854. }
  855. func getReportSecondPermissions(id int, source string) (permissionList []permissionService.PermissionDTO) {
  856. return reportService.GetReportSecondPermissionsById(id, source)
  857. }
  858. func getReportPermissionsMap(id int, source string) (permissionMap map[int]string) {
  859. permissionMap = make(map[int]string)
  860. permissions := reportService.GetReportPermissionsById(id, source)
  861. for _, permission := range permissions {
  862. permissionMap[permission.PermissionId] = permission.PermissionName
  863. }
  864. return
  865. }
  866. func GetPermissionList() (root *permissionService.PermissionNode, err error) {
  867. return permissionService.GetPermissionList()
  868. }
  869. func convertToHotRankedReport(dto reportService.ReportDTO) (report HotRankedReport) {
  870. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  871. if err != nil {
  872. logger.Error("获取封面图片失败:%v", err)
  873. src = ""
  874. }
  875. report = HotRankedReport{
  876. Id: dto.ReportID,
  877. OrgId: dto.OrgId,
  878. Abstract: dto.Abstract,
  879. PublishedTime: dto.PublishedTime,
  880. Title: dto.Title,
  881. SecondPermissions: dto.SecondPermission,
  882. Permissions: dto.Permissions,
  883. PermissionNames: dto.PermissionNames,
  884. CoverUrl: src,
  885. IsSubscribe: dto.IsSubscribe,
  886. IsFree: dto.IsFree,
  887. Price: dto.Price,
  888. RiskLevel: dto.RiskLevel,
  889. Login: dto.Login,
  890. }
  891. return
  892. }
  893. func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
  894. reports = []PublishRankedReport{}
  895. for _, dto := range dtoList {
  896. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  897. if err != nil {
  898. logger.Error("获取封面图片失败:%v", err)
  899. src = ""
  900. }
  901. report := PublishRankedReport{
  902. Id: dto.ReportID,
  903. OrgId: dto.OrgId,
  904. PublishedTime: dto.PublishedTime,
  905. Abstract: dto.Abstract,
  906. Title: dto.Title,
  907. Permissions: dto.Permissions,
  908. SecondPermissions: dto.SecondPermission,
  909. PermissionNames: dto.PermissionNames,
  910. CoverUrl: src,
  911. IsSubscribe: dto.IsSubscribe,
  912. IsFree: dto.IsFree,
  913. Price: dto.Price,
  914. RiskLevel: dto.RiskLevel,
  915. Login: dto.Login,
  916. }
  917. reports = append(reports, report)
  918. }
  919. return
  920. }
  921. func convertToRecordCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
  922. return userService.RecordCountDTO{
  923. UserId: record.UserId,
  924. TraceId: record.TraceId,
  925. Mobile: record.Mobile,
  926. SourceId: record.ReportId,
  927. IpAddress: record.IpAddress,
  928. Location: record.Location,
  929. Referer: record.Referer,
  930. Additional: record.Additional,
  931. }
  932. }
  933. func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
  934. ids, err = reportService.GetReportByIdListByOrgIds(orgIds)
  935. if err != nil {
  936. logger.Error("获取报告ID列表失败:%v", err)
  937. err = exception.New(exception.GetReportSearchRangeFailed)
  938. }
  939. return
  940. }
  941. func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, riskLevel string, err error) {
  942. if isLogin {
  943. userProfile, userErr := user.GetUserProfile(userId)
  944. if userErr != nil {
  945. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  946. err = exception.New(exception.TemplateUserNotFound)
  947. } else {
  948. err = exception.New(exception.TemplateUserFoundFailed)
  949. }
  950. logger.Error("获取有权限的品种列表失败:%v", err)
  951. return
  952. }
  953. //获取产品风险等级
  954. if userProfile.RiskLevel == user.RiskUnTest {
  955. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  956. return
  957. }
  958. if userProfile.RiskLevelStatus == user.RiskExpired {
  959. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  960. return
  961. }
  962. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  963. if mappingErr != nil {
  964. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  965. return
  966. }
  967. var permissionList []permissionService.PermissionDTO
  968. //获取所有设置风险等级的品种
  969. permissionList, err = permissionService.GetPermissionListWithRisk()
  970. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  971. riskLevel = mapping.ProductRiskLevel
  972. if len(permissionList) == 0 {
  973. return
  974. }
  975. for _, permission := range permissionList {
  976. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  977. }
  978. return
  979. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  980. var permissionList []permissionService.PermissionDTO
  981. //获取所有设置风险等级的品种
  982. permissionList, err = permissionService.GetPermissionListWithRisk()
  983. if err != nil {
  984. logger.Error("根据ID查询品种列表失败:%v", err)
  985. }
  986. for _, permission := range permissionList {
  987. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  988. }
  989. //查询品种
  990. return
  991. }
  992. }