From 2830c57af2e379c805d02aab35f2ce2b2e09a88e Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Mon, 26 Jan 2026 09:54:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=94=B6=E7=9B=8A?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E3=80=81=E5=9C=B0=E5=9D=80=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=92=8C=E6=8F=90=E7=8E=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正收益计算将月收益改为日收益,格式化显示为'(币种)' - 统一NEXA地址校验规则,必须带'nexa:'前缀 - 修复提现金额计算逻辑,改为从余额中减去提现金额和手续费 - 优化SQL查询,使用ROW_NUMBER替代变量排序 - 添加用户权限校验,算力保留两位小数并添加单位字段 - 添加空字符串校验和调试日志输出 - 启用提现队列监听功能 --- .../m2pool/lease/aspect/DecryptAspect.java | 5 + .../lease/aspect/OperationLogAspect.java | 5 +- .../m2pool/lease/config/LoginInterceptor.java | 1 + .../java/com/m2pool/lease/dto/PageResult.java | 2 +- .../m2pool/lease/dto/v2/MachineInfoDto.java | 2 +- .../lease/dto/v2/MiningHashrateInfoDto.java | 3 + .../lease/dto/v2/PurchasedMachineDto.java | 3 + .../lease/mapper/LeaseOrderMiningMapper.java | 2 +- .../com/m2pool/lease/mq/MessageReceiver.java | 61 +-- .../netty/handler/ServerChannelHandler.java | 3 +- .../service/impl/LeaseMachineServiceImpl.java | 1 + .../impl/LeaseOrderInfoServiceImpl.java | 10 +- .../m2pool/lease/task/GpuRequestApiTask.java | 5 +- .../lease/utils/WalletRuleCheckUtils.java | 11 +- .../mapper/lease/LeaseMachineMapper.xml | 477 ++++-------------- .../mapper/lease/LeaseOrderMiningMapper.xml | 62 +-- .../lease/LeaseUserOwnedProductMapper.xml | 76 +-- 17 files changed, 223 insertions(+), 506 deletions(-) diff --git a/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java b/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java index b53eca1..ebc4bee 100644 --- a/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java +++ b/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java @@ -6,6 +6,7 @@ import cn.hutool.json.JSONUtil; import com.m2pool.lease.annotation.EncryptedField; import com.m2pool.lease.exception.RSAException; import com.m2pool.lease.utils.RsaUtils; +import io.netty.util.internal.StringUtil; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -13,6 +14,7 @@ import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestBody; +import org.thymeleaf.util.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Parameter; @@ -84,6 +86,9 @@ public class DecryptAspect { Object value = field.get(obj); if (value != null) { String encryptedValue = value.toString(); + if(StringUtils.isEmpty(encryptedValue)){ + return; + } System.out.println("加密前地址:"+value +"类型"+(value instanceof String)); String decryptedValue = RsaUtils.decrypt(encryptedValue); field.set(obj, decryptedValue); diff --git a/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java b/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java index f7d1c82..2e12a26 100644 --- a/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java +++ b/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java @@ -70,7 +70,7 @@ public class OperationLogAspect { Field field = tagFields.poll(); field.setAccessible(true); try { - if (!tagFields.isEmpty() || tag.length() > 0) { // 如果不是第一个元素或者address不为空,才加"--" + if ( tag.length() > 0) { // 如果不是第一个元素或者address不为空,才加"--" tag.append("--"); } tag.append((String) field.get(arg)); @@ -85,8 +85,9 @@ public class OperationLogAspect { getExtraLogParam(ledgerLog); //文件追加用户邮箱和用户id(文件名格式:地址--邮箱--用户id) String username = SecurityUtils.getUsername(); + Long userId = SecurityUtils.getUserId(); if (username != null){ - tag.append("--").append(username).append("--").append(SecurityUtils.getUserId()); + tag.append("--").append(username).append("--").append(userId); } // 记录日志 ledgerLogService.logOperation(tag.toString(), annotation.value(), ledgerLog.toString()); diff --git a/src/main/java/com/m2pool/lease/config/LoginInterceptor.java b/src/main/java/com/m2pool/lease/config/LoginInterceptor.java index 74bcfd6..8978b97 100644 --- a/src/main/java/com/m2pool/lease/config/LoginInterceptor.java +++ b/src/main/java/com/m2pool/lease/config/LoginInterceptor.java @@ -71,6 +71,7 @@ public class LoginInterceptor implements HandlerInterceptor { } String userEmail = JwtUtils.getUserName(token); String getUserId = JwtUtils.getUserId(token); + System.out.println("本地线程:用户ID"+getUserId + "用户邮箱"+userEmail); //1.把userEmail存入ThreadLocal 本地线程变量中 SecurityUtils.setUserEmail(userEmail); SecurityUtils.setUserId(Long.valueOf(getUserId)); diff --git a/src/main/java/com/m2pool/lease/dto/PageResult.java b/src/main/java/com/m2pool/lease/dto/PageResult.java index d46b4fb..64d4fb0 100644 --- a/src/main/java/com/m2pool/lease/dto/PageResult.java +++ b/src/main/java/com/m2pool/lease/dto/PageResult.java @@ -93,7 +93,7 @@ public class PageResult implements Serializable columns.add(TableHeadersDto.builder() .key("monthIncome") - .label("最大月收益") + .label("最大日收益") .type("amount") .currency("USDT") .period("MONTH") diff --git a/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java b/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java index 194e7b7..0b9ff72 100644 --- a/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java +++ b/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java @@ -49,7 +49,7 @@ public class MachineInfoDto { private Integer maxLeaseDays; @ApiModelProperty(value = "最大月收益 usdt") - private BigDecimal monthIncome; + private String monthIncome; @ApiModelProperty(value = "最大收益币种算法") diff --git a/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java b/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java index 2817d44..7f88f44 100644 --- a/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java +++ b/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java @@ -33,4 +33,7 @@ public class MiningHashrateInfoDto { @ApiModelProperty(value = "矿工号") private String miner; + + @ApiModelProperty(value = "算力单位") + private String unit; } diff --git a/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java b/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java index 3d1db01..6ee352c 100644 --- a/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java +++ b/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java @@ -53,4 +53,7 @@ public class PurchasedMachineDto { @ApiModelProperty(value = "最近实时算力记录时间") private LocalDateTime recordTime; + @ApiModelProperty(value = "币种单位") + private String unit; + } diff --git a/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java b/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java index a2731dc..7d10cd6 100644 --- a/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java +++ b/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java @@ -94,5 +94,5 @@ public interface LeaseOrderMiningMapper extends BaseMapper { * @param info * @return */ - List getPurchasedMachineInfo(@Param("info") MiningConfigInfoDto info); + List getPurchasedMachineInfo(@Param("info") MiningConfigInfoDto info,@Param("authId") Long authId); } diff --git a/src/main/java/com/m2pool/lease/mq/MessageReceiver.java b/src/main/java/com/m2pool/lease/mq/MessageReceiver.java index cafcf95..91b1f60 100644 --- a/src/main/java/com/m2pool/lease/mq/MessageReceiver.java +++ b/src/main/java/com/m2pool/lease/mq/MessageReceiver.java @@ -9,11 +9,9 @@ import com.m2pool.lease.constant.RabbitmqConstant; import com.m2pool.lease.entity.*; import com.m2pool.lease.exception.PayRechargeException; import com.m2pool.lease.mapper.*; -import com.m2pool.lease.mq.message.RabbitmqDeleteWalletReturnMessage; -import com.m2pool.lease.mq.message.RabbitmqPayAutoReturnMessage; -import com.m2pool.lease.mq.message.RabbitmqPayRechargeReturnMessage; -import com.m2pool.lease.mq.message.RabbitmqPayWithdrawReturnMessage; +import com.m2pool.lease.mq.message.*; import com.m2pool.lease.service.LeaseOrderItemService; +import com.m2pool.lease.utils.UuidGeneratorUtil; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.messaging.handler.annotation.Payload; @@ -341,6 +339,7 @@ public class MessageReceiver { LeasePayWithdrawMessage leasePayWithdrawMessage = handlerBuyerWithdraw(payWithdrawReturnMessage, leasePayWithdrawMessageList); if (leasePayWithdrawMessage != null){ LeaseShopConfig leaseShopConfig = leaseShopConfigMapper.selectOne(new LambdaQueryWrapper() + .select(LeaseShopConfig::getId, LeaseShopConfig::getBalance) .eq(LeaseShopConfig::getPayAddress, leasePayWithdrawMessage.getFromAddress()) .eq(LeaseShopConfig::getChain, leasePayWithdrawMessage.getFromChain()) .eq(LeaseShopConfig::getPayCoin, leasePayWithdrawMessage.getFromSymbol()) @@ -350,18 +349,20 @@ public class MessageReceiver { if (leasePayWithdrawMessage.getStatus() == 1 && payWithdrawReturnMessage.getStatus() == 1){ return; } - if (payWithdrawReturnMessage.getStatus() == 1){ - leaseShopConfig.setBalance(leaseShopConfig.getBalance() - .add(leasePayWithdrawMessage.getAmount()) - .add(leasePayWithdrawMessage.getServiceCharge())); - leaseShopConfigMapper.updateById(leaseShopConfig); - } - leasePayWithdrawMessageMapper.updateById(LeasePayWithdrawMessage.builder() + + LeasePayWithdrawMessage build = LeasePayWithdrawMessage.builder() .id(leasePayWithdrawMessage.getId()) .status(payWithdrawReturnMessage.getStatus()) - .txHash(payWithdrawReturnMessage.getTx_hash()) - .blockHeight(payWithdrawReturnMessage.getBlock_height()) - .build()); + .build(); + if (payWithdrawReturnMessage.getStatus() == 1){ + leaseShopConfig.setBalance(leaseShopConfig.getBalance() + .subtract(payWithdrawReturnMessage.getAmount()) + .subtract(payWithdrawReturnMessage.getFee())); + leaseShopConfigMapper.updateById(leaseShopConfig); + build.setTxHash(payWithdrawReturnMessage.getTx_hash()); + build.setBlockHeight(payWithdrawReturnMessage.getBlock_height()); + } + leasePayWithdrawMessageMapper.updateById(build); //TODO 修改leaseShopConfig 金额(暂时不修改,提现申请的时候就修改了) } } @@ -580,22 +581,22 @@ public class MessageReceiver { //提现 - //@RabbitListener(queues = RabbitmqConstant.PAY_WITHDRAW_QUEUE,containerFactory ="rabbitListenerContainerFactory") - //@Transactional(rollbackFor = Exception.class) - //public void listenerWithdrawQueueMessage(@Payload RabbitmqPayWithdrawMessage payAutoReturnMessage) { - // //发送充值消息 - // RabbitmqPayWithdrawReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayWithdrawReturnMessage.builder() - // .queue_id(payAutoReturnMessage.getQueue_id()) - // .status(1) - // .amount(payAutoReturnMessage.getAmount()) - // .chain(payAutoReturnMessage.getChain()) - // .symbol(payAutoReturnMessage.getSymbol()) - // .from_address(payAutoReturnMessage.getFrom_address()) - // .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen()) - // .fee(payAutoReturnMessage.getFee()) - // .build(); - // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage); - //} + @RabbitListener(queues = RabbitmqConstant.PAY_WITHDRAW_QUEUE,containerFactory ="rabbitListenerContainerFactory") + @Transactional(rollbackFor = Exception.class) + public void listenerWithdrawQueueMessage(@Payload RabbitmqPayWithdrawMessage payAutoReturnMessage) { + //发送充值消息 + RabbitmqPayWithdrawReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayWithdrawReturnMessage.builder() + .queue_id(payAutoReturnMessage.getQueue_id()) + .status(1) + .amount(payAutoReturnMessage.getAmount()) + .chain(payAutoReturnMessage.getChain()) + .symbol(payAutoReturnMessage.getSymbol()) + .from_address(payAutoReturnMessage.getFrom_address()) + .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen()) + .fee(payAutoReturnMessage.getFee()) + .build(); + rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage); + } ////测试 开发环境 删除钱包测试 diff --git a/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java b/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java index 939c30a..b1020a8 100644 --- a/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java +++ b/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java @@ -440,9 +440,10 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler powerIncomeInfoDtoList = collect.get(machineInfo.getId()); for (int i = 0; i < powerIncomeInfoDtoList.size(); i++) { PowerIncomeInfoDto powerIncomeInfoDto = powerIncomeInfoDtoList.get(i); 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 a50a493..5d19591 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java @@ -1022,9 +1022,6 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl getPurchasedInfo(BaseVo baseVo) { + Long authId = SecurityUtils.getUserId(); + //找到miner 和钱包 ,pool 矿池名 MiningConfigInfoDto info = leaseOrderMiningMapper.getPurchasedInfo(baseVo.getId()); - List list = leaseOrderMiningMapper.getPurchasedMachineInfo(info); + List list = leaseOrderMiningMapper.getPurchasedMachineInfo(info,authId); //根据钱包 + 币种 + 矿工号 查询 pool 库 pool.kryptex 表 中对应 算力 @@ -1153,7 +1152,8 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl @@ -427,167 +252,71 @@ diff --git a/src/main/resources/mapper/lease/LeaseUserOwnedProductMapper.xml b/src/main/resources/mapper/lease/LeaseUserOwnedProductMapper.xml index a1e459b..ee692f4 100644 --- a/src/main/resources/mapper/lease/LeaseUserOwnedProductMapper.xml +++ b/src/main/resources/mapper/lease/LeaseUserOwnedProductMapper.xml @@ -38,29 +38,6 @@ INSERT INTO lease_user_owned_product (id, settle_income, settle_usdt_income,start_time, end_time)