report_service.go 7.6 KB

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