report_service.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. package report
  2. import (
  3. "encoding/json"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. "eta/eta_mini_ht_api/common/utils/date"
  7. "eta/eta_mini_ht_api/common/utils/page"
  8. mediaService "eta/eta_mini_ht_api/domian/media"
  9. reportService "eta/eta_mini_ht_api/domian/report"
  10. userService "eta/eta_mini_ht_api/domian/user"
  11. "sync"
  12. "time"
  13. )
  14. const (
  15. SourceETA = "ETA"
  16. SourceHT = "HT"
  17. )
  18. type PublishRankedReport struct {
  19. Id int `json:"reportId"`
  20. OrgId int `json:"orgId"`
  21. Title string `json:"title"`
  22. Abstract string `json:"abstract"`
  23. PermissionNames interface{} `json:"permissionNames,omitempty"`
  24. PublishedTime string `json:"publishedTime"`
  25. CoverUrl string `json:"coverUrl"`
  26. }
  27. type HotRankedReport struct {
  28. Id int `json:"reportId"`
  29. OrgId int `json:"orgId"`
  30. Abstract string `json:"abstract"`
  31. Count int `json:"count"`
  32. Title string `json:"title"`
  33. PublishedTime string `json:"publishedTime"`
  34. SecondPermissions map[int]string `json:"-"`
  35. Permissions map[int]string `json:"-"`
  36. PermissionNames interface{} `json:"permissionNames,omitempty"`
  37. CoverUrl string `json:"coverUrl"`
  38. }
  39. type PermissionNode struct {
  40. ID int `json:"id"`
  41. Name string `json:"name"`
  42. ParentID int `json:"parentId"`
  43. Children []*PermissionNode `json:"children,omitempty"`
  44. }
  45. type RecordCount struct {
  46. UserId int
  47. Mobile string
  48. ReportId int
  49. IpAddress string
  50. Location string
  51. Referer string
  52. Additional string
  53. }
  54. func GetReportById(reportId int) (report reportService.ReportDTO, err error) {
  55. report, err = reportService.GetGetReportById(reportId)
  56. if err != nil {
  57. logger.Error("获取研报失败:%v", err)
  58. err = exception.New(exception.GetReportFailed)
  59. return
  60. }
  61. var detail interface{}
  62. var pdfUrl string
  63. switch report.Source {
  64. case SourceETA:
  65. detail, err = getETAReportDetail(&report)
  66. if err != nil {
  67. logger.Error("获取研报详情失败失败:%v")
  68. err = exception.New(exception.GetReportFailed)
  69. return
  70. }
  71. var jsonStr []byte
  72. jsonStr, err = json.Marshal(detail)
  73. if err != nil {
  74. logger.Error("生成研报详情失败:%v", err)
  75. err = exception.New(exception.GetReportFailed)
  76. }
  77. report.Detail = jsonStr
  78. return
  79. case SourceHT:
  80. pdfUrl, err = getHTReportDetail(&report)
  81. if err != nil {
  82. logger.Error("获取研报详情失败失败:%v")
  83. err = exception.New(exception.GetReportFailed)
  84. return
  85. }
  86. report.PdfUrl = pdfUrl
  87. return
  88. default:
  89. logger.Error("不支持的研报来演:%v")
  90. err = exception.New(exception.GetReportFailed)
  91. return
  92. }
  93. }
  94. func getETAReportDetail(report *reportService.ReportDTO) (etaReport reportService.ETAReportDTO, err error) {
  95. return reportService.GetETAReport(report.OrgId)
  96. }
  97. func getHTReportDetail(report *reportService.ReportDTO) (url string, err error) {
  98. return reportService.GetHtReport(report.OrgId)
  99. }
  100. func GetTotalPageCount() (total int64, latestId int64, err error) {
  101. return reportService.GetTotalPageCount()
  102. }
  103. func GetTotalPageCountByPermissionIds(permissionIds []int) (total int64, latestId int64, ids map[string][]int) {
  104. if len(permissionIds) == 0 {
  105. var err error
  106. total, latestId, err = GetTotalPageCount()
  107. if err != nil {
  108. logger.Error("获取统计信息失败:%v", err)
  109. }
  110. return total, latestId, map[string][]int{}
  111. }
  112. return reportService.GetTotalPageCountByPermissionIds(permissionIds)
  113. }
  114. func SearchReportList(key string, pageInfo page.PageInfo) (reports []reportService.ReportDTO, err error) {
  115. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  116. reports, err = reportService.SearchReportList(key, offset, pageInfo.PageSize, pageInfo.LatestId)
  117. var wg sync.WaitGroup
  118. wg.Add(len(reports))
  119. for i := 0; i < len(reports); i++ {
  120. go func(report *reportService.ReportDTO) {
  121. defer wg.Done()
  122. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  123. var src string
  124. src, err = mediaService.GetImageSrc(report.CoverSrc)
  125. if err != nil {
  126. logger.Error("获取图片地址失败:%v", err)
  127. src = ""
  128. } else {
  129. report.CoverUrl = src
  130. }
  131. }(&reports[i])
  132. }
  133. wg.Wait()
  134. if err != nil {
  135. err = exception.New(exception.SearchReportPageFailed)
  136. }
  137. return
  138. }
  139. func SearchMaxReportId(key string) (total int64, id int64) {
  140. return reportService.SearchMaxReportId(key)
  141. }
  142. // GetReportPage 分页获取报告列表
  143. func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool) (list []reportService.ReportDTO, err error) {
  144. list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
  145. //并发获取研报的标签
  146. var wg sync.WaitGroup
  147. wg.Add(len(list))
  148. for i := 0; i < len(list); i++ {
  149. go func(report *reportService.ReportDTO) {
  150. defer wg.Done()
  151. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  152. var src string
  153. src, err = mediaService.GetImageSrc(report.CoverSrc)
  154. if err != nil {
  155. logger.Error("获取图片地址失败:%v", err)
  156. src = ""
  157. } else {
  158. report.CoverUrl = src
  159. }
  160. }(&list[i])
  161. }
  162. wg.Wait()
  163. if err != nil {
  164. err = exception.New(exception.QueryReportPageFailed)
  165. }
  166. return
  167. }
  168. func GetTotalPageCountByAnalyst(analyst string) (total int64, latestId int64) {
  169. return reportService.GetTotalPageCountByAnalyst(analyst)
  170. }
  171. func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string) (list []reportService.ReportDTO, err error) {
  172. list, err = reportService.GetReportPageByAnalyst(pageInfo, analyst)
  173. //并发获取研报的标签
  174. var wg sync.WaitGroup
  175. wg.Add(len(list))
  176. for i := 0; i < len(list); i++ {
  177. go func(report *reportService.ReportDTO) {
  178. defer wg.Done()
  179. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  180. }(&list[i])
  181. }
  182. wg.Wait()
  183. if err != nil {
  184. err = exception.New(exception.QueryReportPageFailed)
  185. }
  186. return
  187. }
  188. func CountReport(count RecordCount) error {
  189. dto := convertToRecordCountDTO(count)
  190. return userService.CountReport(dto)
  191. }
  192. func GetRandedReportByWeeklyHot(limit int) (reports []HotRankedReport, err error) {
  193. end := time.Now()
  194. begin := date.GetBeginOfTheWeek(end, time.Monday)
  195. hotReports := userService.GetHotReports(begin.Format(time.DateOnly), end.Format(time.DateOnly), limit)
  196. if len(hotReports) > 0 {
  197. var dtoList []reportService.ReportDTO
  198. var ids []int
  199. for i := 0; i < len(hotReports); i++ {
  200. ids = append(ids, hotReports[i].ReportId)
  201. }
  202. dtoList, err = reportService.GetListByCondition("id", ids)
  203. if err != nil {
  204. logger.Error("获取本周最热研报列表失败:%v", err)
  205. err = exception.New(exception.GetHotRandListFailed)
  206. return
  207. }
  208. var wg sync.WaitGroup
  209. wg.Add(len(dtoList))
  210. for i := 0; i < len(dtoList); i++ {
  211. go func(report *reportService.ReportDTO) {
  212. defer wg.Done()
  213. report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
  214. report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
  215. var label []string
  216. for _, permission := range report.Permissions {
  217. label = append(label, permission)
  218. }
  219. report.PermissionNames = label
  220. }(&dtoList[i])
  221. }
  222. wg.Wait()
  223. reports = make([]HotRankedReport, len(ids))
  224. for i := 0; i < len(dtoList); i++ {
  225. report := convertToHotRankedReport(dtoList[i])
  226. for j := 0; j < len(hotReports); j++ {
  227. if hotReports[j].ReportId == report.Id {
  228. report.Count = hotReports[j].Count
  229. reports[j] = report
  230. break
  231. }
  232. }
  233. }
  234. } else {
  235. reports = []HotRankedReport{}
  236. }
  237. return
  238. }
  239. func GetRandedReportByPublishTimeWeekly(limit int, week bool) (reports []PublishRankedReport, err error) {
  240. dtoList, err := reportService.GetListOrderByConditionWeekly(week, "published_time", limit, reportService.DESC)
  241. if err != nil {
  242. logger.Error("获取最新发布的研报列表失败:%v", err)
  243. err = exception.New(exception.GetPublishedRandListFailed)
  244. return
  245. }
  246. //并发获取研报的标签
  247. var wg sync.WaitGroup
  248. wg.Add(len(dtoList))
  249. for i := 0; i < len(dtoList); i++ {
  250. go func(report *reportService.ReportDTO) {
  251. defer wg.Done()
  252. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  253. }(&dtoList[i])
  254. }
  255. wg.Wait()
  256. reports = convertToPublishRankedReportList(dtoList)
  257. return
  258. }
  259. func getReportPermissionNames(id int, source string) (labels []string) {
  260. permissions := reportService.GetReportPermissionsById(id, source)
  261. for _, permission := range permissions {
  262. labels = append(labels, permission.Name)
  263. }
  264. return
  265. }
  266. func getReportSecondPermissionsMap(id int, source string) (permissionMap map[int]string) {
  267. permissionMap = make(map[int]string)
  268. permissions := reportService.GetReportSecondPermissionsById(id, source)
  269. for _, permission := range permissions {
  270. permissionMap[permission.ID] = permission.Name
  271. }
  272. return
  273. }
  274. func getReportPermissionsMap(id int, source string) (permissionMap map[int]string) {
  275. permissionMap = make(map[int]string)
  276. permissions := reportService.GetReportPermissionsById(id, source)
  277. for _, permission := range permissions {
  278. permissionMap[permission.ID] = permission.Name
  279. }
  280. return
  281. }
  282. func GetPermissionList() (root *PermissionNode, err error) {
  283. list, err := reportService.GetPermissionList()
  284. if err != nil {
  285. logger.Error("获取品种列表失败:%v", err)
  286. err = exception.New(exception.GetPermissionListFailed)
  287. return
  288. }
  289. root = &PermissionNode{
  290. ID: 0,
  291. ParentID: 0,
  292. }
  293. assemblePermissionNode(list, root, 0, 2)
  294. return
  295. }
  296. func assemblePermissionNode(list []reportService.PermissionDTO, node *PermissionNode, current int, level int) {
  297. if node != nil && current < level {
  298. for _, permission := range list {
  299. if permission.ParentID == node.ID {
  300. childNode := &PermissionNode{
  301. ID: permission.ID,
  302. Name: permission.Name,
  303. ParentID: permission.ParentID,
  304. }
  305. node.Children = append(node.Children, childNode)
  306. assemblePermissionNode(list, childNode, current+1, level)
  307. }
  308. }
  309. }
  310. }
  311. func convertToHotRankedReport(dto reportService.ReportDTO) (report HotRankedReport) {
  312. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  313. if err != nil {
  314. logger.Error("获取封面图片失败:%v", err)
  315. src = ""
  316. }
  317. report = HotRankedReport{
  318. Id: dto.ReportID,
  319. OrgId: dto.OrgId,
  320. Abstract: dto.Abstract,
  321. PublishedTime: dto.PublishedTime,
  322. Title: dto.Title,
  323. SecondPermissions: dto.SecondPermission,
  324. Permissions: dto.Permissions,
  325. PermissionNames: dto.PermissionNames,
  326. CoverUrl: src,
  327. }
  328. return
  329. }
  330. func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
  331. reports = []PublishRankedReport{}
  332. for _, dto := range dtoList {
  333. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  334. if err != nil {
  335. logger.Error("获取封面图片失败:%v", err)
  336. src = ""
  337. }
  338. report := PublishRankedReport{
  339. Id: dto.ReportID,
  340. OrgId: dto.OrgId,
  341. PublishedTime: dto.PublishedTime,
  342. Abstract: dto.Abstract,
  343. Title: dto.Title,
  344. PermissionNames: dto.PermissionNames,
  345. CoverUrl: src,
  346. }
  347. reports = append(reports, report)
  348. }
  349. return
  350. }
  351. func convertToRecordCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
  352. return userService.RecordCountDTO{
  353. UserId: record.UserId,
  354. Mobile: record.Mobile,
  355. SourceId: record.ReportId,
  356. IpAddress: record.IpAddress,
  357. Location: record.Location,
  358. Referer: record.Referer,
  359. Additional: record.Additional,
  360. }
  361. }