subscribe_controller.go 6.8 KB

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