package api import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" "strconv" "think-go/controllers/services" "think-go/utils" "time" beego "github.com/beego/beego/v2/server/web" ) type InviteListDirController struct { beego.Controller } var inviteListDirService = &services.InviteListDirService{} type ExternalInviteResponse struct { Code int `json:"code"` Data struct { InviteAmount int `json:"invite_amount"` List []struct { CTime int64 `json:"c_time"` UserID string `json:"userid"` Username string `json:"username"` PromoteName string `json:"promote_name"` Sales string `json:"sales"` TeamSales string `json:"team_sales"` TodayTeamSales string `json:"today_team_sales"` UserBV string `json:"user_bv"` SubStatus int `json:"sub_status"` } `json:"list"` Count int `json:"count"` } `json:"data"` } // 假设路由为 /invite/list [post] func (c *InviteListDirController) GetExternalInviteList() { // 1. 获取当前请求中的参数(可以根据业务从 c 中获取,例如 c.GetInt 等) limit, _ := c.GetInt("limit", 10) // 默认每页10条 page, _ := c.GetInt("page", 1) // 默认第一页 userid := c.GetString("userid") // 假设从当前请求传入 // 2. 准备外部接口的请求参数(x-www-form-urlencoded) data := url.Values{} data.Set("limit", strconv.Itoa(limit)) data.Set("page", strconv.Itoa(page)) data.Set("userid", userid) // 3. 构造 HTTP 请求 externalURL := "https://app-api.aiceanglobal1.com/api/v1/reward/inviteListDir" // 替换为真实地址 req, err := http.NewRequest("POST", externalURL, bytes.NewBufferString(data.Encode())) if err != nil { c.Data["json"] = map[string]interface{}{"code": 500, "msg": "请求构造失败"} c.ServeJSON() return } // 4. 设置 Headers req.Header.Set("Content-Type", "application/x-www-form-urlencoded") // 假设 Authorization 是 Bearer token,从配置或环境变量获取 req.Header.Set("Authorization", "Bearer 3dddf3dd7ba5b83d0b7334601d0e08a6") // 外部接口需要的 userid header(可能和 body 中的 userid 不同,按需设置) req.Header.Set("userid", "04a0d628189644a1b918f14cde664610") // 5. 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { c.Data["json"] = map[string]interface{}{"code": 500, "msg": "请求外部接口失败"} c.ServeJSON() fmt.Println("errrr:", err) return } defer resp.Body.Close() // 6. 读取响应体 body, err := ioutil.ReadAll(resp.Body) if err != nil { c.Data["json"] = map[string]interface{}{"code": 500, "msg": "读取响应失败"} c.ServeJSON() return } // 7. 解析 JSON var externalResp ExternalInviteResponse if err := json.Unmarshal(body, &externalResp); err != nil { c.Data["json"] = map[string]interface{}{"code": 500, "msg": "解析响应失败"} c.ServeJSON() return } // 遍历列表 for _, item := range externalResp.Data.List { fmt.Printf("用户: %s, 用户名: %s, 销售额: %s\n", item.UserID, item.Username, item.Sales) // 取 count info := &services.InviteListInfo{ ParentId: userid, UserId: item.UserID, Username: item.Username, PromoteName: item.PromoteName, Sales: item.Sales, TeamSales: item.TeamSales, TodayTeamSales: item.TodayTeamSales, UserBv: item.UserBV, SubStatus: strconv.Itoa(item.SubStatus), CTime: item.CTime, IsYes: 1, } err := inviteListDirService.CreateInviteList(info) if err != nil { utils.JSON(&c.Controller, 500, err.Error(), nil) return } } // 8. 根据业务需要处理外部接口返回的数据,例如转换格式、添加额外字段等 // 这里直接透传给客户端,也可以重新封装 c.Data["json"] = externalResp c.ServeJSON() } func (c *InviteListDirController) GetExternalInviteList002() { // 外部循环 50 次 for i := 0; i < 50; i++ { // 1. 查询数据库中待处理的用户 records, err := inviteListDirService.GetInviteListByIsYes() if err != nil { utils.JSON(&c.Controller, 500, "查询失败: "+err.Error(), nil) return } // 如果本次查询没有数据,说明处理完了,直接跳出大循环 if len(records) == 0 { break } // 2. 遍历用户 for _, record := range records { // 注意:因为报错提示 mismatched types,说明 record 是值类型而非指针 // 所以这里不需要 if record == nil 的判断,直接使用即可 info := &services.InviteListInfo{ InviteListDirId: record.InviteListDirId, ParentId: record.ParentId, UserId: record.UserId, Username: record.Username, PromoteName: record.PromoteName, Sales: record.Sales, TeamSales: record.TeamSales, TodayTeamSales: record.TodayTeamSales, UserBv: record.UserBv, SubStatus: record.SubStatus, CTime: record.CTime, IsYes: 1, // 标记为已处理 } // 按照业务需求延迟 5 秒 time.Sleep(5 * time.Second) fmt.Println("正在处理用户ID:", info.UserId) // 3. 请求外部接口并存入数据库 inviteListDirService.GoRequestNetInfo(info.UserId) // 4. 修改当前用户状态 err = inviteListDirService.UpdateInviteList(info) if err != nil { utils.JSON(&c.Controller, 500, "更新状态失败: "+err.Error(), nil) return } } } // 5. 循环全部结束后,正常返回成功 // 此时 err 为空,所以不能调用 err.Error() utils.JSON(&c.Controller, 200, "处理完成", nil) } // InviteListDir 获取邀请列表信息 // @router /api/invite/list [get] func (c *InviteListDirController) InviteListDir() { // 获取请求参数 userId, _ := utils.GetRequestString(&c.Controller, "userid") // 如果提供了userId,则从数据库获取数据 if userId != "" { record, err := inviteListDirService.GetInviteList(userId) if err != nil { utils.JSON(&c.Controller, 500, err.Error(), nil) return } utils.JSON(&c.Controller, 200, "success", map[string]interface{}{ "username": record.Username, "user_id": record.UserId, "parent_id": record.ParentId, "promote_name": record.PromoteName, "sales": record.Sales, "team_sales": record.TeamSales, "today_team_sales": record.TodayTeamSales, "user_bv": record.UserBv, "sub_status": record.SubStatus, "c_time": record.CTime, "is_yes": record.IsYes, }) return } // 如果没有提供userId,返回空数据 utils.JSON(&c.Controller, 200, "success", map[string]interface{}{ "message": "please provide userid parameter", }) } // CreateInviteList 创建邀请列表记录 // @router /api/invite/create [post] func (c *InviteListDirController) CreateInviteList() { parentId, _ := utils.GetRequestString(&c.Controller, "parent_id") userId, _ := utils.GetRequestString(&c.Controller, "user_id") username, _ := utils.GetRequestString(&c.Controller, "username") promoteName, _ := utils.GetRequestString(&c.Controller, "promote_name") sales, _ := utils.GetRequestString(&c.Controller, "sales") teamSales, _ := utils.GetRequestString(&c.Controller, "team_sales") todayTeamSales, _ := utils.GetRequestString(&c.Controller, "today_team_sales") userBv, _ := utils.GetRequestString(&c.Controller, "user_bv") subStatus, _ := utils.GetRequestString(&c.Controller, "sub_status") cTimeStr := c.Ctx.Input.Query("c_time") cTime := int64(0) if cTimeStr != "" { if ct, err := strconv.ParseInt(cTimeStr, 10, 64); err == nil { cTime = ct } } isYesStr := c.Ctx.Input.Query("is_yes") isYes := 0 if isYesStr != "" { if iy, err := strconv.Atoi(isYesStr); err == nil { isYes = iy } } info := &services.InviteListInfo{ ParentId: parentId, UserId: userId, Username: username, PromoteName: promoteName, Sales: sales, TeamSales: teamSales, TodayTeamSales: todayTeamSales, UserBv: userBv, SubStatus: subStatus, CTime: cTime, IsYes: isYes, } err := inviteListDirService.CreateInviteList(info) if err != nil { utils.JSON(&c.Controller, 500, err.Error(), nil) return } utils.JSON(&c.Controller, 200, "create success", map[string]interface{}{ "message": "invite list record created successfully", }) } // UpdateInviteList 更新邀请列表记录 // @router /api/invite/update [post] func (c *InviteListDirController) UpdateInviteList() { parentId, _ := utils.GetRequestString(&c.Controller, "parent_id") userId, _ := utils.GetRequestString(&c.Controller, "user_id") username, _ := utils.GetRequestString(&c.Controller, "username") promoteName, _ := utils.GetRequestString(&c.Controller, "promote_name") sales, _ := utils.GetRequestString(&c.Controller, "sales") teamSales, _ := utils.GetRequestString(&c.Controller, "team_sales") todayTeamSales, _ := utils.GetRequestString(&c.Controller, "today_team_sales") userBv, _ := utils.GetRequestString(&c.Controller, "user_bv") subStatus, _ := utils.GetRequestString(&c.Controller, "sub_status") cTimeStr := c.Ctx.Input.Query("c_time") cTime := int64(0) if cTimeStr != "" { if ct, err := strconv.ParseInt(cTimeStr, 10, 64); err == nil { cTime = ct } } isYesStr := c.Ctx.Input.Query("is_yes") isYes := 0 if isYesStr != "" { if iy, err := strconv.Atoi(isYesStr); err == nil { isYes = iy } } info := &services.InviteListInfo{ ParentId: parentId, UserId: userId, Username: username, PromoteName: promoteName, Sales: sales, TeamSales: teamSales, TodayTeamSales: todayTeamSales, UserBv: userBv, SubStatus: subStatus, CTime: cTime, IsYes: isYes, } err := inviteListDirService.UpdateInviteList(info) if err != nil { utils.JSON(&c.Controller, 500, err.Error(), nil) return } utils.JSON(&c.Controller, 200, "update success", map[string]interface{}{ "message": "invite list record updated successfully", }) } // GetAllInviteLists 获取所有邀请列表记录(分页) // @router /api/invite/listAll [get] func (c *InviteListDirController) GetAllInviteLists() { // 获取分页参数 pageStr := c.Ctx.Input.Query("page") pageSizeStr := c.Ctx.Input.Query("pageSize") page := 1 pageSize := 10 if pageStr != "" { if p, err := strconv.Atoi(pageStr); err == nil && p > 0 { page = p } } if pageSizeStr != "" { if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 { pageSize = ps } } offset := int64((page - 1) * pageSize) limit := int64(pageSize) records, total, err := inviteListDirService.GetAllInviteLists(offset, limit) if err != nil { utils.JSON(&c.Controller, 500, err.Error(), nil) return } utils.JSON(&c.Controller, 200, "success", map[string]interface{}{ "list": records, "total": total, "page": page, "pageSize": pageSize, }) } // DeleteInviteList 删除邀请列表记录 // @router /api/invite/delete [post] func (c *InviteListDirController) DeleteInviteList() { userId, _ := utils.GetRequestString(&c.Controller, "user_id") err := inviteListDirService.DeleteInviteList(userId) if err != nil { utils.JSON(&c.Controller, 500, err.Error(), nil) return } utils.JSON(&c.Controller, 200, "success", map[string]interface{}{ "message": "invite list record deleted successfully", }) }