From a7a2b73d00a4d64c997c08f244bf14e027a8ec09 Mon Sep 17 00:00:00 2001
From: yyb <1416014977@qq.com>
Date: Wed, 19 Nov 2025 16:39:25 +0800
Subject: [PATCH] =?UTF-8?q?update=20=E7=A7=9F=E8=B5=81=E7=B3=BB=E7=BB=9F?=
=?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=AE=8C=E6=88=90=EF=BC=8C=E5=85=B6=E4=BB=96?=
=?UTF-8?q?=E7=9F=BF=E6=B1=A0=E6=8C=96=E7=9F=BF=E6=9C=BA=E5=99=A8=E7=A7=9F?=
=?UTF-8?q?=E8=B5=81=E4=B8=9A=E5=8A=A1=E5=BC=80=E5=A7=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/m2pool/lease/constant/CoinCharge.java | 18 +-
.../com/m2pool/lease/dto/PayConfigDto.java | 3 +
.../entity/LeasePayRecordMessageInfo.java | 138 +++++++++++++++
.../LeasePayRecordMessageInfoMapper.java | 30 ++++
.../com/m2pool/lease/mq/MessageReceiver.java | 157 ++++++++++--------
.../LeasePayRecordMessageInfoService.java | 16 ++
.../LeasePayRecordMessageInfoServiceImpl.java | 22 +++
.../impl/LeaseProductMachineServiceImpl.java | 2 +-
.../service/impl/LeaseProductServiceImpl.java | 15 +-
.../impl/LeaseShoppingCartServiceImpl.java | 3 +-
.../LeaseUserOwnedProductServiceImpl.java | 2 +-
.../service/impl/LeaseUserServiceImpl.java | 1 +
.../m2pool/lease/task/OrderAndPayTask.java | 126 +++++++++-----
.../m2pool/lease/task/RealPowerInsetTask.java | 9 +-
.../lease/LeasePayRecordMessageInfoMapper.xml | 27 +++
.../lease/LeasePayRecordMessageMapper.xml | 12 +-
16 files changed, 458 insertions(+), 123 deletions(-)
create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java
create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java
create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java
create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java
create mode 100644 m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java
index 7481386..bfc9bc3 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java
@@ -48,6 +48,22 @@ public enum CoinCharge {
return BigDecimal.ONE;
}
+ /**
+ * 根据 chain 和 coin 查找对应的手续费,未找到则返回 1
+ * @param chain 链名
+ * @param coin 币种名
+ * @return 对应的手续费,未找到返回 1
+ */
+ public static BigDecimal getDeductibleAmountByChainAndCoin(String chain, String coin) {
+ for (CoinCharge charge : CoinCharge.values()) {
+ if (charge.chain.equals(chain) && charge.coin.equals(coin)) {
+ return charge.amount.divide(charge.feeRate, 4, RoundingMode.HALF_UP);
+ }
+ }
+ return BigDecimal.ONE;
+ }
+
+
/**
* 根据 chain 和 coin 找到手续费和费率,然后比较totalPrice是否小于 费率/手续费
* @param chain 链名
@@ -59,7 +75,7 @@ public enum CoinCharge {
for (CoinCharge charge : CoinCharge.values()) {
if (charge.chain.equals(chain) && charge.coin.equals(coin)) {
BigDecimal feeRate = charge.feeRate;
- BigDecimal deductible= feeRate.divide(charge.amount, 4, RoundingMode.HALF_UP);
+ BigDecimal deductible= charge.amount.divide(feeRate, 4, RoundingMode.HALF_UP);
if(deductible.compareTo(totalPrice) < 0){
fee = BigDecimal.ZERO;
}else{
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java
index f48b749..263541a 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java
@@ -48,4 +48,7 @@ public class PayConfigDto {
@ApiModelProperty(value = "起付金额")
private BigDecimal deductibleAmount;
+
+ @ApiModelProperty(value = "手续费")
+ private BigDecimal fee;
}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java
new file mode 100644
index 0000000..016a5b2
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java
@@ -0,0 +1,138 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 支付消息记录表
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeasePayRecordMessageInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 消息ID
+ */
+ private String queueId;
+
+ /**
+ * 买家充值地址
+ */
+ private String fromAddress;
+
+ /**
+ * 卖家充值地址
+ */
+ private String toAddress;
+
+
+ /**
+ * 订单id
+ */
+ private String orderId;
+
+ /**
+ * 订单号
+ */
+ private String orderNumber;
+
+ /**
+ * 店铺ID
+ */
+ private Long shopId;
+
+ /**
+ * 用户邮箱
+ */
+ private String userId;
+
+ /**
+ * 理论支付金额(根据商家定价)
+ */
+ private BigDecimal amount;
+
+ /**
+ *真实支付金额
+ */
+ private BigDecimal realAmount;
+
+ /**
+ * 实际应支付金额(根据一天内预估算力和实际算力差值计算得来)
+ */
+ private BigDecimal needAmount;
+
+ /**
+ * 钱包冻结金额
+ */
+ private BigDecimal blockAmount;
+ /**
+ * 币种
+ */
+ private String toSymbol;
+
+ /**
+ * 链名称
+ */
+ private String toChain;
+
+
+ /**
+ * 币种
+ */
+ private String fromSymbol;
+
+ /**
+ * 链名称
+ */
+ private String fromChain;
+
+ /**
+ * 交易hash
+ */
+ private String txHash;
+
+ private Long blockHeight;
+
+
+ /**
+ * 支付时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 0 支付失败 1 支付成功 2 等待校验
+ */
+ private Integer status;
+
+ /**
+ * 逻辑删除字段
+ */
+ private boolean del;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java
new file mode 100644
index 0000000..b1bf8e0
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java
@@ -0,0 +1,30 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.CheckAddressDto;
+import com.m2pool.lease.dto.PayRecordMessageDto;
+import com.m2pool.lease.dto.RecentlyTransactionDto;
+import com.m2pool.lease.dto.TransactionRecordDto;
+import com.m2pool.lease.entity.LeasePayRecordMessage;
+import com.m2pool.lease.entity.LeasePayRecordMessageInfo;
+import com.m2pool.lease.entity.LeaseShopConfig;
+import com.m2pool.lease.entity.LeaseUserWalletData;
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * LeasePayRecordMessageMapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Mapper
+public interface LeasePayRecordMessageInfoMapper extends BaseMapper {
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java
index 17c11e6..4c564b4 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java
@@ -10,6 +10,7 @@ import com.m2pool.lease.exception.PayRechargeException;
import com.m2pool.lease.mapper.*;
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;
@@ -92,11 +93,15 @@ public class MessageReceiver {
@Transactional(rollbackFor = Exception.class)
public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoReturnMessage payAutoReturnMessage) {
System.out.println("支付消费者"+JSONUtil.toJsonPrettyStr(payAutoReturnMessage));
- //查找到数据库对应的支付记录
+ //查找到数据库对应的支付记录 现在已经每日记录和总记录拆分开了,实际查出来的只会有一条记录
List leasePayRecordMessagesList = leasePayRecordMessageMapper.selectList(new LambdaQueryWrapper()
.eq(LeasePayRecordMessage::getQueueId, payAutoReturnMessage.getQueue_id()));
+ if (leasePayRecordMessagesList.isEmpty()){
+ return ;
+ }
//买家钱包
LeasePayRecordMessage payRecordMessage = leasePayRecordMessagesList.get(0);
+
LeaseUserWalletData buyer = leaseUserWalletDataMapper.selectOne(new LambdaQueryWrapper()
.eq(LeaseUserWalletData::getFromAddress,payRecordMessage.getFromAddress())
.eq(LeaseUserWalletData::getFromChain, payRecordMessage.getFromChain())
@@ -247,6 +252,9 @@ public class MessageReceiver {
.eq(LeaseUserWalletData::getFromAddress, payRechargeReturnMessage.getAddress())
.eq(LeaseUserWalletData::getDel, false)
);
+ if (leaseUserWalletDataList.isEmpty()){
+ return;
+ }
LeaseUserWalletData leaseUserWalletData = null;
for (LeaseUserWalletData item : leaseUserWalletDataList) {
if (item.getFromSymbol().equals(payRechargeReturnMessage.getSymbol())){
@@ -277,6 +285,7 @@ public class MessageReceiver {
if (leasePayRechargeMessage != null){
return;
}
+
LeasePayRechargeMessage build = LeasePayRechargeMessage.builder()
.queueId(payRechargeReturnMessage.getQueue_id())
.chain(payRechargeReturnMessage.getChain())
@@ -300,7 +309,6 @@ public class MessageReceiver {
}
//处理支付成功消息
if (payRechargeReturnMessage.getStatus() == 1){
- System.out.println("余额"+balance);
leaseUserWalletData.setBalance(balance.add(payRechargeReturnMessage.getAmount()));
//使用乐观锁防止余额少加
int update = leaseUserWalletDataMapper.update(leaseUserWalletData, new LambdaQueryWrapper()
@@ -324,7 +332,9 @@ public class MessageReceiver {
System.out.println("提现消费者----"+ JSONUtil.toJsonPrettyStr(payWithdrawReturnMessage));
List leasePayWithdrawMessageList = leasePayWithdrawMessageMapper.selectList(new LambdaQueryWrapper()
.eq(LeasePayWithdrawMessage::getQueueId, payWithdrawReturnMessage.getQueue_id()));
-
+ if (leasePayWithdrawMessageList.isEmpty()){
+ return ;
+ }
LeasePayWithdrawMessage leasePayWithdrawMessage = leasePayWithdrawMessageList.get(0);
//获取对应的提现钱包
LeaseUserWalletData leaseUserWalletData = leaseUserWalletDataMapper.selectOne(new LambdaQueryWrapper()
@@ -472,76 +482,77 @@ public class MessageReceiver {
}
- //测试 开发环境 支付回调测试
- @RabbitListener(queues = RabbitmqConstant.PAY_AUTO_QUEUE,containerFactory ="rabbitListenerContainerFactory")
- @Transactional(rollbackFor = Exception.class)
- public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoMessage payAutoReturnMessage) {
- //消费消息
- System.out.println("自动支付功能queueId"+payAutoReturnMessage.getQueue_id());
-
- RabbitmqPayAutoReturnMessage rabbitmqPayAutoReturnMessage = RabbitmqPayAutoReturnMessage.builder()
- .queue_id(payAutoReturnMessage.getQueue_id())
- .from_address(payAutoReturnMessage.getFrom_address())
- .to_address(payAutoReturnMessage.getTo_address())
- .chain(payAutoReturnMessage.getChain())
- .symbol(payAutoReturnMessage.getSymbol())
- .fee(payAutoReturnMessage.getFee())
- .amount(payAutoReturnMessage.getAmount())
- .status(1)
- .tx_hash(payAutoReturnMessage.getQueue_id())
- .block_height(1000L)
- .order_id(payAutoReturnMessage.getOrder_id())
- .build();
-
- rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_AUTO_RETURN_QUEUE,rabbitmqPayAutoReturnMessage);
- }
-
- //测试 开发环境 充值测试
- @RabbitListener(queues = RabbitmqConstant.PAY_RECHARGE_QUEUE,containerFactory ="rabbitListenerContainerFactory")
- @Transactional(rollbackFor = Exception.class)
- public void listenerPayRechargeQueueMessage(@Payload RabbitmqPayRechargeMessage payAutoReturnMessage) {
- //发送充值消息
- RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayRechargeReturnMessage.builder()
- .queue_id(payAutoReturnMessage.getQueue_id())
- .status(2)
- .amount(BigDecimal.valueOf(20))
- .chain(payAutoReturnMessage.getChain())
- .symbol(payAutoReturnMessage.getSymbol())
- .address(payAutoReturnMessage.getAddress())
- .tx_hash(payAutoReturnMessage.getQueue_id()+"第四笔")
- .build();
- rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage);
-
-
- //发送充值消息
- RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage1 = RabbitmqPayRechargeReturnMessage.builder()
- .queue_id(payAutoReturnMessage.getQueue_id())
- .status(1)
- .amount(BigDecimal.valueOf(20))
- .chain(payAutoReturnMessage.getChain())
- .symbol(payAutoReturnMessage.getSymbol())
- .address(payAutoReturnMessage.getAddress())
- .tx_hash(payAutoReturnMessage.getQueue_id()+"第四笔")
- .build();
- rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage1);
- }
-
- //提现
- @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())
- .tx_hash(payAutoReturnMessage.getQueue_id()+"第一笔")
- .fee(payAutoReturnMessage.getFee())
- .build();
- rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage);
- }
+ ////测试 开发环境 支付回调测试
+ //@RabbitListener(queues = RabbitmqConstant.PAY_AUTO_QUEUE,containerFactory ="rabbitListenerContainerFactory")
+ //@Transactional(rollbackFor = Exception.class)
+ //public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoMessage payAutoReturnMessage) {
+ // //消费消息
+ // System.out.println("自动支付功能queueId"+payAutoReturnMessage.getQueue_id());
+ //
+ // RabbitmqPayAutoReturnMessage rabbitmqPayAutoReturnMessage = RabbitmqPayAutoReturnMessage.builder()
+ // .queue_id(payAutoReturnMessage.getQueue_id())
+ // .from_address(payAutoReturnMessage.getFrom_address())
+ // .to_address(payAutoReturnMessage.getTo_address())
+ // .chain(payAutoReturnMessage.getChain())
+ // .symbol(payAutoReturnMessage.getSymbol())
+ // .fee(payAutoReturnMessage.getFee())
+ // .amount(payAutoReturnMessage.getAmount())
+ // .status(1)
+ // .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen())
+ // .block_height(1000L)
+ // .order_id(payAutoReturnMessage.getOrder_id())
+ // .build();
+ //
+ // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_AUTO_RETURN_QUEUE,rabbitmqPayAutoReturnMessage);
+ //}
+ //
+ ////测试 开发环境 充值测试
+ //@RabbitListener(queues = RabbitmqConstant.PAY_RECHARGE_QUEUE,containerFactory ="rabbitListenerContainerFactory")
+ //@Transactional(rollbackFor = Exception.class)
+ //public void listenerPayRechargeQueueMessage(@Payload RabbitmqPayRechargeMessage payAutoReturnMessage) {
+ // String s = UuidGeneratorUtil.generateUuidWithoutHyphen();
+ // //发送充值消息
+ // RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayRechargeReturnMessage.builder()
+ // .queue_id(payAutoReturnMessage.getQueue_id())
+ // .status(2)
+ // .amount(BigDecimal.valueOf(20))
+ // .chain(payAutoReturnMessage.getChain())
+ // .symbol(payAutoReturnMessage.getSymbol())
+ // .address(payAutoReturnMessage.getAddress())
+ // .tx_hash(s)
+ // .build();
+ // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage);
+ //
+ //
+ // //发送充值消息
+ // RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage1 = RabbitmqPayRechargeReturnMessage.builder()
+ // .queue_id(payAutoReturnMessage.getQueue_id())
+ // .status(1)
+ // .amount(BigDecimal.valueOf(20))
+ // .chain(payAutoReturnMessage.getChain())
+ // .symbol(payAutoReturnMessage.getSymbol())
+ // .address(payAutoReturnMessage.getAddress())
+ // .tx_hash(s)
+ // .build();
+ // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage1);
+ //}
+ //
+ ////提现
+ //@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())
+ // .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen())
+ // .fee(payAutoReturnMessage.getFee())
+ // .build();
+ // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage);
+ //}
////测试 开发环境 删除钱包测试
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java
new file mode 100644
index 0000000..eca0502
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java
@@ -0,0 +1,16 @@
+package com.m2pool.lease.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.m2pool.lease.entity.LeasePayRecordMessage;
+import com.m2pool.lease.entity.LeasePayRecordMessageInfo;
+
+/**
+ *
+ * service层支付
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+public interface LeasePayRecordMessageInfoService extends IService {
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java
new file mode 100644
index 0000000..c38b506
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java
@@ -0,0 +1,22 @@
+package com.m2pool.lease.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.m2pool.lease.entity.LeasePayRecordMessage;
+import com.m2pool.lease.entity.LeasePayRecordMessageInfo;
+import com.m2pool.lease.mapper.LeasePayRecordMessageInfoMapper;
+import com.m2pool.lease.mapper.LeasePayRecordMessageMapper;
+import com.m2pool.lease.service.LeasePayRecordMessageInfoService;
+import com.m2pool.lease.service.LeasePayRecordMessageService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * service层支付
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Service
+public class LeasePayRecordMessageInfoServiceImpl extends ServiceImpl implements LeasePayRecordMessageInfoService {
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java
index 3cbf152..dacd53a 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java
@@ -66,7 +66,7 @@ public class LeaseProductMachineServiceImpl extends ServiceImpl userMinersList = leaseProductMachineMapper.getUserMinersList(userId,userMinerVo.getCoin());
Map> collect = userMinersList.stream().collect(Collectors.groupingBy(UserMinerDto::getCoin));
return Result.success(collect);
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java
index 89efe42..efebdbc 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java
@@ -1,5 +1,6 @@
package com.m2pool.lease.service.impl;
+import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -158,8 +159,8 @@ public class LeaseProductServiceImpl extends ServiceImpl> payConfigMap = shopWalletInfo.stream()
.map(payConfigDto->{
- payConfigDto.setDeductibleAmount(CoinCharge.getChargeByChainAndCoin(payConfigDto.getPayChain(), payConfigDto.getPayCoin()));
+ payConfigDto.setDeductibleAmount(CoinCharge.getDeductibleAmountByChainAndCoin(payConfigDto.getPayChain(), payConfigDto.getPayCoin()));
+ payConfigDto.setFee(CoinCharge.getChargeByChainAndCoin(payConfigDto.getPayChain(), payConfigDto.getPayCoin()));
return payConfigDto;
})
.collect(Collectors.groupingBy(PayConfigDto::getShopId));
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java
index 8ee349b..49cae46 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java
@@ -56,7 +56,7 @@ public class LeaseUserOwnedProductServiceImpl extends ServiceImpl pageInfo = new PageInfo<>(leaseUserOwnedProducts);
if (leaseUserOwnedProducts.isEmpty()){
PageResult fail = PageResult.fail(null, "用户未购买商品");
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java
index ab42e59..ce0b7e9 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java
@@ -1,5 +1,6 @@
package com.m2pool.lease.service.impl;
+import cn.hutool.json.JSONUtil;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java
index d8ae1c6..b2cfddb 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java
@@ -3,16 +3,14 @@ package com.m2pool.lease.task;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.m2pool.common.core.utils.bean.BeanUtils;
import com.m2pool.lease.constant.PowerUnit;
import com.m2pool.lease.dto.*;
import com.m2pool.lease.entity.*;
import com.m2pool.lease.mapper.*;
import com.m2pool.lease.mq.message.RabbitmqDeleteWalletMessage;
import com.m2pool.lease.mq.message.RabbitmqPayAutoMessage;
-import com.m2pool.lease.service.LeaseOrderItemService;
-import com.m2pool.lease.service.LeasePayRecordMessageService;
-import com.m2pool.lease.service.LeaseProductService;
-import com.m2pool.lease.service.LeaseUserOwnedProductService;
+import com.m2pool.lease.service.*;
import com.m2pool.lease.utils.HashUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Configuration;
@@ -65,19 +63,19 @@ public class OrderAndPayTask {
@Resource
private LeaseAutoAddressMapper leaseAutoAddressMapper;
@Resource
- private LeaseProductService leaseProductService;
- @Resource
private LeaseShopConfigMapper leaseShopConfigMapper;
@Resource
private LeaseOrderItemService leaseOrderItemService;
+ @Resource
+ private LeasePayRecordMessageInfoService leasePayRecordMessageInfoService;
/**
* 检查钱包半年内是否有 支付,充值,提现操作
*/
- //@Scheduled(cron = "0 5 1 * * ? ")
- @Scheduled(cron = "0 0/1 * * * ? ")
+ @Scheduled(cron = "0 5 1 * * ? ")
+ //@Scheduled(cron = "0 0/1 * * * ? ")
@Transactional
public void checkOperator(){
//1.查询lease_auto_address 表 状态为1 已使用 的钱包
@@ -192,6 +190,7 @@ public class OrderAndPayTask {
RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder()
.queue_id(queueId)
.order_id(String.valueOf(orderId))
+ .shopId(leaseOrderItem.getShopId())
.chain(leaseOrderItem.getChain())
.symbol(leaseOrderItem.getSymbol())
.fee(orderInfo.getFee())
@@ -372,9 +371,9 @@ public class OrderAndPayTask {
//6.根据这些订单发送今天的支付消息到mq
if (!rabbitmqPayAutoMessages.isEmpty()){
- List collect = new ArrayList<>();
+ List collect = new ArrayList<>();
for (RabbitmqPayAutoMessage rabbitmqPayAutoMessage : rabbitmqPayAutoMessages) {
- collect.add( LeasePayRecordMessage.builder()
+ collect.add( LeasePayRecordMessageInfo.builder()
.orderId(rabbitmqPayAutoMessage.getOrder_id())
.orderNumber(rabbitmqPayAutoMessage.getQueue_id())
.queueId(rabbitmqPayAutoMessage.getQueue_id())
@@ -392,7 +391,7 @@ public class OrderAndPayTask {
.toSymbol(rabbitmqPayAutoMessage.getSymbol())
.build());
}
- leasePayRecordMessageService.saveBatch(collect);
+ leasePayRecordMessageInfoService.saveBatch(collect);
}
}
@@ -432,41 +431,29 @@ public class OrderAndPayTask {
}
- /**
- * 订单完成后---发送支付消息到mq 一个买家对应一个卖家
- * @param orderIds
- */
- public void sendMessageToMq(List orderIds){
- List leasePayRecordMessages = leasePayRecordMessageMapper.selectList(new LambdaQueryWrapper()
- .in(LeasePayRecordMessage::getOrderId, orderIds));
- List leaseOrderInfos = leaseOrderInfoMapper.selectList(new LambdaQueryWrapper()
- .select(LeaseOrderInfo::getFee,LeaseOrderInfo::getOrderNumber)
- .in(LeaseOrderInfo::getId, orderIds));
- Map feeMap = leaseOrderInfos.stream()
- .collect(Collectors.toMap(LeaseOrderInfo::getOrderNumber, LeaseOrderInfo::getFee));
- sendMessageToMq(leasePayRecordMessages,feeMap);
- }
-
/**
*订单完成后---发送支付消息到mq 一个买家对应一个卖家
- * @param leasePayRecordMessages
- * @param feeMap
+ * @param orderIds
*/
- public void sendMessageToMq(List leasePayRecordMessages,Map feeMap){
- Map> collect = leasePayRecordMessages.stream()
- .collect(Collectors.groupingBy(LeasePayRecordMessage::getOrderId));
+ public void sendMessageToMq(List orderIds){
+ List leasePayRecordMessages = leasePayRecordMessageInfoService.list(new LambdaQueryWrapper()
+ .in(LeasePayRecordMessageInfo::getOrderId, orderIds));
+ Map feeMap = getFee(orderIds);
+ Map> collect = leasePayRecordMessages.stream()
+ .collect(Collectors.groupingBy(LeasePayRecordMessageInfo::getOrderId));
+ List reocrdList = new ArrayList<>();
//遍历按订单id分组后的map
collect.forEach((orderId, payRecordMessagesList) -> {
long timestamp = System.currentTimeMillis()/1000;
- LeasePayRecordMessage initForm = payRecordMessagesList.get(0);
+ LeasePayRecordMessageInfo initForm = payRecordMessagesList.get(0);
RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder()
.queue_id(initForm.getQueueId())
.chain(initForm.getFromChain())
.symbol(initForm.getFromSymbol())
- .fee(feeMap.get(orderId))
.from_address(initForm.getFromAddress())
.to_address(initForm.getToAddress())
+ .fee(feeMap.get(orderId))
.amount(BigDecimal.ZERO)
.blockAmount(BigDecimal.ZERO)
.needAmount(BigDecimal.ZERO)
@@ -474,20 +461,55 @@ public class OrderAndPayTask {
.sign(HashUtils.sha256(timestamp))
.build();
- for (LeasePayRecordMessage leasePayRecordMessage : payRecordMessagesList) {
+ for (LeasePayRecordMessageInfo leasePayRecordMessage : payRecordMessagesList) {
build.setAmount(build.getAmount().add(leasePayRecordMessage.getRealAmount()));
build.setBlockAmount(build.getBlockAmount().add(leasePayRecordMessage.getBlockAmount()));
build.setNeedAmount(build.getNeedAmount().add(leasePayRecordMessage.getNeedAmount()));
}
+ LeasePayRecordMessage build1 = LeasePayRecordMessage.builder()
+ .queueId(initForm.getQueueId())
+ .fromAddress(initForm.getFromAddress())
+ .toAddress(initForm.getToAddress())
+ .orderNumber(initForm.getOrderNumber())
+ .orderId(orderId)
+ .shopId(initForm.getShopId())
+ .userId(initForm.getUserId())
+ .blockAmount(build.getBlockAmount())
+ .amount(build.getAmount())
+ .realAmount(build.getAmount())
+ .needAmount(build.getNeedAmount())
+ .fromSymbol(initForm.getFromSymbol())
+ .fromChain(initForm.getFromChain())
+ .toSymbol(initForm.getToSymbol())
+ .toChain(initForm.getToChain())
+ .build();
try {
rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build);
}catch (Exception e){
- System.out.println("消息发送失败(5分)"+e.getMessage());
+ //设置状态为消息发送失败
+ build1.setStatus(4);
+ System.out.println("消息发送失败"+e.getMessage());
+ }finally {
+ reocrdList.add(build1);
}
});
+ leasePayRecordMessageService.saveBatch(reocrdList);
}
+ /**
+ * 获取手续费
+ * @param orderIds
+ * @return
+ */
+ private Map getFee(List< Long> orderIds){
+ List leaseOrderInfos = leaseOrderInfoMapper.selectList(new LambdaQueryWrapper()
+ .select(LeaseOrderInfo::getFee,LeaseOrderInfo::getOrderNumber)
+ .in(LeaseOrderInfo::getId, orderIds));
+ return leaseOrderInfos.stream()
+ .collect(Collectors.toMap(LeaseOrderInfo::getOrderNumber, LeaseOrderInfo::getFee));
+ }
+
///**
// * 订单完成后---发送支付消息到mq 一个买家对应多个卖家
// * @param orderIds
@@ -546,15 +568,41 @@ public class OrderAndPayTask {
@Scheduled(cron = "0 0 0/1 * * ? ")
@Transactional
public void checkPushFailPayMessage(){
- //查找出状态为三 消息发送失败的订单 再次发送支付消息。直到成功为止
+ //查找出状态为3 校验失败 4 发送消息失败 的消息需要重发
List list = leasePayRecordMessageService.list(new LambdaQueryWrapper()
.eq(LeasePayRecordMessage::getStatus, 3)
- .ge(LeasePayRecordMessage::getCreateTime, LocalDateTime.now().minusHours(3)));
+ .ge(LeasePayRecordMessage::getCreateTime, LocalDateTime.now().minusHours(3))
+ .or().eq(LeasePayRecordMessage::getStatus, 4));
if (list.isEmpty()){
return;
}
- List orderIds = list.stream().map(leasePayRecordMessage-> Long.valueOf(leasePayRecordMessage.getOrderId())).distinct().collect(Collectors.toList());
- sendMessageToMq(orderIds);
+ List orderIds = list.stream().map(leasePayRecordMessage->Long.valueOf(leasePayRecordMessage.getOrderId())).collect(Collectors.toList());
+ Map feeMap = getFee(orderIds);
+ List againSendList = new ArrayList<>();
+ for (LeasePayRecordMessage leasePayRecordMessage : list) {
+ Long timestamp = System.currentTimeMillis()/1000;
+ RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder()
+ .queue_id(leasePayRecordMessage.getQueueId())
+ .order_id(leasePayRecordMessage.getOrderId())
+ .chain(leasePayRecordMessage.getFromChain())
+ .symbol(leasePayRecordMessage.getFromSymbol())
+ .from_address(leasePayRecordMessage.getFromAddress())
+ .to_address(leasePayRecordMessage.getToAddress())
+ .fee(feeMap.get(leasePayRecordMessage.getOrderId()))
+ .amount(leasePayRecordMessage.getAmount())
+ .timestamp(timestamp)
+ .sign(HashUtils.sha256(timestamp))
+ .build();
+ try {
+ rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build);
+ leasePayRecordMessage.setStatus(2);
+ againSendList.add(leasePayRecordMessage);
+ }catch (Exception e){
+ System.out.println("消息发送失败"+e.getMessage());
+ }
+ }
+ leasePayRecordMessageService.updateBatchById(againSendList);
+
}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java
index cc7dcdd..aa964b0 100644
--- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java
@@ -11,6 +11,8 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -73,7 +75,12 @@ public class RealPowerInsetTask {
public List getRealPower(String coin){
List leaseProductMachines = leaseProductMachineMapper.selectList(new LambdaQueryWrapper()
.eq(LeaseProductMachine::getDel, false));
- return leaseProductMachineMapper.getRecentlyFiveMinutesData(leaseProductMachines, coin);
+ List recentlyFiveMinutesData = leaseProductMachineMapper.getRecentlyFiveMinutesData(leaseProductMachines, coin);
+ for (ProductMachineDto recentlyFiveMinutesDatum : recentlyFiveMinutesData) {
+ recentlyFiveMinutesDatum.setComputingPower(recentlyFiveMinutesDatum.getComputingPower()
+ .divide(BigDecimal.valueOf(24 * 60 * 60),2, RoundingMode.HALF_UP));
+ }
+ return recentlyFiveMinutesData;
}
diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml
new file mode 100644
index 0000000..86f81c1
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, queue_id, from_address, to_address, amount, `to_chain`, to_symbol,from_chain,from_symbol, order_id,create_time, status, del
+
+
diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml
index fd9466e..5fa997f 100644
--- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml
+++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml
@@ -38,7 +38,17 @@
(from_address = #{item.fromAddress} AND `from_chain` = #{item.fromChain} AND from_symbol = #{item.fromSymbol})
)
AND create_time >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 6 MONTH) AND del = 0
- GROUP BY from_address, from_chain, from_symbol;
+ GROUP BY from_address, from_chain, from_symbol
+ UNION
+ SELECT DISTINCT from_address as fromAddress,from_chain as fromChain,from_symbol as fromSymbol, true AS hasOperator
+ FROM lease_pay_record_message_info
+ WHERE
+ (
+ (from_address = #{item.fromAddress} AND `from_chain` = #{item.fromChain} AND from_symbol = #{item.fromSymbol})
+ )
+ AND create_time >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 6 MONTH) AND del = 0
+ GROUP BY from_address, from_chain, from_symbol
+