diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/context/BlockDataContext.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/context/BlockDataContext.java index cf3e213..a270cc6 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/context/BlockDataContext.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/context/BlockDataContext.java @@ -22,8 +22,8 @@ public class BlockDataContext { @Resource private DetailedBlockDataV2Strategy detailedBlockDataV2Strategy; - public BlockTimeAndNumberDto getBlockData(Date start, Date end, List blockPerDays, boolean useAggregated) { - return useAggregated ? detailedBlockDataV2Strategy.getTotalBlocks(start, end,blockPerDays) - : detailedBlockDataV1Strategy.getTotalBlocks(start, end,blockPerDays) ; + public BlockTimeAndNumberDto getBlockData(String coin,Date start, Date end, List blockPerDays, boolean useAggregated) { + return useAggregated ? detailedBlockDataV2Strategy.getTotalBlocks(coin,start, end,blockPerDays) + : detailedBlockDataV1Strategy.getTotalBlocks(coin,start, end,blockPerDays) ; } } diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/PoolCalParamConfig.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/PoolCalParamConfig.java index 79c2df6..d37a313 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/PoolCalParamConfig.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/PoolCalParamConfig.java @@ -56,4 +56,19 @@ public enum PoolCalParamConfig { public BigDecimal getPoolFees() { return poolFees; } + + + /** + * 根据 coin 名称获取对应的全网每日出块数 + * @param coin 币种名称(如 "grs", "nexa") + * @return 对应的全网每日出块数 + */ + public static BigDecimal getCoinCount(String coin) { + for (PoolCalParamConfig config : PoolCalParamConfig.values()) { + if (config.getCoin().equalsIgnoreCase(coin)) { + return config.getCount(); + } + } + return BigDecimal.ZERO; + } } 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 128e626..8e8e529 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 @@ -11,6 +11,8 @@ import java.math.RoundingMode; import java.util.Date; import java.util.List; +import static com.m2pool.pool.enums.PoolCalParamConfig.getCoinCount; + /** * 旧版 * 用于获取矿池实际报块一段时间内总数 @@ -24,26 +26,25 @@ public class DetailedBlockDataV1Strategy implements PoolBlockDataStrategy { @Override - public BlockTimeAndNumberDto getTotalBlocks(Date start, Date end,List blockPerDays ) { + public BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end,List blockPerDays ) { if (blockPerDays.isEmpty()){ return BlockTimeAndNumberDto.builder().dateLength(BigDecimal.ZERO).height(0).build(); } - - long count = blockPerDays.stream() - .filter(e -> (e.getDate().before(end))) - .filter(e -> (e.getDate().after(start) || e.getDate().equals(start))) - .count(); - - //每日出块数固定的舍弃 -// BigDecimal nexaCount = PoolCalParamConfig.NEXA.getCount(); + //每日出块数固定的出块数 + BigDecimal nexaCount = getCoinCount(coin); long diffInMillis = end.getTime() - start.getTime(); BigDecimal dateLength2 = BigDecimal.valueOf(diffInMillis).divide(BigDecimal.valueOf(86400000), 0, RoundingMode.HALF_UP); Date poolStart = blockPerDays.get(blockPerDays.size() - 1).getDate(); + //获取时间段内全网的实际报块数 + int height = dateLength2.multiply(nexaCount).intValue(); //天数不足时,以实际天数计算 if(poolStart.after(start)){ - dateLength2 = dateLength2.subtract(BigDecimal.valueOf(poolStart.getTime() - start.getTime()).divide(BigDecimal.valueOf(86400000), 2, BigDecimal.ROUND_HALF_UP)); + dateLength2 = dateLength2 + .subtract(BigDecimal.valueOf(poolStart.getTime() - start.getTime()) + .divide(BigDecimal.valueOf(86400000), 2, RoundingMode.HALF_UP)); + height = dateLength2.multiply(nexaCount).intValue(); } - return BlockTimeAndNumberDto.builder().dateLength(dateLength2).height((int) count).build(); + return BlockTimeAndNumberDto.builder().dateLength(dateLength2).height(height).build(); } } 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 b82628d..3557e7a 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 @@ -23,7 +23,7 @@ public class DetailedBlockDataV2Strategy implements PoolBlockDataStrategy { private PoolMapper poolMapper; @Override - public BlockTimeAndNumberDto getTotalBlocks(Date start, Date end, List blockPerDays) { + public BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end, List blockPerDays) { List collect = blockPerDays.stream() .filter(e -> (e.getDate().before(end))) .filter(e -> (e.getDate().after(start) || e.getDate().equals(start))) diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/PoolBlockDataStrategy.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/PoolBlockDataStrategy.java index bcfa0b7..d482afb 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/PoolBlockDataStrategy.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/PoolBlockDataStrategy.java @@ -14,9 +14,10 @@ public interface PoolBlockDataStrategy { /** * 获取矿池区块数 计算幸运值 + * @param coin 币种名 * @param start 查询开始时间 * @param end 查询结束时间(当前系统时间) * @return */ - BlockTimeAndNumberDto getTotalBlocks(Date start, Date end, List blockPerDays); + BlockTimeAndNumberDto getTotalBlocks(String coin,Date start, Date end, List blockPerDays); } 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 07d2c78..d5d119c 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 @@ -416,45 +416,40 @@ public class DataTask { //获取全网实际90天内的报块数(v2) List blockPerDays = poolMapper.selectNetBlock("nexa_net_block"); - //获取矿池实际90天内的报块数(v1) - List list = poolMapper.getNEXABlockInfoList(); - boolean useAggregated = blockPerDays.size() >= 3; //获取3天内全网的实际报块数 - blockPerDays = useAggregated ? blockPerDays : list; - BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("nexa",start3d, end,blockPerDays, useAggregated); //3天矿池理论报块数 - BigDecimal dayChunk = getTheoreticalBlocks("nexa",start3d, end, blockData); - + BigDecimal throreticalBlocks = getTheoreticalBlocks("nexa",start3d, end, blockData); //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //7天幸运值 useAggregated = blockPerDays.size() >= 7; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("nexa",start7d, end, blockData); + + blockData = blockDataContext.getBlockData("nexa",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("nexa",start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //30天幸运值 useAggregated = blockPerDays.size() >= 30; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("nexa",start30d, end, blockData); + + blockData = blockDataContext.getBlockData("nexa",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("nexa",start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //90天幸运值 useAggregated = blockPerDays.size() >= 90; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("nexa",start90d, end, blockData); + + blockData = blockDataContext.getBlockData("nexa",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("nexa",start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); redisService.deleteObject("NEXALuck"); @@ -883,45 +878,39 @@ public class DataTask { //获取全网实际90天内的报块数(v2) List blockPerDays = poolMapper.selectNetBlock("grs_net_block"); - //获取矿池实际90天内的报块数(v1) - List list = poolMapper.getNEXABlockInfoList(); - boolean useAggregated = blockPerDays.size() >= 3; //获取3天内全网的实际报块数 - blockPerDays = useAggregated ? blockPerDays : list; - BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("grs",start3d, end,blockPerDays, useAggregated); //3天矿池理论报块数 - BigDecimal dayChunk = getTheoreticalBlocks("grs",start3d, end, blockData); - + BigDecimal throreticalBlocks= getTheoreticalBlocks("grs",start3d, end, blockData); //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //7天幸运值 useAggregated = blockPerDays.size() >= 7; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("grs",start7d, end, blockData); + + blockData = blockDataContext.getBlockData("grs",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("grs",start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //30天幸运值 useAggregated = blockPerDays.size() >= 30; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("grs",start30d, end, blockData); + + blockData = blockDataContext.getBlockData("grs",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("grs",start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //90天幸运值 useAggregated = blockPerDays.size() >= 90; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("grs",start90d, end, blockData); + blockData = blockDataContext.getBlockData("grs",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("grs",start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); @@ -1293,45 +1282,44 @@ public class DataTask { //获取全网实际90天内的报块数(v2) List blockPerDays = poolMapper.selectNetBlock("mona_net_block"); - //获取矿池实际90天内的报块数(v1) - List list = poolMapper.getNEXABlockInfoList(); + boolean useAggregated = blockPerDays.size() >= 3; //获取3天内全网的实际报块数 - blockPerDays = useAggregated ? blockPerDays : list; - BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("mona",start3d, end,blockPerDays, useAggregated); //3天矿池理论报块数 - BigDecimal dayChunk = getTheoreticalBlocks("mona",start3d, end, blockData); + BigDecimal throreticalBlocks= getTheoreticalBlocks("mona",start3d, end, blockData); //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //7天幸运值 useAggregated = blockPerDays.size() >= 7; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("mona",start7d, end, blockData); + + blockData = blockDataContext.getBlockData("mona",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("mona",start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //30天幸运值 useAggregated = blockPerDays.size() >= 30; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("nexa",start30d, end, blockData); + + blockData = blockDataContext.getBlockData("mona",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("nexa",start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //90天幸运值 useAggregated = blockPerDays.size() >= 90; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("mona",start90d, end, blockData); + + blockData = blockDataContext.getBlockData("mona",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("mona",start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); redisService.deleteObject("MONALuck"); redisService.setCacheObject("MONALuck",dto); @@ -3417,45 +3405,44 @@ public class DataTask { //获取全网实际90天内的报块数(v2) List blockPerDays = poolMapper.selectNetBlock("rxd_net_block"); - //获取矿池实际90天内的报块数(v1) - List list = poolMapper.getNEXABlockInfoList(); + boolean useAggregated = blockPerDays.size() >= 3; //获取3天内全网的实际报块数 - blockPerDays = useAggregated ? blockPerDays : list; - BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData("rxd",start3d, end,blockPerDays, useAggregated); //3天矿池理论报块数 - BigDecimal dayChunk = getTheoreticalBlocks("rxd",start3d, end, blockData); + BigDecimal throreticalBlocks= getTheoreticalBlocks("rxd",start3d, end, blockData); //3天矿池实际报块数 int actualBlocks = poolMapper.selectPoolBlock(3); //3天幸运值 - dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //7天幸运值 useAggregated = blockPerDays.size() >= 7; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start7d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("rxd",start7d, end, blockData); + + blockData = blockDataContext.getBlockData("rxd",start7d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("rxd",start7d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(7); - dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //30天幸运值 useAggregated = blockPerDays.size() >= 30; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start30d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("rxd",start30d, end, blockData); + + blockData = blockDataContext.getBlockData("rxd",start30d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("rxd",start30d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(30); - dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); //90天幸运值 useAggregated = blockPerDays.size() >= 90; - blockPerDays = useAggregated ? blockPerDays : list; - blockData = blockDataContext.getBlockData(start90d, end,blockPerDays, useAggregated); - dayChunk = getTheoreticalBlocks("rxd",start90d, end, blockData); + + blockData = blockDataContext.getBlockData("rxd",start90d, end,blockPerDays, useAggregated); + throreticalBlocks= getTheoreticalBlocks("rxd",start90d, end, blockData); actualBlocks = poolMapper.selectPoolBlock(90); - dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(throreticalBlocks,8, RoundingMode.HALF_UP).doubleValue()); redisService.deleteObject("RXDLuck"); redisService.setCacheObject("RXDLuck",dto);