InviteListDirService.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "net/url"
  10. "strconv"
  11. "think-go/models"
  12. "github.com/beego/beego/v2/client/orm"
  13. )
  14. type InviteListDirService struct{}
  15. // InviteListInfo represents the invite list information
  16. type InviteListInfo struct {
  17. InviteListDirId int `json:"invite_list_dir_id"`
  18. ParentId string `json:"parent_id"`
  19. UserId string `json:"user_id"`
  20. Username string `json:"username"`
  21. PromoteName string `json:"promote_name"`
  22. Sales string `json:"sales"`
  23. TeamSales string `json:"team_sales"`
  24. TodayTeamSales string `json:"today_team_sales"`
  25. UserBv string `json:"user_bv"`
  26. SubStatus string `json:"sub_status"`
  27. CTime int64 `json:"c_time"`
  28. IsYes int `json:"is_yes"`
  29. }
  30. // GetInviteList retrieves invite list information by user_id
  31. func (s *InviteListDirService) GetInviteList(userId string) (*InviteListInfo, error) {
  32. if userId == "" {
  33. return nil, errors.New("user_id is required")
  34. }
  35. o := orm.NewOrm()
  36. record := &models.InviteList{UserId: userId}
  37. err := o.Read(record, "UserId")
  38. if err != nil {
  39. if err == orm.ErrNoRows {
  40. return nil, errors.New("invite list record not found")
  41. }
  42. return nil, err
  43. }
  44. return &InviteListInfo{
  45. InviteListDirId: record.InviteListDirId,
  46. ParentId: record.ParentId,
  47. UserId: record.UserId,
  48. Username: record.Username,
  49. PromoteName: record.PromoteName,
  50. Sales: record.Sales,
  51. TeamSales: record.TeamSales,
  52. TodayTeamSales: record.TodayTeamSales,
  53. UserBv: record.UserBv,
  54. SubStatus: record.SubStatus,
  55. CTime: record.CTime,
  56. IsYes: record.IsYes,
  57. }, nil
  58. }
  59. type ExternalInviteResponse struct {
  60. Code int `json:"code"`
  61. Data struct {
  62. InviteAmount int `json:"invite_amount"`
  63. List []struct {
  64. CTime int64 `json:"c_time"`
  65. UserID string `json:"userid"`
  66. Username string `json:"username"`
  67. PromoteName string `json:"promote_name"`
  68. Sales string `json:"sales"`
  69. TeamSales string `json:"team_sales"`
  70. TodayTeamSales string `json:"today_team_sales"`
  71. UserBV string `json:"user_bv"`
  72. SubStatus int `json:"sub_status"`
  73. } `json:"list"`
  74. Count int `json:"count"`
  75. } `json:"data"`
  76. }
  77. func (s *InviteListDirService) GoRequestNetInfo(userId string) {
  78. svc := &InviteListDirService{}
  79. // 2. 准备外部接口的请求参数(x-www-form-urlencoded)
  80. data := url.Values{}
  81. data.Set("limit", strconv.Itoa(1000))
  82. data.Set("page", strconv.Itoa(1))
  83. data.Set("userid", userId)
  84. // 3. 构造 HTTP 请求
  85. externalURL := "https://app-api.aiceanglobal1.com/api/v1/reward/inviteListDir" // 替换为真实地址
  86. req, err := http.NewRequest("POST", externalURL, bytes.NewBufferString(data.Encode()))
  87. if err != nil {
  88. return
  89. }
  90. // 4. 设置 Headers
  91. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  92. // 假设 Authorization 是 Bearer token,从配置或环境变量获取
  93. req.Header.Set("Authorization", "Bearer 590d13fe9d0ea64df44c00c02ce8dd23")
  94. // 外部接口需要的 userid header(可能和 body 中的 userid 不同,按需设置)
  95. req.Header.Set("userid", "04a0d628189644a1b918f14cde664610")
  96. // 5. 发送请求
  97. client := &http.Client{}
  98. resp, err := client.Do(req)
  99. if err != nil {
  100. fmt.Println("errrr:", err)
  101. return
  102. }
  103. defer resp.Body.Close()
  104. // 6. 读取响应体
  105. body, err := ioutil.ReadAll(resp.Body)
  106. if err != nil {
  107. return
  108. }
  109. // 7. 解析 JSON
  110. var externalResp ExternalInviteResponse
  111. if err := json.Unmarshal(body, &externalResp); err != nil {
  112. return
  113. }
  114. if err == nil {
  115. // 遍历列表
  116. for _, item := range externalResp.Data.List {
  117. // 取 count
  118. info := &InviteListInfo{
  119. ParentId: userId,
  120. UserId: item.UserID,
  121. Username: item.Username,
  122. PromoteName: item.PromoteName,
  123. Sales: item.Sales,
  124. TeamSales: item.TeamSales,
  125. TodayTeamSales: item.TodayTeamSales,
  126. UserBv: item.UserBV,
  127. SubStatus: strconv.Itoa(item.SubStatus),
  128. CTime: item.CTime,
  129. IsYes: 0,
  130. }
  131. err := svc.CreateInviteList(info)
  132. if err != nil {
  133. return
  134. }
  135. }
  136. } else {
  137. fmt.Printf("JSON 序列化失败: %v\n", err)
  138. }
  139. }
  140. func (s *InviteListDirService) GetInviteListByIsYes() ([]InviteListInfo, error) {
  141. query := make(map[string]string)
  142. query["is_yes"] = strconv.Itoa(0)
  143. fields := []string{"InviteListDirId", "ParentId", "UserId", "Username", "PromoteName", "Sales", "TeamSales", "TodayTeamSales", "UserBv", "SubStatus", "CTime", "IsYes"}
  144. sortby := []string{"InviteListDirId"}
  145. order := []string{"desc"}
  146. ml, err := models.GetAllInviteList(query, fields, sortby, order, 0, 100)
  147. if err != nil {
  148. return nil, err
  149. }
  150. //fmt.Printf("ml------:", ml)
  151. result := make([]InviteListInfo, 0, len(ml))
  152. for _, item := range ml {
  153. // 断言 item 是 map[string]interface{}
  154. m, ok := item.(map[string]interface{})
  155. if !ok {
  156. // 类型不匹配,跳过或记录错误
  157. continue
  158. }
  159. // 从 map 中安全提取字段(注意字段名与 JSON 标签一致)
  160. info := InviteListInfo{
  161. InviteListDirId: getInt(m, "InviteListDirId"), // 根据实际字段名调整
  162. ParentId: getString(m, "ParentId"),
  163. UserId: getString(m, "UserId"),
  164. Username: getString(m, "Username"),
  165. PromoteName: getString(m, "PromoteName"),
  166. Sales: getString(m, "Sales"),
  167. TeamSales: getString(m, "TeamSales"),
  168. TodayTeamSales: getString(m, "TodayTeamSales"),
  169. UserBv: getString(m, "UserBv"),
  170. SubStatus: getString(m, "SubStatus"),
  171. CTime: getInt64(m, "CTime"),
  172. IsYes: getInt(m, "IsYes"),
  173. }
  174. result = append(result, info)
  175. }
  176. return result, err
  177. }
  178. // CreateInviteList creates a new invite list record
  179. func (s *InviteListDirService) CreateInviteList(info *InviteListInfo) error {
  180. if info.UserId == "" {
  181. return errors.New("user_id is required")
  182. }
  183. // Check if record already exists
  184. o := orm.NewOrm()
  185. record := &models.InviteList{UserId: info.UserId}
  186. err := o.Read(record, "UserId")
  187. if err == nil {
  188. return errors.New("invite list record already exists")
  189. }
  190. record = &models.InviteList{
  191. ParentId: info.ParentId,
  192. UserId: info.UserId,
  193. Username: info.Username,
  194. PromoteName: info.PromoteName,
  195. Sales: info.Sales,
  196. TeamSales: info.TeamSales,
  197. TodayTeamSales: info.TodayTeamSales,
  198. UserBv: info.UserBv,
  199. SubStatus: info.SubStatus,
  200. CTime: info.CTime,
  201. IsYes: info.IsYes,
  202. }
  203. _, err = models.AddInviteList(record)
  204. return err
  205. }
  206. // UpdateInviteList updates an existing invite list record
  207. func (s *InviteListDirService) UpdateInviteList(info *InviteListInfo) error {
  208. if info.UserId == "" {
  209. return errors.New("user_id is required")
  210. }
  211. o := orm.NewOrm()
  212. record := &models.InviteList{UserId: info.UserId}
  213. err := o.Read(record, "UserId")
  214. if err != nil {
  215. if err == orm.ErrNoRows {
  216. return errors.New("invite list record not found")
  217. }
  218. return err
  219. }
  220. // Update fields
  221. record.ParentId = info.ParentId
  222. record.Username = info.Username
  223. record.PromoteName = info.PromoteName
  224. record.Sales = info.Sales
  225. record.TeamSales = info.TeamSales
  226. record.TodayTeamSales = info.TodayTeamSales
  227. record.UserBv = info.UserBv
  228. record.SubStatus = info.SubStatus
  229. record.CTime = info.CTime
  230. record.IsYes = info.IsYes
  231. return models.UpdateInviteListById(record)
  232. }
  233. // GetAllInviteLists retrieves all invite list records with pagination
  234. func (s *InviteListDirService) GetAllInviteLists(offset, limit int64) ([]InviteListInfo, int64, error) {
  235. query := make(map[string]string)
  236. fields := []string{"InviteListDirId", "ParentId", "UserId", "Username", "PromoteName", "Sales", "TeamSales", "TodayTeamSales", "UserBv", "SubStatus", "CTime", "IsYes"}
  237. sortby := []string{"InviteListDirId"}
  238. order := []string{"desc"}
  239. ml, err := models.GetAllInviteList(query, fields, sortby, order, offset, limit)
  240. if err != nil {
  241. return nil, 0, err
  242. }
  243. result := make([]InviteListInfo, 0, len(ml))
  244. for _, item := range ml {
  245. if record, ok := item.(models.InviteList); ok {
  246. result = append(result, InviteListInfo{
  247. InviteListDirId: record.InviteListDirId,
  248. ParentId: record.ParentId,
  249. UserId: record.UserId,
  250. Username: record.Username,
  251. PromoteName: record.PromoteName,
  252. Sales: record.Sales,
  253. TeamSales: record.TeamSales,
  254. TodayTeamSales: record.TodayTeamSales,
  255. UserBv: record.UserBv,
  256. SubStatus: record.SubStatus,
  257. CTime: record.CTime,
  258. IsYes: record.IsYes,
  259. })
  260. }
  261. }
  262. // Get total count
  263. o := orm.NewOrm()
  264. count, err := o.QueryTable(new(models.InviteList)).Count()
  265. if err != nil {
  266. return result, 0, err
  267. }
  268. return result, count, nil
  269. }
  270. // DeleteInviteList deletes an invite list record by user_id
  271. func (s *InviteListDirService) DeleteInviteList(userId string) error {
  272. if userId == "" {
  273. return errors.New("user_id is required")
  274. }
  275. o := orm.NewOrm()
  276. record := &models.InviteList{UserId: userId}
  277. err := o.Read(record, "UserId")
  278. if err != nil {
  279. if err == orm.ErrNoRows {
  280. return errors.New("invite list record not found")
  281. }
  282. return err
  283. }
  284. return models.DeleteInviteList(record.InviteListDirId)
  285. }
  286. // 从 map 中安全获取 string 值
  287. func getString(m map[string]interface{}, key string) string {
  288. if v, ok := m[key]; ok {
  289. if s, ok := v.(string); ok {
  290. return s
  291. }
  292. }
  293. return ""
  294. }
  295. // 从 map 中安全获取 int 值(兼容 float64)
  296. func getInt(m map[string]interface{}, key string) int {
  297. if v, ok := m[key]; ok {
  298. switch val := v.(type) {
  299. case int:
  300. return val
  301. case float64:
  302. return int(val)
  303. case int64:
  304. return int(val)
  305. }
  306. }
  307. return 0
  308. }
  309. // 从 map 中安全获取 int64 值(兼容 float64)
  310. func getInt64(m map[string]interface{}, key string) int64 {
  311. if v, ok := m[key]; ok {
  312. switch val := v.(type) {
  313. case int64:
  314. return val
  315. case float64:
  316. return int64(val)
  317. case int:
  318. return int64(val)
  319. }
  320. }
  321. return 0
  322. }