| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- package services
- import (
- "encoding/json"
- "fmt"
- "think-go/models"
- "think-go/utils"
- "time"
- "github.com/beego/beego/v2/client/orm" // 确保引入了 orm
- )
- // SyncDataService 提供对外同步数据调用
- type SyncDataService struct{}
- // ApiResponse 用于解析外部接口的通用外层
- type ApiResponse[T any] struct {
- Code json.Number `json:"code"`
- Msg string `json:"msg"`
- Data T `json:"data"` // 利用结构体标签自动过滤掉不需要的字段
- }
- func (s *SyncDataService) SyncDetails(url, userid, authorization string, body interface{}) (int, []byte, error) {
- headers := map[string]string{
- "userid": userid,
- "authorization": authorization,
- }
- // 注意:此处如果目标服务器证书有问题,建议将最后一个参数改为 true
- return utils.PostJSON(url, headers, body, 15*time.Second, false)
- }
- func (s *SyncDataService) SyncDetailsInsecure() (int, interface{}, error) {
- url := "https://app-api.aiceanglobal1.com/api/v1/wallet/details"
- userid := "0716d0ad7eb6404682fcaf564379e4e8"
- authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
- body := map[string]interface{}{}
- // 1. 发起请求
- status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
- if err != nil {
- return status, nil, fmt.Errorf("请求接口失败: %w", err)
- }
- // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
- var resp ApiResponse[models.HomeData] // 结构体:利用标签自动过滤多余字段
- var rawMap map[string]interface{} // Map:保留所有原始键值对
- err = json.Unmarshal(dataBytes, &resp)
- if err != nil {
- return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
- }
- // 解析原始 Map(为了返回完整数据)
- if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
- return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
- }
- codeInt, _ := resp.Code.Int64()
- // 3. 业务状态码校验
- if codeInt != 200 {
- return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
- }
- // 4. 数据加工与入库
- // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
- wallet := resp.Data
- wallet.UserId = userid // 手动补全 userId
- o := orm.NewOrm()
- // 执行插入
- _, err = o.Insert(&wallet)
- if err != nil {
- return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
- }
- // 5. 合并返回内容
- // 创建一个大的 Map,把两个对象塞进去
- combinedResult := map[string]interface{}{
- "filtered": wallet, // 这是根据你的模型过滤后的干净数据
- "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
- }
- // 返回状态码和解析后的 Data 结构体
- return status, combinedResult, nil
- }
- // 首页接口
- func (s *SyncDataService) SyncHomeData() (int, interface{}, error) {
- url := "https://app-api.aiceanglobal1.com/api/v1/dashboard/home"
- userid := "0716d0ad7eb6404682fcaf564379e4e8"
- authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
- body := map[string]interface{}{}
- // 1. 发起请求
- status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
- if err != nil {
- return status, nil, fmt.Errorf("请求接口失败: %w", err)
- }
- // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
- var resp ApiResponse[models.HomeData] // 结构体:利用标签自动过滤多余字段
- var rawMap map[string]interface{} // Map:保留所有原始键值对
- err = json.Unmarshal(dataBytes, &resp)
- if err != nil {
- return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
- }
- // 解析原始 Map(为了返回完整数据)
- if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
- return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
- }
- codeInt, _ := resp.Code.Int64()
- // 3. 业务状态码校验
- if codeInt != 200 {
- return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
- }
- // 4. 数据加工与入库
- // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
- wallet := resp.Data
- wallet.UserId = userid // 手动补全 userId
- o := orm.NewOrm()
- // 执行插入
- _, err = o.Insert(&wallet)
- if err != nil {
- return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
- }
- // 5. 合并返回内容
- // 创建一个大的 Map,把两个对象塞进去
- combinedResult := map[string]interface{}{
- "filtered": wallet, // 这是根据你的模型过滤后的干净数据
- "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
- }
- return status, combinedResult, nil
- }
- // 社区发展奖励
- func (s *SyncDataService) SyncCommunityReward() (int, interface{}, error) {
- url := "https://app-api.aiceanglobal1.com/api/v1/reward/develop/home"
- userid := "04a0d628189644a1b918f14cde664610"
- authorization := "Bearer b2234191b1122b3d11393289985f7472"
- body := map[string]interface{}{}
- // 1. 发起请求
- status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
- if err != nil {
- return status, nil, fmt.Errorf("请求接口失败: %w", err)
- }
- // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
- var resp ApiResponse[models.RewardDevelopData] // 结构体:利用标签自动过滤多余字段
- var rawMap map[string]interface{} // Map:保留所有原始键值对
- err = json.Unmarshal(dataBytes, &resp)
- if err != nil {
- return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
- }
- // 解析原始 Map(为了返回完整数据)
- if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
- return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
- }
- codeInt, _ := resp.Code.Int64()
- // 3. 业务状态码校验
- if codeInt != 200 {
- return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
- }
- // 4. 数据加工与入库
- // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
- wallet := resp.Data
- wallet.UserId = userid // 手动补全 userId
- o := orm.NewOrm()
- // 执行插入
- _, err = o.Insert(&wallet)
- if err != nil {
- return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
- }
- // 5. 合并返回内容
- // 创建一个大的 Map,把两个对象塞进去
- combinedResult := map[string]interface{}{
- "filtered": wallet, // 这是根据你的模型过滤后的干净数据
- "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
- }
- return status, combinedResult, nil
- }
- // 代理奖励
- func (s *SyncDataService) SyncAgentReward() (int, interface{}, error) {
- url := "https://app-api.aiceanglobal1.com/api/v1/reward/range/home"
- userid := "0716d0ad7eb6404682fcaf564379e4e8"
- authorization := "Bearer 09ec48ab484ea7f8b4fb1d4b125dd73e"
- body := map[string]interface{}{}
- // 1. 发起请求
- status, dataBytes, err := s.SyncDetails(url, userid, authorization, body)
- if err != nil {
- return status, nil, fmt.Errorf("请求接口失败: %w", err)
- }
- // 2. 准备两个容器:一个用于过滤入库,一个用于保存原始全量数据
- var resp ApiResponse[models.RewardRangeData] // 结构体:利用标签自动过滤多余字段
- var rawMap map[string]interface{} // Map:保留所有原始键值对
- err = json.Unmarshal(dataBytes, &resp)
- if err != nil {
- return 201, nil, fmt.Errorf("JSON解析失败: %w", err)
- }
- // 解析原始 Map(为了返回完整数据)
- if err := json.Unmarshal(dataBytes, &rawMap); err != nil {
- return 201, nil, fmt.Errorf("解析原始Map失败: %w", err)
- }
- codeInt, _ := resp.Code.Int64()
- // 3. 业务状态码校验
- if codeInt != 200 {
- return 201, resp.Msg, fmt.Errorf("业务返回错误码: %d", codeInt)
- }
- // 4. 数据加工与入库
- // 这里的 wallet 已经是 models.WalletDetail 类型,多余字段已被自动过滤
- wallet := resp.Data
- wallet.UserId = userid // 手动补全 userId
- o := orm.NewOrm()
- // 执行插入
- _, err = o.Insert(&wallet)
- if err != nil {
- return 500, nil, fmt.Errorf("数据库入库失败: %v", err)
- }
- // 5. 合并返回内容
- // 创建一个大的 Map,把两个对象塞进去
- combinedResult := map[string]interface{}{
- "filtered": wallet, // 这是根据你的模型过滤后的干净数据
- "raw": rawMap["data"], // 这是包含 aiceFeeConfig 等所有字段的原始数据
- }
- return status, combinedResult, nil
- }
|