|
@@ -0,0 +1,390 @@
|
|
|
|
|
+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
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if err == nil {
|
|
|
|
|
+
|
|
|
|
|
+ // 遍历列表
|
|
|
|
|
+ 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
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ fmt.Printf("JSON 序列化失败: %v\n", err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 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",
|
|
|
|
|
+ })
|
|
|
|
|
+}
|