From 35653962525f24f12e7796b3456e2f7e506a9a54 Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Wed, 7 May 2025 16:33:27 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=85=A8=E7=BD=91=E7=AE=97=E5=8A=9B?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E5=B9=B8=E8=BF=90=E5=80=BC=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m2pool/pool/config/ThreadPoolConfig.java | 31 + .../m2pool/pool/context/BlockDataContext.java | 29 + .../pool/controller/NoticeController.java | 9 +- .../pool/dto/BlockTimeAndNumberDto.java | 23 + .../java/com/m2pool/pool/enums/Pools.java | 38 +- .../com/m2pool/pool/mapper/PoolMapper.java | 25 + .../pool/service/impl/PoolServiceImpl.java | 43 +- .../strategy/DetailedBlockDataV1Strategy.java | 49 + .../strategy/DetailedBlockDataV2Strategy.java | 43 + .../pool/strategy/PoolBlockDataStrategy.java | 22 + .../java/com/m2pool/pool/task/DataTask.java | 1116 ++++------------- .../java/com/m2pool/pool/task/NodeTask.java | 45 +- .../java/com/m2pool/pool/utils/NodeRpc.java | 9 +- .../src/main/resources/bootstrap-prod.yml | 74 ++ .../src/main/resources/bootstrap-test.yml | 74 ++ .../src/main/resources/bootstrap.yml | 154 +-- .../main/resources/mapper/pool/PoolMapper.xml | 12 + 17 files changed, 743 insertions(+), 1053 deletions(-) create mode 100644 m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/config/ThreadPoolConfig.java create mode 100644 m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/context/BlockDataContext.java create mode 100644 m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/dto/BlockTimeAndNumberDto.java create mode 100644 m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV1Strategy.java create mode 100644 m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV2Strategy.java create mode 100644 m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/PoolBlockDataStrategy.java create mode 100644 m2pool-modules/m2pool-pool/src/main/resources/bootstrap-prod.yml create mode 100644 m2pool-modules/m2pool-pool/src/main/resources/bootstrap-test.yml diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/config/ThreadPoolConfig.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/config/ThreadPoolConfig.java new file mode 100644 index 0000000..3bb2bb3 --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/config/ThreadPoolConfig.java @@ -0,0 +1,31 @@ +package com.m2pool.pool.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +public class ThreadPoolConfig { + + @Bean(name = "customTaskThreadPool") + public ThreadPoolTaskExecutor customTaskThreadPool() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + // 核心线程数 + executor.setCorePoolSize(5); + // 最大线程数 + executor.setMaxPoolSize(10); + // 队列容量 + executor.setQueueCapacity(50); + // 线程空闲时间(秒) + executor.setKeepAliveSeconds(30); + // 线程名前缀 + executor.setThreadNamePrefix("custom-task-thread-"); + // 拒绝策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 初始化 + executor.initialize(); + return executor; + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..cf3e213 --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/context/BlockDataContext.java @@ -0,0 +1,29 @@ +package com.m2pool.pool.context; + +import com.m2pool.pool.dto.BlockInfoDto; +import com.m2pool.pool.dto.BlockTimeAndNumberDto; +import com.m2pool.pool.strategy.DetailedBlockDataV1Strategy; +import com.m2pool.pool.strategy.DetailedBlockDataV2Strategy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * 获取矿池报块数 策略上下文 + */ +@Service +public class BlockDataContext { + + @Resource + private DetailedBlockDataV1Strategy detailedBlockDataV1Strategy; + + @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) ; + } +} diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/controller/NoticeController.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/controller/NoticeController.java index d67d508..75f6f76 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/controller/NoticeController.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/controller/NoticeController.java @@ -7,11 +7,14 @@ import com.m2pool.common.core.web.page.TableDataInfo; import com.m2pool.common.security.annotation.RequiresLogin; import com.m2pool.pool.dto.NoticeListDto; import com.m2pool.pool.service.NoticeService; -import com.m2pool.pool.vo.*; +import com.m2pool.pool.vo.NoticeAddVo; +import com.m2pool.pool.vo.NoticeDelVo; +import com.m2pool.pool.vo.NoticePageVo; +import com.m2pool.pool.vo.NoticeUpdateVo; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.List; /** @@ -23,7 +26,7 @@ import java.util.List; @RequestMapping("/notice") public class NoticeController extends BaseController { - @Autowired + @Resource private NoticeService noticeService; diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/dto/BlockTimeAndNumberDto.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/dto/BlockTimeAndNumberDto.java new file mode 100644 index 0000000..87df142 --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/dto/BlockTimeAndNumberDto.java @@ -0,0 +1,23 @@ +package com.m2pool.pool.dto; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @ClassName BlockTimeAndNumberDto + * @Description 报块数和时间范围返回对象 + * @Author yyb + * @Date 2025/5/7 11:26 + */ +@Data +@Builder +public class BlockTimeAndNumberDto { + /** 区块高度 */ + private int height; + + /** 报块时间 */ + private BigDecimal dateLength; + +} diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/Pools.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/Pools.java index 12b1e42..f0f671f 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/Pools.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/enums/Pools.java @@ -7,19 +7,19 @@ package com.m2pool.pool.enums; */ public enum Pools { - GRS("grs", "grs", "groestl", "grs_pool_blkstats", "grs_mhs", "grs_pool","grs.svg",0.985), - MONA("mona", "mona", "Lyra2REv2", "mona_pool_blkstats", "mona_mhs", "mona_pool","mona.svg",0.985), - DGBS("dgbs", "dgb(skein)", "DigiByte(Skein)", "dgbs_pool_blkstats", "dgbs_mhs", "dgbs_pool","dgb.svg",0.985), - DGBQ("dgbq", "dgb(qubit)", "DigiByte(Qubit)", "dgbq_pool_blkstats", "dgbq_mhs", "dgbq_pool","dgb.svg",0.985), - DGBO("dgbo", "dgb(odocrypt)", "DigiByte(Odocrypt)", "dgbo_pool_blkstats", "dgbo_mhs", "dgbo_pool","dgb.svg",0.985), + GRS("grs", "grs", "groestl", "grs_pool_blkstats", "grs_mhs", "grs_pool","grs.svg",0.985,60), + MONA("mona", "mona", "Lyra2REv2", "mona_pool_blkstats", "mona_mhs", "mona_pool","mona.svg",0.985,90), + DGBS("dgbs", "dgb(skein)", "DigiByte(Skein)", "dgbs_pool_blkstats", "dgbs_mhs", "dgbs_pool","dgb.svg",0.985,0), + DGBQ("dgbq", "dgb(qubit)", "DigiByte(Qubit)", "dgbq_pool_blkstats", "dgbq_mhs", "dgbq_pool","dgb.svg",0.985,0), + DGBO("dgbo", "dgb(odocrypt)", "DigiByte(Odocrypt)", "dgbo_pool_blkstats", "dgbo_mhs", "dgbo_pool","dgb.svg",0.985,0), //DGB2_ODO("dgb2_odo", "dgb-odocrypt-pool2", "odocrypt", "dgb2_odo_pool_blkstats", "dgb2_odo_miners", "dgb2_odo_pool"), - DGB_QUBIT_A10("dgb_qubit_a10", "dgb-qubit-pool2", "qubit", "dgb_qubit_a10_pool_blkstats", "dgb_qubit_a10_miners", "dgb_qubit_a10_pool","dgb.svg",0.985), - DGB_SKEIN_A10("dgb_skein_a10", "dgb-skein-pool2", "skein", "dgb_skein_a10_pool_blkstats", "dgb_skein_a10_miners", "dgb_skein_a10_pool","dgb.svg",0.985), - DGB_ODO_B20("dgb_odo_b20", "dgb-odoscrypt-pool3", "odocrypt", "dgb_odo_b20_pool_blkstats", "dgb_odo_b20_miners", "dgb_odo_b20_pool","dgb.svg",0.985), - NEXA("nexa", "nexa", "NexaPow", "nexa_pool_blkstats", "nexa_mhs", "nexa_pool","nexa.png",0.985), - RXD("rxd", "Radiant", "Sha512256D", "rxd_pool_blkstats", "rxd_mhs", "rxd_pool","rxd.png",0.985), - ALPH("alph", "Alephium", "Blake3", "alph_pool_blkstats", "alph_mhs", "alph_pool","alph.svg",0.985), - ENX("enx", "entropyx", "kHeavyHash", "enx_pool_blkstats", "enx_mhs", "enx_pool","enx.svg",0.985); + DGB_QUBIT_A10("dgb_qubit_a10", "dgb-qubit-pool2", "qubit", "dgb_qubit_a10_pool_blkstats", "dgb_qubit_a10_miners", "dgb_qubit_a10_pool","dgb.svg",0.985,15), + DGB_SKEIN_A10("dgb_skein_a10", "dgb-skein-pool2", "skein", "dgb_skein_a10_pool_blkstats", "dgb_skein_a10_miners", "dgb_skein_a10_pool","dgb.svg",0.985,15), + DGB_ODO_B20("dgb_odo_b20", "dgb-odoscrypt-pool3", "odocrypt", "dgb_odo_b20_pool_blkstats", "dgb_odo_b20_miners", "dgb_odo_b20_pool","dgb.svg",0.985,15), + NEXA("nexa", "nexa", "NexaPow", "nexa_pool_blkstats", "nexa_mhs", "nexa_pool","nexa.png",0.985,120), + RXD("rxd", "Radiant", "Sha512256D", "rxd_pool_blkstats", "rxd_mhs", "rxd_pool","rxd.png",0.985,300), + ALPH("alph", "Alephium", "Blake3", "alph_pool_blkstats", "alph_mhs", "alph_pool","alph.svg",0.985,0), + ENX("enx", "entropyx", "kHeavyHash", "enx_pool_blkstats", "enx_mhs", "enx_pool","enx.svg",0.985,0); /** 币种参数名 */ @@ -39,7 +39,12 @@ public enum Pools { private final double fac; - Pools(String coin, String name, String algorithm, String blkTable, String mhs, String poolTable,String img,double fac) { + /** + * 阻塞时间 + */ + private final long blockTime; + + Pools(String coin, String name, String algorithm, String blkTable, String mhs, String poolTable, String img, double fac, long blockTime) { this.coin = coin; this.name = name; this.algorithm = algorithm; @@ -48,8 +53,11 @@ public enum Pools { this.poolTable = poolTable; this.img = img; this.fac = fac; + this.blockTime = blockTime; } + + public String getCoin() { return coin; } @@ -101,4 +109,8 @@ public enum Pools { } return ""; } + + public long getBlockTime() { + return blockTime; + } } 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 02a8500..5bfa88e 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 @@ -173,4 +173,29 @@ public interface PoolMapper { //todo 分配数据入库 目的:整合主库分库 public List getOfflineList(@Param("table") String table, @Param("date") String date); + + /** + * 插入全网报块数 + * @param tableName + * @param height + * @return + */ + public boolean insertNetBlock(@Param("tableName") String tableName, @Param("height") Long height); + + /** + * 查询全网的报块数 + * @param tableName + * @return + */ + public List selectNetBlock(@Param("tableName") String tableName); + + + /** + * 查询矿池的有效宝库阿叔 + * @param reduce 多少天以前 + * @return + */ + @DistributionDB + public int selectPoolBlock(@Param("reduce")int reduce); + } diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/service/impl/PoolServiceImpl.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/service/impl/PoolServiceImpl.java index b2b7be7..fc8a3ea 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/service/impl/PoolServiceImpl.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/service/impl/PoolServiceImpl.java @@ -1,21 +1,17 @@ package com.m2pool.pool.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.github.pagehelper.PageHelper; import com.m2pool.common.core.text.Convert; import com.m2pool.common.core.utils.DateUtils; -import com.m2pool.common.core.utils.OpenApiJwtUtils; import com.m2pool.common.core.utils.StringUtils; import com.m2pool.common.core.web.Result.AjaxResult; import com.m2pool.common.datasource.annotation.UserDB; import com.m2pool.common.redis.service.RedisService; -import com.m2pool.common.security.utils.SecurityUtils; import com.m2pool.pool.dto.*; import com.m2pool.pool.entity.BlockInfo; -import com.m2pool.pool.entity.OpenApiKey; import com.m2pool.pool.enums.*; import com.m2pool.pool.mapper.PoolMapper; import com.m2pool.pool.mapper.UserAccountMapper; @@ -26,8 +22,6 @@ import com.m2pool.pool.utils.PowerUnitUtils; import com.m2pool.pool.vo.BalanceListGetVo; import com.m2pool.pool.vo.CoinVo; import com.m2pool.pool.vo.MinerAccountAddVo; - -import com.m2pool.pool.vo.TestVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -86,25 +80,32 @@ public class PoolServiceImpl implements PoolService { //从redis中拿币种当前高度、全网算力、全网难度 BlockInfo info = redisService.getCacheObject(pool.getCoin() + "_block"); if(StringUtils.isNotNull(info)){ - //System.out.println("info:"+info); - //高度 - dto.setHeight(info.getHeight()); +// //System.out.println("info:"+info); +// //高度 +// dto.setHeight(info.getHeight()); +// +// //全网难度 +// dto.setTotalDifficulty(PowerUnitUtils.difficultyFormat(info.getDifficulty())); +// Date now = new Date(); +// int minute = (now.getMinutes() / 30) * 30; +// now.setMinutes( minute); +// now.setSeconds(0); +// Calendar ca = new GregorianCalendar(); +// ca.setTime(now); +// ca.add(ca.DATE,-1); +// String start = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, ca.getTime()); +// BigDecimal netPower = poolMapper.getAvgNetPower(pool.getCoin(), start); - //全网难度 dto.setTotalDifficulty(PowerUnitUtils.difficultyFormat(info.getDifficulty())); - Date now = new Date(); - int minute = (now.getMinutes() / 30) * 30; - now.setMinutes( minute); - now.setSeconds(0); - Calendar ca = new GregorianCalendar(); - ca.setTime(now); - ca.add(ca.DATE,-1); - String start = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, ca.getTime()); - BigDecimal netPower = poolMapper.getAvgNetPower(pool.getCoin(), start); + + BigDecimal netPower; + if(pool.getBlockTime() != 0){ + netPower = BigDecimal.valueOf(info.getDifficulty().longValue() * 2 ^ 32 / pool.getBlockTime()); + }else{ + netPower = info.getPower(); + } //全网算力 调用转换工具 动态转换为数值+单位 dto.setTotalPower(PowerUnitUtils.powerFormat(netPower,pool.getCoin())); - - //System.out.println("dto"+dto); }else { System.out.println("未能从节点获取到信息"); 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 new file mode 100644 index 0000000..128e626 --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV1Strategy.java @@ -0,0 +1,49 @@ +package com.m2pool.pool.strategy; + +import com.m2pool.pool.dto.BlockInfoDto; +import com.m2pool.pool.dto.BlockTimeAndNumberDto; +import com.m2pool.pool.mapper.PoolMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; +import java.util.List; + +/** + * 旧版 + * 用于获取矿池实际报块一段时间内总数 + * 可能存在无效区块 + */ +@Component +public class DetailedBlockDataV1Strategy implements PoolBlockDataStrategy { + + @Resource + private PoolMapper poolMapper; + + + @Override + public BlockTimeAndNumberDto getTotalBlocks(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(); + 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(); + //天数不足时,以实际天数计算 + if(poolStart.after(start)){ + dateLength2 = dateLength2.subtract(BigDecimal.valueOf(poolStart.getTime() - start.getTime()).divide(BigDecimal.valueOf(86400000), 2, BigDecimal.ROUND_HALF_UP)); + } + return BlockTimeAndNumberDto.builder().dateLength(dateLength2).height((int) count).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 new file mode 100644 index 0000000..b82628d --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/DetailedBlockDataV2Strategy.java @@ -0,0 +1,43 @@ +package com.m2pool.pool.strategy; + +import com.m2pool.pool.dto.BlockInfoDto; +import com.m2pool.pool.dto.BlockTimeAndNumberDto; +import com.m2pool.pool.mapper.PoolMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * v2版 + * 用于获取矿池实际报块一段时间内总数 + * 解决了无效区块数的问题 + */ +@Component +public class DetailedBlockDataV2Strategy implements PoolBlockDataStrategy { + + @Autowired + private PoolMapper poolMapper; + + @Override + public BlockTimeAndNumberDto getTotalBlocks(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))) + .collect(Collectors.toList()); + + if (collect.isEmpty()){ + return BlockTimeAndNumberDto.builder().dateLength(BigDecimal.ZERO).height(0).build(); + } + if (collect.size() == 1){ + return BlockTimeAndNumberDto.builder().dateLength(BigDecimal.ZERO).height(collect.get(0).getHeight()).build(); + } + return BlockTimeAndNumberDto.builder() + .dateLength(BigDecimal.valueOf(collect.size())) + .height(collect.get(collect.size() - 1).getHeight()- collect.get(0).getHeight()).build(); + + } +} 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 new file mode 100644 index 0000000..bcfa0b7 --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/strategy/PoolBlockDataStrategy.java @@ -0,0 +1,22 @@ +package com.m2pool.pool.strategy; + +import com.m2pool.pool.dto.BlockInfoDto; +import com.m2pool.pool.dto.BlockTimeAndNumberDto; + +import java.util.Date; +import java.util.List; + +/** + * 幸运值策略接口 v1 版本 + * 获取的矿池区块数可能存在无效区块 + */ +public interface PoolBlockDataStrategy { + + /** + * 获取矿池区块数 计算幸运值 + * @param start 查询开始时间 + * @param end 查询结束时间(当前系统时间) + * @return + */ + BlockTimeAndNumberDto getTotalBlocks(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 a47051f..07d2c78 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 @@ -4,12 +4,15 @@ import com.m2pool.common.core.text.Convert; import com.m2pool.common.core.utils.DateUtils; import com.m2pool.common.core.utils.StringUtils; import com.m2pool.common.redis.service.RedisService; +import com.m2pool.pool.context.BlockDataContext; import com.m2pool.pool.dto.*; import com.m2pool.pool.entity.PoolPower; import com.m2pool.pool.enums.PoolCalParamConfig; import com.m2pool.pool.enums.PoolUnits; import com.m2pool.pool.enums.Pools; import com.m2pool.pool.mapper.PoolMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -17,6 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.Function; @@ -38,6 +42,11 @@ public class DataTask { @Autowired private RedisService redisService; + @Autowired + private BlockDataContext blockDataContext; + + private static final Logger log = LoggerFactory.getLogger(DataTask.class); + @Scheduled(cron = "20 1,3,10,31,33,40 * * * ?") public void NEXA30mDataToDB(){ @@ -393,229 +402,120 @@ public class DataTask { //@Scheduled(cron = "30 2,7 0,12 * * ?") @Scheduled(cron = "30 2,5 0/12 * * ?") public void NEXALuckyDataToDB(){ - int time = 0; + log.info("nexa幸运值---延时任务开始"); 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.NEXA.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.NEXA.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("nexa"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("nexa"); - - //拿报块list 筛选实际出块数 - List 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()); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_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("nexa_net_block"); + //获取矿池实际90天内的报块数(v1) + List list = poolMapper.getNEXABlockInfoList(); - 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()); + boolean useAggregated = blockPerDays.size() >= 3; + //获取3天内全网的实际报块数 + blockPerDays = useAggregated ? blockPerDays : list; + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + //3天矿池理论报块数 + BigDecimal dayChunk = getTheoreticalBlocks("nexa",start3d, end, blockData); + + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(3); + //3天幸运值 + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(7); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(30); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(90); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); - break; - }while (time < 4); redisService.deleteObject("NEXALuck"); redisService.setCacheObject("NEXALuck",dto); + log.info("nexa幸运值入库完成"); + } + + + /** + * 币种 理论出块数 + * @param coin 币种名 + * @param start 开始时间 + * @param end 结束时间(当前时间) + * @param blockData + * @return + */ + public BigDecimal getTheoreticalBlocks(String coin,Date start,Date end,BlockTimeAndNumberDto blockData){ + + //得到每一个小时定时任务存储到数据库的全网算力 + List netPowerList = poolMapper.getDailyNetPower(coin); + if(netPowerList.isEmpty()){ + return BigDecimal.ZERO; + } + //得时间段到矿池的算力 + List poolPowerList = poolMapper.getDailyPoolPower(coin); + //A:矿池3天总算力 + //计算矿池每日实际应出块数 block中算力单位是H/s + int hRate = PoolUnits.NEXA.gethRate(); + BigDecimal pPow3d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))) + .map(DateBigDecimalDto::getValue).reduce(BigDecimal.ZERO, BigDecimal::add) + .multiply(BigDecimal.valueOf(hRate)); + //作为A的除数,得到3天内的矿池平均算力 + long pDay3d = poolPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))).count(); + + //B:3天全网算力 + BigDecimal nPow3d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))) + .map(DateBigDecimalDto::getValue).reduce(BigDecimal.ZERO, BigDecimal::add); + + //作为B的除数,得到3天内的全网平均算力 + long nDay3d = netPowerList.stream() + .filter(e -> (e.getPDate().before(end))) + .filter(e -> (e.getPDate().after(start) || e.getPDate().equals(start))).count(); + + if(pDay3d == 0 || nDay3d == 0){ + return BigDecimal.ZERO; + } + + return pPow3d + .divide(BigDecimal.valueOf(pDay3d),8, RoundingMode.HALF_UP) + .divide(nPow3d,8, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(nDay3d)) + .multiply(BigDecimal.valueOf(blockData.getHeight())) + .multiply(blockData.getDateLength()) + .setScale(8, RoundingMode.HALF_UP); + } @Scheduled(cron = "11 1,3,11,31,33,41 * * * ?") @@ -969,230 +869,65 @@ public class DataTask { //@Scheduled(cron = "30 2,7 0,12 * * ?") @Scheduled(cron = "31 2,5 0/12 * * ?") public void GRSLuckyDataToDB(){ - int time = 0; + log.info("GRS幸运值---定时任务开始"); 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.GRS.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.GRS.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("grs"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("grs"); - - //拿报块list 筛选实际出块数 - //List list = poolMapper.getNEXABlockInfoList(); - List list = poolMapper.getGRSBlockInfoList(); - - 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()); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_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("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); + //3天矿池理论报块数 + BigDecimal dayChunk = getTheoreticalBlocks("grs",start3d, end, blockData); + + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(3); + //3天幸运值 + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(7); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(30); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(90); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).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("GRSLuck"); redisService.setCacheObject("GRSLuck",dto); + log.info("grs幸运值入库完成"); } @Scheduled(cron = "12 1,3,12,31,33,42 * * * ?") @@ -1545,227 +1280,58 @@ public class DataTask { //@Scheduled(cron = "30 2,7 0,12 * * ?") @Scheduled(cron = "32 2,5 0/12 * * ?") public void MONALuckyDataToDB(){ - int time = 0; 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.MONA.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.MONA.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("mona"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("mona"); - - //拿报块list 筛选实际出块数 - //List list = poolMapper.getNEXABlockInfoList(); - List list = poolMapper.getMonaBlockInfoList(); - - 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()); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_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("mona_net_block"); + //获取矿池实际90天内的报块数(v1) + List list = poolMapper.getNEXABlockInfoList(); - 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()); + boolean useAggregated = blockPerDays.size() >= 3; + //获取3天内全网的实际报块数 + blockPerDays = useAggregated ? blockPerDays : list; + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + //3天矿池理论报块数 + BigDecimal dayChunk = getTheoreticalBlocks("mona",start3d, end, blockData); - break; - }while (time < 4); + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(3); + //3天幸运值 + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(7); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(30); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(90); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); redisService.deleteObject("MONALuck"); redisService.setCacheObject("MONALuck",dto); @@ -3837,229 +3403,63 @@ public class DataTask { //@Scheduled(cron = "30 2,7 0,12 * * ?") @Scheduled(cron = "39 2,5 0/12 * * ?") public void RXDLuckyDataToDB(){ - int time = 0; + log.info("rxd幸运值---定时任务开启"); 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 rxdCount = PoolCalParamConfig.RXD.getCount(); - - //计算矿池每日实际应出块数 block中算力单位是H/s - int hRate = PoolUnits.RXD.gethRate(); - //先把矿池算力单位转换为H/s 再除以全网算力 得到比值 再乘以每日全网出块数 得到矿池每日应出块数 - List netPowerList = poolMapper.getDailyNetPower("rxd"); - if(netPowerList.size() < 1){ - continue; - } - - List poolPowerList = poolMapper.getDailyPoolPower("rxd"); - - //拿报块list 筛选实际出块数 - List list = poolMapper.getRXDBlockInfoList(); - - 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(rxdCount) - .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(rxdCount) - .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(rxdCount) - .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(rxdCount) - .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()); + //幸运值 = 矿池实际报块/矿池理论报块 + //矿池实际报块 = 数据库查询表名为币名_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("rxd_net_block"); + //获取矿池实际90天内的报块数(v1) + List list = poolMapper.getNEXABlockInfoList(); - 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()); + boolean useAggregated = blockPerDays.size() >= 3; + //获取3天内全网的实际报块数 + blockPerDays = useAggregated ? blockPerDays : list; + BlockTimeAndNumberDto blockData = blockDataContext.getBlockData(start3d, end,blockPerDays, useAggregated); + //3天矿池理论报块数 + BigDecimal dayChunk = getTheoreticalBlocks("rxd",start3d, end, blockData); - break; - }while (time < 4); + //3天矿池实际报块数 + int actualBlocks = poolMapper.selectPoolBlock(3); + //3天幸运值 + dto.setLuck3d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(7); + dto.setLuck7d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(30); + dto.setLuck30d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,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); + actualBlocks = poolMapper.selectPoolBlock(90); + dto.setLuck90d(BigDecimal.valueOf(actualBlocks).divide(dayChunk,8, RoundingMode.HALF_UP).doubleValue()); redisService.deleteObject("RXDLuck"); redisService.setCacheObject("RXDLuck",dto); + log.info("rxd幸运值入库完成"); } @Scheduled(cron = "21 1,3,13,31,33,43 * * * ?") diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/NodeTask.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/task/NodeTask.java index 52cdf74..eb44a0a 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 @@ -3,13 +3,15 @@ package com.m2pool.pool.task; import com.m2pool.common.core.utils.DateUtils; import com.m2pool.common.core.utils.StringUtils; import com.m2pool.common.redis.service.RedisService; - import com.m2pool.pool.entity.BlockInfo; import com.m2pool.pool.mapper.PoolMapper; import com.m2pool.pool.utils.NodeRpc; import com.m2pool.pool.vo.DateValueVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -25,6 +27,9 @@ import java.util.Map; @EnableScheduling public class NodeTask { + + private static final Logger log = LoggerFactory.getLogger(NodeTask.class); + @Autowired private PoolMapper poolMapper; @@ -481,4 +486,42 @@ public class NodeTask { } } + + + /** + * 全网报块高度入库 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Async("customTaskThreadPool") + public void insertNetBlock(){ + insertBlockWithRetry("nexa", "nexa_net_block", 10); + insertBlockWithRetry("dgbq", "dgbq_net_block", 10); + insertBlockWithRetry("dgbo", "dgbo_net_block", 10); + insertBlockWithRetry("dgbs", "dgbs_net_block", 10); + insertBlockWithRetry("mona", "mona_net_block", 10); + insertBlockWithRetry("rxd", "rxd_net_block", 10); + insertBlockWithRetry("grs", "grs_net_block", 10); + } + + private void insertBlockWithRetry(String blockName, String tableName, int maxRetries) { + int retryCount = 0; + while (retryCount < maxRetries) { + try { + BlockInfo block = NodeRpc.getBlock(blockName); + poolMapper.insertNetBlock(tableName, block.getHeight()); + return; + } catch (Exception e) { + retryCount++; + if (retryCount >= maxRetries) { + log.error("插入区块 {} 数据失败,重试 {} 次后仍失败", blockName, maxRetries, e); + throw e; + } + try { + Thread.sleep(500); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + } + } } diff --git a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/NodeRpc.java b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/NodeRpc.java index 77ff401..2332bbe 100644 --- a/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/NodeRpc.java +++ b/m2pool-modules/m2pool-pool/src/main/java/com/m2pool/pool/utils/NodeRpc.java @@ -3,11 +3,9 @@ package com.m2pool.pool.utils; import cn.hutool.core.io.IORuntimeException; import cn.hutool.http.HttpRequest; - import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A; import com.m2pool.common.core.text.Convert; import com.m2pool.common.core.utils.StringUtils; import com.m2pool.pool.entity.BlockInfo; @@ -16,7 +14,10 @@ import com.m2pool.pool.enums.NodeConstant; import org.apache.http.HttpHeaders; import java.math.BigDecimal; -import java.util.*; +import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @Description 节点调用 @@ -84,7 +85,7 @@ public class NodeRpc{ JSONObject requestBody = new JSONObject(); requestBody.put("jsonrpc", "1.0"); requestBody.put("id", "testnet"); - requestBody.put("method", method); + requestBody.put("method", method);//getblockcount requestBody.put("params",params); try { diff --git a/m2pool-modules/m2pool-pool/src/main/resources/bootstrap-prod.yml b/m2pool-modules/m2pool-pool/src/main/resources/bootstrap-prod.yml new file mode 100644 index 0000000..87c53ca --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/resources/bootstrap-prod.yml @@ -0,0 +1,74 @@ +server: + port: 9203 + compression: + enabled: true + mime-types: application/json + +spring: + #邮箱基本配置 + mail: + # 配置在limit_time内,用户可以发送limit次验证码 + limit: 2 这个是我额外的配置,结合邮箱服务用的 + limitTime: 10 这个是我额外的配置 + #配置smtp服务主机地址 + # sina smtp.sina.cn + # aliyun smtp.aliyun.com + # 163 smtp.163.com 端口号465或994 + host: mail.privateemail.com + #发送者邮箱 + username: support@m2pool.cc + #配置密码,注意不是真正的密码,而是刚刚申请到的授权码 + # password: + # password: m2pool2024@! + # password: axvm-zfgx-cgcg-qhhu + password: m2pool2024@! + #端口号 + port: 587 + #默认的邮件编码为UTF-8 + default-encoding: UTF-8 + #其他参数 + properties: + mail: + #配置SSL 加密工厂 + smtp: + ssl: + #本地测试,先放开ssl + enable: false + required: false + #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误 + debug: false + socketFactory: + class: javax.net.ssl.SSLSocketFactory + + application: + # 应用名称 + name: m2pool-pool + cloud: + nacos: + discovery: + # 服务注册地址 172.16.2.5 + server-addr: 127.0.0.1:8808 + namespace: m2_prod + group: m2_prod_group +# server-addr: 127.0.0.1:8808 + config: + # 配置中心地址 + server-addr: 127.0.0.1:8808 +# server-addr: 127.0.0.1:8808 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + namespace: m2_prod + group: m2_prod_group + servlet: + multipart: + max-file-size: 2MB + max-request-size: 8MB + +myenv: + domain: https://www.m2pool.com + path: /var/www/html/web + img: /img + filepath: /home/ubuntu/prod diff --git a/m2pool-modules/m2pool-pool/src/main/resources/bootstrap-test.yml b/m2pool-modules/m2pool-pool/src/main/resources/bootstrap-test.yml new file mode 100644 index 0000000..a3f55ac --- /dev/null +++ b/m2pool-modules/m2pool-pool/src/main/resources/bootstrap-test.yml @@ -0,0 +1,74 @@ +server: + port: 9503 + compression: + enabled: true + mime-types: application/json + +spring: + #邮箱基本配置 + mail: + # 配置在limit_time内,用户可以发送limit次验证码 + limit: 2 这个是我额外的配置,结合邮箱服务用的 + limitTime: 10 这个是我额外的配置 + #配置smtp服务主机地址 + # sina smtp.sina.cn + # aliyun smtp.aliyun.com + # 163 smtp.163.com 端口号465或994 + host: mail.privateemail.com + #发送者邮箱 + username: support@m2pool.cc + #配置密码,注意不是真正的密码,而是刚刚申请到的授权码 + # password: + # password: m2pool2024@! + # password: axvm-zfgx-cgcg-qhhu + password: m2pool2024@! + #端口号 + port: 587 + #默认的邮件编码为UTF-8 + default-encoding: UTF-8 + #其他参数 + properties: + mail: + #配置SSL 加密工厂 + smtp: + ssl: + #本地测试,先放开ssl + enable: false + required: false + #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误 + debug: false + socketFactory: + class: javax.net.ssl.SSLSocketFactory + + application: + # 应用名称 + name: m2pool-pool + cloud: + nacos: + discovery: + # 服务注册地址 172.16.2.5 + server-addr: 127.0.0.1:8808 + namespace: m2_test + group: m2_test_group +# server-addr: 127.0.0.1:8808 + config: + # 配置中心地址 + server-addr: 127.0.0.1:8808 +# server-addr: 127.0.0.1:8808 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + namespace: m2_test + group: m2_test_group + servlet: + multipart: + max-file-size: 2MB + max-request-size: 8MB + +myenv: + domain: https://test.m2pool.com + path: /var/www/html/web_test + img: /img + filepath: /home/ubuntu/web diff --git a/m2pool-modules/m2pool-pool/src/main/resources/bootstrap.yml b/m2pool-modules/m2pool-pool/src/main/resources/bootstrap.yml index 154eac1..6971e7f 100644 --- a/m2pool-modules/m2pool-pool/src/main/resources/bootstrap.yml +++ b/m2pool-modules/m2pool-pool/src/main/resources/bootstrap.yml @@ -1,156 +1,4 @@ -server: - port: 9203 - compression: - enabled: true - mime-types: application/json - spring: - #邮箱基本配置 - mail: - # 配置在limit_time内,用户可以发送limit次验证码 - limit: 2 这个是我额外的配置,结合邮箱服务用的 - limitTime: 10 这个是我额外的配置 - #配置smtp服务主机地址 - # sina smtp.sina.cn - # aliyun smtp.aliyun.com - # 163 smtp.163.com 端口号465或994 - host: mail.privateemail.com - #发送者邮箱 - username: support@m2pool.cc - #配置密码,注意不是真正的密码,而是刚刚申请到的授权码 - # password: - # password: m2pool2024@! - # password: axvm-zfgx-cgcg-qhhu - password: m2pool2024@! - #端口号 - port: 587 - #默认的邮件编码为UTF-8 - default-encoding: UTF-8 - #其他参数 - properties: - mail: - #配置SSL 加密工厂 - smtp: - ssl: - #本地测试,先放开ssl - enable: false - required: false - #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误 - debug: false - socketFactory: - class: javax.net.ssl.SSLSocketFactory - - application: - # 应用名称 - name: m2pool-pool profiles: # 环境配置 - active: prod - cloud: - nacos: - discovery: - # 服务注册地址 172.16.2.5 - server-addr: 127.0.0.1:8808 - namespace: m2_prod - group: m2_prod_group -# server-addr: 127.0.0.1:8808 - config: - # 配置中心地址 - server-addr: 127.0.0.1:8808 -# server-addr: 127.0.0.1:8808 - # 配置文件格式 - file-extension: yml - # 共享配置 - shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - namespace: m2_prod - group: m2_prod_group - servlet: - multipart: - max-file-size: 2MB - max-request-size: 8MB - -myenv: - domain: https://www.m2pool.com - path: /var/www/html/web - img: /img - filepath: /home/ubuntu/prod - - -#server: -# port: 9503 -# compression: -# enabled: true -# mime-types: application/json -# -#spring: -# #邮箱基本配置 -# mail: -# # 配置在limit_time内,用户可以发送limit次验证码 -# limit: 2 这个是我额外的配置,结合邮箱服务用的 -# limitTime: 10 这个是我额外的配置 -# #配置smtp服务主机地址 -# # sina smtp.sina.cn -# # aliyun smtp.aliyun.com -# # 163 smtp.163.com 端口号465或994 -# host: mail.privateemail.com -# #发送者邮箱 -# username: support@m2pool.cc -# #配置密码,注意不是真正的密码,而是刚刚申请到的授权码 -# # password: -# # password: m2pool2024@! -# # password: axvm-zfgx-cgcg-qhhu -# password: m2pool2024@! -# #端口号 -# port: 587 -# #默认的邮件编码为UTF-8 -# default-encoding: UTF-8 -# #其他参数 -# properties: -# mail: -# #配置SSL 加密工厂 -# smtp: -# ssl: -# #本地测试,先放开ssl -# enable: false -# required: false -# #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误 -# debug: false -# socketFactory: -# class: javax.net.ssl.SSLSocketFactory -# -# application: -# # 应用名称 -# name: m2pool-pool -# profiles: -# # 环境配置 -# active: test -# cloud: -# nacos: -# discovery: -# # 服务注册地址 172.16.2.5 -# server-addr: 127.0.0.1:8808 -# namespace: m2_test -# group: m2_test_group -## server-addr: 127.0.0.1:8808 -# config: -# # 配置中心地址 -# server-addr: 127.0.0.1:8808 -## server-addr: 127.0.0.1:8808 -# # 配置文件格式 -# file-extension: yml -# # 共享配置 -# shared-configs: -# - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} -# namespace: m2_test -# group: m2_test_group -# servlet: -# multipart: -# max-file-size: 2MB -# max-request-size: 8MB -# -#myenv: -# domain: https://test.m2pool.com -# path: /var/www/html/web_test -# img: /img -# filepath: /home/ubuntu/web + active: test \ No newline at end of file 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 6c5600e..0cc6a06 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 @@ -585,6 +585,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by `date` + insert into ${table}( `date`, @@ -881,6 +882,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + insert into #{tableName} (`date`,`height`) values(#{date},#{height}) ON DUPLICATE KEY UPDATE `height` = VALUES(`height`) + + + + +