InviteListDirController.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. package api
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "net/url"
  9. "strconv"
  10. "think-go/controllers/services"
  11. "think-go/utils"
  12. "time"
  13. beego "github.com/beego/beego/v2/server/web"
  14. )
  15. type InviteListDirController struct {
  16. beego.Controller
  17. }
  18. var inviteListDirService = &services.InviteListDirService{}
  19. type ExternalInviteResponse struct {
  20. Code int `json:"code"`
  21. Data struct {
  22. InviteAmount int `json:"invite_amount"`
  23. List []struct {
  24. CTime int64 `json:"c_time"`
  25. UserID string `json:"userid"`
  26. Username string `json:"username"`
  27. PromoteName string `json:"promote_name"`
  28. Sales string `json:"sales"`
  29. TeamSales string `json:"team_sales"`
  30. TodayTeamSales string `json:"today_team_sales"`
  31. UserBV string `json:"user_bv"`
  32. SubStatus int `json:"sub_status"`
  33. } `json:"list"`
  34. Count int `json:"count"`
  35. } `json:"data"`
  36. }
  37. // 假设路由为 /invite/list [post]
  38. func (c *InviteListDirController) GetExternalInviteList() {
  39. // 1. 获取当前请求中的参数(可以根据业务从 c 中获取,例如 c.GetInt 等)
  40. limit, _ := c.GetInt("limit", 10) // 默认每页10条
  41. page, _ := c.GetInt("page", 1) // 默认第一页
  42. userid := c.GetString("userid") // 假设从当前请求传入
  43. // 2. 准备外部接口的请求参数(x-www-form-urlencoded)
  44. data := url.Values{}
  45. data.Set("limit", strconv.Itoa(limit))
  46. data.Set("page", strconv.Itoa(page))
  47. data.Set("userid", userid)
  48. // 3. 构造 HTTP 请求
  49. externalURL := "https://app-api.aiceanglobal1.com/api/v1/reward/inviteListDir" // 替换为真实地址
  50. req, err := http.NewRequest("POST", externalURL, bytes.NewBufferString(data.Encode()))
  51. if err != nil {
  52. c.Data["json"] = map[string]interface{}{"code": 500, "msg": "请求构造失败"}
  53. c.ServeJSON()
  54. return
  55. }
  56. // 4. 设置 Headers
  57. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  58. // 假设 Authorization 是 Bearer token,从配置或环境变量获取
  59. req.Header.Set("Authorization", "Bearer 3dddf3dd7ba5b83d0b7334601d0e08a6")
  60. // 外部接口需要的 userid header(可能和 body 中的 userid 不同,按需设置)
  61. req.Header.Set("userid", "04a0d628189644a1b918f14cde664610")
  62. // 5. 发送请求
  63. client := &http.Client{}
  64. resp, err := client.Do(req)
  65. if err != nil {
  66. c.Data["json"] = map[string]interface{}{"code": 500, "msg": "请求外部接口失败"}
  67. c.ServeJSON()
  68. fmt.Println("errrr:", err)
  69. return
  70. }
  71. defer resp.Body.Close()
  72. // 6. 读取响应体
  73. body, err := ioutil.ReadAll(resp.Body)
  74. if err != nil {
  75. c.Data["json"] = map[string]interface{}{"code": 500, "msg": "读取响应失败"}
  76. c.ServeJSON()
  77. return
  78. }
  79. // 7. 解析 JSON
  80. var externalResp ExternalInviteResponse
  81. if err := json.Unmarshal(body, &externalResp); err != nil {
  82. c.Data["json"] = map[string]interface{}{"code": 500, "msg": "解析响应失败"}
  83. c.ServeJSON()
  84. return
  85. }
  86. if err == nil {
  87. // 遍历列表
  88. for _, item := range externalResp.Data.List {
  89. fmt.Printf("用户: %s, 用户名: %s, 销售额: %s\n",
  90. item.UserID, item.Username, item.Sales)
  91. // 取 count
  92. info := &services.InviteListInfo{
  93. ParentId: userid,
  94. UserId: item.UserID,
  95. Username: item.Username,
  96. PromoteName: item.PromoteName,
  97. Sales: item.Sales,
  98. TeamSales: item.TeamSales,
  99. TodayTeamSales: item.TodayTeamSales,
  100. UserBv: item.UserBV,
  101. SubStatus: strconv.Itoa(item.SubStatus),
  102. CTime: item.CTime,
  103. IsYes: 1,
  104. }
  105. err := inviteListDirService.CreateInviteList(info)
  106. if err != nil {
  107. utils.JSON(&c.Controller, 500, err.Error(), nil)
  108. return
  109. }
  110. }
  111. } else {
  112. fmt.Printf("JSON 序列化失败: %v\n", err)
  113. }
  114. // 8. 根据业务需要处理外部接口返回的数据,例如转换格式、添加额外字段等
  115. // 这里直接透传给客户端,也可以重新封装
  116. c.Data["json"] = externalResp
  117. c.ServeJSON()
  118. }
  119. func (c *InviteListDirController) GetExternalInviteList002() {
  120. // 外部循环 50 次
  121. for i := 0; i < 50; i++ {
  122. // 1. 查询数据库中待处理的用户
  123. records, err := inviteListDirService.GetInviteListByIsYes()
  124. if err != nil {
  125. utils.JSON(&c.Controller, 500, "查询失败: "+err.Error(), nil)
  126. return
  127. }
  128. // 如果本次查询没有数据,说明处理完了,直接跳出大循环
  129. if len(records) == 0 {
  130. break
  131. }
  132. // 2. 遍历用户
  133. for _, record := range records {
  134. // 注意:因为报错提示 mismatched types,说明 record 是值类型而非指针
  135. // 所以这里不需要 if record == nil 的判断,直接使用即可
  136. info := &services.InviteListInfo{
  137. InviteListDirId: record.InviteListDirId,
  138. ParentId: record.ParentId,
  139. UserId: record.UserId,
  140. Username: record.Username,
  141. PromoteName: record.PromoteName,
  142. Sales: record.Sales,
  143. TeamSales: record.TeamSales,
  144. TodayTeamSales: record.TodayTeamSales,
  145. UserBv: record.UserBv,
  146. SubStatus: record.SubStatus,
  147. CTime: record.CTime,
  148. IsYes: 1, // 标记为已处理
  149. }
  150. // 按照业务需求延迟 5 秒
  151. time.Sleep(5 * time.Second)
  152. fmt.Println("正在处理用户ID:", info.UserId)
  153. // 3. 请求外部接口并存入数据库
  154. inviteListDirService.GoRequestNetInfo(info.UserId)
  155. // 4. 修改当前用户状态
  156. err = inviteListDirService.UpdateInviteList(info)
  157. if err != nil {
  158. utils.JSON(&c.Controller, 500, "更新状态失败: "+err.Error(), nil)
  159. return
  160. }
  161. }
  162. }
  163. // 5. 循环全部结束后,正常返回成功
  164. // 此时 err 为空,所以不能调用 err.Error()
  165. utils.JSON(&c.Controller, 200, "处理完成", nil)
  166. }
  167. // InviteListDir 获取邀请列表信息
  168. // @router /api/invite/list [get]
  169. func (c *InviteListDirController) InviteListDir() {
  170. // 获取请求参数
  171. userId, _ := utils.GetRequestString(&c.Controller, "userid")
  172. // 如果提供了userId,则从数据库获取数据
  173. if userId != "" {
  174. record, err := inviteListDirService.GetInviteList(userId)
  175. if err != nil {
  176. utils.JSON(&c.Controller, 500, err.Error(), nil)
  177. return
  178. }
  179. utils.JSON(&c.Controller, 200, "success", map[string]interface{}{
  180. "username": record.Username,
  181. "user_id": record.UserId,
  182. "parent_id": record.ParentId,
  183. "promote_name": record.PromoteName,
  184. "sales": record.Sales,
  185. "team_sales": record.TeamSales,
  186. "today_team_sales": record.TodayTeamSales,
  187. "user_bv": record.UserBv,
  188. "sub_status": record.SubStatus,
  189. "c_time": record.CTime,
  190. "is_yes": record.IsYes,
  191. })
  192. return
  193. }
  194. // 如果没有提供userId,返回空数据
  195. utils.JSON(&c.Controller, 200, "success", map[string]interface{}{
  196. "message": "please provide userid parameter",
  197. })
  198. }
  199. // CreateInviteList 创建邀请列表记录
  200. // @router /api/invite/create [post]
  201. func (c *InviteListDirController) CreateInviteList() {
  202. parentId, _ := utils.GetRequestString(&c.Controller, "parent_id")
  203. userId, _ := utils.GetRequestString(&c.Controller, "user_id")
  204. username, _ := utils.GetRequestString(&c.Controller, "username")
  205. promoteName, _ := utils.GetRequestString(&c.Controller, "promote_name")
  206. sales, _ := utils.GetRequestString(&c.Controller, "sales")
  207. teamSales, _ := utils.GetRequestString(&c.Controller, "team_sales")
  208. todayTeamSales, _ := utils.GetRequestString(&c.Controller, "today_team_sales")
  209. userBv, _ := utils.GetRequestString(&c.Controller, "user_bv")
  210. subStatus, _ := utils.GetRequestString(&c.Controller, "sub_status")
  211. cTimeStr := c.Ctx.Input.Query("c_time")
  212. cTime := int64(0)
  213. if cTimeStr != "" {
  214. if ct, err := strconv.ParseInt(cTimeStr, 10, 64); err == nil {
  215. cTime = ct
  216. }
  217. }
  218. isYesStr := c.Ctx.Input.Query("is_yes")
  219. isYes := 0
  220. if isYesStr != "" {
  221. if iy, err := strconv.Atoi(isYesStr); err == nil {
  222. isYes = iy
  223. }
  224. }
  225. info := &services.InviteListInfo{
  226. ParentId: parentId,
  227. UserId: userId,
  228. Username: username,
  229. PromoteName: promoteName,
  230. Sales: sales,
  231. TeamSales: teamSales,
  232. TodayTeamSales: todayTeamSales,
  233. UserBv: userBv,
  234. SubStatus: subStatus,
  235. CTime: cTime,
  236. IsYes: isYes,
  237. }
  238. err := inviteListDirService.CreateInviteList(info)
  239. if err != nil {
  240. utils.JSON(&c.Controller, 500, err.Error(), nil)
  241. return
  242. }
  243. utils.JSON(&c.Controller, 200, "create success", map[string]interface{}{
  244. "message": "invite list record created successfully",
  245. })
  246. }
  247. // UpdateInviteList 更新邀请列表记录
  248. // @router /api/invite/update [post]
  249. func (c *InviteListDirController) UpdateInviteList() {
  250. parentId, _ := utils.GetRequestString(&c.Controller, "parent_id")
  251. userId, _ := utils.GetRequestString(&c.Controller, "user_id")
  252. username, _ := utils.GetRequestString(&c.Controller, "username")
  253. promoteName, _ := utils.GetRequestString(&c.Controller, "promote_name")
  254. sales, _ := utils.GetRequestString(&c.Controller, "sales")
  255. teamSales, _ := utils.GetRequestString(&c.Controller, "team_sales")
  256. todayTeamSales, _ := utils.GetRequestString(&c.Controller, "today_team_sales")
  257. userBv, _ := utils.GetRequestString(&c.Controller, "user_bv")
  258. subStatus, _ := utils.GetRequestString(&c.Controller, "sub_status")
  259. cTimeStr := c.Ctx.Input.Query("c_time")
  260. cTime := int64(0)
  261. if cTimeStr != "" {
  262. if ct, err := strconv.ParseInt(cTimeStr, 10, 64); err == nil {
  263. cTime = ct
  264. }
  265. }
  266. isYesStr := c.Ctx.Input.Query("is_yes")
  267. isYes := 0
  268. if isYesStr != "" {
  269. if iy, err := strconv.Atoi(isYesStr); err == nil {
  270. isYes = iy
  271. }
  272. }
  273. info := &services.InviteListInfo{
  274. ParentId: parentId,
  275. UserId: userId,
  276. Username: username,
  277. PromoteName: promoteName,
  278. Sales: sales,
  279. TeamSales: teamSales,
  280. TodayTeamSales: todayTeamSales,
  281. UserBv: userBv,
  282. SubStatus: subStatus,
  283. CTime: cTime,
  284. IsYes: isYes,
  285. }
  286. err := inviteListDirService.UpdateInviteList(info)
  287. if err != nil {
  288. utils.JSON(&c.Controller, 500, err.Error(), nil)
  289. return
  290. }
  291. utils.JSON(&c.Controller, 200, "update success", map[string]interface{}{
  292. "message": "invite list record updated successfully",
  293. })
  294. }
  295. // GetAllInviteLists 获取所有邀请列表记录(分页)
  296. // @router /api/invite/listAll [get]
  297. func (c *InviteListDirController) GetAllInviteLists() {
  298. // 获取分页参数
  299. pageStr := c.Ctx.Input.Query("page")
  300. pageSizeStr := c.Ctx.Input.Query("pageSize")
  301. page := 1
  302. pageSize := 10
  303. if pageStr != "" {
  304. if p, err := strconv.Atoi(pageStr); err == nil && p > 0 {
  305. page = p
  306. }
  307. }
  308. if pageSizeStr != "" {
  309. if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 {
  310. pageSize = ps
  311. }
  312. }
  313. offset := int64((page - 1) * pageSize)
  314. limit := int64(pageSize)
  315. records, total, err := inviteListDirService.GetAllInviteLists(offset, limit)
  316. if err != nil {
  317. utils.JSON(&c.Controller, 500, err.Error(), nil)
  318. return
  319. }
  320. utils.JSON(&c.Controller, 200, "success", map[string]interface{}{
  321. "list": records,
  322. "total": total,
  323. "page": page,
  324. "pageSize": pageSize,
  325. })
  326. }
  327. // DeleteInviteList 删除邀请列表记录
  328. // @router /api/invite/delete [post]
  329. func (c *InviteListDirController) DeleteInviteList() {
  330. userId, _ := utils.GetRequestString(&c.Controller, "user_id")
  331. err := inviteListDirService.DeleteInviteList(userId)
  332. if err != nil {
  333. utils.JSON(&c.Controller, 500, err.Error(), nil)
  334. return
  335. }
  336. utils.JSON(&c.Controller, 200, "success", map[string]interface{}{
  337. "message": "invite list record deleted successfully",
  338. })
  339. }