From 58aaa345f65bb148bab2e4621c4a4a1f55f8dd77 Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Wed, 21 Jan 2026 14:34:04 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9E=E7=90=86=E8=AE=BA=E7=AE=97?= =?UTF-8?q?=E5=8A=9B=EF=BC=8C=E7=90=86=E8=AE=BA=E7=AE=97=E5=8A=9B=E5=92=8C?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E7=AE=97=E5=8A=9B=E7=9A=84=E6=AF=94=E5=80=BC?= =?UTF-8?q?=EF=BC=8C=E5=AE=9E=E9=99=85=E6=94=AF=E4=BB=98=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m2pool/lease/dto/OrderInfoDto.java | 21 ++++++++ .../com/m2pool/lease/dto/OrderItemDto.java | 13 +++++ .../m2pool/lease/entity/LeaseOrderItem.java | 5 ++ .../impl/LeaseOrderInfoServiceImpl.java | 53 ++++++++++++++----- .../m2pool/lease/task/OrderAndPayTask.java | 50 ++++++++--------- 5 files changed, 100 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/m2pool/lease/dto/OrderInfoDto.java b/src/main/java/com/m2pool/lease/dto/OrderInfoDto.java index 66f21b7..705ac25 100644 --- a/src/main/java/com/m2pool/lease/dto/OrderInfoDto.java +++ b/src/main/java/com/m2pool/lease/dto/OrderInfoDto.java @@ -34,6 +34,7 @@ public class OrderInfoDto { private Long id; @ApiModelProperty(value = "店铺id") + @Deprecated private Long shopId; /** @@ -79,15 +80,19 @@ public class OrderInfoDto { @ApiModelProperty(value = "二维码图片") + @Deprecated private String img; @ApiModelProperty(value = "需支付总金额") + @Deprecated private BigDecimal amount; @ApiModelProperty(value = "已支付金额") + @Deprecated private String payAmount; @ApiModelProperty(value = "未支付金额") + @Deprecated private Double noPayAmount; @ApiModelProperty(value = "店铺名称") @@ -96,7 +101,23 @@ public class OrderInfoDto { @ApiModelProperty(value = "支付币种(单位)") private String payCoin; + + //---------------------------------------------- 一个普通订单对应一个支付订单(多个封装下面四个字段为一个对象,并返回list)- ---------------------------------------------------------------------- + + @ApiModelProperty(value = "实际支付总金额") + private BigDecimal totalPayAmount; + + @ApiModelProperty(value = "理论总算力") + private BigDecimal totalTheoryPower; + + @ApiModelProperty(value = "实际算力") + private BigDecimal totalPracticalPower; + + @ApiModelProperty(value = "实际算力/理论算力 比值") + private BigDecimal powerRatio; + + /** * 订单详情 */ diff --git a/src/main/java/com/m2pool/lease/dto/OrderItemDto.java b/src/main/java/com/m2pool/lease/dto/OrderItemDto.java index b2e3c06..349c3e1 100644 --- a/src/main/java/com/m2pool/lease/dto/OrderItemDto.java +++ b/src/main/java/com/m2pool/lease/dto/OrderItemDto.java @@ -89,4 +89,17 @@ public class OrderItemDto { + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payAmount; + + @ApiModelProperty(value = "理论算力") + private BigDecimal theoryPower; + + @ApiModelProperty(value = "实际算力") + private BigDecimal practicalPower; + + @ApiModelProperty(value = "实际算力/理论算力 比值") + private BigDecimal powerRatio; + + } diff --git a/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java b/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java index b93d9f0..d601f92 100644 --- a/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java +++ b/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java @@ -118,6 +118,11 @@ public class LeaseOrderItem implements Serializable { */ private BigDecimal theoryPower; + /** + * 单机实际算力 + */ + private BigDecimal practicalPower; + /** * 单机理论收益 */ 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 1da9da8..9a76b88 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; @@ -552,19 +553,6 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl leaseOrderItems = leaseOrderItemMapper.selectList(new LambdaQueryWrapper() .eq(LeaseOrderItem::getOrderId, orderVo.getOrderId())); - List collect1 = leaseOrderItems.stream().map(leaseOrderItem -> OrderItemDto.builder() - .orderId(leaseOrderItem.getOrderId()) - .productId(leaseOrderItem.getProductId()) - .productMachineId(leaseOrderItem.getProductMachineId()) - .leaseTime(leaseOrderItem.getLeaseTime()) - .address(leaseOrderItem.getAddress()) - .payCoin(leaseOrderItem.getPayCoin()) - .name(leaseOrderItem.getName()) - .image(leaseOrderItem.getImage()) - .price(leaseOrderItem.getPrice()) - .type(leaseOrderItem.getType() ? 1 : 0) - .numbers(leaseOrderItem.getNumbers()) - .build()).collect(Collectors.toList()); OrderInfoDto orderInfoDto = OrderInfoDto.builder() .id(leaseOrderInfo.getId()) @@ -575,9 +563,46 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl list = new ArrayList<>(); + for (LeaseOrderItem leaseOrderItem : leaseOrderItems) { + BigDecimal theoryPower = leaseOrderItem.getTheoryPower(); + BigDecimal practicalPower = leaseOrderItem.getPracticalPower(); + BigDecimal powerRatio = practicalPower.divide(theoryPower, 2, RoundingMode.HALF_UP); + BigDecimal alreadyPayRealAmount = leaseOrderItem.getAlreadyPayRealAmount(); + + orderInfoDto.setTotalTheoryPower(orderInfoDto.getTotalTheoryPower().add(theoryPower)); + orderInfoDto.setTotalPracticalPower(orderInfoDto.getTotalPracticalPower().add(practicalPower)); + orderInfoDto.setTotalPayAmount(orderInfoDto.getTotalPayAmount().add(alreadyPayRealAmount)); + + list.add(OrderItemDto.builder() + .orderId(leaseOrderItem.getOrderId()) + .productId(leaseOrderItem.getProductId()) + .productMachineId(leaseOrderItem.getProductMachineId()) + .leaseTime(leaseOrderItem.getLeaseTime()) + .address(leaseOrderItem.getAddress()) + .payCoin(leaseOrderItem.getPayCoin()) + .name(leaseOrderItem.getName()) + .image(leaseOrderItem.getImage()) + .price(leaseOrderItem.getPrice()) + .type(leaseOrderItem.getType() ? 1 : 0) + .numbers(leaseOrderItem.getNumbers()) + .theoryPower(theoryPower) + .practicalPower(practicalPower) + .powerRatio(powerRatio) + .payAmount(alreadyPayRealAmount) + .build()); + } + orderInfoDto.setPayCoin(list.get(0).getPayCoin()); + orderInfoDto.setPowerRatio(orderInfoDto.getTotalPracticalPower() + .divide(orderInfoDto.getTotalTheoryPower(), 2, RoundingMode.HALF_UP)); + orderInfoDto.setOrderItemDtoList(list); + return Result.success(orderInfoDto); } diff --git a/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java b/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java index 29985ac..31b24cb 100644 --- a/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java +++ b/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java @@ -208,8 +208,8 @@ public class OrderAndPayTask { dto.getMiner() + "_" + dto.getCoin() + "_" + dto.getAlgorithm() )); - //订单id 与 实时算力 映射 - Map> orderIdToHashrateMap = new HashMap<>(); + //订单id 与 当天平均算力 映射 + Map orderIdToHashrateMap = new HashMap<>(); getOrderItemIdToHashrateMap(orderIdToHashrateMap,miningAnditemIdMap,groupedData); //根据实时算力波动情况 求得订单实际支付金额 @@ -248,11 +248,14 @@ public class OrderAndPayTask { for (LeaseOrderItem item : items) { BigDecimal realAmount = orderItemToPriceMap.get(item.getId()); + BigDecimal practicalPower = orderIdToHashrateMap.get(item.getId()); BigDecimal realPayAmount = realAmount== null ? BigDecimal.ZERO : realAmount; - //已支付金额 和实际待支付金额 + practicalPower = practicalPower == null ? BigDecimal.ZERO : practicalPower; + //已支付金额 + 实际待支付金额 + 实际平均算力 item.setAlreadyPayAmount(item.getAlreadyPayAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(realPayAmount)); - item.setAlreadyPayRealAmount(item.getAlreadyPayRealAmount().add(realPayAmount)); + item.setPracticalPower(item.getPracticalPower().add(practicalPower) + .divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP)); //设置理论支付金额 和 冻结金额 额 (冻结金额 = 理论支付金额) build.setBlockAmount(build.getBlockAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); build.setAmount(build.getAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); @@ -357,37 +360,22 @@ public class OrderAndPayTask { * @param orderIdToPriceMap 订单id 与价格映射 * @return */ - public Map orderPaymentWaveAlgorithm(Map> orderIdToHashrateMap, Map orderIdToPriceMap){ + public Map orderPaymentWaveAlgorithm(Map orderIdToHashrateMap, Map orderIdToPriceMap){ Map orderItemIdToWaveMap = new HashMap<>(); - orderIdToHashrateMap.forEach((orderItemId, realPowerList) -> { + orderIdToHashrateMap.forEach((orderItemId, realPower) -> { LeaseOrderItem itemInfo = orderIdToPriceMap.get(orderItemId); - - // 计算每个数据点 理论算力的比值 - List ratios = realPowerList.stream() - .map(dto -> dto.getPower() - .divide(itemInfo.getTheoryPower(), 4, RoundingMode.HALF_UP)) - .collect(Collectors.toList()); - - // 补零到48个数据点 - while (ratios.size() < dataPoints) { - ratios.add(BigDecimal.ZERO); - } - - // 计算总和并除以48 - BigDecimal finalValue = ratios.stream() - .reduce(BigDecimal.ZERO, BigDecimal::add) - .divide(BigDecimal.valueOf(dataPoints), 2, RoundingMode.HALF_UP); - + //计算实际算力和理论算力的比值 + BigDecimal ratio = realPower.divide(itemInfo.getTheoryPower(), 4, RoundingMode.HALF_UP); BigDecimal payAmount = itemInfo.getPrice() .multiply(BigDecimal.valueOf(itemInfo.getNumbers())); - if (finalValue.compareTo(BigDecimal.valueOf(0.95)) <= 0){ - payAmount = payAmount.multiply(finalValue); + if (ratio.compareTo(BigDecimal.valueOf(0.95)) <= 0){ + payAmount = payAmount.multiply(ratio); } orderItemIdToWaveMap.put(orderItemId, payAmount); }); @@ -397,16 +385,22 @@ public class OrderAndPayTask { /** * 获取订单项id 与实时算力映射 **/ - public void getOrderItemIdToHashrateMap(Map> orderIdToHashrateMap,Map miningAnditemIdMap,Map> groupedData){ + public void getOrderItemIdToHashrateMap(Map orderIdToHashrateMap,Map miningAnditemIdMap,Map> groupedData){ for (Map.Entry> entry : groupedData.entrySet()) { String key = entry.getKey(); List hashrateList = entry.getValue(); // 从第一个映射中获取对应的订单信息 PurchasedMachineListDto orderInfo = miningAnditemIdMap.get(key); + + //计算平均算力 if (orderInfo != null) { - // 将订单ID与实时算力关联起来 - orderIdToHashrateMap.put(orderInfo.getOrderItemId(), hashrateList); + BigDecimal totalPracticalPower = BigDecimal.ZERO; + for (RealHashrateInfoDto realHashrateInfoDto : hashrateList) { + totalPracticalPower = totalPracticalPower.add(realHashrateInfoDto.getPower()); + } + totalPracticalPower = totalPracticalPower.divide(BigDecimal.valueOf(dataPoints), 4, RoundingMode.HALF_UP); + orderIdToHashrateMap.put(orderInfo.getOrderItemId(), totalPracticalPower); } }