newestbiddinglogic.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package logic
  2. import (
  3. "app.yhyue.com/moapp/jybase/redis"
  4. "context"
  5. IC "jyBXBase/rpc/init"
  6. "jyBXBase/rpc/model"
  7. "log"
  8. "sort"
  9. "time"
  10. "jyBXBase/rpc/internal/svc"
  11. "jyBXBase/rpc/type/bxbase"
  12. "github.com/zeromicro/go-zero/core/logx"
  13. )
  14. type NewestBiddingLogic struct {
  15. ctx context.Context
  16. svcCtx *svc.ServiceContext
  17. logx.Logger
  18. }
  19. func NewNewestBiddingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *NewestBiddingLogic {
  20. return &NewestBiddingLogic{
  21. ctx: ctx,
  22. svcCtx: svcCtx,
  23. Logger: logx.WithContext(ctx),
  24. }
  25. }
  26. type newSet struct {
  27. status int
  28. redisKey string
  29. redisStatus int
  30. query string
  31. }
  32. // 首页最新招标信息
  33. func (l *NewestBiddingLogic) NewestBidding(in *bxbase.NewestBiddingReq) (*bxbase.NewsetBiddingResp, error) {
  34. t := time.Now()
  35. // status : 0 -不存缓存 1-未登录用户 2-用户自己的key 3-登录用户最新标讯
  36. r, n := func(in *bxbase.NewestBiddingReq) (*bxbase.NewsetBiddingResp, *newSet) {
  37. var res = &bxbase.NewsetBiddingResp{
  38. Data: &bxbase.NewsetBidding{
  39. List: []*bxbase.NewestList{},
  40. },
  41. }
  42. /* 1. 未登录用户 查未登录缓存 返回 没有缓存 查最新标讯存未登录返回
  43. 2. 登录用户 查count count=1 查用户缓存 缓存没数据查用户推送
  44. count =0 查最新标讯缓存 缓存没数据查最新标讯存登录缓存 显示引导用户设置关键词
  45. */
  46. // 未登录用户
  47. if in.UserId == "" {
  48. // 没数据查最新数据返回
  49. //未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
  50. subtype := `"预告","公告","结果","其它"`
  51. query := model.NewestQuery("", "", subtype)
  52. res.Data.ShowTip = 1
  53. redisKey, _ := model.GetRedisKeyTimeout(model.StatusNoLogin, in.PositionId)
  54. list, err := model.GetNewsCache(redisKey)
  55. if err == nil && list != nil && len(list) > 0 { // 缓存有数据可以直接返回
  56. res.Data.List = list
  57. res.Data.Count = int64(len(list))
  58. return res, &newSet{model.StatusCache, redisKey, model.StatusNoLogin, query}
  59. }
  60. noLoginTime := time.Now()
  61. list = model.NewestES(query)
  62. res.Data.List = list
  63. res.Data.Count = int64(len(list))
  64. log.Println("未登录获es取数据耗时:", time.Since(noLoginTime).Seconds())
  65. return res, &newSet{model.StatusNoLogin, redisKey, model.StatusNoLogin, query}
  66. }
  67. // 登录用户
  68. roleNewestInfo, flag := model.GetRoleNewestInfoService(in.AppId, in.MgoUserId, in.NewUserId, in.AccountId, in.EntId, in.EntUserId, in.PositionType, in.PositionId)
  69. res.Data.SubFlag = flag
  70. // 查count判断
  71. existData := roleNewestInfo.GetPushHistoryCount()
  72. if existData > 0 { // 存在推送 查推送缓存 缓存没有数据则查 推送数据
  73. res.Data.ShowTip = 1 // count>0说明存在数据不用显示引导用户设置关键词
  74. // 查缓存
  75. redisKey, _ := model.GetRedisKeyTimeout(model.StatusLoginUser, in.PositionId)
  76. list, err := model.GetNewsCache(redisKey)
  77. if err == nil && list != nil && len(list) > 0 {
  78. res.Data.List = list
  79. res.Data.Count = int64(len(list))
  80. return res, &newSet{model.StatusCache, redisKey, model.StatusLoginUser, ""}
  81. }
  82. // 查推送
  83. subscribeTime := time.Now()
  84. list = roleNewestInfo.GetPushHistory()
  85. log.Println("获取订阅数据耗时:", time.Since(subscribeTime).Seconds())
  86. if list != nil && len(list) > 0 {
  87. res.Data.List = list
  88. res.Data.Count = int64(len(list))
  89. return res, &newSet{model.StatusLoginUser, redisKey, model.StatusLoginUser, ""}
  90. }
  91. }
  92. // 等0则说明推送里面没有数据 所以去查最新标讯信息缓存 返回 缓存没有则查最新标讯信息 存到缓存里面
  93. res.Data.ShowTip = 2 // 显示
  94. // 查最新标讯
  95. query := model.NewestQuery("", "", "")
  96. // 查缓存
  97. redisKey, _ := model.GetRedisKeyTimeout(model.StatusLogin, in.PositionId)
  98. list, err := model.GetNewsCache(redisKey)
  99. if err == nil && list != nil && len(list) > 0 {
  100. res.Data.List = list
  101. res.Data.Count = int64(len(list))
  102. return res, &newSet{model.StatusCache, redisKey, model.StatusLogin, query}
  103. }
  104. esTime := time.Now()
  105. list = model.NewestES(query)
  106. log.Println("获取es数据耗时:", time.Since(esTime).Seconds())
  107. res.Data.List = list
  108. res.Data.Count = int64(len(list))
  109. return res, &newSet{model.StatusLogin, redisKey, model.StatusLogin, query}
  110. }(in)
  111. if r.Data.Count == 0 {
  112. return r, nil
  113. }
  114. // status : 0 -拿到的是缓存 不用再处理也不用存缓存 1-存到未登录用户 2-存到用户自己的key 3-存到登录用户最新标讯
  115. var sortRedis = func(r *bxbase.NewsetBiddingResp, status int, positionId int64) {
  116. //排序
  117. sort.Slice(r.Data.List, func(i, j int) bool {
  118. return r.Data.List[i].PublishTime > r.Data.List[j].PublishTime
  119. })
  120. redisKey, timeout := model.GetRedisKeyTimeout(status, positionId)
  121. go model.PutNewsCache(redisKey, timeout, r.Data.List)
  122. }
  123. if n.status != model.StatusCache {
  124. go sortRedis(r, n.status, in.PositionId)
  125. } else {
  126. //获取最新数据 -- 延长缓存时间
  127. go func(n *newSet, in *bxbase.NewestBiddingReq) {
  128. if n.redisKey != "" {
  129. //剩余时间 在 IC.C.NewsTimeOut 之内
  130. if ttl := redis.GetTTL("new", n.redisKey); ttl-IC.C.NewsTimeOut < 0 {
  131. var res = &bxbase.NewsetBiddingResp{
  132. Data: &bxbase.NewsetBidding{
  133. List: []*bxbase.NewestList{},
  134. },
  135. }
  136. switch n.redisStatus {
  137. case model.StatusLoginUser:
  138. // 登录用户
  139. roleNewestInfo, _ := model.GetRoleNewestInfoService(in.AppId, in.MgoUserId, in.NewUserId, in.AccountId, in.EntId, in.EntUserId, in.PositionType, in.PositionId)
  140. // 查推送
  141. res.Data.List = roleNewestInfo.GetPushHistory()
  142. default:
  143. res.Data.List = model.NewestES(n.query)
  144. }
  145. go sortRedis(res, n.redisStatus, in.PositionId)
  146. }
  147. }
  148. }(n, in)
  149. }
  150. model.MakeCollection(in.UserId, r.Data.List)
  151. log.Println("接口耗时:", time.Since(t).Seconds())
  152. return r, nil
  153. }