|
|
@@ -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];
|
|
|
}
|
|
|
}
|