report_service.go 9.6 KB

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