productMachineDtoList;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/TransactionRecordDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/TransactionRecordDto.java
new file mode 100644
index 0000000..6d66de1
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/TransactionRecordDto.java
@@ -0,0 +1,118 @@
+package com.m2pool.lease.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 支付消息记录表
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(description = "交易流水返回对象",value = "TransactionRecordDto" )
+public class TransactionRecordDto {
+
+
+ /**
+ * 消息ID
+ */
+ @ApiModelProperty(value = "消息ID")
+ private String queueId;
+
+ /**
+ * 买家充值地址
+ */
+ @ApiModelProperty(value = "买家充值地址")
+ private String fromAddress;
+
+ /**
+ * 卖家地址(卖家自定义地址)
+ */
+ @ApiModelProperty(value = "提现流水:用户提现地址 充值流水:不需要该字段 支付流水:卖家收款地址")
+ private String toAddress;
+
+ /**
+ * 支付金额
+ */
+ @ApiModelProperty(value = "理论支付支付金额")
+ private BigDecimal amount;
+
+ /**
+ *实际支付金额(根据一天内预估算力和实际算力差值计算得来,并且已经真实支付成功的金额)
+ */
+ @ApiModelProperty(value = "实际支付金额(根据一天内预估算力和实际算力差值计算得来,并且已经真实支付成功的金额)")
+ private BigDecimal realAmount;
+
+ /**
+ * 钱包冻结金额
+ */
+ @ApiModelProperty(value = "钱包冻结金额")
+ private BigDecimal blockAmount;
+ /**
+ * 卖家钱包币种
+ */
+ @ApiModelProperty(value = "提现流水:用户提现钱包币种 充值流水:不需要该字段 支付流水:卖家收款钱包币种")
+ private String toSymbol;
+
+ /**
+ * 卖家钱包链名称
+ */
+ @ApiModelProperty(value = "提现流水:用户提现链链名称 充值流水:不需要该字段 支付流水:卖家收款链名称")
+ private String toChain;
+
+
+ /**
+ * 买家钱包币种
+ */
+ @ApiModelProperty(value = "买家钱包币种")
+ private String fromSymbol;
+
+ /**
+ * 买家钱包链名称
+ */
+ @ApiModelProperty(value = "买家钱包链名称")
+ private String fromChain;
+
+ /**
+ * 交易hash
+ */
+ @ApiModelProperty(value = "交易hash")
+ private String txHash;
+
+ /**
+ * 订单号
+ */
+ @ApiModelProperty(value = "订单号")
+ private String orderId;
+
+ /**
+ * 支付时间
+ */
+ @ApiModelProperty(value = "流水建立时间")
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ @ApiModelProperty(value = "成功/失败/证书校验失败时间")
+ private LocalDateTime updateTime;
+
+ /**
+ * 0 失败 1 成功 2 等待校验 3 证书校验失败
+ */
+ @ApiModelProperty(value = " 0 支付/充值/提现失败 1 支付/充值/提现成功 2 支付/充值/提现校验中 3 支付/充值/提现证书校验失败")
+ private Integer status;
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserDto.java
new file mode 100644
index 0000000..b5b9d9b
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserDto.java
@@ -0,0 +1,39 @@
+package com.m2pool.lease.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ * 用户返回对象
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(description = "用户返回对象",value = "UserDto" )
+public class UserDto{
+
+ private Long id;
+
+ /**
+ * 用户id(邮箱)
+ */
+ @ApiModelProperty(value = "用户id(邮箱)")
+ private String userId;
+
+ /**
+ * 密码
+ */
+ @ApiModelProperty(value = "密码")
+ private String password;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserMinerDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserMinerDto.java
new file mode 100644
index 0000000..1b7671d
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserMinerDto.java
@@ -0,0 +1,43 @@
+package com.m2pool.lease.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * 用户挖矿账户矿工返回对象
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(description = "用户挖矿账户矿工返回对象",value = "UserMinerDto" )
+public class UserMinerDto {
+ /**
+ * 挖矿机器 对应的矿工账号
+ */
+ @ApiModelProperty(value = "挖矿机器 对应的矿工账号")
+ private String user;
+ /**
+ * 挖矿机器编号
+ */
+ @ApiModelProperty(value = "挖矿机器编号")
+ private String miner;
+
+ @ApiModelProperty(value = "机器挖矿币种")
+ private String coin;
+
+ @ApiModelProperty(value = "实时算力(单位MH/S)")
+ private BigDecimal realPower;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserMinerPowerDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserMinerPowerDto.java
new file mode 100644
index 0000000..02bf571
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserMinerPowerDto.java
@@ -0,0 +1,48 @@
+package com.m2pool.lease.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 用户挖矿账户矿工返回对象
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(description = "用户挖矿账户矿工实时算力返回对象",value = "UserMinerPowerDto" )
+public class UserMinerPowerDto {
+ /**
+ * 挖矿机器 对应的矿工账号
+ */
+ @ApiModelProperty(value = "挖矿机器 对应的矿工账号")
+ private String user;
+ /**
+ * 挖矿机器编号
+ */
+ @ApiModelProperty(value = "挖矿机器编号")
+ private String miner;
+
+ @ApiModelProperty(value = "机器挖矿币种")
+ private String coin;
+
+ @ApiModelProperty(value = "机器算力")
+ private BigDecimal power;
+
+ @ApiModelProperty(value = "记录开始时间")
+ private LocalDateTime startTime;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserOwnedProductDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserOwnedProductDto.java
new file mode 100644
index 0000000..06af2ad
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserOwnedProductDto.java
@@ -0,0 +1,115 @@
+package com.m2pool.lease.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 用户拥有商品返回对象
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(value="UserOwnedProductDto", description="UserOwnedProductDto")
+public class UserOwnedProductDto {
+
+ @ApiModelProperty(value = "ID")
+ private Long id;
+
+ /**
+ * 用户ID(暂时使用租赁者钱包地址)
+ */
+ @ApiModelProperty(value = "用户id(邮箱)")
+ private String userId;
+
+ /**
+ * 商品对应的机器id
+ */
+ @ApiModelProperty(value = "商品对应的机器id")
+ private Long productMachineId;
+
+ /**
+ * 订单明细 ID,关联订单中的购买记录
+ */
+ @ApiModelProperty(value = "订单明细 ID,关联订单中的购买记录")
+ private Long orderItemId;
+
+ /**
+ * 商品开始使用时间(购买当天24点生效)
+ */
+ @ApiModelProperty(value = "商品开始使用时间(购买当天24点生效)")
+ private LocalDateTime startTime;
+
+ /**
+ * 商品使用结束时间
+ */
+ @ApiModelProperty(value = "商品使用结束时间")
+ private LocalDateTime endTime;
+
+ /**
+ * 购买算力的量,当 type 为 1 时有效
+ */
+ @ApiModelProperty(value = "购买算力的量,当 type 为 1 时有效")
+ private BigDecimal purchasedComputingPower;
+
+ /**
+ * 当前实时算力
+ */
+ @ApiModelProperty(value = "当前实时算力:单位默认MH/S")
+ private BigDecimal currentComputingPower;
+
+ /**
+ * 商品状态,0 表示运行中,1 表示已过期
+ */
+ @ApiModelProperty(value = "商品状态,0 表示运行中,1 表示已过期")
+ private Integer status;
+
+ /**
+ * 商品类型,0 表示挖矿机器,1 表示算力套餐
+ */
+ @ApiModelProperty(value = "商品类型,0 表示挖矿机器,1 表示算力套餐")
+ private Integer type;
+
+ /**
+ * 购买时间
+ */
+ @ApiModelProperty(value = "购买时间")
+ private LocalDateTime createTime;
+
+
+ /**
+ * 预估商品结束时的总收益
+ */
+ @ApiModelProperty(value = "预估商品结束时的总收益")
+ private BigDecimal estimatedEndIncome;
+
+
+ /**
+ * 预估商品结束时的总收益 单位usdt
+ */
+ @ApiModelProperty(value = "预估商品结束时的总收益 单位usdt")
+ private BigDecimal estimatedEndUsdtIncome;
+ /**
+ * 当前收益(根据购买机器到现在的平均算力计算得到)
+ */
+ @ApiModelProperty(value = "当前收益(根据购买机器到现在的平均算力计算得到)")
+ private BigDecimal currentIncome;
+
+ /**
+ * 当前收益(根据购买机器到现在的平均算力计算得到)单位usdt
+ */
+ @ApiModelProperty(value = "当前收益(根据购买机器到现在的平均算力计算得到)单位usdt")
+ private BigDecimal currentUsdtIncome;
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserWalletDataDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserWalletDataDto.java
new file mode 100644
index 0000000..3f17da0
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/UserWalletDataDto.java
@@ -0,0 +1,101 @@
+package com.m2pool.lease.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 用户钱包信息表
+ *
+ *
+ * @author 根据实际情况填写
+ * @since 2025-09-08
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(description = "用户钱包资料信息",value = "UserWalletDataDto")
+public class UserWalletDataDto {
+
+
+ @ApiModelProperty(value = "用户钱包信息id")
+ private Long id;
+
+ /**
+ * 钱包唯一id(用于充值功能)
+ */
+ private String queueId;
+
+ /**
+ * 用户id(邮箱)
+ */
+ @ApiModelProperty(value = "用户id(邮箱)")
+ private String userId;
+
+ /**
+ * 钱包地址
+ */
+ @ApiModelProperty(value = "充值钱包地址(我们提供")
+ private String fromAddress;
+
+
+ /**
+ * 钱包地址
+ */
+ @ApiModelProperty(value = "收款钱包地址(用户自己填写)")
+ private String toAddress;
+
+ /**
+ * 余额
+ */
+ @ApiModelProperty(value = "余额")
+ private BigDecimal balance;
+
+ @ApiModelProperty(value = "冻结余额,不能用于提现(用户购买机器完成租约所需金额)")
+ private BigDecimal blockedBalance;
+
+ /**
+ * 支付地址二维码
+ */
+ @ApiModelProperty(value = "支付地址二维码")
+ private String qrcode;
+
+ /**
+ * 币种
+ */
+ @ApiModelProperty(value = "用户自定义钱包地址的币种")
+ private String toSymbol;
+
+ /**
+ * 链名称
+ */
+ @ApiModelProperty(value = "用户自定义钱包地址的链名称")
+ private String toChain;
+
+
+ /**
+ * 币种
+ */
+ @ApiModelProperty(value = "官方自动绑定钱包地址的币种")
+ private String fromSymbol;
+
+ /**
+ * 链名称
+ */
+ @ApiModelProperty(value = "官方自动绑定钱包地址的链名称")
+ private String fromChain;
+
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "手续费")
+ private BigDecimal charge;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/GoogleInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/GoogleInfo.java
new file mode 100644
index 0000000..5f34cd4
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/GoogleInfo.java
@@ -0,0 +1,32 @@
+package com.m2pool.lease.entity;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Description 文件
+ * @Date 2024/6/14 15:57
+ * @Author dy
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class GoogleInfo implements Serializable {
+
+ /** 邮箱 */
+ private String email;
+
+ /** 谷歌验证码 */
+ private String secret;
+
+ /** 谷歌验证码 */
+ private int status;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseAutoAddress.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseAutoAddress.java
new file mode 100644
index 0000000..34c572c
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseAutoAddress.java
@@ -0,0 +1,58 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.m2pool.lease.dto.PageResult;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 矿池nexa机器实时平均算力 - 自动钱包地址表
+ *
+ *
+ * @author yyb
+ * @since 2025-09-04
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseAutoAddress implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 钱包地址
+ */
+ private String address;
+
+ /**
+ * 币种
+ */
+ private String fromSymbol;
+
+ /**
+ * 链名称
+ */
+ private String fromChain;
+ /**
+ * 0 未使用 1 已使用
+ */
+ private Integer status;
+
+ /**
+ * 绑定用户用户邮箱
+ */
+ private String bindUser;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseNexaMachineAvgPower.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseNexaMachineAvgPower.java
new file mode 100644
index 0000000..f46fffc
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseNexaMachineAvgPower.java
@@ -0,0 +1,60 @@
+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;
+
+/**
+ *
+ * 矿池nexa机器实时平均算力
+ *
+ *
+ * @author yyb
+ * @since 2025-07-29
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseNexaMachineAvgPower implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 挖矿账户
+ */
+ private String user;
+
+ /**
+ * 矿工
+ */
+ private String miner;
+
+ /**
+ * 记录开始时间
+ */
+ private LocalDateTime startTime;
+
+ /**
+ * 记录结束时间
+ */
+ private LocalDateTime endTime;
+
+ /**
+ * 实时平均算力
+ */
+ private BigDecimal realAvgPower;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseNexaMachinePower.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseNexaMachinePower.java
new file mode 100644
index 0000000..633d1b4
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseNexaMachinePower.java
@@ -0,0 +1,65 @@
+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-07-25
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseNexaMachinePower implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 挖矿账户
+ */
+ private String user;
+
+ /**
+ * 矿工
+ */
+ private String miner;
+
+ /**
+ * 记录时间(每五分钟整点)
+ */
+ private LocalDateTime date;
+
+ /**
+ * 五分钟一次的矿工矿机算力
+ */
+ private BigDecimal accepts;
+
+ /**
+ * 矿机在离线状态 离线offline 在线online
+ */
+ private String state;
+
+ /**
+ * 实际记录时间
+ */
+ private LocalDateTime lastSubmit;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseOrderInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseOrderInfo.java
new file mode 100644
index 0000000..0b658c7
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseOrderInfo.java
@@ -0,0 +1,69 @@
+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-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseOrderInfo implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 订单 ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 订单号
+ */
+ private String orderNumber;
+
+ /**
+ * 用户 ID
+ */
+ private String userId;
+
+ /**
+ * 订单总价
+ */
+ private BigDecimal totalPrice;
+
+ /**
+ * 订单状态,0 表示待支付,1 表示(全部)已支付,2 表示已取消 3售后状态 4已退款 5已超时 10 部分已支付
+ */
+ private Integer status;
+ /**
+ * 下单时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java
new file mode 100644
index 0000000..3da8efd
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseOrderItem.java
@@ -0,0 +1,163 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 订单明细表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseOrderItem implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 订单明细 ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 店铺 ID
+ */
+ private Long shopId;
+
+ /**
+ * 用户 ID(邮箱)
+ */
+ private String userId;
+ /**
+ * 订单 ID
+ */
+ private Long orderId;
+
+ /**
+ * 商品 ID
+ */
+ private Long productId;
+
+ /**
+ * 机器id
+ */
+ private Long productMachineId;
+
+ /**
+ * 矿工账号
+ */
+ private String user;
+
+ /**
+ * 矿机编号
+ */
+ private String miner;
+
+ /**
+ * 商品数量
+ */
+ private Integer quantity;
+
+ /**
+ * 收货地址(模拟)
+ */
+ private String address;
+
+
+ /**
+ *卖家地址链名称
+ */
+ private String chain;
+
+ /**
+ * 卖家地址支付币种
+ */
+ private String symbol;
+
+ private String fromAddress;
+
+ private String fromChain;
+
+ private String fromSymbol;
+
+ /**
+ * 租期
+ */
+ private Integer leaseTime;
+
+ /**
+ * 支付币种
+ */
+ private String payCoin;
+
+ /**
+ * 商品单价
+ */
+ private BigDecimal price;
+
+ /**
+ * 矿机挖矿币种 nexa rxd dgbo dgbq dgbs alph enx grs mona
+ */
+ private String coin;
+
+ /**
+ * 单机理论收益
+ */
+ private BigDecimal theoryIncome;
+
+ /**
+ * 单机预估实际收益
+ */
+ //private BigDecimal actualIncome;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+ /**
+ * 0 租约已过期 1 租约生效中
+ */
+ private Integer status;
+
+
+ /**
+ * 商品名称
+ */
+ private String name;
+ /**
+ * 商品图片路径
+ */
+ private String image;
+
+ /**
+ * 商品类型 0 矿机 1 算力
+ */
+ @TableField(exist = false)
+ private Integer type;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRechargeMessage.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRechargeMessage.java
new file mode 100644
index 0000000..cdb13b8
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRechargeMessage.java
@@ -0,0 +1,95 @@
+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 LeasePayRechargeMessage implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ *消息ID
+ */
+ private String queueId;
+
+
+ /**
+ * 充值地址
+ */
+ private String address;
+
+ /**
+ * 支付金额
+ */
+ private BigDecimal amount;
+ /**
+ * 币种
+ */
+ private String symbol;
+
+ /**
+ * 链名称
+ */
+ private String chain;
+
+ //
+ ///**
+ // * 币种
+ // */
+ //private String fromSymbol;
+ //
+ ///**
+ // * 链名称
+ // */
+ //private String fromChain;
+
+ /**
+ * 充值时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 交易hash
+ */
+ private String txHash;
+
+ /**
+ * 0 充值失败 1 充值成功 2 充值中
+ */
+ private Integer status;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessage.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessage.java
new file mode 100644
index 0000000..47fbcb8
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessage.java
@@ -0,0 +1,136 @@
+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 LeasePayRecordMessage 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;
+
+ /**
+ * 订单号
+ */
+ 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;
+
+ /**
+ * 订单id
+ */
+ private String orderId;
+
+ /**
+ * 支付时间
+ */
+ 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/entity/LeasePayWithdrawMessage.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayWithdrawMessage.java
new file mode 100644
index 0000000..30ac9ff
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayWithdrawMessage.java
@@ -0,0 +1,105 @@
+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 LeasePayWithdrawMessage 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;
+
+ /**
+ * 支付金额
+ */
+ private BigDecimal amount;
+
+ /**
+ * 交易hash
+ */
+ private String txHash;
+
+ /**
+ * 手续费
+ */
+ private BigDecimal serviceCharge;
+
+ /**
+ * 币种
+ */
+ private String toSymbol;
+
+ /**
+ * 链名称
+ */
+ private String toChain;
+
+
+ /**
+ * 币种
+ */
+ private String fromSymbol;
+
+ /**
+ * 链名称
+ */
+ private String fromChain;
+
+ /**
+ * 充值时间
+ */
+ 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/entity/LeasePaymentRecord.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePaymentRecord.java
new file mode 100644
index 0000000..daf1a5c
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePaymentRecord.java
@@ -0,0 +1,109 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 支付记录表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeasePaymentRecord implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 支付记录 ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 订单 ID
+ */
+ private Long orderId;
+
+ /**
+ * 店铺 ID
+ */
+ private Long shopId;
+
+ /**
+ * 商品 ID
+ */
+ private Long productId;
+
+ /**
+ * 支付方式,nexa rxd dgbo dgbq dgbs alph enx grs mona usdt usdc busd
+ */
+ private String payCoin;
+
+ /**
+ * 支付金额
+ */
+ private BigDecimal amount;
+
+ /**
+ * 已支付金额
+ */
+ private BigDecimal payAmount;
+
+ /**
+ * 支付状态0支付失败 1支付成功--全部货款已支付 2待支付 5支付已超时 10支付成功--已支付部分货款
+ */
+ private Integer status;
+
+ /**
+ * 支付地址
+ */
+ private String payAddress;
+
+ /**
+ * 交易hash(交易成功后会生成)
+ */
+ private String hash;
+
+
+ /**
+ * 买家钱包地址
+ */
+
+ @TableField("`from`")
+ private String from;
+
+ /**
+ * 支付二维码
+ */
+ private String qrcode;
+
+ /**
+ * 支付时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProduct.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProduct.java
new file mode 100644
index 0000000..36a0c16
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProduct.java
@@ -0,0 +1,115 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 商品表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseProduct implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 商品 ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 店铺id
+ */
+ private Long shopId;
+
+ /**
+ * 商品名称
+ */
+ private String name;
+
+ /**
+ * 商品图片路径
+ */
+ private String image;
+
+ /**
+ * 商品类型,0 挖矿机器套餐,1 算力套餐
+ */
+ private Integer type;
+
+ /**
+ * 上下架状态,0 上架,1 下架
+ */
+ private Integer state;
+
+ /**
+ * 最高价格
+ */
+ private BigDecimal maxPrice;
+
+ /**
+ * 最低价格
+ */
+ private BigDecimal minPrice;
+
+
+ /**
+ * 矿机挖矿币种 nexa rxd dgbo dgbq dgbs alph enx grs mona
+ */
+ private String coin;
+
+ /**
+ * 矿机挖矿币种全称
+ */
+ private String coinFullName;
+
+ /**
+ * 算法
+ */
+ private String algorithm;
+
+ /**
+ * 商品描述
+ */
+ private String description;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+ /**
+ * 销售机器数
+ */
+ private Integer saleNumber;
+
+ /**
+ * 总矿机数
+ */
+ private Integer totalMachineNumber;
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProductIncome.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProductIncome.java
new file mode 100644
index 0000000..fb8a232
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProductIncome.java
@@ -0,0 +1,60 @@
+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-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseProductIncome implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 收益记录 ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 用户拥有商品详情 ID,关联 lease_user_owned_product 表
+ */
+ private Long userOwnedProductId;
+
+ /**
+ * 预估商品结束时的总收益
+ */
+ private BigDecimal estimatedEndIncome;
+
+ /**
+ * 当前实际总收益
+ */
+ private BigDecimal currentActualIncome;
+
+ /**
+ * 记录创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 记录更新时间
+ */
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProductMachine.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProductMachine.java
new file mode 100644
index 0000000..064af81
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseProductMachine.java
@@ -0,0 +1,145 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 商品表对应的物品机器表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseProductMachine implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+
+ /**
+ * 店铺ID
+ */
+ private Long shopId;
+
+ /**
+ * 商品 ID
+ */
+ private Long productId;
+
+ /**
+ * 挖矿机器 对应的矿工账号
+ */
+ private String user;
+
+ /**
+ * 挖矿机器编号
+ */
+ private String miner;
+
+ /**
+ * 矿机挖矿币种 nexa rxd dgbo dgbq dgbs alph enx grs mona
+ */
+ private String coin;
+
+ /**
+ * 单机理论收入(每日)
+ */
+ private BigDecimal theoryIncome;
+
+ /**
+ * 单机预估实际收入(每日)
+ */
+ //private BigDecimal actualIncome;
+
+ /**
+ * 矿机型号
+ */
+ private String type;
+
+ /**
+ * 实际价格单价
+ */
+ private BigDecimal price;
+
+ /**
+ * 算力大小(计算得到,商家不能够自己添加和修改)
+ */
+ private BigDecimal computingPower;
+
+ /**
+ * 上下架状态,0 上架,1 下架
+ */
+ private Integer state;
+
+ /**
+ * 售出状态 0未售出 1已售出 2售出中
+ */
+ private Integer saleState;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+
+ /**
+ * 商品机器单机理论算力(卖方手动填写)
+ */
+ private BigDecimal theoryPower;
+
+ /**
+ * 商品机器单机算力单位
+ */
+ private String unit;
+
+
+ /**
+ * 功耗 单位kw/h
+ */
+ private BigDecimal powerDissipation;
+
+ /**
+ * 默认价格$ [ 功耗 * 电费 * 24 * (1 + 收益率) ]
+ */
+ private BigDecimal cost;
+
+
+ /**
+ * 电费 单位 $/度
+ */
+ //private BigDecimal electricityBill;
+
+ /**
+ * 收益率 单位 %
+ */
+ private BigDecimal incomeRate;
+
+ private Integer maxLeaseDays;
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShop.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShop.java
new file mode 100644
index 0000000..ae53b46
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShop.java
@@ -0,0 +1,74 @@
+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.time.LocalDateTime;
+
+/**
+ *
+ * 店铺表
+ *
+ *
+ * @author yyb
+ * @since 2025-08-05
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseShop implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 店铺ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 店铺拥有者邮箱
+ */
+ private String userEmail;
+
+ /**
+ * 店铺名称
+ */
+ private String name;
+
+ /**
+ * 店铺图片路径
+ */
+ private String image;
+
+ /**
+ * 店铺描述
+ */
+ private String description;
+
+ /**
+ * 商铺状态 0 待审核 1 审核通过(店铺开启) 2 店铺关闭 10 店铺开启
+ */
+ private Integer state;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShopAddressConfig.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShopAddressConfig.java
new file mode 100644
index 0000000..18799e8
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShopAddressConfig.java
@@ -0,0 +1,52 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 矿池nexa机器实时平均算力 - 商铺地址配置表
+ *
+ *
+ * @author yyb
+ * @since 2025-09-04
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseShopAddressConfig implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 买方账号id(邮箱)
+ */
+ private String userId;
+
+ /**
+ * 卖方收款钱包 每个买方对应一个地址(自动生成匹配)
+ */
+ private String address;
+
+ /**
+ * 商铺收款钱包二维码
+ */
+ private String qrcode;
+
+ /**
+ * 商铺ID
+ */
+ private Long shopId;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShopConfig.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShopConfig.java
new file mode 100644
index 0000000..eaa6d95
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShopConfig.java
@@ -0,0 +1,93 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 店铺商品配置表
+ *
+ *
+ * @author yyb
+ * @since 2025-08-05
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseShopConfig implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 配置ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 商铺ID
+ */
+ private Long shopId;
+
+ /**
+ * 商品 ID (商品id为0代表适用于店铺中所有商品)
+ */
+ private Long productId;
+
+ /**
+ * 链名称
+ */
+ private String chain;
+
+ /**
+ * nexa rxd dgbo dgbq dgbs alph enx grs mona usdt
+ */
+ private String payCoin;
+
+ /**
+ * 币种图标
+ */
+ private String payCoinImage;
+
+ /**
+ * 币种类型 0 虚拟币 1 稳定币
+ */
+ private Integer payType;
+
+ /**
+ * 卖方对应收款钱包
+ */
+ private String payAddress;
+
+ /**
+ * 支付二维码
+ */
+ private String qrcode;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+ @TableField(exist = false)
+ private BigDecimal price;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShoppingCart.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShoppingCart.java
new file mode 100644
index 0000000..0869570
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShoppingCart.java
@@ -0,0 +1,49 @@
+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.time.LocalDateTime;
+
+/**
+ *
+ * 购物车表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseShoppingCart implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 购物车 ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 用户 ID(邮箱)
+ */
+ private String userId;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShoppingCartInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShoppingCartInfo.java
new file mode 100644
index 0000000..bddee81
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseShoppingCartInfo.java
@@ -0,0 +1,64 @@
+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.time.LocalDateTime;
+
+/**
+ *
+ * 购物车详情表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-24
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseShoppingCartInfo implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 购物车ID
+ */
+ private Long cartId;
+
+ /**
+ * 商品 ID
+ */
+ private Long productId;
+
+ /**
+ * 商品机器ID
+ */
+ private Long productMachineId;
+
+ /**
+ * 租期
+ */
+ private Integer leaseTime;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUser.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUser.java
new file mode 100644
index 0000000..6955012
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUser.java
@@ -0,0 +1,55 @@
+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.time.LocalDateTime;
+
+/**
+ *
+ * 用户表
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseUser implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 用户ID(邮箱)
+ */
+ private String userId;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUserOwnedProduct.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUserOwnedProduct.java
new file mode 100644
index 0000000..853aac5
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUserOwnedProduct.java
@@ -0,0 +1,143 @@
+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-07-23
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseUserOwnedProduct implements Serializable {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 用户ID(暂时使用租赁者钱包地址)
+ */
+ private String userId;
+
+ private Long orderId;
+
+
+ /**
+ * 挖矿机器 对应的矿工账号
+ */
+ private String user;
+
+ /**
+ * 挖矿机器编号
+ */
+ private String miner;
+
+
+ /**
+ * 商品对应的机器id
+ */
+ private Long productMachineId;
+
+ /**
+ * 订单明细 ID,关联订单中的购买记录
+ */
+ private Long orderItemId;
+
+
+
+ /**
+ * 商品开始使用时间(购买当天24点生效)
+ */
+ private LocalDateTime startTime;
+
+ /**
+ * 商品使用结束时间
+ */
+ private LocalDateTime endTime;
+
+ /**
+ * 挖矿币种 nexa rxd dgbo dgbq dgbs alph enx grs mona
+ */
+ private String coin;
+
+ /**
+ * 购买算力的量,当 type 为 1 时有效
+ */
+ private BigDecimal purchasedComputingPower;
+
+
+ /**
+ * 预估商品结束时的总收益 单位币种
+ */
+ private BigDecimal estimatedEndIncome;
+
+
+ /**
+ * 预估商品结束时的总收益 单位usdt
+ */
+ private BigDecimal estimatedEndUsdtIncome;
+
+ /**
+ * 当前收益(根据购买机器到现在的平均算力计算得到) 单位币种
+ */
+ private BigDecimal currentIncome;
+
+
+ /**
+ * 当前收益(根据购买机器到现在的平均算力计算得到)单位usdt
+ */
+ private BigDecimal currentUsdtIncome;
+
+ private BigDecimal settleIncome ;
+
+ private BigDecimal settleUsdtIncome ;
+
+ /**
+ * 商品状态,0 表示运行中,1 表示已过期
+ */
+ private Integer status;
+
+ /**
+ * 商品类型,0 表示挖矿机器,1 表示算力套餐
+ */
+ private Integer type;
+
+ /**
+ * 卖方钱包地址
+ */
+ private String address;
+
+ /**
+ * 购买时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 逻辑删除字段
+ */
+ private Boolean del;
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUserWalletData.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUserWalletData.java
new file mode 100644
index 0000000..49b92b4
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseUserWalletData.java
@@ -0,0 +1,111 @@
+package com.m2pool.lease.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.sun.org.apache.xpath.internal.operations.Bool;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 用户钱包信息表
+ *
+ *
+ * @author 根据实际情况填写
+ * @since 2025-09-08
+ */
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class LeaseUserWalletData implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * ID
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+
+ /**
+ * 钱包唯一id(用于充值功能)
+ */
+ private String queueId;
+ /**
+ * 用户id(邮箱)
+ */
+ private String userId;
+
+ /**
+ * 充值钱包地址(我们提供)
+ */
+ private String fromAddress;
+
+ /**
+ * 收款钱包地址(用户自己填写)
+ */
+ private String toAddress;
+
+ /**
+ * 币种
+ */
+ private String toSymbol;
+
+ /**
+ * 链名称
+ */
+ private String toChain;
+
+
+ /**
+ * 币种
+ */
+ private String fromSymbol;
+
+ /**
+ * 链名称
+ */
+ private String fromChain;
+
+ /**
+ * 余额
+ */
+ private BigDecimal balance;
+
+ /**
+ * 冻结余额(用户购买机器完成租约所需金额)
+ */
+ private BigDecimal blockedBalance;
+
+ /**
+ * 支付地址二维码
+ */
+ private String qrcode;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+ /**
+ * 删除标识
+ */
+ private Boolean del;
+
+ @TableField(exist = false)
+ private Long shopId;
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/GlobalExceptionHandler.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..c0d046f
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/GlobalExceptionHandler.java
@@ -0,0 +1,49 @@
+package com.m2pool.lease.exception;
+
+import com.m2pool.lease.dto.Result;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理器,用于捕获并处理应用中抛出的异常。
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ /**
+ * 处理商品已出售异常,返回统一的错误结果。
+ *
+ * @param e 商品已出售异常对象
+ * @return 包含错误信息的统一结果对象
+ */
+ @ExceptionHandler(ProductSoldOutException.class)
+ public Result handleProductSoldOutException(ProductSoldOutException e) {
+ return Result.fail(e.getMessage());
+ }
+
+ @ExceptionHandler(PaymentException.class)
+ public Result handlePaymentException(PaymentException e) {
+ return Result.fail(e.getMessage());
+ }
+
+ @ExceptionHandler(OrderException.class)
+ public Result handleOrderException(OrderException e) {
+ return Result.fail(e.getMessage());
+ }
+
+ @ExceptionHandler(PayRechargeException.class)
+ public Result handleOrderException(PayRechargeException e) {
+ return Result.fail(e.getMessage());
+ }
+
+ /**
+ * 处理其他未明确捕获的异常,返回统一的错误结果。
+ *
+ * @param e 异常对象
+ * @return 包含错误信息的统一结果对象
+ */
+ @ExceptionHandler(Exception.class)
+ public Result handleException(Exception e) {
+ return Result.fail("系统异常,请稍后再试: " + e.getMessage());
+ }
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/OrderException.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/OrderException.java
new file mode 100644
index 0000000..a0efa10
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/OrderException.java
@@ -0,0 +1,10 @@
+package com.m2pool.lease.exception;
+
+/**
+ * 订单异常
+ */
+public class OrderException extends RuntimeException {
+ public OrderException(String message) {
+ super(message);
+ }
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/PayRechargeException.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/PayRechargeException.java
new file mode 100644
index 0000000..3732663
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/PayRechargeException.java
@@ -0,0 +1,10 @@
+package com.m2pool.lease.exception;
+
+/**
+ * 支付异常
+ */
+public class PayRechargeException extends RuntimeException {
+ public PayRechargeException(String message) {
+ super(message);
+ }
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/PaymentException.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/PaymentException.java
new file mode 100644
index 0000000..fb33400
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/PaymentException.java
@@ -0,0 +1,10 @@
+package com.m2pool.lease.exception;
+
+/**
+ * 支付异常
+ */
+public class PaymentException extends RuntimeException {
+ public PaymentException(String message) {
+ super(message);
+ }
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/ProductSoldOutException.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/ProductSoldOutException.java
new file mode 100644
index 0000000..40f1c02
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/ProductSoldOutException.java
@@ -0,0 +1,10 @@
+package com.m2pool.lease.exception;
+
+/**
+ * 商品已出售异常类,用于表示在添加订单时商品已被出售的异常情况。
+ */
+public class ProductSoldOutException extends RuntimeException {
+ public ProductSoldOutException(String message) {
+ super(message);
+ }
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseAutoAddressMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseAutoAddressMapper.java
new file mode 100644
index 0000000..e44af86
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseAutoAddressMapper.java
@@ -0,0 +1,25 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.UserWalletDataDto;
+import com.m2pool.lease.entity.LeaseAutoAddress;
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface LeaseAutoAddressMapper extends BaseMapper {
+ /**
+ * 获取一个未使用的地址
+ * @return
+ */
+ LeaseAutoAddress getOneStatusIsNoUse();
+
+
+ /**
+ * 获取所有有效的地址
+ * @return
+ */
+ List getValidAddress();
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseNexaMachineAvgPowerMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseNexaMachineAvgPowerMapper.java
new file mode 100644
index 0000000..260808b
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseNexaMachineAvgPowerMapper.java
@@ -0,0 +1,37 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.UserMinerDto;
+import com.m2pool.lease.entity.LeaseNexaMachineAvgPower;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 矿池nexa机器实时平均算力 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-29
+ */
+@Mapper
+public interface LeaseNexaMachineAvgPowerMapper extends BaseMapper {
+
+ /**
+ * 批量插入数据
+ *
+ * @param list
+ * @return
+ */
+ boolean insertBatchDatas(@Param("list") List list);
+
+ /**
+ * 根据用户和矿工查询数据
+ *
+ * @param userMinerList
+ * @return
+ */
+ List selectListByUserAndMiner(@Param("list") List userMinerList);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseNexaMachinePowerMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseNexaMachinePowerMapper.java
new file mode 100644
index 0000000..d4de42b
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseNexaMachinePowerMapper.java
@@ -0,0 +1,46 @@
+package com.m2pool.lease.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.common.datasource.annotation.HashRateDB;
+import com.m2pool.lease.dto.ProductMachineDto;
+import com.m2pool.lease.entity.LeaseNexaMachinePower;
+import com.m2pool.lease.entity.LeaseProductMachine;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 已售商品矿工实时算力表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-25
+ */
+@Mapper
+public interface LeaseNexaMachinePowerMapper extends BaseMapper {
+
+ /**
+ * 获取指定时间段内指定表内指定矿工的实时算力
+ * @param leaseProductMachines
+ * @param pointDate
+ * @param tableName
+ * @return
+ */
+ @HashRateDB
+ List getMachinePowerInHashRateById(@Param("leaseProductMachines") List leaseProductMachines, @Param("pointDate")Date pointDate, @Param("tableName") String tableName);
+
+ /**
+ * 获取3天内算力总和
+ * @param leaseProductMachines
+ * @param coin
+ * @return
+ */
+ @HashRateDB
+ List getMachineThreePower(@Param("leaseProductMachines") List leaseProductMachines, @Param("coin") String coin);
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderInfoMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderInfoMapper.java
new file mode 100644
index 0000000..220449d
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderInfoMapper.java
@@ -0,0 +1,58 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.common.datasource.annotation.Pool2DB;
+import com.m2pool.lease.dto.OrderInfoDto;
+import com.m2pool.lease.entity.LeaseOrderInfo;
+import com.m2pool.lease.entity.LeaseUserOwnedProduct;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ *
+ * 订单表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseOrderInfoMapper extends BaseMapper {
+
+ /**
+ * 根据订单状态查询订单(买家)
+ *
+ * @param status 订单状态
+ * @return 订单列表
+ */
+ List getOrdersByStatus(@Param("userId") String userId, @Param("status") Integer status);
+
+
+ /**
+ * 根据订单状态查询订单(卖家)
+ *
+ * @param status 订单状态
+ * @param ids 订单id集合
+ * @return 订单列表
+ */
+ List getOrdersByStatusForSeller( @Param("status") Integer status,@Param("ids") List ids);
+
+ /**
+ * 根据机器id集合查看订单详情信息
+ * @param ids
+ * @return
+ */
+ List getOrderItemsByMachineId(@Param("ids") List ids);
+
+ /**
+ * 获取需要付款的订单列表 状态为7 订单进行中的订单
+ * @return
+ */
+ List getNeedPayOrderList();
+
+ @Pool2DB
+ BigDecimal getCoinPrice(@Param("coin") String coin);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java
new file mode 100644
index 0000000..34b6412
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderItemMapper.java
@@ -0,0 +1,54 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.OrderStatusDto;
+import com.m2pool.lease.entity.LeaseOrderItem;
+import com.m2pool.lease.entity.LeasePaymentRecord;
+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;
+import java.util.Set;
+
+/**
+ *
+ * 订单明细表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseOrderItemMapper extends BaseMapper {
+
+ /**
+ * 获取订单状态为支付中的订单机器id
+ *
+ * @param list
+ * @return
+ */
+ List getMachineByOrderStatusIsPayInData(@Param("list") List list);
+
+ /**
+ *通过订单详情id找到订单id
+ * @param orderItemIds
+ * @return
+ */
+ List getOrderIds(@Param("orderItemIds") List orderItemIds);
+
+
+
+ List getOrderInfoStatus(@Param("orderIds") List orderIds);
+
+
+
+ /**
+ * 通过订单详情id找到订单id
+ * @param itemIds
+ * @return
+ */
+ List selectOrderInfoIds(@Param("itemIds") Set itemIds);
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRechargeMessageMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRechargeMessageMapper.java
new file mode 100644
index 0000000..aab431b
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRechargeMessageMapper.java
@@ -0,0 +1,76 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.*;
+import com.m2pool.lease.entity.LeasePayRechargeMessage;
+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;
+
+/**
+ *
+ * 充值业务mapper层
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Mapper
+public interface LeasePayRechargeMessageMapper extends BaseMapper {
+
+ /**
+ * 获取充值记录列表
+ *
+ * @param walletList 钱包集合
+ * @param status
+ * @return
+ */
+ @Deprecated
+ List balanceRechargeList(@Param("walletList") List walletList, @Param("status") Integer status);
+
+ /**
+ * 获取近半年是否有充值记录
+ *
+ * @param fromAddress
+ * @return
+ */
+ boolean checkRechargeOperator(@Param("fromAddress") String fromAddress);
+
+ /**
+ * 批量获取近半年是否有充值记录
+ *
+ * @param fromAddressList
+ * @return
+ */
+ @MapKey("fromAddress")
+ Map checkRechargeOperatorBatch(@Param("list") List fromAddressList);
+
+ /**
+ * 交易流水---充值
+ *
+ * @param walletList
+ * @return
+ */
+ List transactionRecord(@Param("walletList") List walletList);
+
+
+ /**
+ * 最近交易
+ *
+ * @param walletList
+ * @return
+ */
+ List getRecentlyTransaction(@Param("walletList") List walletList);
+
+ /**
+ * 根据唯一索引修改或删除
+ *
+ * @param leasePayRechargeMessage
+ * @return
+ */
+ int saveOrUpdateByIndex(@Param("leasePayRechargeMessage") LeasePayRechargeMessage leasePayRechargeMessage);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageMapper.java
new file mode 100644
index 0000000..6972983
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageMapper.java
@@ -0,0 +1,82 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.*;
+import com.m2pool.lease.entity.LeasePayRecordMessage;
+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;
+import java.util.Set;
+
+/**
+ *
+ * LeasePayRecordMessageMapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Mapper
+public interface LeasePayRecordMessageMapper extends BaseMapper {
+ /**
+ * 检查用户半年内是否有支付操作
+ * @param fromAddress
+ * @return
+ */
+ boolean checkPayOperator(@Param("fromAddress") String fromAddress);
+
+
+ /**
+ * 检查用户批量是否有支付操作
+ * @param fromAddressList
+ * @return
+ */
+ @MapKey("fromAddress")
+ Map checkPayOperatorBatch(@Param("list") List fromAddressList);
+
+ /**
+ * 批量查询用户余额支付列表
+ * @param walletList
+ * @param status
+ * @return
+ */
+
+ List balancePayList(@Param("walletList") List walletList, @Param("status") Integer status);
+
+ /**
+ * 交易流水---支付
+ * @param walletList
+ * @return
+ */
+ List transactionRecord(@Param("walletList") List walletList);
+
+
+ /**
+ * 最近交易
+ * @param walletList
+ * @return
+ */
+ List getRecentlyTransaction(@Param("walletList") List walletList);
+
+
+ /**
+ * 根据订单id 查询当天支付状态
+ * @param orderInfoIds
+ * @return
+ */
+ @MapKey("orderId")
+ Map selectOrderInfoMap(@Param("orderInfoIds") Set orderInfoIds);
+
+
+ /**
+ * 保存或者更新根据txHash
+ * @param leasePayRecordMessage
+ * @return
+ */
+ int updateByTxHash(@Param("leasePayRecordMessage") LeasePayRecordMessage leasePayRecordMessage,@Param("txHash") String txHash);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayWithdrawMessageMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayWithdrawMessageMapper.java
new file mode 100644
index 0000000..07da8d4
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayWithdrawMessageMapper.java
@@ -0,0 +1,77 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.*;
+import com.m2pool.lease.entity.LeasePayWithdrawMessage;
+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;
+
+/**
+ *
+ * 提现mapper层
+ *
+ *
+ * @author yyb
+ * @since 2025-09-10
+ */
+@Mapper
+public interface LeasePayWithdrawMessageMapper extends BaseMapper {
+
+ /**
+ * 获取提现记录列表
+ *
+ * @param walletList 钱包集合
+ * @param status
+ * @return
+ */
+ @Deprecated
+ List balanceWithdrawList(@Param("walletList") List walletList,
+ @Param("status") Integer status);
+
+
+ /**
+ * 检查用户半年内是否有提现操作
+ * @param fromAddress
+ * @return
+ */
+ boolean checkWithdrawOperator(@Param("fromAddress") String fromAddress);
+
+
+ /**
+ * 检查用户半年内是否有提现操作
+ * @param fromAddressList
+ * @return
+ */
+ @MapKey("fromAddress")
+ Map checkWithdrawOperatorBatch(@Param("list") List fromAddressList);
+
+ /**
+ * 交易流水---提现
+ *
+ * @param walletList
+ * @return
+ */
+ List transactionRecord(@Param("walletList") List walletList);
+
+ /**
+ * 最近交易
+ *
+ * @param walletList
+ * @return
+ */
+ List getRecentlyTransaction(@Param("walletList") List walletList);
+
+
+ /**
+ * 获取最近一条数据的提现状态
+ *
+ * @param fromAddress
+ * @return
+ */
+ Integer getRecentlyOneData(@Param("fromAddress") String fromAddress,@Param("chain")String chain);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePaymentRecordMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePaymentRecordMapper.java
new file mode 100644
index 0000000..b09368e
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePaymentRecordMapper.java
@@ -0,0 +1,48 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.mq.message.RabbitmqOrderMessage;
+import com.m2pool.lease.entity.LeasePaymentRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 支付记录表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeasePaymentRecordMapper extends BaseMapper {
+
+ /**
+ * 检查订单支付状态
+ *
+ * @param message
+ * @return
+ */
+ List checkPaymentRecordStatus(@Param("list") List message);
+
+ /**
+ * 批量更新订单支付状态
+ *
+ * @param list
+ * @return
+ */
+ int updateBatchStatusForOderIdAndShopId(@Param("list") List list);
+
+
+ /**
+ * 查询最近15分钟处于支付中的订单
+ * @return
+ */
+ List getIsPayInData();
+
+
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductIncomeMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductIncomeMapper.java
new file mode 100644
index 0000000..a0154c1
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductIncomeMapper.java
@@ -0,0 +1,18 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.entity.LeaseProductIncome;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 商品收益表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseProductIncomeMapper extends BaseMapper {
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductMachineMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductMachineMapper.java
new file mode 100644
index 0000000..60b1edb
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductMachineMapper.java
@@ -0,0 +1,105 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.common.datasource.annotation.HashRateDB;
+import com.m2pool.common.datasource.annotation.Pool2DB;
+import com.m2pool.lease.dto.PriceDto;
+import com.m2pool.lease.dto.ProductMachineDto;
+import com.m2pool.lease.dto.UserMinerDto;
+import com.m2pool.lease.entity.LeaseProductMachine;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 商品表对应的物品机器表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseProductMachineMapper extends BaseMapper {
+
+
+ /**
+ * 获取当前账户对应的挖矿账户
+ *
+ * @param userId 账户ID
+ * @return 挖矿账户集合
+ */
+ @Pool2DB
+ List getUserMinersList(@Param("userId") String userId, @Param("coin") String coin);
+
+ /**
+ * 根据机器ID集合获取机器信息
+ *
+ * @param machineIds 机器ID集合
+ * @return 机器信息集合
+ */
+ List getMachinesByIds(@Param("machineIds") List machineIds);
+
+ /**
+ * 创建订单业务----修改乐观锁(sale_state 改为 2 售出中)
+ * @param machineIds
+ * @return
+ */
+ int updateLockState(@Param("machineIds") List machineIds);
+
+ /**
+ * 获取当前账户对应的挖矿账户的机器矿工集合 (1天内有过算力的才能上架)
+ *
+ * @param user 账户ID
+ * @param coin 币种
+ * @return 挖矿账户的机器矿工集合
+ */
+ @Pool2DB
+ List getMinerMachines(@Param("user") String user, @Param("coin") String coin);
+
+ /**
+ * 获取当前账户对应的挖矿账户的已经上架正在售出或已售出的机器矿工
+ *
+ * @param user 账户ID
+ * @param coin 币种
+ * @return 挖矿账户的机器矿工集合
+ */
+ List getMinerMachinesIsSale(@Param("user") String user, @Param("coin") String coin);
+
+ /**
+ * 获取商品价格范围
+ *
+ * @param productId 商品ID
+ * @return 商品价格范围
+ */
+ PriceDto getPriceRange(@Param("productId") Long productId);
+
+
+ @Pool2DB
+ List getRecentlyFiveMinutesData(@Param("leaseProductMachines") List leaseProductMachines, @Param("coin") String coin);
+
+
+
+ int saveOrUpdateBatchs(@Param("leaseProductMachines") List leaseProductMachines);
+
+
+ /**
+ * 检测当前商铺是否有已售出机器
+ *
+ * @param shopId 商家ID
+ * @return 检测结果
+ */
+ int checkHasSaleMachineByShopId(@Param("shopId") Long shopId);
+
+ /**
+ * 检测当前商品是否存在已售出机器
+ *
+ * @param productId 商品ID
+ * @return 检测结果
+ */
+ int checkHasSaleMachineByProductId(@Param("productId") Long productId);
+
+
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductMapper.java
new file mode 100644
index 0000000..c545eaa
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseProductMapper.java
@@ -0,0 +1,59 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.common.datasource.annotation.Pool2DB;
+import com.m2pool.lease.dto.ProductDto;
+import com.m2pool.lease.entity.LeaseProduct;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ *
+ * 商品表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseProductMapper extends BaseMapper {
+
+ /**
+ * 获取近三天币种对应的全网算力
+ * @param coin
+ * @return
+ */
+ @Pool2DB
+ BigDecimal getCoinNetPower(@Param("coin") String coin);
+
+
+ /**
+ * 获取近三天的全网实际报块数
+ * @param coin
+ * @return
+ */
+ @Pool2DB
+ BigDecimal getNetBlocks(@Param("coin") String coin);
+
+
+ /**
+ * 获取商品列表(弃用)
+ * @param coin
+ * @param algorithm
+ * @return
+ */
+ List getProductList(@Param("coin") String coin , @Param("algorithm") String algorithm);
+
+
+ /**
+ * 用户个人中心 和 首页商城 商品列表获取
+ * @param coin 用于商城首页
+ * @param algorithm 用于商城首页
+ * @param shopId 用于个人中心商品列表
+ * @return
+ */
+ List getProductListForShopAndUserCenter(@Param("coin") String coin , @Param("algorithm") String algorithm,@Param("shopId") Long shopId);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopAddressConfigMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopAddressConfigMapper.java
new file mode 100644
index 0000000..4bfc126
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopAddressConfigMapper.java
@@ -0,0 +1,10 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.entity.LeaseShopAddressConfig;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface LeaseShopAddressConfigMapper extends BaseMapper {
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java
new file mode 100644
index 0000000..4b7d5fd
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java
@@ -0,0 +1,42 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.*;
+import com.m2pool.lease.entity.LeaseShopConfig;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 店铺商品配置表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-08-05
+ */
+public interface LeaseShopConfigMapper extends BaseMapper {
+ /**
+ * 获取链和币种
+ * @return
+ */
+ List getChainAndList(@Param("chain") String chain);
+
+ List getChainAndListForSeller(@Param("shopId") Long shopId);
+
+ /**
+ * 更具链名称和币种名称获取币种图标
+ * @param chain
+ * @param coinList
+ * @return
+ */
+ List getCoinIconByChainAndCoin(@Param("chain") String chain, @Param("coinList") List coinList);
+
+ /**
+ * 根据店铺id和链名称和币种获取店铺配置(包含已删除的配置)
+ * @param list
+ * @return
+ */
+ List selectShopConfigByShopIdAndSymbolAndChain(@Param("list") List list);
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopMapper.java
new file mode 100644
index 0000000..71d232e
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopMapper.java
@@ -0,0 +1,52 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.PayConfigDto;
+import com.m2pool.lease.entity.LeaseProductMachine;
+import com.m2pool.lease.entity.LeaseShop;
+import com.m2pool.lease.entity.LeaseShopConfig;
+import com.m2pool.lease.vo.OrderInfoVo;
+import com.m2pool.lease.vo.OrderItemVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * 店铺表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-08-05
+ */
+@Mapper
+public interface LeaseShopMapper extends BaseMapper {
+
+ /**
+ * 获取买家自定义的支付地址和支付币种和链
+ * @param shopIds
+ * @param coin
+ * @param chain
+ * @return
+ */
+ List getPayAddressAndPayCoin(@Param("shopIds") Set shopIds,@Param("coin") String coin,@Param("chain") String chain);
+
+
+ /**
+ * 获取单个店铺钱包信息
+ * @param shopId
+ * @return
+ */
+ List getShopWalletInfo(@Param("shopId") Long shopId);
+
+
+ /**
+ * 获取多个店铺钱包信息
+ * @param shopIds
+ * @return
+ */
+ List getShopWalletInfoList(@Param("shopIds") List shopIds);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShoppingCartInfoMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShoppingCartInfoMapper.java
new file mode 100644
index 0000000..ec7842e
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShoppingCartInfoMapper.java
@@ -0,0 +1,38 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.ShoppingCartInfoDto;
+import com.m2pool.lease.entity.LeaseShoppingCartInfo;
+import com.m2pool.lease.vo.ProductAndMachineVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 购物车详情表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-24
+ */
+@Mapper
+public interface LeaseShoppingCartInfoMapper extends BaseMapper {
+
+ /**
+ * 查询购物车详情列表
+ * @return
+ */
+ List getCartInfoList(@Param("cartId") Long cartId);
+
+
+
+ /**
+ * 批量删除购物车详情数据
+ * @param cartId
+ * @param productAndMachineVos
+ * @return
+ */
+ int deleteBatchData(@Param("cartId") Long cartId,@Param("productAndMachineVos") List productAndMachineVos);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShoppingCartMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShoppingCartMapper.java
new file mode 100644
index 0000000..ea3518e
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShoppingCartMapper.java
@@ -0,0 +1,18 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.entity.LeaseShoppingCart;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 购物车表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseShoppingCartMapper extends BaseMapper {
+
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java
new file mode 100644
index 0000000..500fc0e
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java
@@ -0,0 +1,22 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.common.datasource.annotation.GAuth;
+import com.m2pool.lease.entity.GoogleInfo;
+import com.m2pool.lease.entity.LeaseUser;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ *
+ * 用户表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseUserMapper extends BaseMapper {
+ @GAuth
+ public GoogleInfo getGoogleInfoByEmail(@Param("email") String email);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserOwnedProductMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserOwnedProductMapper.java
new file mode 100644
index 0000000..6be0e85
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserOwnedProductMapper.java
@@ -0,0 +1,61 @@
+package com.m2pool.lease.mapper;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.common.datasource.annotation.Pool2DB;
+import com.m2pool.lease.dto.HourIncomeDto;
+import com.m2pool.lease.dto.UserMinerDto;
+import com.m2pool.lease.dto.UserMinerPowerDto;
+import com.m2pool.lease.entity.LeaseUserOwnedProduct;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ *
+ * 用户拥有商品详情表 Mapper 接口
+ *
+ *
+ * @author yyb
+ * @since 2025-07-23
+ */
+@Mapper
+public interface LeaseUserOwnedProductMapper extends BaseMapper {
+ /**
+ * 获取已生效商品机器id集合
+ * @param beginOfDay
+ * @return
+ */
+ List getProductMachineIds(@Param("beginOfDay") DateTime beginOfDay);
+
+
+ /**
+ * 获取小时收益列表
+ * @param coin
+ * @param start
+ * @param end
+ * @return
+ */
+ @Pool2DB
+ List getHourIncomeList(@Param("list") List list,@Param("coin") String coin, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end);
+
+
+ /**
+ * 批量更新收益
+ * @param list
+ * @return
+ */
+ int updateBatchIncome(@Param("list") List list);
+
+
+ /**
+ * 获取矿机实时算力(30m)
+ * @param list
+ * @param coin
+ * @return
+ */
+ @Pool2DB
+ List getUserMinerPower(@Param("list")List list,@Param("coin") String coin);
+}
diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java
new file mode 100644
index 0000000..8c02bc2
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java
@@ -0,0 +1,43 @@
+package com.m2pool.lease.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.m2pool.lease.dto.UserWalletDataDto;
+import com.m2pool.lease.entity.LeaseUserWalletData;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Mapper
+public interface LeaseUserWalletDataMapper extends BaseMapper {
+
+ /**
+ * 根据用户 ID 查询钱包信息
+ * @param userId 用户 ID
+ * @return 钱包信息
+ */
+ List selectByUserId(@Param("userId") String userId);
+
+ /**
+ * 根据钱包地址查询钱包信息
+ * @param address 钱包地址
+ * @return 钱包信息
+ */
+ UserWalletDataDto getWalletInfoByAddress(@Param("address") String address,@Param("symbol") String symbol,@Param("userId") String userId);
+
+ /**
+ * 根据链查询钱包信息
+ * @param chain 链
+ * @return 钱包信息
+ */
+ List getWalletInfoByChain(@Param("chain") String chain,@Param("userId") String userId);
+
+
+ /**
+ * 获取余额为 不为0 的钱包地址
+ * @param chain 链
+ * @return 钱包地址
+ */
+ List getWalletForBalanceIsZero(@Param("list") List addressList);
+}
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
new file mode 100644
index 0000000..71ebddf
--- /dev/null
+++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java
@@ -0,0 +1,483 @@
+package com.m2pool.lease.mq;
+
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.m2pool.common.core.utils.StringUtils;
+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.*;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+public class MessageReceiver {
+
+ @Resource
+ private LeasePayWithdrawMessageMapper leasePayWithdrawMessageMapper;
+ @Resource
+ private LeasePayRechargeMessageMapper leasePayRechargeMessageMapper;
+ @Resource
+ private LeaseUserWalletDataMapper leaseUserWalletDataMapper;
+ @Resource
+ private LeasePayRecordMessageMapper leasePayRecordMessageMapper;
+ @Resource
+ private LeaseAutoAddressMapper leaseAutoAddressMapper;
+
+ @Resource
+ private RabbitTemplate rabbitTemplate;
+ ///**
+ // * 订单超时 消费者
+ // */
+ //@RabbitListener(queues = RabbitmqConstant.DEAD_LETTER_QUEUE_NAME)
+ //@Transactional(rollbackFor = Exception.class)
+ //public void orderOvertimeMessage(@Payload List message /**,Message amqpMessage */) {
+ // List leasePaymentRecords = leasePaymentRecordMapper.checkPaymentRecordStatus(message);
+ // List collect = leasePaymentRecords.stream()
+ // .filter(record -> record.getStatus() == 6)
+ // .peek(record-> record.setStatus(5))
+ // .collect(Collectors.toList());
+ // System.out.println("订单超时消费者"+collect);
+ // if (!collect.isEmpty()){
+ // //1. 修改支付订单状态为 6支付中 状态改为 5 订单已超时
+ // boolean b = leasePaymentRecordService.updateBatchById(collect);
+ // //2. 修改普通订单状态 6支付中 状态改为 5 订单已超时(普通订单和支付订单是同时创建的,所以用的同一个消息)
+ // Long orderId = collect.get(0).getOrderId();
+ // int i = leaseOrderInfoMapper.updateById(LeaseOrderInfo.builder().id(orderId).status(5).build());
+ // //3.修改该订单下状态为售出中的机器为可售出状态
+ // List orderStatusIsPayInData = leaseOrderItemMapper.getMachineByOrderStatusIsPayInData(leasePaymentRecords);
+ // //这里只更新机器售出状态为2 售出中的机器
+ // int update = leaseProductMachineMapper.update(LeaseProductMachine.builder().saleState(0).build(),
+ // new LambdaQueryWrapper()
+ // .eq(LeaseProductMachine::getSaleState, 2).in(LeaseProductMachine::getId, orderStatusIsPayInData));
+ //
+ // }
+ // //try {
+ // // // 手动确认消息
+ // // channel.basicAck(amqpMessage.getMessageProperties().getDeliveryTag(), false);
+ // //} catch (Exception e) {
+ // // try {
+ // // // 拒绝消息,不重新入队
+ // // channel.basicReject(amqpMessage.getMessageProperties().getDeliveryTag(), false);
+ // // } catch (IOException ioException) {}
+ // //}
+ //}
+
+
+ /**
+ * 支付 消费者
+ * @param payAutoReturnMessage
+ */
+ @RabbitListener(queues = RabbitmqConstant.PAY_AUTO_RETURN_QUEUE,containerFactory ="rabbitListenerContainerFactory")
+ @Transactional(rollbackFor = Exception.class)
+ public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoReturnMessage payAutoReturnMessage) {
+ System.out.println("支付消费者"+JSONUtil.toJsonPrettyStr(payAutoReturnMessage));
+ //查找到数据库对应的充值记录
+ List leasePayRecordMessages = leasePayRecordMessageMapper.
+ selectList(new LambdaQueryWrapper()
+ .eq(LeasePayRecordMessage::getQueueId, payAutoReturnMessage.getQueue_id()));
+ Map collect = leasePayRecordMessages.stream()
+ .collect(Collectors.toMap(LeasePayRecordMessage::getOrderId, Function.identity()));
+ //买家钱包
+ List transactions = payAutoReturnMessage.getTransactions();
+ RabbitmqPayAutoReturnInfoMessage rabbitmqPayAutoReturnInfoMessage = transactions.get(0);
+ LeaseUserWalletData buyer = leaseUserWalletDataMapper.selectOne(new LambdaQueryWrapper()
+ .eq(LeaseUserWalletData::getFromAddress,rabbitmqPayAutoReturnInfoMessage.getFrom_address())
+ .eq(LeaseUserWalletData::getFromChain, rabbitmqPayAutoReturnInfoMessage.getChain())
+ .eq(LeaseUserWalletData::getFromSymbol, rabbitmqPayAutoReturnInfoMessage.getSymbol())
+ .eq(LeaseUserWalletData::getDel, false)
+ );
+ //获取初始余额和冻结余额
+ BigDecimal initBalance = buyer.getBalance();
+ BigDecimal initBlockBalance = buyer.getBlockedBalance();
+
+ transactions.forEach(transaction -> {
+ LeasePayRecordMessage leasePayRecordMessage = collect.get(transaction.getOrder_id());
+
+ if (leasePayRecordMessage != null){
+ BigDecimal balance = buyer.getBalance().subtract(transaction.getAmount());
+ BigDecimal blockBalance = buyer.getBlockedBalance().subtract(leasePayRecordMessage.getBlockAmount());
+
+ leasePayRecordMessage.setUpdateTime(LocalDateTime.now());
+ leasePayRecordMessage.setBlockHeight(transaction.getBlock_height());
+ leasePayRecordMessage.setRealAmount(transaction.getAmount());
+ //当天已存在支付的信息
+ leasePayRecordMessage.setStatus(transaction.getStatus());
+ leasePayRecordMessage.setTxHash(transaction.getTx_hash());
+ if(transaction.getStatus() == 1){
+ //支付成功 买家 钱包总余额 + 冻结余额 减少 卖家 钱包总余额增加
+ buyer.setBalance(balance);
+ buyer.setBlockedBalance(blockBalance);
+ }
+ if (transaction.getStatus() == 0){
+ buyer.setBlockedBalance(blockBalance);
+ }
+ //修改支付记录状态
+ //int i = leasePayRecordMessageMapper.updateByTxHash(leasePayRecordMessage,transaction.getTx_hash());
+ System.out.println("支付成功"+JSONUtil.toJsonPrettyStr(leasePayRecordMessage) + transaction.getTx_hash());
+ int i = leasePayRecordMessageMapper.updateById(leasePayRecordMessage);
+ if (i < 1){
+ throw new PayRechargeException("支付失败,该支付记录已修改,消息重试!!!");
+ }
+ }
+
+ });
+ //使用乐观锁防止余额少减少
+ int update = leaseUserWalletDataMapper.update(buyer, new LambdaQueryWrapper()
+ .eq(LeaseUserWalletData::getId, buyer.getId())
+ .eq(LeaseUserWalletData::getBalance, initBalance)
+ .eq(LeaseUserWalletData::getBlockedBalance, initBlockBalance)
+ );
+ if (update < 1){
+ throw new PayRechargeException("支付失败,余额金额错误,消息重试!!!");
+ }
+ }
+
+
+
+ /**
+ * 余额充值 消费者 (正常流程一笔充值会有两个消息 2 充值中 1充值成功)
+ * @param payRechargeReturnMessage
+ */
+ @RabbitListener(queues = RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,containerFactory ="rabbitListenerContainerFactory")
+ @Transactional(rollbackFor = Exception.class)
+ public void listenerPayRechargeStatusQueueMessage(@Payload RabbitmqPayRechargeReturnMessage payRechargeReturnMessage) {
+ System.out.println("充值消费者---"+JSONUtil.toJsonPrettyStr(payRechargeReturnMessage));
+
+ //获取到需要操作的钱包
+ List leaseUserWalletDataList = leaseUserWalletDataMapper.selectList(new LambdaQueryWrapper()
+ .eq(LeaseUserWalletData::getFromAddress, payRechargeReturnMessage.getAddress())
+ .eq(LeaseUserWalletData::getDel, false)
+ );
+ LeaseUserWalletData leaseUserWalletData = null;
+ for (LeaseUserWalletData item : leaseUserWalletDataList) {
+ if (item.getFromSymbol().equals(payRechargeReturnMessage.getSymbol())){
+ leaseUserWalletData = item;
+ break;
+ }
+ }
+ //需要新增该币种的钱包
+ if (leaseUserWalletData == null){
+ LeaseUserWalletData leaseUserWalletData1 = leaseUserWalletDataList.get(0);
+ leaseUserWalletData = LeaseUserWalletData.builder()
+ .queueId(payRechargeReturnMessage.getQueue_id())
+ .userId(leaseUserWalletData1.getUserId())
+ .fromAddress(payRechargeReturnMessage.getAddress())
+ .fromChain(payRechargeReturnMessage.getChain())
+ .fromSymbol(payRechargeReturnMessage.getSymbol())
+ .balance(BigDecimal.ZERO)
+ .blockedBalance(BigDecimal.ZERO)
+ .qrcode(leaseUserWalletData1.getQrcode())
+ .build();
+ leaseUserWalletDataMapper.insert(leaseUserWalletData);
+ }
+ LeasePayRechargeMessage leasePayRechargeMessage = leasePayRechargeMessageMapper.selectOne(new LambdaQueryWrapper()
+ .eq(LeasePayRechargeMessage::getTxHash, payRechargeReturnMessage.getTx_hash()));
+ BigDecimal balance = leaseUserWalletData.getBalance();
+ //处理支付中消息
+ if(payRechargeReturnMessage.getStatus() == 2 || leasePayRechargeMessage == null){
+ if (leasePayRechargeMessage != null){
+ return;
+ }
+ LeasePayRechargeMessage build = LeasePayRechargeMessage.builder()
+ .queueId(payRechargeReturnMessage.getQueue_id())
+ .chain(payRechargeReturnMessage.getChain())
+ .symbol(payRechargeReturnMessage.getSymbol())
+ .amount(payRechargeReturnMessage.getAmount())
+ .address(payRechargeReturnMessage.getAddress())
+ .txHash(payRechargeReturnMessage.getTx_hash())
+ .status(payRechargeReturnMessage.getStatus())
+ .build();
+ leasePayRechargeMessageMapper.saveOrUpdateByIndex(build);
+ }else {
+ //已存在已完成充值的消息
+ if (leasePayRechargeMessage.getStatus() == 1){
+ return;
+ }
+ leasePayRechargeMessage.setStatus(payRechargeReturnMessage.getStatus());
+ leasePayRechargeMessage.setUpdateTime(LocalDateTime.now());
+ leasePayRechargeMessageMapper.updateById(leasePayRechargeMessage);
+ }
+ //处理支付成功消息
+ if (payRechargeReturnMessage.getStatus() == 1){
+ System.out.println("余额"+balance);
+ leaseUserWalletData.setBalance(balance.add(payRechargeReturnMessage.getAmount()));
+ //使用乐观锁防止余额少加
+ int update = leaseUserWalletDataMapper.update(leaseUserWalletData, new LambdaQueryWrapper()
+ .eq(LeaseUserWalletData::getId, leaseUserWalletData.getId())
+ .eq(LeaseUserWalletData::getBalance, balance)
+ );
+ if (update < 1){
+ throw new PayRechargeException("余额充值失败,余额已被修改");
+ }
+ }
+ }
+
+
+ /**
+ * 余额提现 消费者
+ * @param payWithdrawReturnMessage
+ */
+ @RabbitListener(queues = RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,containerFactory ="rabbitListenerContainerFactory")
+ @Transactional(rollbackFor = Exception.class)
+ public void listenerPayWithdrawStatusQueueMessage(@Payload RabbitmqPayWithdrawReturnMessage payWithdrawReturnMessage) {
+ System.out.println("提现消费者----"+ JSONUtil.toJsonPrettyStr(payWithdrawReturnMessage));
+ List leasePayWithdrawMessageList = leasePayWithdrawMessageMapper.selectList(new LambdaQueryWrapper()
+ .eq(LeasePayWithdrawMessage::getQueueId, payWithdrawReturnMessage.getQueue_id()));
+
+ LeasePayWithdrawMessage leasePayWithdrawMessage = leasePayWithdrawMessageList.get(0);
+ //获取对应的提现钱包
+ LeaseUserWalletData leaseUserWalletData = leaseUserWalletDataMapper.selectOne(new LambdaQueryWrapper()
+ .eq(LeaseUserWalletData::getFromAddress, leasePayWithdrawMessage.getFromAddress())
+ .eq(LeaseUserWalletData::getFromChain, leasePayWithdrawMessage.getFromChain())
+ .eq(LeaseUserWalletData::getFromSymbol, leasePayWithdrawMessage.getFromSymbol())
+ .eq(LeaseUserWalletData::getDel,false));
+
+ BigDecimal balance = leaseUserWalletData.getBalance()
+ .subtract(payWithdrawReturnMessage.getAmount())
+ .subtract(leasePayWithdrawMessage.getServiceCharge());
+ BigDecimal blockBalance = leaseUserWalletData.getBlockedBalance()
+ .subtract(payWithdrawReturnMessage.getAmount())
+ .subtract(leasePayWithdrawMessage.getServiceCharge());
+
+ if (leasePayWithdrawMessageList.size() == 1){
+ //这种情况下说明不是同一笔交易了,但是它又提现了,但是数据库里面没有该提现记录 需要去新增这笔记录并只减去钱包余额
+ if (StringUtils.isNotEmpty(leasePayWithdrawMessage.getTxHash()) && leasePayWithdrawMessage.getStatus() == 1 && !leasePayWithdrawMessage.getTxHash().equals(payWithdrawReturnMessage.getTx_hash())){
+ leasePayWithdrawMessageMapper.insert(LeasePayWithdrawMessage.builder()
+ .toChain(leasePayWithdrawMessage.getToChain())
+ .toSymbol(leasePayWithdrawMessage.getToSymbol())
+ .fromChain(leasePayWithdrawMessage.getFromChain())
+ .fromSymbol(leasePayWithdrawMessage.getFromSymbol())
+ .fromAddress(leasePayWithdrawMessage.getFromAddress())
+ .serviceCharge(leasePayWithdrawMessage.getServiceCharge())
+ .toAddress(leasePayWithdrawMessage.getToAddress())
+ .status(payWithdrawReturnMessage.getStatus())
+ .amount(payWithdrawReturnMessage.getAmount().add(payWithdrawReturnMessage.getFee()))
+ .queueId(payWithdrawReturnMessage.getQueue_id())
+ .txHash(payWithdrawReturnMessage.getTx_hash())
+ .build());
+ blockBalance = leaseUserWalletData.getBlockedBalance();
+ }else{
+ //要修改的钱包状态为1 且提现的状态为1 则不处理
+ if (leasePayWithdrawMessage.getStatus() == 1 && payWithdrawReturnMessage.getStatus() == 1){
+ return;
+ }
+ leasePayWithdrawMessageMapper.updateById(LeasePayWithdrawMessage.builder()
+ .id(leasePayWithdrawMessage.getId())
+ .amount(payWithdrawReturnMessage.getAmount().add(payWithdrawReturnMessage.getFee()))
+ .status(payWithdrawReturnMessage.getStatus())
+ .txHash(payWithdrawReturnMessage.getTx_hash())
+ .build());
+ }
+ updateWalletInfo(payWithdrawReturnMessage.getStatus(), leaseUserWalletData, balance, blockBalance);
+ }else if(leasePayWithdrawMessageList.size() >= 2){
+ //极少情况 连续三次以上发送相同queueid 的消息
+ LeasePayWithdrawMessage with = null;
+ for (LeasePayWithdrawMessage withdraw : leasePayWithdrawMessageList) {
+ if (withdraw.getTxHash().equals(payWithdrawReturnMessage.getTx_hash()) ){
+ with = withdraw;
+ }
+ }
+ if(with == null){
+ leasePayWithdrawMessageMapper.insert(LeasePayWithdrawMessage.builder()
+ .queueId(payWithdrawReturnMessage.getQueue_id())
+ .txHash(payWithdrawReturnMessage.getTx_hash())
+ .toChain(leasePayWithdrawMessage.getToChain())
+ .toSymbol(leasePayWithdrawMessage.getToSymbol())
+ .fromChain(leasePayWithdrawMessage.getFromChain())
+ .fromSymbol(leasePayWithdrawMessage.getFromSymbol())
+ .fromAddress(leasePayWithdrawMessage.getFromAddress())
+ .serviceCharge(payWithdrawReturnMessage.getFee())
+ .toAddress(leasePayWithdrawMessage.getToAddress())
+ .amount(payWithdrawReturnMessage.getAmount().add(payWithdrawReturnMessage.getFee()))
+ .build());
+ blockBalance =leaseUserWalletData.getBlockedBalance();
+ updateWalletInfo(payWithdrawReturnMessage.getStatus(), leaseUserWalletData, balance, blockBalance);
+ }else{
+ leasePayWithdrawMessageMapper.updateById(LeasePayWithdrawMessage.builder()
+ .id(with.getId())
+ .amount(payWithdrawReturnMessage.getAmount().add(payWithdrawReturnMessage.getFee()))
+ .status(payWithdrawReturnMessage.getStatus())
+ .txHash(payWithdrawReturnMessage.getTx_hash())
+ .build());
+ if (with.getStatus() != 1 && payWithdrawReturnMessage.getStatus() == 1){
+ updateWalletInfo(payWithdrawReturnMessage.getStatus(), leaseUserWalletData, balance, blockBalance);
+ }
+ }
+
+
+ }
+
+
+ }
+
+ /**
+ * 更新钱包余额信息
+ * @param status
+ * @param leaseUserWalletData
+ * @param balance
+ * @param blockBalance
+ */
+ public void updateWalletInfo(Integer status,LeaseUserWalletData leaseUserWalletData,BigDecimal balance,BigDecimal blockBalance){
+ BigDecimal initBalance = leaseUserWalletData.getBalance();
+ BigDecimal initBlockBalance = leaseUserWalletData.getBlockedBalance();
+ //余额 和 冻结余额 减去提现金额 + 手续费 状态为3不做任何操作
+ if (status == 1){
+ leaseUserWalletData.setBalance(balance);
+ leaseUserWalletData.setBlockedBalance(blockBalance);
+ }else if (status == 0 ){
+ //余额提现失败 冻结金额 需要减去提现手续费和提现金额
+ leaseUserWalletData.setBlockedBalance(blockBalance);
+ }
+ leaseUserWalletData.setUpdateTime(LocalDateTime.now());
+ //使用乐观锁防止余额少加
+ int update = leaseUserWalletDataMapper.update(leaseUserWalletData, new LambdaQueryWrapper()
+ .eq(LeaseUserWalletData::getId, leaseUserWalletData.getId())
+ .eq(LeaseUserWalletData::getBalance, initBalance)
+ .eq(LeaseUserWalletData::getBlockedBalance, initBlockBalance)
+ );
+ if (update < 1){
+ System.out.println("余额提现/支付失败");
+ throw new PayRechargeException("余额提现失败,余额已被修改");
+ }
+ System.out.println("余额提现/支付成功");
+ }
+
+ @RabbitListener(queues = RabbitmqConstant.DELETE_WALLET_RETURN_QUEUE,containerFactory ="rabbitListenerContainerFactory")
+ @Transactional(rollbackFor = Exception.class)
+ public void listenerDeleteWalletQueue(@Payload RabbitmqDeleteWalletReturnMessage rabbitmqDeleteWalletReturnMessage) {
+ System.out.println("钱包监听删除----删除钱包地址"+rabbitmqDeleteWalletReturnMessage.getAddress());
+ LeaseAutoAddress build;
+ if (rabbitmqDeleteWalletReturnMessage.getStatus() == 1){
+ //设置钱包使用状态为2 已过期
+ build = LeaseAutoAddress.builder().status(2).build();
+ }else{
+ //设置钱包使用状态为3 删除监听失败
+ build = LeaseAutoAddress.builder().status(3).build();
+ }
+ int i = leaseAutoAddressMapper.update(build, new LambdaUpdateWrapper