Jelajahi Sumber

add:bitget增加合约资金费率数据同步抽取v1

lvzhiqiang 1 Minggu lalu
induk
melakukan
b7d21b9255

+ 1 - 1
src/main/java/top/lvzhiqiang/config/InitRunner.java

@@ -56,7 +56,7 @@ public class InitRunner implements ApplicationRunner {
 
         if (null == proxy) {
             if ("dev".equals(env)) {
-                proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1081));
+                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7897));
             } else {
                 proxy = Proxy.NO_PROXY;
             }

+ 68 - 0
src/main/java/top/lvzhiqiang/entity/CoinBitgetMixFundrate.java

@@ -0,0 +1,68 @@
+package top.lvzhiqiang.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * CoinBitgetMixFundrate
+ *
+ * @author lvzhiqiang
+ * 2023/12/31 18:52
+ */
+@Data
+public class CoinBitgetMixFundrate implements Serializable {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 币对名称
+     */
+    private String symbol;
+
+    /**
+     * 当前资金费率
+     */
+    private String fundingRate;
+
+    /**
+     * 资金费率结算周期
+     * 单位为小时。枚举值包括1,2,4,8 1代表1小时,2代表2小时,以此类推
+     */
+    private String fundingRateInterval;
+
+    /**
+     * 下次更新时间
+     * Unix毫秒时间戳
+     */
+    private String nextUpdate;
+
+    /**
+     * 资金费率下限
+     * 以小数形式返回。0.025为2.5%
+     */
+    private String minFundingRate;
+
+    /**
+     * 资金费率上限
+     * 以小数形式返回。0.025为2.5%
+     */
+    private String maxFundingRate;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime modifyTime;
+}

+ 44 - 0
src/main/java/top/lvzhiqiang/job/CoinBitgetJob.java

@@ -0,0 +1,44 @@
+package top.lvzhiqiang.job;
+
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import top.lvzhiqiang.service.CoinBitgetService;
+
+import javax.annotation.Resource;
+
+/**
+ * coin-bitget任务
+ *
+ * @author lvzhiqiang
+ * 2025/12/8 19:31
+ */
+@Component
+@Slf4j
+public class CoinBitgetJob {
+
+    @Resource
+    private CoinBitgetService coinBitgetService;
+
+    /**
+     * 同步合约资金周期
+     *
+     * @return com.xxl.job.core.biz.model.ReturnT<java.lang.String>
+     * @author lvzhiqiang
+     * 2025/10/18 11:04
+     */
+    @XxlJob("syncMixFundrateTime")
+    public ReturnT<String> syncMixFundrateTime() {
+        try {
+            coinBitgetService.syncMixFundrateTime();
+        } catch (Exception e) {
+            log.error("syncMixFundRateTime exception", e);
+            XxlJobHelper.log(e);
+            return ReturnT.FAIL;
+        }
+
+        return ReturnT.SUCCESS;
+    }
+}

+ 27 - 0
src/main/java/top/lvzhiqiang/mapper/CoinBitgetMapper.java

@@ -0,0 +1,27 @@
+package top.lvzhiqiang.mapper;
+
+import org.apache.ibatis.annotations.Insert;
+import top.lvzhiqiang.entity.CoinBitgetMixFundrate;
+
+import java.util.List;
+
+/**
+ * coin-bitget-Mapper
+ *
+ * @author lvzhiqiang
+ * 2025/12/8 19:31
+ */
+public interface CoinBitgetMapper {
+
+
+    @Insert({"<script>" +
+            "INSERT INTO coin_bitget_mix_fundrate(symbol,funding_rate,funding_rate_interval,next_update,min_funding_rate,max_funding_rate,create_time,modify_time)" +
+            " VALUES " +
+            "<foreach collection='list' item='mt' index=\"index\" separator=\",\">" +
+            "   (#{mt.symbol},#{mt.fundingRate},#{mt.fundingRateInterval},#{mt.nextUpdate},#{mt.minFundingRate},#{mt.maxFundingRate},now(),now())" +
+            " </foreach>" +
+            " ON DUPLICATE KEY UPDATE funding_rate=values(funding_rate),funding_rate_interval=values(funding_rate_interval),next_update=values(next_update),min_funding_rate=values(min_funding_rate)," +
+            "max_funding_rate=values(max_funding_rate),modify_time=now()" +
+            "</script>"})
+    void insertOrUpdateMixFundrateList(List<CoinBitgetMixFundrate> mixFundratelist);
+}

+ 19 - 0
src/main/java/top/lvzhiqiang/service/CoinBitgetService.java

@@ -0,0 +1,19 @@
+package top.lvzhiqiang.service;
+
+/**
+ * Coin Bitget Service
+ *
+ * @author lvzhiqiang
+ * 2025/12/8 19:31
+ */
+public interface CoinBitgetService {
+
+    /**
+     * 同步合约资金周期
+     *
+     * @return com.xxl.job.core.biz.model.ReturnT<java.lang.String>
+     * @author lvzhiqiang
+     * 2025/10/18 11:04
+     */
+    void syncMixFundrateTime() throws Exception;
+}

+ 79 - 0
src/main/java/top/lvzhiqiang/service/impl/CoinBitgetServiceImpl.java

@@ -0,0 +1,79 @@
+package top.lvzhiqiang.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.xxl.job.core.context.XxlJobHelper;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Connection;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StopWatch;
+import top.lvzhiqiang.config.InitRunner;
+import top.lvzhiqiang.entity.CoinBitgetMixFundrate;
+import top.lvzhiqiang.mapper.CoinBitgetMapper;
+import top.lvzhiqiang.service.CoinBitgetService;
+import top.lvzhiqiang.util.JsoupUtil;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Coin Bitget ServiceImpl
+ *
+ * @author lvzhiqiang
+ * 2025/12/8 19:31
+ */
+@Service
+@Slf4j
+public class CoinBitgetServiceImpl implements CoinBitgetService {
+
+    @Resource
+    private CoinBitgetMapper coinBitgetMapper;
+
+    /**
+     * 同步合约资金周期
+     *
+     * @return com.xxl.job.core.biz.model.ReturnT<java.lang.String>
+     * @author lvzhiqiang
+     * 2025/10/18 11:04
+     */
+    @Override
+    public void syncMixFundrateTime() throws Exception {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+
+        String bitgetMixfundRateUrl = InitRunner.dicCodeMap.get("bitget_mixfundrate_url").getCodeValue();
+
+        Connection.Response response = JsoupUtil.requestBody(bitgetMixfundRateUrl, JsoupUtil.HTTP_GET, InitRunner.proxy, null, null);
+        JSONObject result = JSONObject.parseObject(response.body());
+        JSONArray dataJA = result.getJSONArray("data");
+
+        List<CoinBitgetMixFundrate> mixFundrateList = new ArrayList<>();
+        CoinBitgetMixFundrate mixFundrate;
+        for (int i = 0; i < dataJA.size(); i++) {
+            JSONObject dataJO = dataJA.getJSONObject(i);
+
+            mixFundrate = new CoinBitgetMixFundrate();
+            mixFundrate.setSymbol(dataJO.getString("symbol"));
+            mixFundrate.setFundingRate(dataJO.getString("fundingRate"));
+            mixFundrate.setFundingRateInterval(dataJO.getString("fundingRateInterval"));
+            mixFundrate.setNextUpdate(dataJO.getString("nextUpdate"));
+            mixFundrate.setMinFundingRate(dataJO.getString("minFundingRate"));
+            mixFundrate.setMaxFundingRate(dataJO.getString("maxFundingRate"));
+
+            mixFundrateList.add(mixFundrate);
+        }
+
+        int MAX_NUMBER = 100;
+        // 新增或者更新
+        Stream.iterate(0, n -> n + 1).limit((mixFundrateList.size() + MAX_NUMBER - 1) / MAX_NUMBER)
+                .forEach(i -> {
+                    List<CoinBitgetMixFundrate> list = mixFundrateList.stream().skip((long) i * MAX_NUMBER).limit(MAX_NUMBER).collect(Collectors.toList());
+                    coinBitgetMapper.insertOrUpdateMixFundrateList(list);
+                });
+
+        XxlJobHelper.log("耗时={},总数={}", stopWatch.getTotalTimeSeconds(), mixFundrateList.size());
+    }
+}

+ 35 - 0
src/test/java/top/lvzhiqiang/TestCoinBitget.java

@@ -0,0 +1,35 @@
+package top.lvzhiqiang;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import top.lvzhiqiang.service.CoinBitgetService;
+
+import javax.annotation.Resource;
+
+/**
+ * Bitget单元测试类
+ *
+ * @author lvzhiqiang
+ * 2025/12/8 19:31
+ */
+@Slf4j
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(properties = {
+        "spring.profiles.active=dev",
+        "logging.level.top.lvzhiqiang=DEBUG"
+}
+)
+public class TestCoinBitget {
+
+    @Resource
+    private CoinBitgetService coinBitgetService;
+
+
+    @Test
+    public void testSyncMixFundrateTime() throws Exception {
+        coinBitgetService.syncMixFundrateTime();
+    }
+}