report_service.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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) {
  101. return reportService.GetTotalPageCount()
  102. }
  103. func GetTotalPageCountByPermissionIds(permissionIds []int) (total int64, latestId int64, ids map[string][]int) {
  104. if len(permissionIds) == 0 {
  105. total = GetTotalPageCount()
  106. latestId = total
  107. return total, latestId, map[string][]int{}
  108. }
  109. return reportService.GetTotalPageCountByPermissionIds(permissionIds)
  110. }
  111. func SearchReportList(key string, pageInfo page.PageInfo) (reports []reportService.ReportDTO, err error) {
  112. offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
  113. reports, err = reportService.SearchReportList(key, offset, pageInfo.PageSize, pageInfo.LatestId)
  114. var wg sync.WaitGroup
  115. wg.Add(len(reports))
  116. for i := 0; i < len(reports); i++ {
  117. go func(report *reportService.ReportDTO) {
  118. defer wg.Done()
  119. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  120. var src string
  121. src, err = mediaService.GetImageSrc(report.CoverSrc)
  122. if err != nil {
  123. logger.Error("获取图片地址失败:%v", err)
  124. src = ""
  125. } else {
  126. report.CoverUrl = src
  127. }
  128. }(&reports[i])
  129. }
  130. wg.Wait()
  131. if err != nil {
  132. err = exception.New(exception.SearchReportPageFailed)
  133. }
  134. return
  135. }
  136. func SearchMaxReportId(key string) (total int64, id int64) {
  137. return reportService.SearchMaxReportId(key)
  138. }
  139. // GetReportPage 分页获取报告列表
  140. func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool) (list []reportService.ReportDTO, err error) {
  141. list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
  142. //并发获取研报的标签
  143. var wg sync.WaitGroup
  144. wg.Add(len(list))
  145. for i := 0; i < len(list); i++ {
  146. go func(report *reportService.ReportDTO) {
  147. defer wg.Done()
  148. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  149. var src string
  150. src, err = mediaService.GetImageSrc(report.CoverSrc)
  151. if err != nil {
  152. logger.Error("获取图片地址失败:%v", err)
  153. src = ""
  154. } else {
  155. report.CoverUrl = src
  156. }
  157. }(&list[i])
  158. }
  159. wg.Wait()
  160. if err != nil {
  161. err = exception.New(exception.QueryReportPageFailed)
  162. }
  163. return
  164. }
  165. func GetTotalPageCountByAnalyst(analyst string) (total int64, latestId int64) {
  166. return reportService.GetTotalPageCountByAnalyst(analyst)
  167. }
  168. func GetReportPageByAnalyst(pageInfo page.PageInfo, analyst string) (list []reportService.ReportDTO, err error) {
  169. list, err = reportService.GetReportPageByAnalyst(pageInfo, analyst)
  170. //并发获取研报的标签
  171. var wg sync.WaitGroup
  172. wg.Add(len(list))
  173. for i := 0; i < len(list); i++ {
  174. go func(report *reportService.ReportDTO) {
  175. defer wg.Done()
  176. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  177. }(&list[i])
  178. }
  179. wg.Wait()
  180. if err != nil {
  181. err = exception.New(exception.QueryReportPageFailed)
  182. }
  183. return
  184. }
  185. func CountReport(count RecordCount) error {
  186. dto := convertToRecordCountDTO(count)
  187. return userService.CountReport(dto)
  188. }
  189. func GetRandedReportByWeeklyHot(limit int) (reports []HotRankedReport, err error) {
  190. end := time.Now()
  191. begin := date.GetBeginOfTheWeek(end, time.Monday)
  192. hotReports := userService.GetHotReports(begin.Format(time.DateOnly), end.Format(time.DateOnly), limit)
  193. if len(hotReports) > 0 {
  194. var dtoList []reportService.ReportDTO
  195. var ids []int
  196. for i := 0; i < len(hotReports); i++ {
  197. ids = append(ids, hotReports[i].ReportId)
  198. }
  199. dtoList, err = reportService.GetListByCondition("id", ids)
  200. if err != nil {
  201. logger.Error("获取本周最热研报列表失败:%v", err)
  202. err = exception.New(exception.GetHotRandListFailed)
  203. return
  204. }
  205. var wg sync.WaitGroup
  206. wg.Add(len(dtoList))
  207. for i := 0; i < len(dtoList); i++ {
  208. go func(report *reportService.ReportDTO) {
  209. defer wg.Done()
  210. report.Permissions = getReportPermissionsMap(report.OrgId, report.Source)
  211. report.SecondPermission = getReportSecondPermissionsMap(report.OrgId, report.Source)
  212. var label []string
  213. for _, permission := range report.Permissions {
  214. label = append(label, permission)
  215. }
  216. report.PermissionNames = label
  217. }(&dtoList[i])
  218. }
  219. wg.Wait()
  220. reports = make([]HotRankedReport, len(ids))
  221. for i := 0; i < len(dtoList); i++ {
  222. report := convertToHotRankedReport(dtoList[i])
  223. for j := 0; j < len(hotReports); j++ {
  224. if hotReports[j].ReportId == report.Id {
  225. report.Count = hotReports[j].Count
  226. reports[j] = report
  227. break
  228. }
  229. }
  230. }
  231. } else {
  232. reports = []HotRankedReport{}
  233. }
  234. return
  235. }
  236. func GetRandedReportByPublishTimeWeekly(limit int, week bool) (reports []PublishRankedReport, err error) {
  237. dtoList, err := reportService.GetListOrderByConditionWeekly(week, "published_time", limit, reportService.DESC)
  238. if err != nil {
  239. logger.Error("获取最新发布的研报列表失败:%v", err)
  240. err = exception.New(exception.GetPublishedRandListFailed)
  241. return
  242. }
  243. //并发获取研报的标签
  244. var wg sync.WaitGroup
  245. wg.Add(len(dtoList))
  246. for i := 0; i < len(dtoList); i++ {
  247. go func(report *reportService.ReportDTO) {
  248. defer wg.Done()
  249. report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
  250. }(&dtoList[i])
  251. }
  252. wg.Wait()
  253. reports = convertToPublishRankedReportList(dtoList)
  254. return
  255. }
  256. func getReportPermissionNames(id int, source string) (labels []string) {
  257. permissions := reportService.GetReportPermissionsById(id, source)
  258. for _, permission := range permissions {
  259. labels = append(labels, permission.Name)
  260. }
  261. return
  262. }
  263. func getReportSecondPermissionsMap(id int, source string) (permissionMap map[int]string) {
  264. permissionMap = make(map[int]string)
  265. permissions := reportService.GetReportSecondPermissionsById(id, source)
  266. for _, permission := range permissions {
  267. permissionMap[permission.ID] = permission.Name
  268. }
  269. return
  270. }
  271. func getReportPermissionsMap(id int, source string) (permissionMap map[int]string) {
  272. permissionMap = make(map[int]string)
  273. permissions := reportService.GetReportPermissionsById(id, source)
  274. for _, permission := range permissions {
  275. permissionMap[permission.ID] = permission.Name
  276. }
  277. return
  278. }
  279. func GetPermissionList() (root *PermissionNode, err error) {
  280. list, err := reportService.GetPermissionList()
  281. if err != nil {
  282. logger.Error("获取品种列表失败:%v", err)
  283. err = exception.New(exception.GetPermissionListFailed)
  284. return
  285. }
  286. root = &PermissionNode{
  287. ID: 0,
  288. ParentID: 0,
  289. }
  290. assemblePermissionNode(list, root, 0, 2)
  291. return
  292. }
  293. func assemblePermissionNode(list []reportService.PermissionDTO, node *PermissionNode, current int, level int) {
  294. if node != nil && current < level {
  295. for _, permission := range list {
  296. if permission.ParentID == node.ID {
  297. childNode := &PermissionNode{
  298. ID: permission.ID,
  299. Name: permission.Name,
  300. ParentID: permission.ParentID,
  301. }
  302. node.Children = append(node.Children, childNode)
  303. assemblePermissionNode(list, childNode, current+1, level)
  304. }
  305. }
  306. }
  307. }
  308. func convertToHotRankedReport(dto reportService.ReportDTO) (report HotRankedReport) {
  309. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  310. if err != nil {
  311. logger.Error("获取封面图片失败:%v", err)
  312. src = ""
  313. }
  314. report = HotRankedReport{
  315. Id: dto.ReportID,
  316. OrgId: dto.OrgId,
  317. Abstract: dto.Abstract,
  318. PublishedTime: dto.PublishedTime,
  319. Title: dto.Title,
  320. SecondPermissions: dto.SecondPermission,
  321. Permissions: dto.Permissions,
  322. PermissionNames: dto.PermissionNames,
  323. CoverUrl: src,
  324. }
  325. return
  326. }
  327. func convertToPublishRankedReportList(dtoList []reportService.ReportDTO) (reports []PublishRankedReport) {
  328. reports = []PublishRankedReport{}
  329. for _, dto := range dtoList {
  330. src, err := mediaService.GetImageSrc(dto.CoverSrc)
  331. if err != nil {
  332. logger.Error("获取封面图片失败:%v", err)
  333. src = ""
  334. }
  335. report := PublishRankedReport{
  336. Id: dto.ReportID,
  337. OrgId: dto.OrgId,
  338. PublishedTime: dto.PublishedTime,
  339. Abstract: dto.Abstract,
  340. Title: dto.Title,
  341. PermissionNames: dto.PermissionNames,
  342. CoverUrl: src,
  343. }
  344. reports = append(reports, report)
  345. }
  346. return
  347. }
  348. func convertToRecordCountDTO(record RecordCount) (dto userService.RecordCountDTO) {
  349. return userService.RecordCountDTO{
  350. UserId: record.UserId,
  351. Mobile: record.Mobile,
  352. SourceId: record.ReportId,
  353. IpAddress: record.IpAddress,
  354. Location: record.Location,
  355. Referer: record.Referer,
  356. Additional: record.Additional,
  357. }
  358. }