Przeglądaj źródła

update:渲染字段映射支持配置v1

tujidelv 2 lat temu
rodzic
commit
cf476231b4

+ 22 - 0
src/main/java/top/lvzhiqiang/config/InitRunner.java

@@ -1,17 +1,23 @@
 package top.lvzhiqiang.config;
 
+import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import top.lvzhiqiang.entity.DicCode;
+import top.lvzhiqiang.mapper.CoinMapper;
 import top.lvzhiqiang.mapper.DicCodeMapper;
 import top.lvzhiqiang.service.CoinService;
 
 import javax.annotation.Resource;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 初始化Runner
@@ -27,6 +33,8 @@ public class InitRunner implements ApplicationRunner {
 
     @Resource
     private DicCodeMapper dicCodeMapper;
+    @Resource
+    private CoinMapper coinMapper;
 
     @Resource
     private CoinService coinService;
@@ -34,8 +42,22 @@ public class InitRunner implements ApplicationRunner {
     @Value("${spring.profiles.active}")
     private String env;
 
+    public static Proxy proxy = null;
+    public static Map<String, JSONObject> publicParamsMap = null;
+
     @Override
     public void run(ApplicationArguments args) {
+        publicParamsMap = coinMapper.findPublicParams().stream().collect(
+                Collectors.toMap(v -> v.getCodeKey(), v -> JSONObject.parseObject(v.getCodeValue()), (key1, key2) -> key2));
+
+        if (null == proxy) {
+            if ("dev".equals(env)) {
+                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 1080));
+            } else {
+                proxy = Proxy.NO_PROXY;
+            }
+        }
+
         if (!"dev".equals(env)) {
             coinService.monitorJob();
         }

+ 46 - 0
src/main/java/top/lvzhiqiang/entity/CoinPubilcParams.java

@@ -0,0 +1,46 @@
+package top.lvzhiqiang.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * coin公共参数配置实体类
+ *
+ * @author lvzhiqiang
+ * @since 19:07 2023/9/16
+ */
+@Data
+public class CoinPubilcParams implements Serializable {
+
+    /**
+     * id主键
+     */
+    private Integer id;
+
+    /**
+     * 键
+     */
+    private String codeKey;
+
+    /**
+     * 描述
+     */
+    private String codeDesc;
+
+    /**
+     * 值
+     */
+    private String codeValue;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 7 - 0
src/main/java/top/lvzhiqiang/mapper/CoinMapper.java

@@ -1,8 +1,10 @@
 package top.lvzhiqiang.mapper;
 
 import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Select;
 import top.lvzhiqiang.entity.CoinHistoryOrder;
+import top.lvzhiqiang.entity.CoinPubilcParams;
 
 import java.util.List;
 
@@ -35,9 +37,14 @@ public interface CoinMapper {
             "<if test=\"type != null \">" +
             "   and type = #{type}" +
             "</if>" +
+            " order by cTime desc" +
             "</script>"})
     List<CoinHistoryOrder> findByParams();
 
     @Select("select symbol from coin_monitor_currency where delete_flag = 1 order by sort")
     List<String> findMonitorCurrencyList();
+
+    @Select("select * from coin_public_params where 1=1")
+    @MapKey("codeKey")
+    List<CoinPubilcParams> findPublicParams();
 }

+ 202 - 50
src/main/java/top/lvzhiqiang/service/impl/CoinServiceImpl.java

@@ -11,11 +11,11 @@ import me.chanjar.weixin.cp.bean.message.WxCpMessage;
 import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
 import org.jsoup.Connection;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import top.lvzhiqiang.config.InitRunner;
 import top.lvzhiqiang.config.WorkWeixinProperties;
 import top.lvzhiqiang.entity.CoinHistoryOrder;
 import top.lvzhiqiang.mapper.CoinMapper;
@@ -26,9 +26,8 @@ import javax.annotation.Resource;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.net.InetSocketAddress;
-import java.net.Proxy;
 import java.security.InvalidKeyException;
+import java.text.DecimalFormat;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -67,12 +66,8 @@ public class CoinServiceImpl implements CoinService {
     // 私钥,由系统随机生成,用于签名的生成。
     private static final String secretKey = "1fdd0fc2976bea80189ba13710e12825ca3ef6c5e25a0d76fd03f8f6cd4a61d9";
 
-    @Value("${spring.profiles.active}")
-    private String env;
-
     @Resource
     private CoinMapper coinMapper;
-
     @Resource
     private WxCpService wxCpService;
     @Autowired(required = false)
@@ -80,11 +75,13 @@ public class CoinServiceImpl implements CoinService {
 
     private final Map<String, String> orderMap = new ConcurrentHashMap<>();
     private final Map<String, JSONObject> mixMap = new ConcurrentHashMap<>();
-
-
     private final static ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(10);
 
-    Proxy proxy = null;
+    private final ForkJoinPool forkJoinPool = new ForkJoinPool(16);
+    private final ForkJoinPool forkJoinPool2 = new ForkJoinPool(16);
+    private final ForkJoinPool forkJoinPool3 = new ForkJoinPool(16);
+    private final ForkJoinPool forkJoinPool4 = new ForkJoinPool(16);
+    private static final DecimalFormat df1 = new DecimalFormat("#,##0.00");
 
     static {
         // API KEY作为一个字符串。
@@ -99,16 +96,8 @@ public class CoinServiceImpl implements CoinService {
         basicHeaderMap.put("Content-Type", "application/json");
         // 支持多语言, 如:中文(zh-CN),英语(en-US)
         basicHeaderMap.put("locale", "zh-CN");
-    }
 
-    public void beforeProxy() {
-        if (null == proxy) {
-            if ("dev".equals(env)) {
-                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 1080));
-            } else {
-                proxy = Proxy.NO_PROXY;
-            }
-        }
+        df1.setRoundingMode(RoundingMode.HALF_UP);
     }
 
     @Override
@@ -296,10 +285,8 @@ public class CoinServiceImpl implements CoinService {
         }
 
         try {
-            beforeProxy();
-
             String requestUrl = mainUrl + requestPath;
-            Connection.Response response = JsoupUtil.requestBody(requestUrl, httpMethod, proxy, headerMap, paramMap);
+            Connection.Response response = JsoupUtil.requestBody(requestUrl, httpMethod, InitRunner.proxy, headerMap, paramMap);
 
             return JSONObject.parseObject(response.body());
         } catch (Exception e) {
@@ -341,9 +328,8 @@ public class CoinServiceImpl implements CoinService {
         } else if (params.getString("nameEn").equals("monitorCurrency")) {
             List<String> monitorCurrencyList = coinMapper.findMonitorCurrencyList();
 
-            beforeProxy();
             String requestUrl = mainUrl + params.getString("url");
-            Connection.Response response = JsoupUtil.requestBody(requestUrl, JsoupUtil.HTTP_GET, proxy, null, null);
+            Connection.Response response = JsoupUtil.requestBody(requestUrl, JsoupUtil.HTTP_GET, InitRunner.proxy, null, null);
             result = JSONObject.parseObject(response.body()).getJSONArray("data");
 
             result = renderMainSearch4MonitorCurrency(result, monitorCurrencyList);
@@ -365,82 +351,248 @@ public class CoinServiceImpl implements CoinService {
         return result;
     }
 
+    /**
+     * 渲染获取当前计划委托(止盈止损)列表
+     *
+     * @param result
+     */
     private void renderMainSearch4CurrentPlan(JSONArray result) {
-        beforeProxy();
-
-        ForkJoinPool forkJoinPool = new ForkJoinPool(16);
-        forkJoinPool.submit(() -> result.parallelStream().forEach(e -> {
+        forkJoinPool3.submit(() -> result.parallelStream().forEach(e -> {
             JSONObject jsonObject = (JSONObject) e;
 
-            jsonObject.put("orderType", jsonObject.getString("orderType").equals("limit") ? "限价" : "市价");
+            // 币对名称
+            String symbol = jsonObject.getString("symbol");
+            jsonObject.put("symbol", "<strong style=\"background-color:#F1B90d;\"><font color=\"#242A30\">" + symbol.replace("USDT_UMCBL", "") + "</font></strong>USDT_UMCBL");
+            // 订单状态
+            jsonObject.put("status", InitRunner.publicParamsMap.get("status").getString(jsonObject.getString("status")));
+            // 交易类型
+            jsonObject.put("orderType", InitRunner.publicParamsMap.get("orderType").getString(jsonObject.getString("orderType")));
+            // 订单类型
+            jsonObject.put("planType", InitRunner.publicParamsMap.get("planType").getString(jsonObject.getString("planType")));
+            // 开单方向
+            String side = jsonObject.getString("side");
+            jsonObject.put("side", InitRunner.publicParamsMap.get("side").getString(side));
+            if (side.equals("open_long")) {
+                jsonObject.put("sideStyle", " style=\"color:#FFFFFF;background-color:#1DA2B4;\"");
+            } else if (side.equals("open_short")) {
+                jsonObject.put("sideStyle", " style=\"color:#FFFFFF;background-color:#F1493F;\"");
+            } else {
+                jsonObject.put("sideStyle", " style=\"color:#FFFFFF;background-color:#F0F0F0;\"");
+            }
+            // 触发类型
+            jsonObject.put("triggerType", InitRunner.publicParamsMap.get("triggerType").getString(jsonObject.getString("triggerType")));
 
             jsonObject.put("cTime", DateUtils.longToString(jsonObject.getLong("cTime")));
             jsonObject.put("uTime", StringUtils.isEmpty(jsonObject.getString("uTime")) ? "--" : DateUtils.longToString(jsonObject.getLong("uTime")));
 
-            String requestUrl = mainUrl + "/api/mix/v1/market/ticker?symbol=" + jsonObject.getString("symbol");
+            String requestUrl = mainUrl + "/api/mix/v1/market/ticker?symbol=" + symbol;
             try {
-                Connection.Response response = JsoupUtil.requestBody(requestUrl, JsoupUtil.HTTP_GET, proxy, null, null);
+                Connection.Response response = JsoupUtil.requestBody(requestUrl, JsoupUtil.HTTP_GET, InitRunner.proxy, null, null);
                 String last = JSONObject.parseObject(response.body()).getJSONObject("data").getString("last");
 
-                BigDecimal chaRate;
-                if ("open_long".equals(jsonObject.getString("side"))) {
+                BigDecimal chaRate = null;
+                if ("open_long".equals(side)) {
                     chaRate = new BigDecimal(last).divide(new BigDecimal(jsonObject.getString("triggerPrice")), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
-                } else {
+                } else if ("open_short".equals(side)) {
                     chaRate = new BigDecimal(jsonObject.getString("triggerPrice")).divide(new BigDecimal(last), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
                 }
 
                 jsonObject.put("last", last);
-                jsonObject.put("chaRate", chaRate.toPlainString() + "%");
-                jsonObject.put("chaRateStyle", " style=\"color:#FFFFFF;background-color:red;\"");
+                jsonObject.put("chaRate", chaRate != null ? chaRate : "--");
+                jsonObject.put("chaRateStyle", " style=\"color:#FFFFFF;background-color:#5EA294;\"");
             } catch (Exception ex) {
                 throw new RuntimeException(ex);
             }
         })).join();
     }
 
+    /**
+     * 渲染获取监控币种列表
+     *
+     * @param monitorCurrencyList
+     */
     private JSONArray renderMainSearch4MonitorCurrency(JSONArray result, List<String> monitorCurrencyList) {
-        return result.stream().filter(iter -> monitorCurrencyList.contains(((JSONObject) iter).getString("symbol"))).collect(Collectors.toCollection(JSONArray::new));
+        JSONArray array = result.stream()
+                .filter(iter -> monitorCurrencyList.contains(((JSONObject) iter).getString("symbol")))
+                .collect(Collectors.toCollection(JSONArray::new));
+
+        forkJoinPool.submit(() -> array.parallelStream().forEach(e -> {
+            JSONObject jsonObject = (JSONObject) e;
+            jsonObject.put("changeUtc", jsonObject.getBigDecimal("changeUtc").multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP));
+            jsonObject.put("change", jsonObject.getBigDecimal("change").multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP));
+            jsonObject.put("ts", DateUtils.longToString(jsonObject.getLong("ts")));
+
+            // UTC0时涨跌幅
+            if (jsonObject.getBigDecimal("changeUtc").compareTo(BigDecimal.ZERO) < 0) {
+                jsonObject.put("changeUtcStyle", " style=\"color:#FFFFFF;background-color:#F1493F;\"");
+            } else {
+                jsonObject.put("changeUtcStyle", " style=\"color:#FFFFFF;background-color:#1DA2B4;\"");
+            }
+            // 24小时涨跌幅
+            if (jsonObject.getBigDecimal("change").compareTo(BigDecimal.ZERO) < 0) {
+                jsonObject.put("changeStyle", " style=\"color:#FFFFFF;background-color:#F1493F;\"");
+            } else {
+                jsonObject.put("changeStyle", " style=\"color:#FFFFFF;background-color:#1DA2B4;\"");
+            }
+            // 币对名称
+            String symbol = jsonObject.getString("symbol").replace("USDT", "");
+            jsonObject.put("symbol", "<strong style=\"background-color:#F1B90d;\"><font color=\"#242A30\">" + symbol + "</font></strong>USDT");
+            // 标记价格
+            jsonObject.put("closeStyle", " style=\"color:#252B31;background-color:#C4ADE9;font-weight:bold;\"");
+            // 基础币量 计价币量 usdt币量
+            jsonObject.put("baseVol", readableFileSize(jsonObject.getDouble("baseVol")));
+            jsonObject.put("quoteVol", readableFileSize(jsonObject.getDouble("quoteVol")));
+            jsonObject.put("usdtVol", readableFileSize(jsonObject.getDouble("usdtVol")));
+        })).join();
+
+        return array;
     }
 
+    /**
+     * 渲染获取全部历史委托
+     *
+     * @param historyOrderList
+     */
     private void renderMainSearch4OrderHistoryProductType(List<CoinHistoryOrder> historyOrderList) {
         for (CoinHistoryOrder coinHistoryOrder : historyOrderList) {
+            // 币种名称
+            coinHistoryOrder.setSymbol(coinHistoryOrder.getSymbol().replace("USDT_UMCBL", ""));
+            // 订单状态
+            coinHistoryOrder.setState(InitRunner.publicParamsMap.get("state").getString(coinHistoryOrder.getState()));
+            // 开单方向
+            coinHistoryOrder.setSide(InitRunner.publicParamsMap.get("side").getString(coinHistoryOrder.getSide()));
+            // 总盈亏
+            String TotalProfits = "0E-8";
+            if (!coinHistoryOrder.getTotalProfits().contains("0E-8")) {
+                TotalProfits = new BigDecimal(coinHistoryOrder.getTotalProfits()).setScale(2, RoundingMode.HALF_UP).toPlainString();
+            }
+            coinHistoryOrder.setTotalProfits(TotalProfits);
+            // 手续费
+            String fee = "0E-8";
+            if (!coinHistoryOrder.getFee().contains("0E-8")) {
+                fee = new BigDecimal(coinHistoryOrder.getFee()).setScale(2, RoundingMode.HALF_UP).toPlainString();
+            }
+            coinHistoryOrder.setFee(fee);
+            // 持仓方向
+            coinHistoryOrder.setPosSide(InitRunner.publicParamsMap.get("posSide").getString(coinHistoryOrder.getPosSide()));
+            // 仓位模式
+            coinHistoryOrder.setMarginMode(InitRunner.publicParamsMap.get("marginMode").getString(coinHistoryOrder.getMarginMode()));
+            // 交易类型
+            coinHistoryOrder.setOrderType(InitRunner.publicParamsMap.get("orderType").getString(coinHistoryOrder.getOrderType()));
+            // 交易方向
+            coinHistoryOrder.setTradeSide(InitRunner.publicParamsMap.get("tradeSide").getString(coinHistoryOrder.getTradeSide()));
+            // 持仓模式
+            coinHistoryOrder.setHoldMode(InitRunner.publicParamsMap.get("holdMode").getString(coinHistoryOrder.getHoldMode()));
+            // orderSource
+            coinHistoryOrder.setOrderSource(InitRunner.publicParamsMap.get("orderSource").getString(coinHistoryOrder.getOrderSource()));
+
             coinHistoryOrder.setCTime(DateUtils.longToString(Long.valueOf(coinHistoryOrder.getCTime())));
             coinHistoryOrder.setUTime(DateUtils.longToString(Long.valueOf(coinHistoryOrder.getUTime())));
         }
     }
 
+    /**
+     * 渲染获取全部当前委托
+     *
+     * @param result
+     */
     private void renderMainSearch4OrderMarginCoinCurrent(JSONArray result) {
-        for (int i = 0; i < result.size(); i++) {
-            JSONObject jsonObject = result.getJSONObject(i);
-
-            jsonObject.put("orderType", jsonObject.getString("orderType").equals("limit") ? "限价" : "市价");
-            jsonObject.put("marginMode", jsonObject.getString("marginMode").equals("fixed") ? "逐仓" : "全仓");
+        forkJoinPool2.submit(() -> result.parallelStream().forEach(e -> {
+            JSONObject jsonObject = (JSONObject) e;
+            // 币对名称
+            String symbol = jsonObject.getString("symbol");
+            jsonObject.put("symbol", "<strong style=\"background-color:#F1B90d;\"><font color=\"#242A30\">" + symbol.replace("USDT_UMCBL", "") + "</font></strong>USDT_UMCBL");
+            // 订单状态
+            jsonObject.put("state", InitRunner.publicParamsMap.get("state").getString(jsonObject.getString("state")));
+            // 开单方向
+            String side = jsonObject.getString("side");
+            jsonObject.put("side", InitRunner.publicParamsMap.get("side").getString(side));
+            // 交易类型
+            jsonObject.put("orderType", InitRunner.publicParamsMap.get("orderType").getString(jsonObject.getString("orderType")));
+            // 止盈止损
+            jsonObject.put("presetTakeProfitPrice", StringUtils.isEmpty(jsonObject.getString("presetTakeProfitPrice")) ? "--" : jsonObject.getString("presetTakeProfitPrice"));
+            jsonObject.put("presetStopLossPrice", StringUtils.isEmpty(jsonObject.getString("presetTakeProfitPrice")) ? "--" : jsonObject.getString("presetTakeProfitPrice"));
+            // 持仓模式
+            jsonObject.put("holdMode", InitRunner.publicParamsMap.get("holdMode").getString(jsonObject.getString("holdMode")));
+            // orderSource
+            jsonObject.put("orderSource", InitRunner.publicParamsMap.get("orderSource").getString(jsonObject.getString("orderSource")));
+            // 仓位模式
+            jsonObject.put("marginMode", InitRunner.publicParamsMap.get("marginMode").getString(jsonObject.getString("marginMode")));
 
             jsonObject.put("cTime", DateUtils.longToString(jsonObject.getLong("cTime")));
             jsonObject.put("uTime", DateUtils.longToString(jsonObject.getLong("uTime")));
-        }
+
+            String requestUrl = mainUrl + "/api/mix/v1/market/ticker?symbol=" + symbol;
+            try {
+                Connection.Response response = JsoupUtil.requestBody(requestUrl, JsoupUtil.HTTP_GET, InitRunner.proxy, null, null);
+                String last = JSONObject.parseObject(response.body()).getJSONObject("data").getString("last");
+
+                BigDecimal chaRate = null;
+                if ("open_short".equals(side)) {
+                    chaRate = new BigDecimal(last).divide(new BigDecimal(jsonObject.getString("price")), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
+                } else if ("open_long".equals(side)) {
+                    chaRate = new BigDecimal(jsonObject.getString("price")).divide(new BigDecimal(last), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
+                }
+
+                jsonObject.put("last", last);
+                jsonObject.put("chaRate", chaRate != null ? chaRate : "--");
+                jsonObject.put("chaRateStyle", " style=\"color:#FFFFFF;background-color:#5EA294;\"");
+            } catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        })).join();
     }
 
+    /**
+     * 渲染获取全部合约仓位信息V2
+     *
+     * @param result
+     */
     private void renderMainSearch4AllPositionv2(JSONArray result) {
-        for (int i = 0; i < result.size(); i++) {
-            JSONObject jsonObject = result.getJSONObject(i);
+        forkJoinPool4.submit(() -> result.parallelStream().forEach(e -> {
+            JSONObject jsonObject = (JSONObject) e;
+
+            // 币对名称
+            String symbol = jsonObject.getString("symbol").replace("USDT_UMCBL", "");
+            jsonObject.put("symbol", "<strong style=\"background-color:#F1B90d;\"><font color=\"#242A30\">" + symbol + "</font></strong>USDT_UMCBL");
+            // 持仓方向
+            jsonObject.put("holdSide", InitRunner.publicParamsMap.get("holdSide").getString(jsonObject.getString("holdSide")));
+            // 保证金模式
+            jsonObject.put("marginMode", InitRunner.publicParamsMap.get("marginMode").getString(jsonObject.getString("marginMode")));
+            // 持仓模式
+            jsonObject.put("holdMode", InitRunner.publicParamsMap.get("holdMode").getString(jsonObject.getString("holdMode")));
+
+            // 最近更新时间 保证金数量 (保证金币种) 平均开仓价 未实现盈亏 预估强平价
             jsonObject.put("cTime", DateUtils.longToString(jsonObject.getLong("cTime")));
             jsonObject.put("margin", new BigDecimal(jsonObject.getString("margin")).setScale(4, RoundingMode.HALF_UP));
             jsonObject.put("averageOpenPrice", new BigDecimal(jsonObject.getString("averageOpenPrice")).setScale(4, RoundingMode.HALF_UP));
             jsonObject.put("unrealizedPL", new BigDecimal(jsonObject.getString("unrealizedPL")).setScale(4, RoundingMode.HALF_UP));
             jsonObject.put("liquidationPrice", new BigDecimal(jsonObject.getString("liquidationPrice")).setScale(4, RoundingMode.HALF_UP));
 
-            //未实现盈亏
+            // 未实现盈亏
             if (jsonObject.getBigDecimal("unrealizedPL").compareTo(BigDecimal.ZERO) < 0) {
                 jsonObject.put("unrealizedPLStyle", " style=\"color:#FFFFFF;background-color:#F1493F;\"");
             } else {
                 jsonObject.put("unrealizedPLStyle", " style=\"color:#FFFFFF;background-color:#1DA2B4;\"");
             }
-            //标记价格
+            // 标记价格
             jsonObject.put("marketPriceStyle", " style=\"color:#252B31;background-color:#C4ADE9;font-weight:bold;\"");
-            //币对名称
-            String symbol = jsonObject.getString("symbol").replace("USDT_UMCBL", "");
-            jsonObject.put("symbol", "<strong style=\"background-color:#F1B90d;\"><font color=\"#242A30\">" + symbol + "</font></strong>USDT_UMCBL");
+
+        })).join();
+    }
+
+    /**
+     * Java实现字节转换,可以自动转换为B、KB、MB、GB、TB
+     *
+     * @param size
+     * @return
+     */
+    private String readableFileSize(double size) {
+        if (size <= 0) {
+            return "0";
         }
+        final String[] units = new String[]{"B", "K", "M", "G", "T"};
+        int digitGroups = (int) (Math.log10(size) / Math.log10(1000));
+        return df1.format(size / Math.pow(1000, digitGroups)) + units[digitGroups];
     }
 }