InviteListDirService.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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. // 遍历列表
  115. for _, item := range externalResp.Data.List {
  116. // 取 count
  117. info := &InviteListInfo{
  118. ParentId: userId,
  119. UserId: item.UserID,
  120. Username: item.Username,
  121. PromoteName: item.PromoteName,
  122. Sales: item.Sales,
  123. TeamSales: item.TeamSales,
  124. TodayTeamSales: item.TodayTeamSales,
  125. UserBv: item.UserBV,
  126. SubStatus: strconv.Itoa(item.SubStatus),
  127. CTime: item.CTime,
  128. IsYes: 0,
  129. }
  130. err := svc.CreateInviteList(info)
  131. if err != nil {
  132. return
  133. }
  134. }
  135. }
  136. func (s *InviteListDirService) GetInviteListByIsYes() ([]InviteListInfo, error) {
  137. query := make(map[string]string)
  138. query["is_yes"] = strconv.Itoa(0)
  139. fields := []string{"InviteListDirId", "ParentId", "UserId", "Username", "PromoteName", "Sales", "TeamSales", "TodayTeamSales", "UserBv", "SubStatus", "CTime", "IsYes"}
  140. sortby := []string{"InviteListDirId"}
  141. order := []string{"desc"}
  142. ml, err := models.GetAllInviteList(query, fields, sortby, order, 0, 100)
  143. if err != nil {
  144. return nil, err
  145. }
  146. //fmt.Printf("ml------:", ml)
  147. result := make([]InviteListInfo, 0, len(ml))
  148. for _, item := range ml {
  149. // 断言 item 是 map[string]interface{}
  150. m, ok := item.(map[string]interface{})
  151. if !ok {
  152. // 类型不匹配,跳过或记录错误
  153. continue
  154. }
  155. // 从 map 中安全提取字段(注意字段名与 JSON 标签一致)
  156. info := InviteListInfo{
  157. InviteListDirId: getInt(m, "InviteListDirId"), // 根据实际字段名调整
  158. ParentId: getString(m, "ParentId"),
  159. UserId: getString(m, "UserId"),
  160. Username: getString(m, "Username"),
  161. PromoteName: getString(m, "PromoteName"),
  162. Sales: getString(m, "Sales"),
  163. TeamSales: getString(m, "TeamSales"),
  164. TodayTeamSales: getString(m, "TodayTeamSales"),
  165. UserBv: getString(m, "UserBv"),
  166. SubStatus: getString(m, "SubStatus"),
  167. CTime: getInt64(m, "CTime"),
  168. IsYes: getInt(m, "IsYes"),
  169. }
  170. result = append(result, info)
  171. }
  172. return result, err
  173. }
  174. // CreateInviteList creates a new invite list record
  175. func (s *InviteListDirService) CreateInviteList(info *InviteListInfo) error {
  176. if info.UserId == "" {
  177. return errors.New("user_id is required")
  178. }
  179. // Check if record already exists
  180. o := orm.NewOrm()
  181. record := &models.InviteList{UserId: info.UserId}
  182. err := o.Read(record, "UserId")
  183. if err == nil {
  184. return errors.New("invite list record already exists")
  185. }
  186. record = &models.InviteList{
  187. ParentId: info.ParentId,
  188. UserId: info.UserId,
  189. Username: info.Username,
  190. PromoteName: info.PromoteName,
  191. Sales: info.Sales,
  192. TeamSales: info.TeamSales,
  193. TodayTeamSales: info.TodayTeamSales,
  194. UserBv: info.UserBv,
  195. SubStatus: info.SubStatus,
  196. CTime: info.CTime,
  197. IsYes: info.IsYes,
  198. }
  199. _, err = models.AddInviteList(record)
  200. return err
  201. }
  202. // UpdateInviteList updates an existing invite list record
  203. func (s *InviteListDirService) UpdateInviteList(info *InviteListInfo) error {
  204. if info.UserId == "" {
  205. return errors.New("user_id is required")
  206. }
  207. o := orm.NewOrm()
  208. record := &models.InviteList{UserId: info.UserId}
  209. err := o.Read(record, "UserId")
  210. if err != nil {
  211. if err == orm.ErrNoRows {
  212. return errors.New("invite list record not found")
  213. }
  214. return err
  215. }
  216. // Update fields
  217. record.ParentId = info.ParentId
  218. record.Username = info.Username
  219. record.PromoteName = info.PromoteName
  220. record.Sales = info.Sales
  221. record.TeamSales = info.TeamSales
  222. record.TodayTeamSales = info.TodayTeamSales
  223. record.UserBv = info.UserBv
  224. record.SubStatus = info.SubStatus
  225. record.CTime = info.CTime
  226. record.IsYes = info.IsYes
  227. return models.UpdateInviteListById(record)
  228. }
  229. // GetAllInviteLists retrieves all invite list records with pagination
  230. func (s *InviteListDirService) GetAllInviteLists(offset, limit int64) ([]InviteListInfo, int64, error) {
  231. query := make(map[string]string)
  232. fields := []string{"InviteListDirId", "ParentId", "UserId", "Username", "PromoteName", "Sales", "TeamSales", "TodayTeamSales", "UserBv", "SubStatus", "CTime", "IsYes"}
  233. sortby := []string{"InviteListDirId"}
  234. order := []string{"desc"}
  235. ml, err := models.GetAllInviteList(query, fields, sortby, order, offset, limit)
  236. if err != nil {
  237. return nil, 0, err
  238. }
  239. result := make([]InviteListInfo, 0, len(ml))
  240. for _, item := range ml {
  241. if record, ok := item.(models.InviteList); ok {
  242. result = append(result, InviteListInfo{
  243. InviteListDirId: record.InviteListDirId,
  244. ParentId: record.ParentId,
  245. UserId: record.UserId,
  246. Username: record.Username,
  247. PromoteName: record.PromoteName,
  248. Sales: record.Sales,
  249. TeamSales: record.TeamSales,
  250. TodayTeamSales: record.TodayTeamSales,
  251. UserBv: record.UserBv,
  252. SubStatus: record.SubStatus,
  253. CTime: record.CTime,
  254. IsYes: record.IsYes,
  255. })
  256. }
  257. }
  258. // Get total count
  259. o := orm.NewOrm()
  260. count, err := o.QueryTable(new(models.InviteList)).Count()
  261. if err != nil {
  262. return result, 0, err
  263. }
  264. return result, count, nil
  265. }
  266. // DeleteInviteList deletes an invite list record by user_id
  267. func (s *InviteListDirService) DeleteInviteList(userId string) error {
  268. if userId == "" {
  269. return errors.New("user_id is required")
  270. }
  271. o := orm.NewOrm()
  272. record := &models.InviteList{UserId: userId}
  273. err := o.Read(record, "UserId")
  274. if err != nil {
  275. if err == orm.ErrNoRows {
  276. return errors.New("invite list record not found")
  277. }
  278. return err
  279. }
  280. return models.DeleteInviteList(record.InviteListDirId)
  281. }
  282. // 从 map 中安全获取 string 值
  283. func getString(m map[string]interface{}, key string) string {
  284. if v, ok := m[key]; ok {
  285. if s, ok := v.(string); ok {
  286. return s
  287. }
  288. }
  289. return ""
  290. }
  291. // 从 map 中安全获取 int 值(兼容 float64)
  292. func getInt(m map[string]interface{}, key string) int {
  293. if v, ok := m[key]; ok {
  294. switch val := v.(type) {
  295. case int:
  296. return val
  297. case float64:
  298. return int(val)
  299. case int64:
  300. return int(val)
  301. }
  302. }
  303. return 0
  304. }
  305. // 从 map 中安全获取 int64 值(兼容 float64)
  306. func getInt64(m map[string]interface{}, key string) int64 {
  307. if v, ok := m[key]; ok {
  308. switch val := v.(type) {
  309. case int64:
  310. return val
  311. case float64:
  312. return int64(val)
  313. case int:
  314. return int64(val)
  315. }
  316. }
  317. return 0
  318. }