From f8d1bdf819084077e96fa4640d3caeda86f8f426 Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Wed, 28 Jan 2026 12:09:21 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=96=B0=E5=A2=9E2miners=20=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E7=AE=97=E5=8A=9B=E6=9B=B4=E6=96=B0=20=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lease/mapper/LeaseOrderItemMapper.java | 13 ++ .../lease/mapper/LeaseOrderMiningMapper.java | 10 ++ .../impl/LeaseOrderInfoServiceImpl.java | 2 +- .../m2pool/lease/task/RealPowerInsetTask.java | 115 +++++++++++++++++- .../mapper/lease/LeaseOrderItemMapper.xml | 42 +++++-- .../mapper/lease/LeaseOrderMiningMapper.xml | 18 +++ 6 files changed, 182 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java b/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java index 38de5cc..ff614fa 100644 --- a/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java +++ b/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java @@ -96,4 +96,17 @@ public interface LeaseOrderItemMapper extends BaseMapper { * @return */ int updateSettleAmount(@Param("list") List reocrdList); + + /** + * 获取租约生效中的订单详情(status=1) + * @return 订单详情列表 + */ + List getActiveOrderItems(); + + /** + * 批量更新订单详情的实时算力 + * @param list 订单详情列表 + * @return 更新行数 + */ + int updatePracticalPowerBatch(@Param("list") List list); } diff --git a/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java b/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java index 7d10cd6..f4c5213 100644 --- a/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java +++ b/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java @@ -95,4 +95,14 @@ public interface LeaseOrderMiningMapper extends BaseMapper { * @return */ List getPurchasedMachineInfo(@Param("info") MiningConfigInfoDto info,@Param("authId") Long authId); + + /** + * 获取指定时间点的实时算力 + * @param tableName 表名(如:2miners) + * @param datetime 时间点 + * @param list 查询条件列表 + * @return 实时算力信息列表 + */ + @MiningDB + List getRealTimeHashrate(@Param("tableName") String tableName, @Param("datetime") String datetime, @Param("list") List list); } diff --git a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java index 831914d..ad6214b 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java @@ -903,7 +903,7 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl activeOrderItems = leaseOrderItemMapper.getActiveOrderItems(); + if (activeOrderItems == null || activeOrderItems.isEmpty()) { + System.out.println("没有需要更新实时算力的订单详情"); + return; + } + System.out.println("查询到 " + activeOrderItems.size() + " 条需要更新实时算力的订单详情"); + //2. 根据订单详情信息构建查询条件,去@MiningDB库中的矿池实时算力表查询数据 + // 计算当前时间的前5分钟的整点时间(如:2026-01-28 01:05:50 -> 2026-01-28 01:05:00) + LocalDateTime now = LocalDateTime.now(); + LocalDateTime queryTime = now.minusMinutes(5).withSecond(0).withNano(0); + String queryDateTime = queryTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + System.out.println("查询时间点:" + queryDateTime); + + // 按矿池分组查询 + Map> poolGroups = activeOrderItems.stream() + .collect(Collectors.groupingBy(LeaseOrderItem::getPool)); + + List updatedItems = new ArrayList<>(); + + for (Map.Entry> entry : poolGroups.entrySet()) { + String pool = entry.getKey(); + List items = entry.getValue(); + + // 构建查询条件列表 + List queryList = items.stream() + .map(item -> RealTimeHashrateQueryDto.builder() + .orderItemId(item.getId()) + .walletAddress(item.getUser()) + .miner(item.getMiner()) + .coin(item.getCoin()) + .algorithm(item.getAlgorithm()) + .pool(item.getPool()) + .build()) + .collect(Collectors.toList()); + + String tableName = "2miners"; //表名 + // 查询实时算力 + List hashrateList = leaseOrderMiningMapper.getRealTimeHashrate( + tableName, queryDateTime, queryList); + + System.out.println("矿池 " + pool + " 查询到 " + hashrateList.size() + " 条算力数据"); + + // 构建算力数据映射表:key = walletAddress + "_" + miner + "_" + coin + "_" + algorithm + Map hashrateMap = hashrateList.stream() + .collect(Collectors.toMap( + dto -> dto.getWalletAddress() + "_" + dto.getMiner() + "_" + dto.getCoin() + "_" + dto.getAlgorithm(), + RealHashrateInfoDto::getPower, + (v1, v2) -> v1 // 如果有重复,取第一个 + )); + + // 更新订单详情的实时算力 + for (LeaseOrderItem item : items) { + String key = item.getUser() + "_" + item.getMiner() + "_" + item.getCoin() + "_" + item.getAlgorithm(); + BigDecimal power = hashrateMap.get(key); + + // 如果查询到算力数据则使用,否则设置为0 + item.setPracticalPower(power != null ? power : BigDecimal.ZERO); + updatedItems.add(item); + } + } + + //3. 批量更新lease_order_item的practical_power实时算力字段 + if (!updatedItems.isEmpty()) { + int updateCount = leaseOrderItemMapper.updatePracticalPowerBatch(updatedItems); + System.out.println("成功更新 " + updateCount + " 条订单详情的实时算力"); + } + + System.out.println("GPU实时算力更新任务执行完成:" + LocalDateTime.now()); + } catch (Exception e) { + System.err.println("GPU实时算力更新任务执行失败:" + e.getMessage()); + throw new RuntimeException("GPU实时算力更新任务执行失败", e); + } + } + + + /*---------------------v2版本实时算力------------------------------**/ + } diff --git a/src/main/resources/mapper/lease/LeaseOrderItemMapper.xml b/src/main/resources/mapper/lease/LeaseOrderItemMapper.xml index 488bc48..928704e 100644 --- a/src/main/resources/mapper/lease/LeaseOrderItemMapper.xml +++ b/src/main/resources/mapper/lease/LeaseOrderItemMapper.xml @@ -102,21 +102,39 @@ #{id} - + select id,create_time as createTime,lease_time as leaseTime from lease_order_item where status = 1 + + + + + + UPDATE lease_order_item + SET practical_power = CASE + + WHEN id = #{item.id} + THEN #{item.practicalPower} + + ELSE practical_power + END + WHERE id IN ( + + #{item.id} + + ) + + +