report_service.go 36 KB

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