report_service.go 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  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) (list []reportService.ReportDTO, err error) {
  355. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  356. var reports []reportService.ReportDTO
  357. reports, err = reportService.SearchReportList(key, Ids, offset, pageInfo.PageSize, pageInfo.LatestId)
  358. var wg sync.WaitGroup
  359. wg.Add(len(reports))
  360. for i := 0; i < len(reports); i++ {
  361. go func(report *reportService.ReportDTO) {
  362. defer wg.Done()
  363. report.Login = isLogin
  364. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  365. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  366. if len(permissions) == 0 {
  367. return
  368. }
  369. riskNum := getHighestRiskLevel(permissions)
  370. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  371. var src string
  372. src, err = mediaService.GetImageSrc(report.CoverSrc)
  373. if err != nil {
  374. logger.Error("获取图片地址失败:%v", err)
  375. src = ""
  376. } else {
  377. report.CoverUrl = src
  378. }
  379. //下查询产品信息
  380. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  381. if pdErr != nil {
  382. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  383. report.Price = defaultProductPrice
  384. report.IsFree = true
  385. report.IsSubscribe = false
  386. } else {
  387. report.Price = defaultProductPrice
  388. report.IsFree = false
  389. report.IsSubscribe = false
  390. }
  391. } else {
  392. report.Price = product.Price.String()
  393. report.IsFree = false
  394. if isLogin {
  395. subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
  396. if subscribeErr != nil {
  397. report.IsSubscribe = false
  398. } else {
  399. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  400. }
  401. }
  402. pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
  403. if parseErr != nil {
  404. return
  405. }
  406. rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
  407. if parseErr != nil {
  408. return
  409. }
  410. if rpRiskNum <= pdRiskNum {
  411. report.RiskLevel = product.RiskLevel
  412. }
  413. }
  414. list = append(list, *report)
  415. }(&reports[i])
  416. }
  417. wg.Wait()
  418. if err != nil {
  419. err = exception.New(exception.SearchReportPageFailed)
  420. }
  421. return
  422. }
  423. func SearchMaxReportId(key string) (total int64, id int64) {
  424. return reportService.SearchMaxReportId(key)
  425. }
  426. func RangeSearchByAnalyst(analystName string, userId int) (total int64, latestId int64, ids []int) {
  427. var err error
  428. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  429. userProfile, userErr := user.GetUserProfile(userId)
  430. if userErr != nil {
  431. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  432. err = exception.New(exception.TemplateUserNotFound)
  433. } else {
  434. err = exception.New(exception.TemplateUserFoundFailed)
  435. }
  436. logger.Error("分页查询报告列表失败:%v", err)
  437. return
  438. }
  439. //获取产品风险等级
  440. if userProfile.RiskLevel == user.RiskUnTest {
  441. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  442. return
  443. }
  444. if userProfile.RiskLevelStatus == user.RiskExpired {
  445. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  446. return
  447. }
  448. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  449. if mappingErr != nil {
  450. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  451. return
  452. }
  453. var permissionList []permissionService.PermissionDTO
  454. //获取所有设置风险等级的品种
  455. permissionList, err = permissionService.GetPermissionListWithRisk()
  456. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  457. if len(permissionList) == 0 {
  458. return
  459. }
  460. var filterPermissionIds []int
  461. for _, permission := range permissionList {
  462. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  463. }
  464. return reportService.GetTotalPageCountByAnalyst(analystName, filterPermissionIds)
  465. }
  466. func RangeSearch(isLogin bool, userId int) (total int64, latestId int64, orgIds map[string][]int) {
  467. var err error
  468. //登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
  469. if isLogin {
  470. userProfile, userErr := user.GetUserProfile(userId)
  471. if userErr != nil {
  472. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  473. err = exception.New(exception.TemplateUserNotFound)
  474. } else {
  475. err = exception.New(exception.TemplateUserFoundFailed)
  476. }
  477. logger.Error("分页查询报告列表失败:%v", err)
  478. return
  479. }
  480. //获取产品风险等级
  481. if userProfile.RiskLevel == user.RiskUnTest {
  482. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  483. return
  484. }
  485. if userProfile.RiskLevelStatus == user.RiskExpired {
  486. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  487. return
  488. }
  489. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  490. if mappingErr != nil {
  491. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  492. return
  493. }
  494. var permissionList []permissionService.PermissionDTO
  495. //获取所有设置风险等级的品种
  496. permissionList, err = permissionService.GetPermissionListWithRisk()
  497. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  498. if len(permissionList) == 0 {
  499. return
  500. }
  501. var filterPermissionIds []int
  502. for _, permission := range permissionList {
  503. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  504. }
  505. return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, mapping.ProductRiskLevel)
  506. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  507. var permissionList []permissionService.PermissionDTO
  508. //获取所有设置风险等级的品种
  509. permissionList, err = permissionService.GetPermissionListWithRisk()
  510. if err != nil {
  511. logger.Error("根据ID查询品种列表失败:%v", err)
  512. }
  513. var filterPermissionIds []int
  514. for _, permission := range permissionList {
  515. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  516. }
  517. //查询品种
  518. return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, "")
  519. }
  520. }
  521. // GetReportPage 分页获取报告列表
  522. func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool, isLogin bool, userId int) (reports []reportService.ReportDTO, err error) {
  523. var list []reportService.ReportDTO
  524. list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
  525. //并发获取研报的标签
  526. var wg sync.WaitGroup
  527. wg.Add(len(list))
  528. for i := 0; i < len(list); i++ {
  529. go func(report *reportService.ReportDTO) {
  530. defer wg.Done()
  531. report.Login = isLogin
  532. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  533. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  534. if len(permissions) == 0 {
  535. return
  536. }
  537. riskNum := getHighestRiskLevel(permissions)
  538. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  539. var src string
  540. src, err = mediaService.GetImageSrc(report.CoverSrc)
  541. if err != nil {
  542. logger.Error("获取图片地址失败:%v", err)
  543. src = ""
  544. } else {
  545. report.CoverUrl = src
  546. }
  547. //下查询产品信息
  548. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  549. if pdErr != nil {
  550. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  551. report.Price = defaultProductPrice
  552. report.IsFree = true
  553. report.IsSubscribe = false
  554. } else {
  555. report.Price = defaultProductPrice
  556. report.IsFree = false
  557. report.IsSubscribe = false
  558. }
  559. } else {
  560. report.Price = product.Price.String()
  561. report.IsFree = false
  562. if isLogin {
  563. subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
  564. if subscribeErr != nil {
  565. report.IsSubscribe = false
  566. } else {
  567. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  568. }
  569. }
  570. pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
  571. if parseErr != nil {
  572. return
  573. }
  574. rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
  575. if parseErr != nil {
  576. return
  577. }
  578. if rpRiskNum <= pdRiskNum {
  579. report.RiskLevel = product.RiskLevel
  580. }
  581. }
  582. reports = append(reports, *report)
  583. }(&list[i])
  584. }
  585. wg.Wait()
  586. if err != nil {
  587. err = exception.New(exception.QueryReportPageFailed)
  588. }
  589. return
  590. }
  591. // func GetTotalPageCountByAnalyst(analyst string) (total int64, latestId int64) {
  592. // return reportService.GetTotalPageCountByAnalyst(analyst)
  593. // }
  594. func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string, reportIds []int) (list []reportService.ReportDTO, err error) {
  595. list, err = reportService.GetReportPageByAnalyst(pageInfo, analyst, reportIds)
  596. //并发获取研报的标签
  597. var wg sync.WaitGroup
  598. wg.Add(len(list))
  599. for i := 0; i < len(list); i++ {
  600. go func(report *reportService.ReportDTO) {
  601. defer wg.Done()
  602. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  603. }(&list[i])
  604. }
  605. wg.Wait()
  606. if err != nil {
  607. err = exception.New(exception.QueryReportPageFailed)
  608. }
  609. return
  610. }
  611. func CountReport(count RecordCount) (traceId string, err error) {
  612. dto := convertToRecordCountDTO(count)
  613. return userService.CountReport(dto)
  614. }
  615. func GetRandedReportByWeeklyHot(limit int, isLogin bool, userId int, pdRiskLevel string) (reports []HotRankedReport, err error) {
  616. end := time.Now()
  617. begin := date.GetBeginOfTheWeek(end, time.Monday)
  618. hotReports := userService.GetHotReports(begin.Format(time.DateOnly), end.Format(time.DateOnly), limit)
  619. if len(hotReports) > 0 {
  620. var dtoList []reportService.ReportDTO
  621. var ids []int
  622. for i := 0; i < len(hotReports); i++ {
  623. ids = append(ids, hotReports[i].ReportId)
  624. }
  625. dtoList, err = reportService.GetListByCondition("id", ids)
  626. if err != nil {
  627. logger.Error("获取本周最热研报列表失败:%v", err)
  628. err = exception.New(exception.GetHotRandListFailed)
  629. return
  630. }
  631. var filterList []reportService.ReportDTO
  632. if pdRiskLevel != "" {
  633. for _, report := range dtoList {
  634. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  635. if pdErr != nil {
  636. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  637. report.Price = defaultProductPrice
  638. report.IsFree = true
  639. report.IsSubscribe = false
  640. } else {
  641. logger.Error("查询产品失败:%v", pdErr)
  642. report.Price = defaultProductPrice
  643. report.IsFree = false
  644. report.IsSubscribe = false
  645. }
  646. filterList = append(filterList, report)
  647. } else {
  648. pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
  649. if paresErr != nil {
  650. logger.Error("解析风险等级失败:%v", err)
  651. continue
  652. }
  653. reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
  654. if paresErr != nil {
  655. logger.Error("解析风险等级失败:%v", err)
  656. continue
  657. }
  658. report.RiskLevel = product.RiskLevel
  659. if isLogin {
  660. subscribe, subErr := userService.GetUserSubscribe(product.Id, userId)
  661. if subErr != nil {
  662. logger.Error("查询用户订阅信息失败:%v,productId:%v,userId:%v", err, product.Id, userId)
  663. report.Price = product.Price.String()
  664. report.IsFree = false
  665. report.IsSubscribe = false
  666. } else {
  667. report.Price = product.Price.String()
  668. report.IsFree = false
  669. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  670. }
  671. }
  672. if pdRiskNum <= reRiskNum {
  673. filterList = append(filterList, report)
  674. }
  675. }
  676. }
  677. } else {
  678. filterList = dtoList
  679. for _, report := range filterList {
  680. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  681. if pdErr != nil {
  682. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  683. report.Price = defaultProductPrice
  684. report.IsFree = true
  685. report.IsSubscribe = false
  686. } else {
  687. logger.Error("查询产品失败:%v", pdErr)
  688. report.Price = defaultProductPrice
  689. report.IsFree = false
  690. report.IsSubscribe = false
  691. }
  692. } else {
  693. report.Price = product.Price.String()
  694. report.IsFree = false
  695. report.IsSubscribe = false
  696. report.RiskLevel = product.RiskLevel
  697. }
  698. }
  699. }
  700. var wg sync.WaitGroup
  701. wg.Add(len(filterList))
  702. for i := 0; i < len(filterList); i++ {
  703. go func(report *reportService.ReportDTO) {
  704. defer wg.Done()
  705. report.Login = isLogin
  706. report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
  707. report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
  708. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  709. var riskNum int
  710. if len(permissions) == 0 {
  711. riskNum = 0
  712. } else {
  713. riskNum = getHighestRiskLevel(permissions)
  714. }
  715. if report.RiskLevel == "" {
  716. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  717. } else {
  718. reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
  719. if paresErr != nil {
  720. logger.Error("解析风险等级失败:%v", err)
  721. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  722. } else {
  723. if reRiskNum <= riskNum {
  724. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  725. }
  726. }
  727. }
  728. var label []string
  729. for _, permission := range report.Permissions {
  730. label = append(label, permission)
  731. }
  732. report.PermissionNames = label
  733. }(&filterList[i])
  734. }
  735. wg.Wait()
  736. reports = make([]HotRankedReport, len(ids))
  737. for i := 0; i < len(filterList); i++ {
  738. risk, parseErr := parseRiskLevel(filterList[i].RiskLevel)
  739. if parseErr != nil || risk == 0 {
  740. continue
  741. }
  742. report := convertToHotRankedReport(filterList[i])
  743. for j := 0; j < len(hotReports); j++ {
  744. if hotReports[j].ReportId == report.Id {
  745. report.Count = hotReports[j].Count
  746. reports[j] = report
  747. break
  748. }
  749. }
  750. }
  751. } else {
  752. reports = []HotRankedReport{}
  753. }
  754. return
  755. }
  756. func GetRandedReportByPublishTimeWeekly(limit int, week bool, isLogin bool, userId int, pdRiskLevel string) (reports []PublishRankedReport, err error) {
  757. dtoList, err := reportService.GetListOrderByConditionWeekly(week, "published_time", limit, reportService.DESC)
  758. if err != nil {
  759. logger.Error("获取最新发布的研报列表失败:%v", err)
  760. err = exception.New(exception.GetPublishedRandListFailed)
  761. return
  762. }
  763. var filterList []reportService.ReportDTO
  764. if pdRiskLevel != "" {
  765. for _, report := range dtoList {
  766. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  767. if pdErr != nil {
  768. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  769. report.Price = defaultProductPrice
  770. report.IsFree = true
  771. report.IsSubscribe = false
  772. } else {
  773. logger.Error("查询产品失败:%v", pdErr)
  774. report.Price = defaultProductPrice
  775. report.IsFree = false
  776. report.IsSubscribe = false
  777. }
  778. filterList = append(filterList, report)
  779. } else {
  780. pdRiskNum, paresErr := parseRiskLevel(product.RiskLevel)
  781. if paresErr != nil {
  782. logger.Error("解析风险等级失败:%v", err)
  783. continue
  784. }
  785. reRiskNum, paresErr := parseRiskLevel(pdRiskLevel)
  786. if paresErr != nil {
  787. logger.Error("解析风险等级失败:%v", err)
  788. continue
  789. }
  790. report.RiskLevel = product.RiskLevel
  791. if isLogin {
  792. subscribe, subErr := userService.GetUserSubscribe(product.Id, userId)
  793. if subErr != nil {
  794. logger.Error("查询用户订阅信息失败:%v,productId:%v,userId:%v", err, product.Id, userId)
  795. report.Price = product.Price.String()
  796. report.IsFree = false
  797. report.IsSubscribe = false
  798. } else {
  799. report.Price = product.Price.String()
  800. report.IsFree = false
  801. report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
  802. }
  803. }
  804. if pdRiskNum <= reRiskNum {
  805. filterList = append(filterList, report)
  806. }
  807. }
  808. }
  809. } else {
  810. filterList = dtoList
  811. for _, report := range filterList {
  812. product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
  813. if pdErr != nil {
  814. if errors.Is(pdErr, gorm.ErrRecordNotFound) {
  815. report.Price = defaultProductPrice
  816. report.IsFree = true
  817. report.IsSubscribe = false
  818. } else {
  819. logger.Error("查询产品失败:%v", pdErr)
  820. report.Price = defaultProductPrice
  821. report.IsFree = false
  822. report.IsSubscribe = false
  823. }
  824. } else {
  825. report.Price = product.Price.String()
  826. report.IsFree = false
  827. report.IsSubscribe = false
  828. report.RiskLevel = product.RiskLevel
  829. }
  830. }
  831. }
  832. //并发获取研报的标签
  833. var wg sync.WaitGroup
  834. wg.Add(len(filterList))
  835. for i := 0; i < len(filterList); i++ {
  836. go func(report *reportService.ReportDTO) {
  837. defer wg.Done()
  838. report.Login = isLogin
  839. report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
  840. report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
  841. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  842. var riskNum int
  843. permissions := getReportSecondPermissions(report.OrgId, report.Source)
  844. if len(permissions) == 0 {
  845. riskNum = 0
  846. } else {
  847. riskNum = getHighestRiskLevel(permissions)
  848. }
  849. if report.RiskLevel == "" {
  850. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  851. } else {
  852. reRiskNum, paresErr := parseRiskLevel(report.RiskLevel)
  853. if paresErr != nil {
  854. logger.Error("解析风险等级失败:%v", err)
  855. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  856. } else {
  857. if reRiskNum <= riskNum {
  858. report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
  859. }
  860. }
  861. }
  862. }(&filterList[i])
  863. }
  864. wg.Wait()
  865. reports = convertToPublishRankedReportList(filterList)
  866. return
  867. }
  868. func getReportPermissionNames(id int, source string) (labels []string) {
  869. permissions := reportService.GetReportPermissionsById(id, source)
  870. for _, permission := range permissions {
  871. labels = append(labels, permission.PermissionName)
  872. }
  873. return
  874. }
  875. func getReportSecondPermissionsMap(id int, source string) (permissionMap map[int]string) {
  876. permissionMap = make(map[int]string)
  877. permissions := reportService.GetReportSecondPermissionsById(id, source)
  878. for _, permission := range permissions {
  879. permissionMap[permission.PermissionId] = permission.PermissionName
  880. }
  881. return
  882. }
  883. func getReportSecondPermissions(id int, source string) (permissionList []permissionService.PermissionDTO) {
  884. return reportService.GetReportSecondPermissionsById(id, source)
  885. }
  886. func getReportPermissionsMap(id int, source string) (permissionMap map[int]string) {
  887. permissionMap = make(map[int]string)
  888. permissions := reportService.GetReportPermissionsById(id, source)
  889. for _, permission := range permissions {
  890. permissionMap[permission.PermissionId] = permission.PermissionName
  891. }
  892. return
  893. }
  894. func GetPermissionList() (root *permissionService.PermissionNode, err error) {
  895. return permissionService.GetPermissionList()
  896. }
  897. func convertToHotRankedReport(dto reportService.ReportDTO) (report HotRankedReport) {
  898. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  899. if err != nil {
  900. logger.Error("获取封面图片失败:%v", err)
  901. src = ""
  902. }
  903. report = HotRankedReport{
  904. Id: dto.ReportID,
  905. OrgId: dto.OrgId,
  906. Abstract: dto.Abstract,
  907. PublishedTime: dto.PublishedTime,
  908. Title: dto.Title,
  909. SecondPermissions: dto.SecondPermission,
  910. Permissions: dto.Permissions,
  911. PermissionNames: dto.PermissionNames,
  912. CoverUrl: src,
  913. IsSubscribe: dto.IsSubscribe,
  914. IsFree: dto.IsFree,
  915. Price: dto.Price,
  916. RiskLevel: dto.RiskLevel,
  917. Login: dto.Login,
  918. }
  919. return
  920. }
  921. func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
  922. reports = []PublishRankedReport{}
  923. for _, dto := range dtoList {
  924. risk, err := parseRiskLevel(dto.RiskLevel)
  925. if err != nil || risk == 0 {
  926. continue
  927. }
  928. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  929. if err != nil {
  930. logger.Error("获取封面图片失败:%v", err)
  931. src = ""
  932. }
  933. report := PublishRankedReport{
  934. Id: dto.ReportID,
  935. OrgId: dto.OrgId,
  936. PublishedTime: dto.PublishedTime,
  937. Abstract: dto.Abstract,
  938. Title: dto.Title,
  939. Permissions: dto.Permissions,
  940. SecondPermissions: dto.SecondPermission,
  941. PermissionNames: dto.PermissionNames,
  942. CoverUrl: src,
  943. IsSubscribe: dto.IsSubscribe,
  944. IsFree: dto.IsFree,
  945. Price: dto.Price,
  946. RiskLevel: dto.RiskLevel,
  947. Login: dto.Login,
  948. }
  949. reports = append(reports, report)
  950. }
  951. return
  952. }
  953. func convertToRecordCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
  954. return userService.RecordCountDTO{
  955. UserId: record.UserId,
  956. TraceId: record.TraceId,
  957. Mobile: record.Mobile,
  958. SourceId: record.ReportId,
  959. IpAddress: record.IpAddress,
  960. Location: record.Location,
  961. Referer: record.Referer,
  962. Additional: record.Additional,
  963. }
  964. }
  965. func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
  966. ids, err = reportService.GetReportByIdListByOrgIds(orgIds)
  967. if err != nil {
  968. logger.Error("获取报告ID列表失败:%v", err)
  969. err = exception.New(exception.GetReportSearchRangeFailed)
  970. }
  971. return
  972. }
  973. func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, riskLevel string, err error) {
  974. if isLogin {
  975. userProfile, userErr := user.GetUserProfile(userId)
  976. if userErr != nil {
  977. if errors.Is(userErr, gorm.ErrRecordNotFound) {
  978. err = exception.New(exception.TemplateUserNotFound)
  979. } else {
  980. err = exception.New(exception.TemplateUserFoundFailed)
  981. }
  982. logger.Error("获取有权限的品种列表失败:%v", err)
  983. return
  984. }
  985. //获取产品风险等级
  986. if userProfile.RiskLevel == user.RiskUnTest {
  987. logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
  988. return
  989. }
  990. if userProfile.RiskLevelStatus == user.RiskExpired {
  991. logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
  992. return
  993. }
  994. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
  995. if mappingErr != nil {
  996. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  997. return
  998. }
  999. var permissionList []permissionService.PermissionDTO
  1000. //获取所有设置风险等级的品种
  1001. permissionList, err = permissionService.GetPermissionListWithRisk()
  1002. permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
  1003. riskLevel = mapping.ProductRiskLevel
  1004. if len(permissionList) == 0 {
  1005. return
  1006. }
  1007. for _, permission := range permissionList {
  1008. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  1009. }
  1010. return
  1011. } else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
  1012. var permissionList []permissionService.PermissionDTO
  1013. //获取所有设置风险等级的品种
  1014. permissionList, err = permissionService.GetPermissionListWithRisk()
  1015. if err != nil {
  1016. logger.Error("根据ID查询品种列表失败:%v", err)
  1017. }
  1018. for _, permission := range permissionList {
  1019. filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
  1020. }
  1021. //查询品种
  1022. return
  1023. }
  1024. }