report_service.go 10 KB

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