report_service.go 9.6 KB

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