report_service.go 10 KB

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