SyncDataService.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package services
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "think-go/models"
  6. "think-go/utils"
  7. "time"
  8. "github.com/beego/beego/v2/client/orm" // 确保引入了 orm
  9. )
  10. // SyncDataService 提供对外同步数据调用
  11. type SyncDataService struct{}
  12. // ApiResponse 用于解析外部接口的通用外层
  13. type ApiResponse[T any] struct {
  14. Code json.Number `json:"code"`
  15. Msg string `json:"msg"`
  16. Data T `json:"data"` // 利用结构体标签自动过滤掉不需要的字段
  17. }
  18. func (s *SyncDataService) SyncDetails(url, userid, authorization string, body interface{}) (int, []byte, error) {
  19. headers := map[string]string{
  20. "userid": userid,
  21. "authorization": authorization,
  22. }
  23. // 注意:此处如果目标服务器证书有问题,建议将最后一个参数改为 true
  24. return utils.PostJSON(url, headers, body, 15*time.Second, false)
  25. }
  26. func (s *SyncDataService) SyncDetailsInsecure() (int, interface{}, error) {
  27. url := "https://app-api.aiceanglobal1.com/api/v1/wallet/details"
  28. userid := "0716d0ad7eb6404682fcaf564379e4e8"
  29. authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
  30. body := map[string]interface{}{}
  31. // 1. 发起请求
  32. status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
  33. if err != nil {
  34. return status, nil, fmt.Errorf("请求接口失败: %w", err)
  35. }
  36. // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
  37. var resp ApiResponse[models.HomeData] // 结构体:利用标签自动过滤多余字段
  38. var rawMap map[string]interface{} // Map:保留所有原始键值对
  39. err = json.Unmarshal(dataBytes, &resp)
  40. if err != nil {
  41. return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
  42. }
  43. // 解析原始 Map(为了返回完整数据)
  44. if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
  45. return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
  46. }
  47. codeInt, _ := resp.Code.Int64()
  48. // 3. 业务状态码校验
  49. if codeInt != 200 {
  50. return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
  51. }
  52. // 4. 数据加工与入库
  53. // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
  54. wallet := resp.Data
  55. wallet.UserId = userid // 手动补全 userId
  56. o := orm.NewOrm()
  57. // 执行插入
  58. _, err = o.Insert(&wallet)
  59. if err != nil {
  60. return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
  61. }
  62. // 5. 合并返回内容
  63. // 创建一个大的 Map,把两个对象塞进去
  64. combinedResult := map[string]interface{}{
  65. "filtered": wallet, // 这是根据你的模型过滤后的干净数据
  66. "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
  67. }
  68. // 返回状态码和解析后的 Data 结构体
  69. return status, combinedResult, nil
  70. }
  71. // 首页接口
  72. func (s *SyncDataService) SyncHomeData() (int, interface{}, error) {
  73. url := "https://app-api.aiceanglobal1.com/api/v1/dashboard/home"
  74. userid := "0716d0ad7eb6404682fcaf564379e4e8"
  75. authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
  76. body := map[string]interface{}{}
  77. // 1. 发起请求
  78. status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
  79. if err != nil {
  80. return status, nil, fmt.Errorf("请求接口失败: %w", err)
  81. }
  82. // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
  83. var resp ApiResponse[models.HomeData] // 结构体:利用标签自动过滤多余字段
  84. var rawMap map[string]interface{} // Map:保留所有原始键值对
  85. err = json.Unmarshal(dataBytes, &resp)
  86. if err != nil {
  87. return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
  88. }
  89. // 解析原始 Map(为了返回完整数据)
  90. if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
  91. return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
  92. }
  93. codeInt, _ := resp.Code.Int64()
  94. // 3. 业务状态码校验
  95. if codeInt != 200 {
  96. return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
  97. }
  98. // 4. 数据加工与入库
  99. // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
  100. wallet := resp.Data
  101. wallet.UserId = userid // 手动补全 userId
  102. o := orm.NewOrm()
  103. // 执行插入
  104. _, err = o.Insert(&wallet)
  105. if err != nil {
  106. return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
  107. }
  108. // 5. 合并返回内容
  109. // 创建一个大的 Map,把两个对象塞进去
  110. combinedResult := map[string]interface{}{
  111. "filtered": wallet, // 这是根据你的模型过滤后的干净数据
  112. "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
  113. }
  114. return status, combinedResult, nil
  115. }
  116. // 社区发展奖励
  117. func (s *SyncDataService) SyncCommunityReward() (int, interface{}, error) {
  118. url := "https://app-api.aiceanglobal1.com/api/v1/reward/develop/home"
  119. userid := "04a0d628189644a1b918f14cde664610"
  120. authorization := "Bearer b2234191b1122b3d11393289985f7472"
  121. body := map[string]interface{}{}
  122. // 1. 发起请求
  123. status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
  124. if err != nil {
  125. return status, nil, fmt.Errorf("请求接口失败: %w", err)
  126. }
  127. // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
  128. var resp ApiResponse[models.RewardDevelopData] // 结构体:利用标签自动过滤多余字段
  129. var rawMap map[string]interface{} // Map:保留所有原始键值对
  130. err = json.Unmarshal(dataBytes, &resp)
  131. if err != nil {
  132. return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
  133. }
  134. // 解析原始 Map(为了返回完整数据)
  135. if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
  136. return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
  137. }
  138. codeInt, _ := resp.Code.Int64()
  139. // 3. 业务状态码校验
  140. if codeInt != 200 {
  141. return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
  142. }
  143. // 4. 数据加工与入库
  144. // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
  145. wallet := resp.Data
  146. wallet.UserId = userid // 手动补全 userId
  147. o := orm.NewOrm()
  148. // 执行插入
  149. _, err = o.Insert(&wallet)
  150. if err != nil {
  151. return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
  152. }
  153. // 5. 合并返回内容
  154. // 创建一个大的 Map,把两个对象塞进去
  155. combinedResult := map[string]interface{}{
  156. "filtered": wallet, // 这是根据你的模型过滤后的干净数据
  157. "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
  158. }
  159. return status, combinedResult, nil
  160. }
  161. // 代理奖励
  162. func (s *SyncDataService) SyncAgentReward() (int, interface{}, error) {
  163. url := "https://app-api.aiceanglobal1.com/api/v1/reward/range/home"
  164. userid := "0716d0ad7eb6404682fcaf564379e4e8"
  165. authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
  166. body := map[string]interface{}{}
  167. // 1. 发起请求
  168. status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
  169. if err != nil {
  170. return status, nil, fmt.Errorf("请求接口失败: %w", err)
  171. }
  172. // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
  173. var resp ApiResponse[models.RewardRangeData] // 结构体:利用标签自动过滤多余字段
  174. var rawMap map[string]interface{} // Map:保留所有原始键值对
  175. err = json.Unmarshal(dataBytes, &resp)
  176. if err != nil {
  177. return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
  178. }
  179. // 解析原始 Map(为了返回完整数据)
  180. if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
  181. return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
  182. }
  183. codeInt, _ := resp.Code.Int64()
  184. // 3. 业务状态码校验
  185. if codeInt != 200 {
  186. return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
  187. }
  188. // 4. 数据加工与入库
  189. // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
  190. wallet := resp.Data
  191. wallet.UserId = userid // 手动补全 userId
  192. o := orm.NewOrm()
  193. // 执行插入
  194. _, err = o.Insert(&wallet)
  195. if err != nil {
  196. return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
  197. }
  198. // 5. 合并返回内容
  199. // 创建一个大的 Map,把两个对象塞进去
  200. combinedResult := map[string]interface{}{
  201. "filtered": wallet, // 这是根据你的模型过滤后的干净数据
  202. "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
  203. }
  204. return status, combinedResult, nil
  205. }