update m2pool alph幸运值获取死循环问题修复

This commit is contained in:
yyb
2026-01-20 10:04:58 +08:00
parent b22d73dc1c
commit ad379bfa58

View File

@@ -3969,221 +3969,227 @@ public class DataTask {
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.ALPH.getCount();
//代码出错一次,time++防止死循环。目前获取alph 幸运值这个可能和enx一样不要了
try{
//幸运值
// N天出块= N天矿池平均算力/ N天全网平均算力 * 币种每日出块数 * N天 取同一时间点的矿池算力/全网算力
// 币种每日出块数 = 720 数值来源: 每日分钟数(24*60) / 出一个块需要的时间(根据具体币种 nexa是2分钟)
// N天实际出块量 数据库查询N天实际出块量
// N天幸运值 = N天实际出块量 / N天应出块量 * 100 结果即百分比数字%
/** 全网每日出块数 */
BigDecimal nexaCount = PoolCalParamConfig.ALPH.getCount();
//计算矿池每日实际应出块数 block中算力单位是H/s
int hRate = PoolUnits.ALPH.gethRate();
//先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数
List<DateBigDecimalDto> netPowerList = poolMapper.getDailyNetPower("alph");
if(netPowerList.size() < 1){
continue;
//计算矿池每日实际应出块数 block中算力单位是H/s
int hRate = PoolUnits.ALPH.gethRate();
//先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数
List<DateBigDecimalDto> netPowerList = poolMapper.getDailyNetPower("alph");
if(netPowerList.size() < 1){
continue;
}
List<DateBigDecimalDto> poolPowerList = poolMapper.getDailyPoolPower("alph");
//拿报块list 筛选实际出块数
List<BlockInfoDto> list = poolMapper.getNEXABlockInfoList();
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());
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());
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;
}catch (Exception e){
time++;
}
List<DateBigDecimalDto> poolPowerList = poolMapper.getDailyPoolPower("alph");
//拿报块list 筛选实际出块数
List<BlockInfoDto> list = poolMapper.getNEXABlockInfoList();
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());
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());
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);
redisService.deleteObject("ALPHLuck");