subscribe_controller.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package user
  2. import (
  3. "eta/eta_mini_ht_api/common/exception"
  4. "eta/eta_mini_ht_api/controllers"
  5. "eta/eta_mini_ht_api/service/facade"
  6. "eta/eta_mini_ht_api/service/order"
  7. "eta/eta_mini_ht_api/service/user"
  8. "golang.org/x/time/rate"
  9. "net/http"
  10. "sync"
  11. "time"
  12. )
  13. type SubscribeController struct {
  14. controllers.BaseController
  15. }
  16. var (
  17. // 初始化限流器
  18. orderRateLimiter = NewUserRateLimiter(rate.Every(5*time.Second), 1)
  19. orderNoRateLimiter = NewUserRateLimiter(rate.Every(time.Second), 1)
  20. )
  21. type UserRateLimiter struct {
  22. limiters sync.Map // 存储每个用户的限流器
  23. defaultLimiter *rate.Limiter // 默认限流器
  24. }
  25. func NewUserRateLimiter(limit rate.Limit, burst int) *UserRateLimiter {
  26. return &UserRateLimiter{
  27. defaultLimiter: rate.NewLimiter(limit, burst),
  28. }
  29. }
  30. func (url *UserRateLimiter) Allow(userID int) bool {
  31. if limiter, ok := url.limiters.Load(userID); ok {
  32. return limiter.(*rate.Limiter).Allow()
  33. }
  34. // 创建新的限流器并存储
  35. newLimiter := rate.NewLimiter(url.defaultLimiter.Limit(), url.defaultLimiter.Burst())
  36. url.limiters.Store(userID, newLimiter)
  37. return newLimiter.Allow()
  38. }
  39. func orderRateLimitFilter(userId int) (code int) {
  40. if userId <= 0 {
  41. code = http.StatusBadRequest
  42. return
  43. }
  44. if !orderRateLimiter.Allow(userId) {
  45. code = http.StatusTooManyRequests
  46. return
  47. }
  48. code = http.StatusOK
  49. return
  50. }
  51. func orderNoRateLimitFilter(userId int) (code int) {
  52. if userId <= 0 {
  53. code = http.StatusBadRequest
  54. return
  55. }
  56. if !orderRateLimiter.Allow(userId) {
  57. code = http.StatusTooManyRequests
  58. return
  59. }
  60. code = http.StatusOK
  61. return
  62. }
  63. const (
  64. AccountNotOpen = 430
  65. IDExpired = 431
  66. RiskUnTest = 432
  67. RiskNotMatch = 433
  68. RiskExpired = 434
  69. AccountOpening = 435
  70. )
  71. // GetOrderNo 获取订单号
  72. // @Summary 获取订单号
  73. // @Description 获取订单号
  74. // @Success 200 {object} controllers.BaseResponse
  75. // @router /subscribe/orderNo [get]
  76. func (sc *SubscribeController) GetOrderNo() {
  77. controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
  78. result = sc.InitWrapData("获取订单号失败")
  79. userInfo := sc.Data["user"].(user.User)
  80. if code := orderNoRateLimitFilter(userInfo.Id); code != 200 {
  81. err = exception.New(exception.SubscribeFailed)
  82. sc.FailedResult("操作太频繁了,请稍后再试", result)
  83. return
  84. }
  85. orderNo := order.GenerateProductOrderNo()
  86. sc.SuccessResult("获取订单号成功", orderNo, result)
  87. return
  88. })
  89. }
  90. // SubscribeProduct 订阅产品
  91. // @Summary 订阅产品
  92. // @Description 订阅产品
  93. // @Success 200 {object} controllers.BaseResponse
  94. // @router /subscribe/createOrder [post]
  95. func (sc *SubscribeController) SubscribeProduct() {
  96. controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
  97. result = sc.InitWrapData("订阅产品失败")
  98. subscribeReq := new(SubscribeRequest)
  99. sc.GetPostParams(subscribeReq)
  100. var userInfo user.User
  101. userInfo = sc.Data["user"].(user.User)
  102. if subscribeReq.ProductId <= 0 {
  103. err = exception.New(exception.IllegalProductId)
  104. sc.FailedResult("订阅产品失败,产品编号非法", result)
  105. return
  106. }
  107. if subscribeReq.OrderNo == "" {
  108. err = exception.New(exception.IllegalOrderNo)
  109. sc.FailedResult("订阅产品失败,订单编号非法", result)
  110. return
  111. }
  112. if code := orderRateLimitFilter(userInfo.Id); code != 200 {
  113. err = exception.New(exception.SubscribeFailed)
  114. sc.FailedResult("操作太频繁了,请稍后再试", result)
  115. return
  116. }
  117. //是否开户
  118. //未开户
  119. officialUser, err := user.GetUserByTemplateUserId(userInfo.Id)
  120. if err != nil {
  121. if err.Error() == exception.GetMsg(exception.OfficialUserNotFound) {
  122. result.Ret = AccountNotOpen
  123. sc.FailedResult("用户未开通账户", result)
  124. } else {
  125. sc.FailedResult("订阅产品失败", result)
  126. }
  127. return
  128. }
  129. //开户中
  130. if officialUser.AccountStatus == "opening" {
  131. result.Ret = AccountOpening
  132. sc.FailedResult("用户开户中", result)
  133. return
  134. }
  135. //证件信息是否过期
  136. if !officialUser.IDValid {
  137. result.Ret = IDExpired
  138. sc.FailedResult("用户证件有效期过期", result)
  139. return
  140. }
  141. //主动发起查询最新风险测评(获取失败用系统中原有的测评信息)
  142. code, err := facade.CheckUserRiskLevel(userInfo.Id, subscribeReq.ProductId)
  143. if err != nil {
  144. result.Ret = code
  145. sc.FailedResult("校验用户风险等级失败", result)
  146. return
  147. }
  148. //创单
  149. //返回订单信息、商品信息
  150. orderInfo, err := order.CreateProductOrder(userInfo, subscribeReq.ProductId, subscribeReq.OrderNo)
  151. if err != nil {
  152. sc.FailedResult("创建订单失败", result)
  153. return
  154. }
  155. sc.SuccessResult("订阅产品成功", orderInfo, result)
  156. return
  157. })
  158. }
  159. type SubscribeRequest struct {
  160. ProductId int `json:"productId"`
  161. OrderNo string `json:"orderNo"`
  162. }