From 5d7e3e6401104b4684d425106942937cafd87a33 Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Wed, 21 May 2025 15:06:04 +0800 Subject: [PATCH] =?UTF-8?q?update=20dgb=E7=B3=BB=E5=88=97=E5=B9=B8?= =?UTF-8?q?=E8=BF=90=E5=80=BC=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m2pool/pool/mapper/PoolMapper.java | 2 +- .../strategy/DetailedBlockDataV1Strategy.java | 2 +- .../strategy/DetailedBlockDataV2Strategy.java | 4 - .../java/com/m2pool/pool/task/DataTask.java | 949 +++++------------- .../java/com/m2pool/pool/task/NodeTask.java | 2 +- .../com/m2pool/pool/utils/PowerUnitUtils.java | 6 +- .../main/resources/mapper/pool/PoolMapper.xml | 7 +- 7 files changed, 242 insertions(+), 730 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 bbbd87c..ca0e21a 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 @@ -197,7 +197,7 @@ public interface PoolMapper { * @return */ @DistributionDB - public int selectPoolBlock(@Param("reduce")int reduce); + public int selectPoolBlock(@Param("start")Date start,@Param("end")Date end,@Param("coin")String coin,@Param("reduce")int reduce); /** * 查询一段时间内矿池平均算力 diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV1Strategy.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV1Strategy.java index c0d4916..bfca98f 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV1Strategy.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV1Strategy.java @@ -34,7 +34,7 @@ public class DetailedBlockDataV1Strategy implements PoolBlockDataStrategy { //每日出块数固定的出块数 BigDecimal nexaCount = getCoinCount(coin); long diffInMillis = end.getTime() - start.getTime(); - BigDecimal dateLength2 = BigDecimal.valueOf(diffInMillis).divide(BigDecimal.valueOf(86400000), 0, RoundingMode.HALF_UP); + BigDecimal dateLength2 = BigDecimal.valueOf(diffInMillis).divide(BigDecimal.valueOf(86400000), 2, RoundingMode.HALF_UP); //获取时间段内全网的实际报块数 int height = dateLength2.multiply(nexaCount).intValue(); //天数不足时,以实际天数计算 diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV2Strategy.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV2Strategy.java index d94bfc9..56e969b 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV2Strategy.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV2Strategy.java @@ -19,9 +19,6 @@ import java.util.stream.Collectors; @Component public class DetailedBlockDataV2Strategy implements PoolBlockDataStrategy { - @Autowired - private PoolMapper poolMapper; - @Override public BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end, List blockPerDays) { List collect = blockPerDays.stream() @@ -35,7 +32,6 @@ public class DetailedBlockDataV2Strategy implements PoolBlockDataStrategy { return BlockTimeAndNumberDto.builder().dateLength(BigDecimal.ZERO).height(collect.get(0).getHeight()).build(); } return BlockTimeAndNumberDto.builder() - .dateLength(BigDecimal.valueOf(collect.size())) .height(collect.get(0).getHeight()-collect.get(collect.size() - 1).getHeight()).build(); } 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 9aa7d32..bf8d818 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 @@ -404,12 +404,13 @@ public class DataTask { } - @Scheduled(cron = "30 2,5 0 * * ?") + + @Scheduled(cron = "30 3 0/1 * * ?") //@Scheduled(cron = "0 0/2 * * * ?") public void NEXALuckyDataToDB(){ log.info("nexa幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); //幸运值 = 矿池实际报块/矿池理论报块 //矿池实际报块 = distribution数据库查询表名为 币名_blkreportprofitv2 //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 @@ -418,52 +419,51 @@ public class DataTask { Date start30d = DateUtils.addDays(end,-30); Date start90d = DateUtils.addDays(end,-90); - //获取全网实际90天内的报块数(v2) List blockPerDays = poolMapper.selectNetBlock("nexa_net_block"); - boolean useAggregated = blockPerDays.size() >= 3; + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); //获取3天内全网的实际报块数 BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("nexa",start3d, end,blockPerDays, useAggregated); //3天矿池理论报块数 BigDecimal throreticalBlocks = getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start3d, end, blockData); //3天矿池实际报块数 - int actualBlocks = poolMapper.selectPoolBlock(3); - log.info("nexa 3天实际报块数{},理论报块数{},全网实际报块数{}",actualBlocks,throreticalBlocks,blockData.getHeight()); + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"nexa",3); + log.info("nexa 3天实际报块数{},理论报块数{},全网实际报块数{},开始时间{},结束时间{}",actualBlocks,throreticalBlocks,blockData.getHeight(),start3d,end); //3天幸运值 if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //7天幸运值 - useAggregated = blockPerDays.size() >= 7; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("nexa",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start7d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(7); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"nexa",7); log.info("nexa 7天实际报块数{},理论报块数{}",actualBlocks,throreticalBlocks); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //30天幸运值 - useAggregated = blockPerDays.size() >= 30; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); blockData = blockDataContext.getBlockData("nexa",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start30d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(30); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"nexa",30); log.info("nexa 30天实际报块数{},理论报块数{}",actualBlocks,throreticalBlocks); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //90天幸运值 - useAggregated = blockPerDays.size() >= 90; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("nexa",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.NEXA.gethRate(),start90d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(90); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"nexa",90); log.info("nexa 90天实际报块数{},理论报块数{}",actualBlocks,throreticalBlocks); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } redisService.deleteObject("NEXALuck"); @@ -472,7 +472,6 @@ public class DataTask { dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } - /** * 币种 理论出块数 * @param coin 币种名 @@ -492,7 +491,7 @@ public class DataTask { return BigDecimal.ZERO; } - return avgPowerForPool.getValue().multiply(BigDecimal.valueOf(hRate)).divide(avgPowerForNet.getValue(),8, RoundingMode.HALF_UP) + return avgPowerForPool.getValue().multiply(BigDecimal.valueOf(hRate)).divide(BigDecimal.valueOf(0.985),3, RoundingMode.HALF_UP).divide(avgPowerForNet.getValue(),8, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(blockData.getHeight())).setScale(4, RoundingMode.HALF_UP); } @@ -845,12 +844,13 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") - @Scheduled(cron = "31 2,5 0 * * ?") + + @Scheduled(cron = "31 3 0/1 * * ?") + //@Scheduled(cron = "0 0/2 * * * ?") public void GRSLuckyDataToDB(){ log.info("GRS幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); //幸运值 = 矿池实际报块/矿池理论报块 //矿池实际报块 = 数据库查询表名为币名_pool_blkstats //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 @@ -862,43 +862,43 @@ public class DataTask { //获取全网实际90天内的报块数(v2) List blockPerDays = poolMapper.selectNetBlock("grs_net_block"); - boolean useAggregated = blockPerDays.size() >= 3; + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); //获取3天内全网的实际报块数 BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("grs",start3d, end,blockPerDays, useAggregated); //3天矿池理论报块数 BigDecimal throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start3d, end, blockData); //3天矿池实际报块数 - int actualBlocks = poolMapper.selectPoolBlock(3); + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"grs",3); //3天幸运值 if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //7天幸运值 - useAggregated = blockPerDays.size() >= 7; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("grs",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start7d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(7); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"grs",7); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //30天幸运值 - useAggregated = blockPerDays.size() >= 30; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); blockData = blockDataContext.getBlockData("grs",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start30d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(30); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"grs",30); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //90天幸运值 - useAggregated = blockPerDays.size() >= 90; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("grs",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("grs",PoolUnits.GRS.gethRate(),start90d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(90); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"grs",90); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } @@ -1255,12 +1255,12 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") - @Scheduled(cron = "32 2,5 0 * * ?") + @Scheduled(cron = "32 3 0/1 * * ?") + //@Scheduled(cron = "0 0/2 * * * ?") public void MONALuckyDataToDB(){ log.info("MONA幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); //幸运值 = 矿池实际报块/矿池理论报块 //矿池实际报块 = 数据库查询表名为币名_pool_blkstats //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 @@ -1274,7 +1274,7 @@ public class DataTask { List blockPerDays = poolMapper.selectNetBlock("mona_net_block"); - boolean useAggregated = blockPerDays.size() >= 3; + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); //获取3天内全网的实际报块数 BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("mona",start3d, end,blockPerDays, useAggregated); @@ -1282,38 +1282,38 @@ public class DataTask { BigDecimal throreticalBlocks= getTheoreticalBlocks("mona",PoolUnits.MONA.gethRate(),start3d, end, blockData); //3天矿池实际报块数 - int actualBlocks = poolMapper.selectPoolBlock(3); + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"mona",3); //3天幸运值 if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //7天幸运值 - useAggregated = blockPerDays.size() >= 7; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("mona",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("mona",PoolUnits.MONA.gethRate(),start7d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(7); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"mona",7); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //30天幸运值 - useAggregated = blockPerDays.size() >= 30; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); blockData = blockDataContext.getBlockData("mona",start30d, end,blockPerDays, useAggregated); - throreticalBlocks= getTheoreticalBlocks("nexa",PoolUnits.MONA.gethRate(),start30d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(30); + throreticalBlocks= getTheoreticalBlocks("mona",PoolUnits.MONA.gethRate(),start30d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"mona",30); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //90天幸运值 - useAggregated = blockPerDays.size() >= 90; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("mona",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("mona",PoolUnits.MONA.gethRate(),start90d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(90); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"mona",90); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } redisService.deleteObject("MONALuck"); redisService.setCacheObject("MONALuck",dto); @@ -1668,233 +1668,72 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") - @Scheduled(cron = "34 2,5 0/12 * * ?") + + @Scheduled(cron = "34 3 0/1 * * ?") + //@Scheduled(cron = "0 0/2 * * * ?") public void DGBOLuckyDataToDB(){ - int time = 0; + + log.info("DGBO幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); - do { - //幸运值 - // N天应出块数量 = N天矿池平均算力/ N天全网平均算力 * 币种每日出块数 * N天 取同一时间点的矿池算力/全网算力 - // 币种每日出块数 = 720 数值来源: 每日分钟数(24*60) / 出一个块需要的时间(根据具体币种 nexa是2分钟) - // N天实际出块量 数据库查询N天实际出块量 - // N天幸运值 = N天实际出块量 / N天应出块量 * 100 结果即百分比数字% - /** 全网每日出块数 */ - BigDecimal dgboCount = PoolCalParamConfig.DGBO.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.DGBO.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("dgbo"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("dgbo"); - - //拿报块list 筛选实际出块数 - //List list = poolMapper.getNEXABlockInfoList(); - List list = poolMapper.getDGBODOBlockInfoList(); - - if (list.size() < 1){ - continue; - } - - //第一条报块数据的时间 - Date poolStart = list.get(list.size() - 1).getDate(); - Date start3d = DateUtils.addDays(end,-3); - Date start7d = DateUtils.addDays(end,-7); - Date start30d = DateUtils.addDays(end,-30); - Date start90d = DateUtils.addDays(end,-90); - //(矿池平均/全网平均) * (全网计算平均的时间/矿池计算平均的时间) * 每日全网出块数 = 矿池每日应出块数 - long pDay3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - //矿池单位转换 - BigDecimal pPow3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - BigDecimal nPow3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay3d == 0 || nDay3d == 0){ - continue; - } - //计算3天 每日出块量 - BigDecimal dayChunk3d = pPow3d - .multiply(BigDecimal.valueOf(nDay3d * nDay3d)) - .divide(nPow3d.multiply(BigDecimal.valueOf(pDay3d * pDay3d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(dgboCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal pPow7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal nPow7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay7d == 0 || nDay7d == 0){ - continue; - } - - //计算7d 每日应出块量 - BigDecimal dayChunk7d = pPow7d - .multiply(BigDecimal.valueOf(nDay7d * nDay7d)) - .divide(nPow7d.multiply(BigDecimal.valueOf(pDay7d * pDay7d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(dgboCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal pPow30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal nPow30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay30d == 0 || nDay30d == 0){ - continue; - } - - //计算30d 每日应出块量 - BigDecimal dayChunk30d = pPow30d - .multiply(BigDecimal.valueOf(nDay30d * nDay30d)) - .divide(nPow30d.multiply(BigDecimal.valueOf(pDay30d * pDay30d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(dgboCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal pPow90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal nPow90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay90d == 0 || nDay90d == 0){ - continue; - } - - //计算90d 每日应出块量 - BigDecimal dayChunk90d = pPow90d - .multiply(BigDecimal.valueOf(nDay90d * nDay90d)) - .divide(nPow90d.multiply(BigDecimal.valueOf(pDay90d * pDay90d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(dgboCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - //3天时间出块数 - long count3d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start3d) || e.getDate().equals(start3d))) - .count(); - BigDecimal chunk3d = BigDecimal.valueOf(count3d); - //7天时间出块数 - long count7d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start7d) || e.getDate().equals(start7d))) - .count(); - BigDecimal chunk7d = BigDecimal.valueOf(count7d); - //30天时间出块数 - long count30d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start30d) || e.getDate().equals(start30d))) - .count(); - BigDecimal chunk30d = BigDecimal.valueOf(count30d); - //90天时间出块数 - long count90d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start90d) || e.getDate().equals(start90d))) - .count(); - BigDecimal chunk90d = BigDecimal.valueOf(count90d); - - if(poolStart.after(start3d)){ - System.out.println("不足3天"); - long needTime = poolStart.getTime()-start3d.getTime(); - chunk3d = chunk3d - .add(dayChunk3d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("3天出块量"+chunk3d); - dto.setLuck3d(chunk3d.divide(dayChunk3d.multiply(BigDecimal.valueOf(3)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - if(poolStart.after(start7d)){ - System.out.println("不足7天"); - long needTime = poolStart.getTime()-start7d.getTime(); - chunk7d = chunk7d - .add(dayChunk7d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("7天出块量"+chunk7d); - dto.setLuck7d(chunk7d.divide(dayChunk7d.multiply(BigDecimal.valueOf(7)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_pool_blkstats + //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 + Date start3d = DateUtils.addDays(end,-3); + Date start7d = DateUtils.addDays(end,-7); + Date start30d = DateUtils.addDays(end,-30); + Date start90d = DateUtils.addDays(end,-90); - if(poolStart.after(start30d)){ - System.out.println("不足30天"); - long needTime = poolStart.getTime()-start30d.getTime(); - chunk30d = chunk30d - .add(dayChunk30d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("30天出块量"+chunk30d); - dto.setLuck30d(chunk30d.divide(dayChunk30d.multiply(BigDecimal.valueOf(30)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + //获取全网实际90天内的报块数(v2) + List blockPerDays = poolMapper.selectNetBlock("dgbo_net_block"); - if(poolStart.after(start90d)){ - System.out.println("不足90天"); - long needTime = poolStart.getTime()-start90d.getTime(); - chunk90d = chunk90d - .add(dayChunk90d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("90天出块量"+chunk90d); - dto.setLuck90d(chunk90d.divide(dayChunk90d.multiply(BigDecimal.valueOf(90)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - break; - }while (time < 4); + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); + //获取3天内全网的实际报块数 + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("dgbo",start3d, end,blockPerDays, useAggregated); + //3天矿池理论报块数 + BigDecimal throreticalBlocks= getTheoreticalBlocks("dgbo",PoolUnits.DGBO.gethRate(),start3d, end, blockData); + + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"dgbo",3); + //3天幸运值 + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + //7天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); + + blockData = blockDataContext.getBlockData("dgbo",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbo",PoolUnits.MONA.gethRate(),start7d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"dgbo",7); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + //30天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); + + blockData = blockDataContext.getBlockData("dgbo",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbo",PoolUnits.MONA.gethRate(),start30d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"dgbo",30); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + + //90天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); + + blockData = blockDataContext.getBlockData("dgbo",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbo",PoolUnits.MONA.gethRate(),start90d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"dgbo",90); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("DGBOLuck"); redisService.setCacheObject("DGBOLuck",dto); + log.info("DGBO幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } @Scheduled(cron = "16 1,3,8,31,33,38 * * * ?") @@ -2244,233 +2083,70 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") - @Scheduled(cron = "36 2,5 0/12 * * ?") + @Scheduled(cron = "36 3 0/1 * * ?") + //@Scheduled(cron = "0 0/2 * * * ?") public void DGBQLuckyDataToDB(){ - int time = 0; + log.info("DGBQ幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); - do { - //幸运值 - // N天应出块数量 = N天矿池平均算力/ N天全网平均算力 * 币种每日出块数 * N天 取同一时间点的矿池算力/全网算力 - // 币种每日出块数 = 720 数值来源: 每日分钟数(24*60) / 出一个块需要的时间(根据具体币种 nexa是2分钟) - // N天实际出块量 数据库查询N天实际出块量 - // N天幸运值 = N天实际出块量 / N天应出块量 * 100 结果即百分比数字% - /** 全网每日出块数 */ - BigDecimal nexaCount = PoolCalParamConfig.DGBQ.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.DGBQ.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("dgbq"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("dgbq"); - - //拿报块list 筛选实际出块数 - //List list = poolMapper.getNEXABlockInfoList(); - List list = poolMapper.getDgbQubitBlockInfoList(); - - if (list.size() < 1){ - continue; - } - - //第一条报块数据的时间 - Date poolStart = list.get(list.size() - 1).getDate(); - Date start3d = DateUtils.addDays(end,-3); - Date start7d = DateUtils.addDays(end,-7); - Date start30d = DateUtils.addDays(end,-30); - Date start90d = DateUtils.addDays(end,-90); - //(矿池平均/全网平均) * (全网计算平均的时间/矿池计算平均的时间) * 每日全网出块数 = 矿池每日应出块数 - long pDay3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - //矿池单位转换 - BigDecimal pPow3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - BigDecimal nPow3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay3d == 0 || nDay3d == 0){ - continue; - } - //计算3天 每日出块量 - BigDecimal dayChunk3d = pPow3d - .multiply(BigDecimal.valueOf(nDay3d * nDay3d)) - .divide(nPow3d.multiply(BigDecimal.valueOf(pDay3d * pDay3d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal pPow7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal nPow7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay7d == 0 || nDay7d == 0){ - continue; - } - - //计算7d 每日应出块量 - BigDecimal dayChunk7d = pPow7d - .multiply(BigDecimal.valueOf(nDay7d * nDay7d)) - .divide(nPow7d.multiply(BigDecimal.valueOf(pDay7d * pDay7d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal pPow30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal nPow30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay30d == 0 || nDay30d == 0){ - continue; - } - - //计算30d 每日应出块量 - BigDecimal dayChunk30d = pPow30d - .multiply(BigDecimal.valueOf(nDay30d * nDay30d)) - .divide(nPow30d.multiply(BigDecimal.valueOf(pDay30d * pDay30d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal pPow90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal nPow90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay90d == 0 || nDay90d == 0){ - continue; - } - - //计算90d 每日应出块量 - BigDecimal dayChunk90d = pPow90d - .multiply(BigDecimal.valueOf(nDay90d * nDay90d)) - .divide(nPow90d.multiply(BigDecimal.valueOf(pDay90d * pDay90d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - //3天时间出块数 - long count3d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start3d) || e.getDate().equals(start3d))) - .count(); - BigDecimal chunk3d = BigDecimal.valueOf(count3d); - //7天时间出块数 - long count7d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start7d) || e.getDate().equals(start7d))) - .count(); - BigDecimal chunk7d = BigDecimal.valueOf(count7d); - //30天时间出块数 - long count30d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start30d) || e.getDate().equals(start30d))) - .count(); - BigDecimal chunk30d = BigDecimal.valueOf(count30d); - //90天时间出块数 - long count90d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start90d) || e.getDate().equals(start90d))) - .count(); - BigDecimal chunk90d = BigDecimal.valueOf(count90d); - - if(poolStart.after(start3d)){ - System.out.println("不足3天"); - long needTime = poolStart.getTime()-start3d.getTime(); - chunk3d = chunk3d - .add(dayChunk3d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("3天出块量"+chunk3d); - dto.setLuck3d(chunk3d.divide(dayChunk3d.multiply(BigDecimal.valueOf(3)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - if(poolStart.after(start7d)){ - System.out.println("不足7天"); - long needTime = poolStart.getTime()-start7d.getTime(); - chunk7d = chunk7d - .add(dayChunk7d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("7天出块量"+chunk7d); - dto.setLuck7d(chunk7d.divide(dayChunk7d.multiply(BigDecimal.valueOf(7)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_pool_blkstats + //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 + Date start3d = DateUtils.addDays(end,-3); + Date start7d = DateUtils.addDays(end,-7); + Date start30d = DateUtils.addDays(end,-30); + Date start90d = DateUtils.addDays(end,-90); - if(poolStart.after(start30d)){ - System.out.println("不足30天"); - long needTime = poolStart.getTime()-start30d.getTime(); - chunk30d = chunk30d - .add(dayChunk30d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("30天出块量"+chunk30d); - dto.setLuck30d(chunk30d.divide(dayChunk30d.multiply(BigDecimal.valueOf(30)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + //获取全网实际90天内的报块数(v2) + List blockPerDays = poolMapper.selectNetBlock("dgbq_net_block"); - if(poolStart.after(start90d)){ - System.out.println("不足90天"); - long needTime = poolStart.getTime()-start90d.getTime(); - chunk90d = chunk90d - .add(dayChunk90d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("90天出块量"+chunk90d); - dto.setLuck90d(chunk90d.divide(dayChunk90d.multiply(BigDecimal.valueOf(90)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - break; - }while (time < 4); + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); + //获取3天内全网的实际报块数 + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("dgbq",start3d, end,blockPerDays, useAggregated); + //3天矿池理论报块数 + BigDecimal throreticalBlocks= getTheoreticalBlocks("dgbq",PoolUnits.DGBQ.gethRate(),start3d, end, blockData); + + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"dgbq",3); + //3天幸运值 + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + //7天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); + + blockData = blockDataContext.getBlockData("dgbq",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbq",PoolUnits.MONA.gethRate(),start7d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"dgbq",7); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + //30天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); + + blockData = blockDataContext.getBlockData("dgbq",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbq",PoolUnits.MONA.gethRate(),start30d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"dgbq",30); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + + //90天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); + + blockData = blockDataContext.getBlockData("dgbq",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbq",PoolUnits.MONA.gethRate(),start90d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"dgbq",90); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("DGBQLuck"); redisService.setCacheObject("DGBQLuck",dto); + log.info("DGBQ幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } @Scheduled(cron = "18 1,3,7,31,33,37 * * * ?") @@ -2818,233 +2494,70 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") - @Scheduled(cron = "38 2,5 0/12 * * ?") + @Scheduled(cron = "38 3 0/1 * * ?") + //@Scheduled(cron = "0 0/2 * * * ?") public void DGBSLuckyDataToDB(){ - int time = 0; + log.info("DGBS幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); - do { - //幸运值 - // N天应出块数量 = N天矿池平均算力/ N天全网平均算力 * 币种每日出块数 * N天 取同一时间点的矿池算力/全网算力 - // 币种每日出块数 = 720 数值来源: 每日分钟数(24*60) / 出一个块需要的时间(根据具体币种 nexa是2分钟) - // N天实际出块量 数据库查询N天实际出块量 - // N天幸运值 = N天实际出块量 / N天应出块量 * 100 结果即百分比数字% - /** 全网每日出块数 */ - BigDecimal nexaCount = PoolCalParamConfig.DGBS.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.DGBS.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("dgbs"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("dgbs"); - - //拿报块list 筛选实际出块数 - //List list = poolMapper.getNEXABlockInfoList(); - List list = poolMapper.getDgbSkeinBlockInfoList(); - - if (list.size() < 1){ - continue; - } - - //第一条报块数据的时间 - Date poolStart = list.get(list.size() - 1).getDate(); - Date start3d = DateUtils.addDays(end,-3); - Date start7d = DateUtils.addDays(end,-7); - Date start30d = DateUtils.addDays(end,-30); - Date start90d = DateUtils.addDays(end,-90); - //(矿池平均/全网平均) * (全网计算平均的时间/矿池计算平均的时间) * 每日全网出块数 = 矿池每日应出块数 - long pDay3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - //矿池单位转换 - BigDecimal pPow3d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))).count(); - - BigDecimal nPow3d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start3d) || e.getPDate().equals(start3d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay3d == 0 || nDay3d == 0){ - continue; - } - //计算3天 每日出块量 - BigDecimal dayChunk3d = pPow3d - .multiply(BigDecimal.valueOf(nDay3d * nDay3d)) - .divide(nPow3d.multiply(BigDecimal.valueOf(pDay3d * pDay3d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal pPow7d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))).count(); - - BigDecimal nPow7d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start7d) || e.getPDate().equals(start7d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay7d == 0 || nDay7d == 0){ - continue; - } - - //计算7d 每日应出块量 - BigDecimal dayChunk7d = pPow7d - .multiply(BigDecimal.valueOf(nDay7d * nDay7d)) - .divide(nPow7d.multiply(BigDecimal.valueOf(pDay7d * pDay7d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal pPow30d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))).count(); - - BigDecimal nPow30d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start30d) || e.getPDate().equals(start30d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay30d == 0 || nDay30d == 0){ - continue; - } - - //计算30d 每日应出块量 - BigDecimal dayChunk30d = pPow30d - .multiply(BigDecimal.valueOf(nDay30d * nDay30d)) - .divide(nPow30d.multiply(BigDecimal.valueOf(pDay30d * pDay30d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - long pDay90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal pPow90d = poolPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add) - .multiply(BigDecimal.valueOf(hRate)); - - long nDay90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))).count(); - - BigDecimal nPow90d = netPowerList.stream() - .filter(e -> (e.getPDate().before(end))) - .filter(e -> (e.getPDate().after(start90d) || e.getPDate().equals(start90d))) - .map(e -> e.getValue()).reduce(BigDecimal.ZERO, BigDecimal::add); - - if(pDay90d == 0 || nDay90d == 0){ - continue; - } - - //计算90d 每日应出块量 - BigDecimal dayChunk90d = pPow90d - .multiply(BigDecimal.valueOf(nDay90d * nDay90d)) - .divide(nPow90d.multiply(BigDecimal.valueOf(pDay90d * pDay90d)),8,BigDecimal.ROUND_HALF_UP) - .multiply(nexaCount) - .setScale(8, BigDecimal.ROUND_HALF_UP); - - //3天时间出块数 - long count3d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start3d) || e.getDate().equals(start3d))) - .count(); - BigDecimal chunk3d = BigDecimal.valueOf(count3d); - //7天时间出块数 - long count7d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start7d) || e.getDate().equals(start7d))) - .count(); - BigDecimal chunk7d = BigDecimal.valueOf(count7d); - //30天时间出块数 - long count30d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start30d) || e.getDate().equals(start30d))) - .count(); - BigDecimal chunk30d = BigDecimal.valueOf(count30d); - //90天时间出块数 - long count90d = list.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start90d) || e.getDate().equals(start90d))) - .count(); - BigDecimal chunk90d = BigDecimal.valueOf(count90d); - - if(poolStart.after(start3d)){ - System.out.println("不足3天"); - long needTime = poolStart.getTime()-start3d.getTime(); - chunk3d = chunk3d - .add(dayChunk3d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("3天出块量"+chunk3d); - dto.setLuck3d(chunk3d.divide(dayChunk3d.multiply(BigDecimal.valueOf(3)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - - if(poolStart.after(start7d)){ - System.out.println("不足7天"); - long needTime = poolStart.getTime()-start7d.getTime(); - chunk7d = chunk7d - .add(dayChunk7d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("7天出块量"+chunk7d); - dto.setLuck7d(chunk7d.divide(dayChunk7d.multiply(BigDecimal.valueOf(7)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_pool_blkstats + //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 + Date start3d = DateUtils.addDays(end,-3); + Date start7d = DateUtils.addDays(end,-7); + Date start30d = DateUtils.addDays(end,-30); + Date start90d = DateUtils.addDays(end,-90); - if(poolStart.after(start30d)){ - System.out.println("不足30天"); - long needTime = poolStart.getTime()-start30d.getTime(); - chunk30d = chunk30d - .add(dayChunk30d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("30天出块量"+chunk30d); - dto.setLuck30d(chunk30d.divide(dayChunk30d.multiply(BigDecimal.valueOf(30)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); + //获取全网实际90天内的报块数(v2) + List blockPerDays = poolMapper.selectNetBlock("dgbs_net_block"); - if(poolStart.after(start90d)){ - System.out.println("不足90天"); - long needTime = poolStart.getTime()-start90d.getTime(); - chunk90d = chunk90d - .add(dayChunk90d.multiply(BigDecimal.valueOf(needTime).divide(BigDecimal.valueOf(86400000),8,BigDecimal.ROUND_HALF_UP))); - } - System.out.println("90天出块量"+chunk90d); - dto.setLuck90d(chunk90d.divide(dayChunk90d.multiply(BigDecimal.valueOf(90)),4,BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).doubleValue()); - break; - }while (time < 4); + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); + //获取3天内全网的实际报块数 + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("dgbs",start3d, end,blockPerDays, useAggregated); + //3天矿池理论报块数 + BigDecimal throreticalBlocks= getTheoreticalBlocks("dgbs",PoolUnits.DGBS.gethRate(),start3d, end, blockData); + + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"dgbs",3); + //3天幸运值 + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + //7天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); + + blockData = blockDataContext.getBlockData("dgbs",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbs",PoolUnits.MONA.gethRate(),start7d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"dgbs",7); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + //30天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); + + blockData = blockDataContext.getBlockData("dgbs",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbs",PoolUnits.MONA.gethRate(),start30d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"dgbs",30); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } + + //90天幸运值 + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); + + blockData = blockDataContext.getBlockData("dgbs",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("dgbs",PoolUnits.MONA.gethRate(),start90d, end, blockData); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"dgbs",90); + if(!BigDecimal.ZERO.equals(throreticalBlocks)){ + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); + } redisService.deleteObject("DGBSLuck"); redisService.setCacheObject("DGBSLuck",dto); + log.info("DGBS幸运值入库完成---幸运值3天:{},幸运值7天:{},幸运值30天:{},幸运值90天:{},", + dto.getLuck3d(),dto.getLuck7d(),dto.getLuck30d(),dto.getLuck90d()); } @Scheduled(cron = "19 1,3,13,31,33,43 * * * ?") @@ -3384,12 +2897,12 @@ public class DataTask { } - //@Scheduled(cron = "30 2,7 0,12 * * ?") - @Scheduled(cron = "39 2,5 0 * * ?") + @Scheduled(cron = "39 3 0/1 * * ?") + //@Scheduled(cron = "0 0/2 * * * ?") public void RXDLuckyDataToDB(){ log.info("rxd幸运值---定时任务开始"); LuckDto dto = new LuckDto(); - Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD)); + Date end = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS)); //幸运值 = 矿池实际报块/矿池理论报块 //矿池实际报块 = 数据库查询表名为币名_pool_blkstats //矿池理论报块 = (矿池过去N段时间的平均算力 / 全网过去N段时间平均算力) * 全网过去N段时间实际报块 @@ -3403,7 +2916,7 @@ public class DataTask { List blockPerDays = poolMapper.selectNetBlock("rxd_net_block"); - boolean useAggregated = blockPerDays.size() >= 3; + boolean useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start3d); //获取3天内全网的实际报块数 BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("rxd",start3d, end,blockPerDays, useAggregated); @@ -3411,38 +2924,38 @@ public class DataTask { BigDecimal throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start3d, end, blockData); //3天矿池实际报块数 - int actualBlocks = poolMapper.selectPoolBlock(3); + int actualBlocks = poolMapper.selectPoolBlock(start3d, end,"rxd",3); //3天幸运值 if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //7天幸运值 - useAggregated = blockPerDays.size() >= 7; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("rxd",start7d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start7d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(7); + actualBlocks = poolMapper.selectPoolBlock(start7d, end,"rxd",7); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //30天幸运值 - useAggregated = blockPerDays.size() >= 30; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start30d); blockData = blockDataContext.getBlockData("rxd",start30d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start30d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(30); + actualBlocks = poolMapper.selectPoolBlock(start30d, end,"rxd",30); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } //90天幸运值 - useAggregated = blockPerDays.size() >= 90; + useAggregated = blockPerDays.get(blockPerDays.size()-1).getDate().before(start7d); blockData = blockDataContext.getBlockData("rxd",start90d, end,blockPerDays, useAggregated); throreticalBlocks= getTheoreticalBlocks("rxd",PoolUnits.RXD.gethRate(),start90d, end, blockData); - actualBlocks = poolMapper.selectPoolBlock(90); + actualBlocks = poolMapper.selectPoolBlock(start90d, end,"rxd",90); if(!BigDecimal.ZERO.equals(throreticalBlocks)){ - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,4, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).multiply(BigDecimal.valueOf(100)).divide(throreticalBlocks,2, RoundingMode.HALF_UP).doubleValue()); } redisService.deleteObject("RXDLuck"); redisService.setCacheObject("RXDLuck",dto); 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 9d3046c..0faf96e 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 @@ -491,7 +491,7 @@ public class NodeTask { /** * 全网报块高度入库 */ - @Scheduled(cron = "0 0 0 * * ?") + @Scheduled(cron = "0 2 0/1 * * ?") @Async("customTaskThreadPool") public void insertNetBlock(){ insertBlockWithRetry("nexa", "nexa_net_block", 10); diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/PowerUnitUtils.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/PowerUnitUtils.java index 047dc1a..224c35a 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/PowerUnitUtils.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/PowerUnitUtils.java @@ -65,7 +65,11 @@ public class PowerUnitUtils { if(StringUtils.isNull(value)){ return "0"; } - if (value.compareTo(BigDecimal.valueOf(1000*1000*1000)) >= 0){ + if(value.compareTo(BigDecimal.valueOf(1000L * 1000L * 1000L * 1000L * 1000L)) >= 0){ + return value.divide(BigDecimal.valueOf(1000L * 1000L * 1000L * 1000L * 1000L),4,BigDecimal.ROUND_HALF_UP).toEngineeringString()+"P"; + }else if(value.compareTo(BigDecimal.valueOf(1000L * 1000L * 1000L * 1000L)) >= 0){ + return value.divide(BigDecimal.valueOf(1000L * 1000L * 1000L * 1000L),4,BigDecimal.ROUND_HALF_UP).toEngineeringString()+"T"; + } else if (value.compareTo(BigDecimal.valueOf(1000*1000*1000)) >= 0){ return value.divide(BigDecimal.valueOf(1000*1000*1000),2,BigDecimal.ROUND_HALF_UP).toEngineeringString()+"G"; }else if (value.compareTo(BigDecimal.valueOf(1000*1000)) >= 0){ return value.divide(BigDecimal.valueOf(1000*1000),2,BigDecimal.ROUND_HALF_UP).toEngineeringString()+"M"; 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 ac557e3..b69ce17 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 @@ -886,18 +886,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into ${tableName} (`height`) values(#{height}) ON DUPLICATE KEY UPDATE `height` = VALUES(`height`)