Просмотр исходного кода

update:当前持有币种列表v2

tujidelv 1 год назад
Родитель
Сommit
ecfa9a91c1

+ 9 - 0
src/main/java/top/lvzhiqiang/controller/CoinController.java

@@ -65,6 +65,15 @@ public class CoinController {
         return coinService.mainSearch(params);
     }
 
+    @PostMapping("/getCurrentHoldingTotalAmout")
+    public Object getCurrentHoldingTotalAmout(@RequestBody JSONObject params) throws Exception {
+        if (!params.containsKey("nameEn")) {
+            throw new ParameterException("参数错误!");
+        }
+
+        return coinService.getCurrentHoldingTotalAmout(params);
+    }
+
     @GetMapping("/orderDetail/{trackingNo}")
     public String orderDetail(@PathVariable String trackingNo) {
         if (StringUtils.isEmpty(trackingNo)) {

+ 4 - 0
src/main/java/top/lvzhiqiang/entity/CoinCurrencyHolding.java

@@ -25,6 +25,7 @@ public class CoinCurrencyHolding implements Serializable {
      * 名称
      */
     private String symbol;
+    private String symbolStyle;
 
     /**
      * 入场价格
@@ -35,11 +36,13 @@ public class CoinCurrencyHolding implements Serializable {
      * 当前价格
      */
     private String currentPrice;
+    private String currentPriceStyle;
 
     /**
      * 涨跌幅比例
      */
     private BigDecimal changePercentage;
+    private String changePercentageStyle;
 
     /**
      * 入场数量
@@ -65,6 +68,7 @@ public class CoinCurrencyHolding implements Serializable {
      * 所属平台
      */
     private String exchangeCategory;
+    private Integer exchangeCategoryId;
 
     /**
      * coingecko id

+ 22 - 1
src/main/java/top/lvzhiqiang/mapper/CoinMapper.java

@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 import top.lvzhiqiang.entity.*;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -267,7 +268,7 @@ public interface CoinMapper {
     void insertOrUpdateBinanceOrderHistoryList(List<CoinBinanceOrderHistory> coinBinanceOrderHistoryList);
 
     @Select({"<script>" +
-            "select cch.*,cec.category_name exchangeCategory from coin_currency_holding cch left join coin_exchange_category cec on cch.exchange_category_id=cec.id WHERE cch.delete_flag = 1" +
+            "select cch.*,cec.category_name exchangeCategory from coin_currency_holding cch left join coin_exchange_category cec on cch.exchange_category_id=cec.id WHERE cch.delete_flag = 1 and cch.status = 1" +
             "<if test=\"keyword != null and keyword != ''\">" +
             "   and cch.symbol like concat('%',#{keyword},'%')" +
             "</if>" +
@@ -283,4 +284,24 @@ public interface CoinMapper {
             " </foreach>" +
             "</script>"})
     List<CoinCurrencyHolding> findCurrentHoldingList(Map<String, Object> params);
+
+
+    @Update("update coin_currency_holding set symbol=#{symbol},buy_price=#{buyPrice},current_price=#{currentPrice},change_percentage=#{changePercentage},buy_quantity=#{buyQuantity}," +
+            "current_quantity=#{currentQuantity},buy_amount=#{buyAmount},current_amount=#{currentAmount},exchange_category_id=#{exchangeCategoryId},coingecko_id=#{coingeckoId},status=#{status}," +
+            "remark=#{remark},buy_time=#{buyTime},modify_time=now() where id = #{id}")
+    int updateCurrentHolding(CoinCurrencyHolding coinCurrencyHolding);
+
+    @Select({"<script>" +
+            "select sum(current_amount) from coin_currency_holding cch WHERE cch.delete_flag = 1 and cch.status = 1" +
+            "<if test=\"keyword != null and keyword != ''\">" +
+            "   and cch.symbol like concat('%',#{keyword},'%')" +
+            "</if>" +
+            "<if test=\"symbol != null and symbol != ''\">" +
+            "   and cch.symbol = #{symbol}" +
+            "</if>" +
+            "<if test=\"categoryField != null and categoryField != ''\">" +
+            "   and cch.id = #{categoryField}" +
+            "</if>" +
+            "</script>"})
+    BigDecimal getCurrentHoldingTotalAmout(Map<String, Object> params);
 }

+ 2 - 0
src/main/java/top/lvzhiqiang/service/CoinService.java

@@ -59,4 +59,6 @@ public interface CoinService {
     void syncCexFlag(String symbol);
 
     void initWatchlist(CoinWatchlist coinWatchlist);
+
+    Object getCurrentHoldingTotalAmout(JSONObject params);
 }

+ 88 - 0
src/main/java/top/lvzhiqiang/service/impl/CoinServiceImpl.java

@@ -883,6 +883,12 @@ public class CoinServiceImpl implements CoinService {
                         parseWatchlistMap4CmC(coinWatchlistMap4CmcId);
                     });
 
+            // CoinCurrencyHolding同步
+            params.put("sortField", Collections.singletonList("cch.buy_time"));
+            params.put("sort", "desc");
+            List<CoinCurrencyHolding> currentHoldingList = coinMapper.findCurrentHoldingList(params);
+            parseCurrentHoldingMap4Coingecko(currentHoldingList);
+
             log.warn("watchlist-coingecko-cmc scheduler end");
         }, 0, 1, TimeUnit.HOURS);
 
@@ -941,6 +947,68 @@ public class CoinServiceImpl implements CoinService {
         return null;
     }
 
+    private void parseCurrentHoldingMap4Coingecko(List<CoinCurrencyHolding> currentHoldingList) {
+        String coingeckoCoinsMarketsUrl = InitRunner.dicCodeMap.get("coingecko_coins_markets_url").getCodeValue();
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put("Accept", "application/json");
+        headerMap.put("Accept-Encoding", "deflate,gzip");
+
+        Map<String, String> paramMap = new LinkedHashMap<>();
+        paramMap.put("ids", currentHoldingList.stream().map(CoinCurrencyHolding::getCoingeckoId).distinct().collect(Collectors.joining(",")));
+        paramMap.put("vs_currency", "usd");
+        AtomicInteger i = new AtomicInteger();
+        Connection.Response response = null;
+        try {
+            response = JsoupUtil.requestBody(coingeckoCoinsMarketsUrl, JsoupUtil.HTTP_GET, InitRunner.proxy, headerMap, paramMap);
+            JSONArray result = JSONArray.parseArray(response.body());
+
+            Map<String, List<CoinCurrencyHolding>> currencyHoldingMap = currentHoldingList.stream().collect(Collectors.groupingBy(CoinCurrencyHolding::getCoingeckoId));
+
+
+            for (int j = 0; j < result.size(); j++) {
+                JSONObject marketData = result.getJSONObject(j);
+                String id = marketData.getString("id");
+
+                if (currencyHoldingMap.containsKey(id)) {
+                    List<CoinCurrencyHolding> currencyHoldingSubList = currencyHoldingMap.get(id);
+
+                    for (CoinCurrencyHolding currencyHolding : currencyHoldingSubList) {
+                        // 市场价格
+                        if (marketData.containsKey("current_price") && null != marketData.get("current_price")) {
+                            String markPrice = marketData.getBigDecimal("current_price").toPlainString();
+                            currencyHolding.setCurrentPrice(markPrice);
+                        }
+                        // 入场总额
+                        if (StringUtils.isNotEmpty(currencyHolding.getBuyPrice()) && StringUtils.isNotEmpty(currencyHolding.getBuyQuantity())) {
+                            currencyHolding.setBuyAmount(new BigDecimal(currencyHolding.getBuyPrice()).multiply(new BigDecimal(currencyHolding.getBuyQuantity())).setScale(2, RoundingMode.HALF_UP));
+
+                        }
+                        // 当前总额
+                        if (StringUtils.isNotEmpty(currencyHolding.getCurrentPrice()) && StringUtils.isNotEmpty(currencyHolding.getCurrentQuantity())) {
+                            currencyHolding.setCurrentAmount(new BigDecimal(currencyHolding.getCurrentPrice()).multiply(new BigDecimal(currencyHolding.getCurrentQuantity())).setScale(2, RoundingMode.HALF_UP));
+                        }
+                        // 涨跌幅比例
+                        if (StringUtils.isNotEmpty(currencyHolding.getBuyPrice()) && StringUtils.isNotEmpty(currencyHolding.getCurrentPrice())) {
+                            BigDecimal changePercentage = new BigDecimal(currencyHolding.getCurrentPrice()).divide(new BigDecimal(currencyHolding.getBuyPrice()), 2, RoundingMode.HALF_UP);
+                            currencyHolding.setChangePercentage(changePercentage);
+                        }
+
+                        coinMapper.updateCurrentHolding(currencyHolding);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("parseCurrentHoldingMap4Coingecko error,response={},size={},i={}", response != null ? response.body() : "--", currentHoldingList.size(), i.get(), e);
+        }
+    }
+
+
+    @Override
+    public Object getCurrentHoldingTotalAmout(JSONObject params) {
+        BigDecimal totalAmout = coinMapper.getCurrentHoldingTotalAmout(params.toJavaObject(Map.class));
+        return totalAmout;
+    }
+
     private void initCexSpotFlag(Map<String, CoinWatchlistOther> coinWatchlistOtherMap4Symbol) {
         // spot
         String coingeckoExchangeTickersUrl = InitRunner.dicCodeMap.get("coingecko_exchange_tickers_url").getCodeValue();
@@ -1631,7 +1699,27 @@ public class CoinServiceImpl implements CoinService {
     }
 
     private void renderMainSearch4CurrencyHolding(List<CoinCurrencyHolding> currentHoldingList) {
+        for (CoinCurrencyHolding coinCurrencyHolding : currentHoldingList) {
+            // 名称
+            coinCurrencyHolding.setSymbolStyle(" style=\"background-color:rgba(70,169,244,.72);font-weight: bold;\"");
+            // 当前价格
+            coinCurrencyHolding.setCurrentPriceStyle(" style=\"color:#252B31;background-color:#C4ADE9;\"");
+            if (StringUtils.isNotEmpty(coinCurrencyHolding.getCurrentPrice())) {
+                coinCurrencyHolding.setCurrentPrice(new BigDecimal(coinCurrencyHolding.getCurrentPrice()).divide(BigDecimal.ONE, new MathContext(3)).toPlainString());
+            }
+            // 入场价格
+            if (StringUtils.isNotEmpty(coinCurrencyHolding.getBuyPrice())) {
+                coinCurrencyHolding.setBuyPrice(new BigDecimal(coinCurrencyHolding.getBuyPrice()).divide(BigDecimal.ONE, new MathContext(3)).toPlainString());
+            }
 
+            // 涨跌幅比例
+            if (coinCurrencyHolding.getChangePercentage() == null) {
+            } else if (coinCurrencyHolding.getChangePercentage().compareTo(BigDecimal.ONE) < 0) {
+                coinCurrencyHolding.setChangePercentageStyle(" style=\"color:#000000;background-color:#f1a8a4;\"");
+            } else {
+                coinCurrencyHolding.setChangePercentageStyle(" style=\"color:#000000;background-color:#aad6f5;\"");
+            }
+        }
     }
 
 

+ 1 - 0
src/main/resources/static/coin.html

@@ -391,6 +391,7 @@
             <select id="apis-quiet-div-currentHolding-sortField" style="height: 24px;">
                 <option value="cch.buy_time">买入时间</option>
                 <option value="cch.current_amount">当前金额</option>
+                <option value="cch.change_percentage">涨跌幅</option>
             </select>
             <select id="apis-quiet-div-currentHolding-sort" style="height: 24px;">
                 <option value="desc">desc</option>

+ 35 - 1
src/main/resources/static/js/my-coin.js

@@ -187,7 +187,7 @@ function initOther4Select() {
                     } else if (obj.nameEn === 'currentHolding') {
                         var exchangeCategoryStr = '';
                         $.each(obj.exchangeCategoryList, function (index2, obj2) {
-                            exchangeCategoryStr += '<option value="' + obj2 + '">' + obj2 + '</option>';
+                            exchangeCategoryStr += '<option value="' + obj2.id + '">' + obj2.categoryName + '</option>';
                         });
                         $("#apis-quiet-div-currentHolding-categoryField").append(exchangeCategoryStr);
                     }
@@ -445,6 +445,11 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
                     $.each(returnEn, function (index, obj) {
                         var objStyle = dataDetail.hasOwnProperty(obj + 'Style') && dataDetail[obj + 'Style'] != null ? dataDetail[obj + 'Style'] : '';
                         var objContent = dataDetail.hasOwnProperty(obj) ? dataDetail[obj] : '--';
+
+                        if (nameEn === 'currentHolding') {
+                            objContent = objContent != null ? objContent : '--';
+                        }
+
                         str += '<td' + objStyle + '>' + objContent + '</td>';
                     });
 
@@ -500,6 +505,9 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
             if (typetype === '2') {
                 $(".quiet-loading").css("display", "none");
             }
+            if (nameEn === 'currentHolding') {
+                getCurrentHoldingTotalAmout(jsonData);
+            }
         },
         error: function (data) {
             //请求出错处理
@@ -508,6 +516,32 @@ function mainSearch(url, nameEn, slideDiv, typetype, needCustomFlag) {
     });
 }
 
+function getCurrentHoldingTotalAmout(jsonData) {
+    $.ajax({
+        url: "coin/getCurrentHoldingTotalAmout", //请求的url地址
+        dataType: "json", //返回格式为json
+        data: JSON.stringify(jsonData), //参数值
+        type: "post", //请求方式
+        contentType: "application/json;charset=utf-8",
+        async: true, //请求是否异步,默认为异步,这也是ajax重要特性
+        success: function (data) {
+            //请求成功时处理
+            if (data != null && $.trim(data) != "" && data.success) {
+                let contentSPAN = $('#apis-quiet-content').find("span.contentSPAN");
+                contentSPAN.html(contentSPAN.html() + '  |  ' +data.data);
+            } else {
+                //alert(data.message);
+            }
+        },
+        beforeSend: function () {
+        },
+        complete: function () {
+        },
+        error: function (data) {
+        }
+    });
+}
+
 /**
  * 初始化主内容事件
  */