From cd57115454894c2808227d2940fe79538323c16d Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Mon, 12 May 2025 09:37:33 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=B9=B8=E8=BF=90=E5=80=BC=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m2pool/pool/mapper/PoolMapper.java | 19 +++ .../java/com/m2pool/pool/task/DataTask.java | 142 +++++++++--------- .../java/com/m2pool/pool/task/NodeTask.java | 1 + .../main/resources/mapper/pool/PoolMapper.xml | 11 +- 4 files changed, 96 insertions(+), 77 deletions(-) diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/mapper/PoolMapper.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/mapper/PoolMapper.java index 5bfa88e..bbbd87c 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/mapper/PoolMapper.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/mapper/PoolMapper.java @@ -10,6 +10,7 @@ import com.m2pool.pool.vo.DateValueVo; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -198,4 +199,22 @@ public interface PoolMapper { @DistributionDB public int selectPoolBlock(@Param("reduce")int reduce); + /** + * 查询一段时间内矿池平均算力 + * @param coin + * @param start + * @param end + * @return + */ + DateBigDecimalDto getAvgPowerForPool(@Param("coin") String coin, @Param("start")Date start, @Param("end")Date end); + + /** + * 查询一段时间段内全网平均算力 + * @param coin + * @param start + * @param end + * @return + */ + DateBigDecimalDto getAvgPowerForNet(@Param("coin") String coin, @Param("start")Date start, @Param("end")Date end); + } diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java index 227c12f..ef6cd66 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/DataTask.java @@ -399,10 +399,10 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") + @Scheduled(cron = "30 2,5 0/12 * * ?") public void NEXALuckyDataToDB(){ - log.info("nexa幸运值---延时任务开始"); + log.info("nexa幸运值---定时任务开始"); LuckDto dto = new LuckDto(); Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); //幸运值 = 矿池实际报块/矿池理论报块 @@ -424,24 +424,27 @@ public class DataTask { //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //7天幸运值 useAggregated = blockPerDays.size() >= 7; blockData = blockDataContext.getBlockData("nexa",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //30天幸运值 useAggregated = blockPerDays.size() >= 30; blockData = blockDataContext.getBlockData("nexa",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //90天幸运值 useAggregated = blockPerDays.size() >= 90; @@ -449,12 +452,14 @@ public class DataTask { blockData = blockDataContext.getBlockData("nexa",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("NEXALuck"); redisService.setCacheObject("NEXALuck",dto); - log.info("nexa幸运值入库完成"); + log.info("nexa幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } @@ -468,47 +473,17 @@ public class DataTask { */ public BigDecimal getTheoreticalBlocks(String coin,int hRate,Date start,Date end,BlockTimeAndNumberDto blockData){ - //得到每一个小时定时任务存储到数据库的全网算力 - List netPowerList = poolMapper.getDailyNetPower(coin); - if(netPowerList.isEmpty()){ - return BigDecimal.ZERO; - } - //得时间段到矿池的算力 - List poolPowerList = poolMapper.getDailyPoolPower(coin); - //A:矿池N天总算力 - //计算矿池每日实际应出块数 block中算力单位是H/s - BigDecimal pPow3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))) - .map(DateBigDecimalDto::getValue).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - //作为A的除数,得到N天内的矿池平均算力 - long pDay3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))).count(); + //查询一段时间内矿池平均算力 + DateBigDecimalDto avgPowerForPool = poolMapper.getAvgPowerForPool(coin, start, end); + //查询一段时间段内全网平均算力 + DateBigDecimalDto avgPowerForNet = poolMapper.getAvgPowerForNet(coin, start, end); - //B:N天全网算力 - BigDecimal nPow3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))) - .map(DateBigDecimalDto::getValue).reduce(BigDecimal.ZERO, BigDecimal::add); - - //作为B的除数,得到3天内的全网平均算力 - long nDay3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))).count(); - - if(pDay3d == 0 || nDay3d == 0){ + if(avgPowerForNet.getValue().equals(BigDecimal.ZERO)){ return BigDecimal.ZERO; } - return pPow3d - .divide(BigDecimal.valueOf(pDay3d),8, RoundingMode.HALF_UP) - .divide(nPow3d,8, RoundingMode.HALF_UP) - .multiply(BigDecimal.valueOf(nDay3d)) - .multiply(BigDecimal.valueOf(blockData.getHeight())) - .multiply(blockData.getDateLength()) - .setScale(8, RoundingMode.HALF_UP); + return avgPowerForPool.getValue().multiply(BigDecimal.valueOf(hRate)).divide(avgPowerForNet.getValue(),8, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(blockData.getHeight())).setScale(8, RoundingMode.HALF_UP); } @@ -885,37 +860,42 @@ public class DataTask { //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //7天幸运值 useAggregated = blockPerDays.size() >= 7; blockData = blockDataContext.getBlockData("grs",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //30天幸运值 useAggregated = blockPerDays.size() >= 30; blockData = blockDataContext.getBlockData("grs",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //90天幸运值 useAggregated = blockPerDays.size() >= 90; blockData = blockDataContext.getBlockData("grs",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("GRSLuck"); redisService.setCacheObject("GRSLuck",dto); - log.info("grs幸运值入库完成"); + log.info("grs幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d());; } @Scheduled(cron = "12 1,3,12,31,33,42 * * * ?") @@ -1268,6 +1248,7 @@ public class DataTask { //@Scheduled(cron = "30 2,7 0,12 * * ?") @Scheduled(cron = "32 2,5 0/12 * * ?") public void MONALuckyDataToDB(){ + log.info("MONA幸运值---定时任务开始"); LuckDto dto = new LuckDto(); Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); //幸运值 = 矿池实际报块/矿池理论报块 @@ -1293,24 +1274,27 @@ public class DataTask { //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //7天幸运值 useAggregated = blockPerDays.size() >= 7; blockData = blockDataContext.getBlockData("mona",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("mona",PoolUnits.MONA.gethRate(),start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //30天幸运值 useAggregated = blockPerDays.size() >= 30; blockData = blockDataContext.getBlockData("mona",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.MONA.gethRate(),start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //90天幸运值 useAggregated = blockPerDays.size() >= 90; @@ -1318,10 +1302,13 @@ public class DataTask { blockData = blockDataContext.getBlockData("mona",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("mona",PoolUnits.MONA.gethRate(),start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("MONALuck"); redisService.setCacheObject("MONALuck",dto); + log.info("MONA幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } @Scheduled(cron = "14 1,3,9,31,33,39 * * * ?") @@ -3390,7 +3377,7 @@ public class DataTask { //@Scheduled(cron = "30 2,7 0,12 * * ?") @Scheduled(cron = "39 2,5 0/12 * * ?") public void RXDLuckyDataToDB(){ - log.info("rxd幸运值---定时任务开启"); + log.info("rxd幸运值---定时任务开始"); LuckDto dto = new LuckDto(); Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); //幸运值 = 矿池实际报块/矿池理论报块 @@ -3416,24 +3403,27 @@ public class DataTask { //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //7天幸运值 useAggregated = blockPerDays.size() >= 7; blockData = blockDataContext.getBlockData("rxd",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //30天幸运值 useAggregated = blockPerDays.size() >= 30; blockData = blockDataContext.getBlockData("rxd",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } //90天幸运值 useAggregated = blockPerDays.size() >= 90; @@ -3441,11 +3431,13 @@ public class DataTask { blockData = blockDataContext.getBlockData("rxd",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); - + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("RXDLuck"); redisService.setCacheObject("RXDLuck",dto); - log.info("rxd幸运值入库完成"); + log.info("rxd幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } @Scheduled(cron = "21 1,3,13,31,33,43 * * * ?") diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/NodeTask.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/NodeTask.java index f383829..9d3046c 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/NodeTask.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/NodeTask.java @@ -509,6 +509,7 @@ public class NodeTask { try { BlockInfo block = NodeRpc.getBlock(blockName); poolMapper.insertNetBlock(tableName, block.getHeight()); + log.info("插入币种 {} ,插入的最新高度为{}", blockName,block.getHeight()); return; } catch (Exception e) { retryCount++; diff --git a/m2pool-modules/m2pool-pool/src/main/resources/mapper/pool/PoolMapper.xml b/m2pool-modules/m2pool-pool/src/main/resources/mapper/pool/PoolMapper.xml index 0df0682..1d99780 100644 --- a/m2pool-modules/m2pool-pool/src/main/resources/mapper/pool/PoolMapper.xml +++ b/m2pool-modules/m2pool-pool/src/main/resources/mapper/pool/PoolMapper.xml @@ -883,7 +883,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - insert into ${tableName} (`date`,`height`) values(#{date},#{height}) ON DUPLICATE KEY UPDATE `height` = VALUES(`height`) + insert into ${tableName} (`height`) values(#{height}) ON DUPLICATE KEY UPDATE `height` = VALUES(`height`) SELECT count(*) FROM nexa_blkreportprofitv2 WHERE `date` >= DATE_SUB(CURDATE(),INTERVAL #{reduce} DAY) - + +