subscribe_controller.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. orderPending = "pending"
  72. orderPaid = "paid"
  73. orderRefund = "refund"
  74. orderClosed = "closed"
  75. )
  76. // GetOrderNo 获取订单号
  77. // @Summary 获取订单号
  78. // @Description 获取订单号
  79. // @Success 200 {object} controllers.BaseResponse
  80. // @router /subscribe/orderNo [get]
  81. func (sc *SubscribeController) GetOrderNo() {
  82. controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
  83. result = sc.InitWrapData("获取订单号失败")
  84. userInfo := sc.Data["user"].(user.User)
  85. if code := orderNoRateLimitFilter(userInfo.Id); code != 200 {
  86. err = exception.New(exception.SubscribeFailed)
  87. sc.FailedResult("操作太频繁了,请稍后再试", result)
  88. return
  89. }
  90. orderNo := order.GenerateProductOrderNo()
  91. sc.SuccessResult("获取订单号成功", orderNo, result)
  92. return
  93. })
  94. }
  95. // OrderDetail 获取订单号
  96. // @Summary 获取订单号
  97. // @Description 获取订单号
  98. // @Success 200 {object} controllers.BaseResponse
  99. // @router /subscribe/orderDetail [get]
  100. func (sc *SubscribeController) GetOrderDetail(orderId int) {
  101. controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
  102. result = sc.InitWrapData("获取订单号失败")
  103. userInfo := sc.Data["user"].(user.User)
  104. if orderId <= 0 {
  105. err = exception.New(exception.IllegalProductOrderId)
  106. sc.FailedResult("获取订单详情失败,产品编号非法", result)
  107. return
  108. }
  109. orderDetail, err := order.GetOrderDetail(orderId, userInfo.Id)
  110. if err != nil {
  111. sc.FailedResult("获取订单详情失败", result)
  112. }
  113. sc.SuccessResult("获取订单详情成功", orderDetail, result)
  114. return
  115. })
  116. }
  117. // GetOrderList 获取用户订单号列表
  118. // @Summary 获取用户订单号列表
  119. // @Description 获取用户订单号列表
  120. // @Success 200 {object} controllers.BaseResponse
  121. // @router /subscribe/orderList [get]
  122. func (sc *SubscribeController) GetOrderList(orderStatus string) {
  123. controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
  124. result = sc.InitWrapData("分页查询订单列表失败")
  125. userInfo := sc.Data["user"].(user.User)
  126. pageRes := page.Page{
  127. Current: sc.PageInfo.Current,
  128. PageSize: sc.PageInfo.PageSize,
  129. }
  130. pageRes.Total, pageRes.LatestId = order.GetTotalPageCountByUserId(userInfo.Id, orderStatus)
  131. if sc.PageInfo.LatestId == 0 {
  132. sc.PageInfo.LatestId = pageRes.LatestId
  133. } else {
  134. pageRes.LatestId = sc.PageInfo.LatestId
  135. pageRes.Total = sc.PageInfo.Total
  136. }
  137. pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
  138. list, err := order.GetOrderPage(sc.PageInfo, userInfo.Id, orderStatus)
  139. if err != nil {
  140. sc.FailedResult("分页查询订单列表失败", result)
  141. return
  142. }
  143. orders := new(page.PageResult)
  144. orders.Data = list
  145. orders.Page = pageRes
  146. sc.SuccessResult("查询报告列表成功", orders, result)
  147. return
  148. })
  149. }
  150. // SubscribeProduct 订阅产品
  151. // @Summary 订阅产品
  152. // @Description 订阅产品
  153. // @Success 200 {object} controllers.BaseResponse
  154. // @router /subscribe/createOrder [post]
  155. func (sc *SubscribeController) SubscribeProduct() {
  156. controllers.Wrap(&sc.BaseController, func() (result *controllers.WrapData, err error) {
  157. result = sc.InitWrapData("订阅产品失败")
  158. subscribeReq := new(SubscribeRequest)
  159. sc.GetPostParams(subscribeReq)
  160. var userInfo user.User
  161. userInfo = sc.Data["user"].(user.User)
  162. if subscribeReq.ProductId <= 0 {
  163. err = exception.New(exception.IllegalProductId)
  164. sc.FailedResult("订阅产品失败,产品编号非法", result)
  165. return
  166. }
  167. if subscribeReq.OrderNo == "" {
  168. err = exception.New(exception.IllegalOrderNo)
  169. sc.FailedResult("订阅产品失败,订单编号非法", result)
  170. return
  171. }
  172. if code := orderRateLimitFilter(userInfo.Id); code != 200 {
  173. err = exception.New(exception.SubscribeFailed)
  174. sc.FailedResult("操作太频繁了,请稍后再试", result)
  175. return
  176. }
  177. //校验是否已经购买并且在有效期内
  178. //是否开户
  179. //未开户
  180. officialUser, err := user.GetUserByTemplateUserId(userInfo.Id)
  181. if err != nil {
  182. if err.Error() == exception.GetMsg(exception.OfficialUserNotFound) {
  183. result.Ret = AccountNotOpen
  184. sc.FailedResult("用户未开通账户", result)
  185. } else {
  186. sc.FailedResult("获取用户账户信息失败", result)
  187. }
  188. return
  189. }
  190. //开户中
  191. if officialUser.AccountStatus == "opening" {
  192. result.Ret = AccountOpening
  193. sc.FailedResult("用户开户中", result)
  194. return
  195. }
  196. //证件信息是否过期
  197. if !officialUser.IDValid {
  198. result.Ret = IDExpired
  199. sc.FailedResult("用户证件有效期过期", result)
  200. return
  201. }
  202. //主动发起查询最新风险测评(获取失败用系统中原有的测评信息)
  203. code, err := facade.CheckUserRiskLevel(userInfo.Id, subscribeReq.ProductId, officialUser)
  204. if err != nil {
  205. result.Ret = code
  206. sc.FailedResult("校验用户风险等级失败", result)
  207. return
  208. }
  209. //创单
  210. //返回订单信息、商品信息
  211. orderInfo, err := order.CreateProductOrder(userInfo, subscribeReq.ProductId, subscribeReq.OrderNo)
  212. if err != nil {
  213. sc.FailedResult("创建订单失败", result)
  214. return
  215. }
  216. sc.SuccessResult("订阅产品成功", orderInfo, result)
  217. return
  218. })
  219. }
  220. type SubscribeRequest struct {
  221. ProductId int `json:"productId"`
  222. OrderNo string `json:"orderNo"`
  223. }