From f1896bc1aefd19740d47f8447ee42a8d751a8ede Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Mon, 22 Dec 2025 09:42:57 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=A7=9F=E8=B5=81=E7=B3=BB=E7=BB=9F1.?= =?UTF-8?q?1.0=20=E9=92=B1=E5=8C=85=E5=9C=B0=E5=9D=80=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=8A=A0=E5=AF=86,gpu=E7=9F=BF=E6=9C=BA=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=88=B0=E8=AE=A2=E5=8D=95=E6=B5=81=E7=A8=8B=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m2pool/lease/annotation/Decrypt.java | 14 ++ .../lease/annotation/EncryptedField.java | 14 ++ .../m2pool/lease/aspect/DecryptAspect.java | 127 ++++++++++++ .../LeaseOrderInfoV2Controller.java | 9 +- .../controller/LeaseProductController.java | 3 + .../dto/ProductMachineForWalletConfigVo.java | 3 +- .../lease/dto/v2/CoinAndAlgorithmDto.java | 30 ++- .../lease/dto/v2/MachineHashRateMapDto.java | 27 +++ .../lease/dto/v2/MiningConfigInfoDto.java | 56 +++++ .../lease/dto/v2/MiningHashrateInfoDto.java | 9 +- .../lease/dto/v2/PurchasedMachineDto.java | 36 +--- .../m2pool/lease/entity/LeaseGpuConfig.java | 32 +++ .../exception/GlobalExceptionHandler.java | 5 + .../m2pool/lease/exception/RSAException.java | 10 + .../lease/mapper/LeaseGpuConfigMapper.java | 12 +- .../mapper/LeaseMachineConfigMapper.java | 12 +- .../LeaseMiningSoftwareConfigMapper.java | 2 +- .../lease/mapper/LeaseOrderMiningMapper.java | 23 +- .../netty/handler/ServerChannelHandler.java | 178 +++++++++------- .../server/ServerChannelInitializer.java | 2 +- .../lease/service/LeaseOrderInfoService.java | 7 +- .../impl/LeaseOrderInfoServiceImpl.java | 32 ++- .../service/impl/LeaseProductServiceImpl.java | 5 +- .../service/impl/LeaseShopServiceImpl.java | 80 +++++-- .../m2pool/lease/task/GpuRequestApiTask.java | 196 ++++++++++++++++++ .../m2pool/lease/task/info/AlgorithmInfo.java | 46 ++++ .../com/m2pool/lease/task/info/GpuInfo.java | 34 +++ .../lease/task/info/MiningRewardInfo.java | 21 ++ .../lease/task/info/MonthIncomeInfo.java | 31 +++ .../com/m2pool/lease/utils/HashUtils.java | 28 +-- .../java/com/m2pool/lease/utils/RsaUtils.java | 31 +++ .../com/m2pool/lease/vo/ShopConfigVo.java | 6 +- .../m2pool/lease/vo/v2/ShopWalletInfoVo.java | 2 + .../mapper/lease/LeaseGpuConfigMapper.xml | 27 ++- .../mapper/lease/LeaseMachineConfigMapper.xml | 8 + .../lease/LeaseMiningSoftwareConfigMapper.xml | 43 +++- .../mapper/lease/LeaseOrderMiningMapper.xml | 58 ++++-- .../lease/LeaseProductMachineMapper.xml | 2 +- 38 files changed, 1031 insertions(+), 230 deletions(-) create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/Decrypt.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/EncryptedField.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineHashRateMapDto.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningConfigInfoDto.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/RSAException.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/GpuRequestApiTask.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/AlgorithmInfo.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/GpuInfo.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MiningRewardInfo.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MonthIncomeInfo.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/RsaUtils.java diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/Decrypt.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/Decrypt.java new file mode 100644 index 0000000..f0e5089 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/Decrypt.java @@ -0,0 +1,14 @@ +package com.m2pool.lease.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记在方法上,表示需要对请求体进行解密 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Decrypt { +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/EncryptedField.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/EncryptedField.java new file mode 100644 index 0000000..b554ada --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/EncryptedField.java @@ -0,0 +1,14 @@ +package com.m2pool.lease.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记在字段上,表示该字段需要解密 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface EncryptedField { +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java new file mode 100644 index 0000000..9755c2a --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/DecryptAspect.java @@ -0,0 +1,127 @@ +package com.m2pool.lease.aspect; + + +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.json.JSONUtil; +import com.m2pool.lease.annotation.EncryptedField; +import com.m2pool.lease.exception.RSAException; +import com.m2pool.lease.utils.RsaUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestBody; + +import java.lang.reflect.Field; +import java.lang.reflect.Parameter; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Map; + +@Aspect +@Component +public class DecryptAspect { + + // 定义切点,拦截所有带 @Decrypt 注解的方法 + @Pointcut("@annotation(com.m2pool.lease.annotation.Decrypt)") + public void decryptPointcut() {} + + @Around("decryptPointcut()") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + Object[] args = joinPoint.getArgs(); + Parameter[] parameters = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameters(); + + for (int i = 0; i < parameters.length; i++) { + // 找到被 @RequestBody 标记的参数 + if (parameters[i].isAnnotationPresent(RequestBody.class)) { + Object requestBody = args[i]; + // 递归解密对象中的加密字段 + decryptObjectFields(requestBody); + } + } + // 继续执行原方法 + return joinPoint.proceed(args); + } + + private void decryptObjectFields(Object obj) { + if (obj == null) { + return; + } + + // 处理集合或数组类型 + if (obj instanceof Collection) { + for (Object item : (Collection) obj) { + decryptObjectFields(item); + } + return; + } + + // 处理Map类型 + if (obj instanceof Map) { + for (Object value : ((Map) obj).values()) { + decryptObjectFields(value); + } + return; + } + + // 处理普通对象 + Field[] fields = obj.getClass().getDeclaredFields(); + for (Field field : fields) { + if (field.isAnnotationPresent(EncryptedField.class)) { + handleEncryptedField(obj, field); + } else { + //这里可能是普通对象或者集合或其他非EncryptedField标记的普通属性字段 + handleNestedField(obj, field); + } + } + } + + private void handleEncryptedField(Object obj, Field field) { + field.setAccessible(true); + try { + Object value = field.get(obj); + if (value != null) { + String encryptedValue = value.toString(); + System.out.println("加密前地址:"+value +"类型"+(value instanceof String)); + String decryptedValue = RsaUtils.decrypt(encryptedValue); + System.out.println("解密后地址:"+decryptedValue); + field.set(obj, decryptedValue); + } + } catch (Exception e) { + throw new RSAException("解密失败: " + e.getMessage()); + } finally { + field.setAccessible(false); + } + } + + private void handleNestedField(Object obj, Field field) { + field.setAccessible(true); + try { + Object fieldValue = field.get(obj); + if (fieldValue != null && !isPrimitiveOrWrapper(fieldValue)) { + decryptObjectFields(fieldValue); + } + } catch (IllegalAccessException e) { + // 忽略访问异常 + } finally { + field.setAccessible(false); + } + } + + private boolean isPrimitiveOrWrapper(Object obj) { + Class clazz = obj.getClass(); + return clazz.isPrimitive() || + clazz == String.class || + clazz == Integer.class || + clazz == Long.class || + clazz == Double.class || + clazz == Float.class || + clazz == Boolean.class || + clazz == Character.class || + clazz == Byte.class || + clazz == Short.class || + clazz == BigDecimal.class; + } +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseOrderInfoV2Controller.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseOrderInfoV2Controller.java index 46e038a..6872ae9 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseOrderInfoV2Controller.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseOrderInfoV2Controller.java @@ -1,12 +1,10 @@ package com.m2pool.lease.controller; +import com.m2pool.lease.annotation.Decrypt; import com.m2pool.lease.dto.PageResult; import com.m2pool.lease.dto.Result; -import com.m2pool.lease.dto.v2.CoinAndAlgorithmListDto; -import com.m2pool.lease.dto.v2.MiningInfoDto; -import com.m2pool.lease.dto.v2.PurchasedMachineDto; -import com.m2pool.lease.dto.v2.PurchasedMachineListDto; +import com.m2pool.lease.dto.v2.*; import com.m2pool.lease.service.LeaseOrderInfoService; import com.m2pool.lease.vo.BaseVo; import com.m2pool.lease.vo.OrderAndCodeVo; @@ -52,6 +50,7 @@ public class LeaseOrderInfoV2Controller { @ApiOperation("创建订单及订单详情 + 支付订单(返回二维码内容)") @PostMapping("/addOrdersV2") + @Decrypt public Result addOrdersV2(@RequestBody OrderAndCodeVo orderAndCodeVo) { return leaseOrderInfoService.addOrdersV2(orderAndCodeVo); } @@ -70,7 +69,7 @@ public class LeaseOrderInfoV2Controller { @ApiOperation("买家:根据id查询已购矿机详情") @PostMapping("/getPurchasedInfo") - public Result getPurchasedInfo(@RequestBody BaseVo baseVo) { + public Result getPurchasedInfo(@RequestBody BaseVo baseVo) { return leaseOrderInfoService.getPurchasedInfo(baseVo); } } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseProductController.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseProductController.java index d359e5c..853291a 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseProductController.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseProductController.java @@ -1,6 +1,7 @@ package com.m2pool.lease.controller; +import com.m2pool.lease.annotation.Decrypt; import com.m2pool.lease.dto.*; import com.m2pool.lease.service.LeaseProductService; import com.m2pool.lease.service.LeaseUserOwnedProductService; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.validation.Valid; import java.util.List; /** @@ -121,6 +123,7 @@ public class LeaseProductController { @ApiOperation("新增绑定店铺钱包并设置店铺下面每个矿机该钱包币种的售价 + 钱包绑定") @PostMapping("/updateProductListForShopWalletConfig") + @Decrypt public Result updateProductListForShopWalletConfig(@RequestBody ProductMachineForWalletConfigVo productMachineForWalletConfigVo) { return leaseProductService.updateProductListForShopWalletConfig(productMachineForWalletConfigVo); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java index c3f5ae4..7ba3315 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java @@ -1,5 +1,6 @@ package com.m2pool.lease.dto; +import com.m2pool.lease.annotation.EncryptedField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -7,7 +8,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.math.BigDecimal; import java.util.List; /** @@ -26,6 +26,7 @@ import java.util.List; public class ProductMachineForWalletConfigVo { @ApiModelProperty(value = "钱包地址") + @EncryptedField private String payAddress; @ApiModelProperty(value = "支付链") diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/CoinAndAlgorithmDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/CoinAndAlgorithmDto.java index 3fd1b09..d997641 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/CoinAndAlgorithmDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/CoinAndAlgorithmDto.java @@ -1,15 +1,12 @@ package com.m2pool.lease.dto.v2; -import com.m2pool.lease.dto.PageResult; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; +import java.math.BigDecimal; @Data @Builder @@ -37,4 +34,29 @@ public class CoinAndAlgorithmDto { */ private Boolean isEffect; + /** + * gpu名称 + */ + private String model; + + /** + * gpu 功耗 + */ + private BigDecimal powerDissipation; + + /** + * gpu 理论算力 + */ + private BigDecimal hashRate; + + /** + * 月收入 + */ + private BigDecimal monthIncome; + + /** + * 是否新增 gpu 配置 + */ + private Boolean isAdd; + } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineHashRateMapDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineHashRateMapDto.java new file mode 100644 index 0000000..3aa9808 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineHashRateMapDto.java @@ -0,0 +1,27 @@ +package com.m2pool.lease.dto.v2; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + *

+ * 商品列表分页请求对象 + *

+ * + * @author yyb + * @since 2025-07-23 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MachineHashRateMapDto { + private Long machineId; + + private BigDecimal hashRate; + +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningConfigInfoDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningConfigInfoDto.java new file mode 100644 index 0000000..e23ec4a --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningConfigInfoDto.java @@ -0,0 +1,56 @@ +package com.m2pool.lease.dto.v2; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import scala.math.BigDecimal; + +import java.time.LocalDateTime; +import java.util.List; + +/** + *

+ * 挖矿中订单 + *

+ * + * @author yyb + * @since 2025-12-02 + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(description = "已购商品挖矿配置详情返回对象",value = "MiningConfigInfoDto" ) +public class MiningConfigInfoDto { + + @ApiModelProperty(value = "矿池所挖币种") + private String coin; + + @ApiModelProperty(value = "币种对应算法") + private String algorithm; + + + @ApiModelProperty(value = "矿池名称") + private String pool; + + + @ApiModelProperty(value = "矿池挖矿地址") + private String poolUrl; + + + @ApiModelProperty(value = "矿池挖矿账户") + private String poolUser; + + @ApiModelProperty(value = "收款钱包") + private String walletAddress; + + @ApiModelProperty(value = "挖矿信息页面地址") + private String watchUrl; + + @ApiModelProperty(value = "已购矿机信息") + private List purchasedMachines; + +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java index 64f73a0..2817d44 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MiningHashrateInfoDto.java @@ -6,8 +6,8 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import scala.math.BigDecimal; +import java.math.BigDecimal; import java.time.LocalDateTime; @@ -25,9 +25,12 @@ import java.time.LocalDateTime; @AllArgsConstructor @ApiModel(description = "矿机对应实时算力放回对象",value = "MiningHashrateInfoDto" ) public class MiningHashrateInfoDto { - @ApiModelProperty(value = "算力") + @ApiModelProperty(value = "实时算力") private BigDecimal power; - @ApiModelProperty(value = "记录时间") + @ApiModelProperty(value = "最近实时算力记录时间") private LocalDateTime recordTime; + + @ApiModelProperty(value = "矿工号") + private String miner; } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java index da2e92f..3d1db01 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineDto.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -30,37 +31,12 @@ public class PurchasedMachineDto { //@ApiModelProperty(value = "订单编号") //private String orderNumbers; - @ApiModelProperty(value = "矿池所挖币种") - private String coin; - - @ApiModelProperty(value = "币种对应算法") - private String algorithm; - - - @ApiModelProperty(value = "矿池名称") - private String pool; - - - @ApiModelProperty(value = "矿池挖矿地址") - private String poolUrl; - - - @ApiModelProperty(value = "矿池挖矿账户") - private String poolUser; - @ApiModelProperty(value = "矿工号") private String workerId; - @ApiModelProperty(value = "收款钱包") - private String walletAddress; - - @ApiModelProperty(value = "挖矿信息页面地址") - private String watchUrl; - - @ApiModelProperty(value = "0 租约已到期 1挖矿中 2卖家矿机启动中") - private Boolean status; + private Integer status; @ApiModelProperty(value = "挖矿开始时间") @@ -70,7 +46,11 @@ public class PurchasedMachineDto { @ApiModelProperty(value = "挖矿结束时间") private LocalDateTime endTime; - @ApiModelProperty(value = "算力信息") - private MiningHashrateInfoDto miningHashrateInfo; + + @ApiModelProperty(value = "实时算力") + private BigDecimal power; + + @ApiModelProperty(value = "最近实时算力记录时间") + private LocalDateTime recordTime; } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseGpuConfig.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseGpuConfig.java index 40988f0..7d80026 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseGpuConfig.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeaseGpuConfig.java @@ -50,6 +50,38 @@ public class LeaseGpuConfig implements Serializable { */ private Integer memory; + /** + * 币种 + */ + private String coin; + + + /** + * 算力 单位MH/s + */ + private BigDecimal hashrate; + + + /** + * 算法 + */ + private String algorithm; + + /** + * 图标 + */ + private String icon; + + /** + * 单位 默认MH/S + */ + private String unit; + + /** + * 月收入 + */ + private BigDecimal monthIncome; + /** * 功耗 单位kw/h */ 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 index 8519630..6e5b562 100644 --- 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 @@ -41,6 +41,11 @@ public class GlobalExceptionHandler { return Result.fail(e.getMessage()); } + @ExceptionHandler(RSAException.class) + public Result handleRSAException(RSAException e) { + return Result.fail(e.getMessage()); + } + /** * 处理其他未明确捕获的异常,返回统一的错误结果。 * diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/RSAException.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/RSAException.java new file mode 100644 index 0000000..7b5c4a9 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/exception/RSAException.java @@ -0,0 +1,10 @@ +package com.m2pool.lease.exception; + +/** + * 非对称加密异常 + */ +public class RSAException extends RuntimeException { + public RSAException(String message) { + super(message); + } +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseGpuConfigMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseGpuConfigMapper.java index 8ab3b61..7a13982 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseGpuConfigMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseGpuConfigMapper.java @@ -1,8 +1,10 @@ package com.m2pool.lease.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.m2pool.lease.dto.v2.CoinAndAlgorithmDto; import com.m2pool.lease.entity.LeaseGpuConfig; import com.m2pool.lease.netty.message.GpuMessage; +import com.m2pool.lease.task.info.BlockInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -24,5 +26,13 @@ public interface LeaseGpuConfigMapper extends BaseMapper { * @param gpuMessages * @return */ - int insertOrUpdate(@Param("list") Collection gpuMessages); + int insertOrUpdateBatchByGpuInfo(@Param("list") List gpuMessages); + + /** + * 通过实体类批量插入或更新 + * @param leaseGpuConfigs + * @return + */ + int insertOrUpdateBatchByEntity(@Param("list") List leaseGpuConfigs); + } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineConfigMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineConfigMapper.java index f1f3261..a1ba8ea 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineConfigMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineConfigMapper.java @@ -1,16 +1,16 @@ package com.m2pool.lease.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.m2pool.lease.dto.v2.CoinAndAlgorithmDto; -import com.m2pool.lease.dto.v2.CoinAndAlgorithmListDto; -import com.m2pool.lease.dto.v2.MiningConfigSelectDto; +import com.m2pool.lease.dto.v2.*; import com.m2pool.lease.entity.LeaseMachineConfig; import com.m2pool.lease.vo.BaseVo; import com.m2pool.lease.vo.v2.CoinAndAlgorithmVo; +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; /** *

@@ -38,4 +38,10 @@ public interface LeaseMachineConfigMapper extends BaseMapper */ List getMachineSupportCoinAndAlgorithm(@Param("machineIds") List machineIds); + + /** + * 获取理论算力 + * @return + */ + List getTheoryHashRate(@Param("list") List orderMiningInfoDtoList); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMiningSoftwareConfigMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMiningSoftwareConfigMapper.java index 5b73b82..309f91a 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMiningSoftwareConfigMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMiningSoftwareConfigMapper.java @@ -23,5 +23,5 @@ public interface LeaseMiningSoftwareConfigMapper extends BaseMapper selectSupportAlgorithm(@Param("miningsofts") List miningsofts); + List selectSupportAlgorithm(@Param("miningsofts") List miningsofts,@Param("modelList") List modelList); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java index f404f93..50ef007 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseOrderMiningMapper.java @@ -5,11 +5,13 @@ import com.m2pool.common.datasource.annotation.MiningDB; import com.m2pool.lease.dto.v2.*; import com.m2pool.lease.entity.LeaseOrderMining; import com.m2pool.lease.netty.message.ClientConfigurationMining; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; +import java.util.Map; /** *

@@ -50,22 +52,17 @@ public interface LeaseOrderMiningMapper extends BaseMapper { * @param id * @return */ - PurchasedMachineDto getPurchasedInfo(@Param("id") Long id); + MiningConfigInfoDto getPurchasedInfo(@Param("id") Long id); /** * 获取最近一次的算力 - * @param pool - * @param wallet - * @param coin - * @param miner + * @param list * @return */ @MiningDB - MiningHashrateInfoDto getRecentlyHashrate(@Param("pool") String pool, - @Param("wallet") String wallet, - @Param("coin") String coin, - @Param("miner") String miner); + @MapKey("miner") + Map getRecentlyHashrate(@Param("pool") String pool,@Param("wallet") String wallet,@Param("coin") String coin,@Param("list") List list); /** @@ -90,4 +87,12 @@ public interface LeaseOrderMiningMapper extends BaseMapper { * @return */ List checkMiningMinersExist(@Param("list") List list); + + + /** + * 获取用户购买的矿机信息 + * @param info + * @return + */ + List getPurchasedMachineInfo(@Param("info") MiningConfigInfoDto info); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java index 3a0cfba..b2c6c47 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ServerChannelHandler.java @@ -87,59 +87,70 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler msg){ String id = msg.getId(); - String[] split = id.split("::"); - System.out.println("客户端消息"+JSONUtil.toJsonPrettyStr( split) + "长度"+split.length); - System.out.println("客户端消息 "+checkMessage(ctx,id,split[0])); - if (split.length == 2 && checkMessage(ctx,id,split[0])){ + if (checkMessage(ctx,id)){ + String[] split = id.split("::"); Object params = msg.getParams(); + GpuAndSoftMessage gpuAndSoftMessage = JSONUtil.toBean(params.toString(), GpuAndSoftMessage.class); + Map gpus = gpuAndSoftMessage.getGpus(); + List miningsofts = gpuAndSoftMessage.getMiningsofts(); + List modelList = gpus.values().stream().map(GpuMessage::getModel).collect(Collectors.toList()); - if (params instanceof GpuAndSoftMessage){ - System.out.println("客户端消息"+JSONUtil.toJsonPrettyStr(params)); - GpuAndSoftMessage gpuAndSoftMessage = (GpuAndSoftMessage) params; - Map gpus = gpuAndSoftMessage.getGpus(); - List miningsofts = gpuAndSoftMessage.getMiningsofts(); - Collection gpuMessagesList = gpus.values(); + //挖矿软件公共配置 + List supportAlgorithmAndCoin = leaseMiningSoftwareConfigMapper.selectSupportAlgorithm(miningsofts,modelList); + // 新增主机相关信息 + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + protected void doInTransactionWithoutResult(TransactionStatus status) { + try { + LeaseMachine leaseMachine = leaseMachineMapper.selectOne(new LambdaQueryWrapper() + .eq(LeaseMachine::getHostMac, id).eq(LeaseMachine::getDel, false)); + if (leaseMachine == null){ + LeaseShop shop = getShop(split[0]); + leaseMachine = LeaseMachine.builder() + .shopId(shop.getId()) + .hostMac(id) + .type(true) + .state(true) + .saleNumbers(0).build(); + List needAddAlgo = supportAlgorithmAndCoin.stream() + .filter(CoinAndAlgorithmDto::getIsAdd).collect(Collectors.toList()); - //挖矿软件公共配置 - List supportAlgorithmAndCoin = leaseMiningSoftwareConfigMapper.selectSupportAlgorithm(miningsofts); - // 新增主机相关信息 - transactionTemplate.execute(new TransactionCallbackWithoutResult() { - @Override - protected void doInTransactionWithoutResult(TransactionStatus status) { - try { - LeaseMachine leaseMachine = leaseMachineMapper.selectOne(new LambdaQueryWrapper() - .eq(LeaseMachine::getHostMac, split[1])); - if (leaseMachine == null){ - LeaseShop shop = getShop(split[0]); - leaseMachine = LeaseMachine.builder() - .shopId(shop.getId()) - .hostMac(split[1]) - .type(true) - .state(true) - .saleNumbers(0).build(); + if (!needAddAlgo.isEmpty()){ + List needAdd = new ArrayList<>(); + for (String model : modelList) { + for (CoinAndAlgorithmDto coinAndAlgorithmDto : needAddAlgo) { + needAdd.add(CoinAndAlgorithmDto.builder() + .isEffect(coinAndAlgorithmDto.getIsEffect()) + .coin(coinAndAlgorithmDto.getCoin()) + .algorithm(coinAndAlgorithmDto.getAlgorithm()) + .model(model) + .build() + ); + } + } //GPU配置信息配置 - leaseGpuConfigMapper.insertOrUpdate(gpuMessagesList); - List leaseMachineConfigs = packageInsert(leaseMachine.getId(),gpus, supportAlgorithmAndCoin); - leaseMachineMapper.insert(leaseMachine); - leaseMachineConfigService.saveBatch(leaseMachineConfigs); - }else { - leaseMachine.setOnlineStatus(true); - leaseMachineMapper.updateById(leaseMachine); - //检测对照表 - List needUpdateInfo = packageInsert(leaseMachine.getId(),gpus, supportAlgorithmAndCoin); - //带检测矿机 - List needCheckInfo = leaseMachineMapper.getEffectMachineAndTempMachineList(leaseMachine.getId()); - Map> collect = needCheckInfo.stream().collect(Collectors.groupingBy(MachineConfigDto::getIsTemp)); - checkMachineAndInsertOrUpdate(leaseMachine.getId(),needUpdateInfo, collect); + leaseGpuConfigMapper.insertOrUpdateBatchByGpuInfo(needAdd); } - } catch (Exception e) { - // 回滚事务 - status.setRollbackOnly(); - throw e; + leaseMachineMapper.insert(leaseMachine); + List leaseMachineConfigs = packageInsert(leaseMachine.getId(),gpus, supportAlgorithmAndCoin); + leaseMachineConfigService.saveBatch(leaseMachineConfigs); + }else { + leaseMachine.setOnlineStatus(true); + leaseMachineMapper.updateById(leaseMachine); + //检测对照表 + List needUpdateInfo = packageInsert(leaseMachine.getId(),gpus, supportAlgorithmAndCoin); + //带检测矿机 + List needCheckInfo = leaseMachineMapper.getEffectMachineAndTempMachineList(leaseMachine.getId()); + Map> collect = needCheckInfo.stream().collect(Collectors.groupingBy(MachineConfigDto::getIsTemp)); + checkMachineAndInsertOrUpdate(leaseMachine.getId(),needUpdateInfo, collect); } + } catch (Exception e) { + // 回滚事务 + status.setRollbackOnly(); + throw e; } - }); - } + } + }); } } @@ -151,18 +162,25 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler packageInsert(Long machineId,Map gpus,List supportAlgorithmAndCoin){ List list = new ArrayList<>(); + System.out.println("gpu信息"+ JSONUtil.toJsonStr(gpus.values())); for (GpuMessage value : gpus.values()) { - list.addAll(supportAlgorithmAndCoin.stream().map(item-> LeaseMachineConfig.builder() - .machineId(machineId) - .coin(item.getCoin()) - .algorithm(item.getAlgorithm()) - .brand(value.getBrand()) - .name(value.getModel()) - .memory(value.getMem()) - .status(item.getIsEffect()) - .unit("MH/S") - .del(false) - .build()).collect(Collectors.toList())); + for (CoinAndAlgorithmDto coinAndAlgorithmDto : supportAlgorithmAndCoin) { + if (coinAndAlgorithmDto.getModel() != null && value.getModel().contains(coinAndAlgorithmDto.getModel())){ + list.add(LeaseMachineConfig.builder() + .machineId(machineId) + .brand(value.getBrand()) + .name(value.getModel()) + .memory(value.getMem()) + .coin(coinAndAlgorithmDto.getCoin()) + .algorithm(coinAndAlgorithmDto.getAlgorithm()) + .status(coinAndAlgorithmDto.getIsEffect()) + .powerDissipation(coinAndAlgorithmDto.getPowerDissipation()) + .hashrate(coinAndAlgorithmDto.getHashRate()) + .monthIncome(coinAndAlgorithmDto.getMonthIncome()) + .build()); + } + + } } return list; } @@ -263,15 +281,12 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler msg){ - String id = msg.getId(); - String[] split = id.split("::"); - if (split.length == 2 && checkMessage(ctx,id,split[0])){ + if (checkMessage(ctx,msg.getId())){ + String[] split = msg.getId().split("::"); Object params = msg.getParams(); - if (params instanceof ClientConfigurationMining){ - ClientConfigurationMining clientConfigurationMining = (ClientConfigurationMining) params; - //修改 当前邮箱账户 对应的该矿池的 一些基本信息 TODO 这里可以设置真实开始时间 和 状态改为1 - leaseOrderMiningMapper.updateOrderMining(split[0],clientConfigurationMining); - } + ClientConfigurationMining clientConfigurationMining = JSONUtil.toBean(params.toString(), ClientConfigurationMining.class); + //修改 当前邮箱账户 对应的该矿池的 一些基本信息 TODO 这里可以设置真实开始时间 和 状态改为1 + leaseOrderMiningMapper.updateOrderMining(split[0],clientConfigurationMining); } } @@ -290,11 +305,15 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler().eq(LeaseMachine::getHostMac,mac)); + if (id != null){ + leaseMachineMapper.update(LeaseMachine.builder().onlineStatus(false).build(), + new LambdaUpdateWrapper().eq(LeaseMachine::getHostMac,id)); } ChannelManager.removeChannel(getIPString(ctx)); ctx.close(); @@ -382,28 +402,28 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler ChannelPipeline pipeline = socketChannel.pipeline(); //IdleStateHandler心跳机制,如果超时触发Handle中userEventTrigger()方法 pipeline.addLast("idleStateHandler", - new IdleStateHandler(PONG_TIME, PING_TIME, 0, TimeUnit.MINUTES)); + new IdleStateHandler(PONG_TIME, PING_TIME, 0, TimeUnit.SECONDS)); pipeline.addLast(new LineBasedFrameDecoder(1024)); //字符串编解码器 pipeline.addLast(new MessageToJsonDecoder(),new MessageToJsonEncoder()); diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseOrderInfoService.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseOrderInfoService.java index 2220759..e979ed2 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseOrderInfoService.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseOrderInfoService.java @@ -2,10 +2,7 @@ package com.m2pool.lease.service; import com.baomidou.mybatisplus.extension.service.IService; import com.m2pool.lease.dto.*; -import com.m2pool.lease.dto.v2.CoinAndAlgorithmListDto; -import com.m2pool.lease.dto.v2.MiningInfoDto; -import com.m2pool.lease.dto.v2.PurchasedMachineDto; -import com.m2pool.lease.dto.v2.PurchasedMachineListDto; +import com.m2pool.lease.dto.v2.*; import com.m2pool.lease.entity.LeaseOrderInfo; import com.m2pool.lease.vo.*; import com.m2pool.lease.vo.v2.CoinAndAlgorithmVo; @@ -106,5 +103,5 @@ public interface LeaseOrderInfoService extends IService { * @param baseVo * @return */ - Result getPurchasedInfo(BaseVo baseVo); + Result getPurchasedInfo(BaseVo baseVo); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java index fc53655..e21e29c 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java @@ -821,12 +821,19 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl shopList = leaseShopMapper.selectBatchIds(shopIds); Map shopMap = shopList.stream().collect(Collectors.toMap(LeaseShop::getId, Function.identity())); + //获取理论算力 + List theoryHashRate1 = leaseMachineConfigMapper.getTheoryHashRate(orderMiningInfoDtoList); + Map> theoryHashRateMap = theoryHashRate1.stream() + .collect(Collectors.groupingBy(MachineHashRateMapDto::getMachineId)); + Map endMiningMap = new HashMap<>(); Map machineOrderIdMap = new HashMap<>(); Map machineOrderItemIdMap = new HashMap<>(); for (LeaseMachine leaseMachine : machinesList) { Long machineId = leaseMachine.getId(); OrderInfoVo orderInfoVo = machineMap.get(machineId); + List machineHashRateMapDtos = theoryHashRateMap.get(machineId); + BigDecimal theoryHashRate = machineHashRateMapDtos.isEmpty() ? BigDecimal.ZERO : machineHashRateMapDtos.get(0).getHashRate(); String chain = orderInfoVo.getChain(); String coin = orderInfoVo.getCoin(); Long shopId = orderInfoVo.getShopId(); @@ -862,6 +869,7 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl gpuMachines){ for (LeaseMachine gpuMachine : gpuMachines) { - if (ChannelManager.getChannelByMac(gpuMachine.getHostMac()) == null){ + if (ChannelManager.getChannelById(gpuMachine.getHostMac()) == null){ return false; } } @@ -1003,7 +1011,7 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl getPurchasedInfo(BaseVo baseVo) { + public Result getPurchasedInfo(BaseVo baseVo) { //找到miner 和钱包 ,pool 矿池名 - PurchasedMachineDto info = leaseOrderMiningMapper.getPurchasedInfo(baseVo.getId()); + MiningConfigInfoDto info = leaseOrderMiningMapper.getPurchasedInfo(baseVo.getId()); + List list = leaseOrderMiningMapper.getPurchasedMachineInfo(info); + + //根据钱包 + 币种 + 矿工号 查询 pool 库 pool.kryptex 表 中对应 算力 - MiningHashrateInfoDto recentlyHashrate = leaseOrderMiningMapper.getRecentlyHashrate(info.getPool(), info.getWalletAddress(), info.getCoin(), info.getWorkerId()); - info.setMiningHashrateInfo(recentlyHashrate); + Map recentlyHashRateMap = leaseOrderMiningMapper + .getRecentlyHashrate(info.getPool(), info.getWalletAddress(), info.getCoin(), list); + for (PurchasedMachineDto purchasedMachineDto : list) { + MiningHashrateInfoDto miningHashrateInfoDto = recentlyHashRateMap.get(purchasedMachineDto.getWorkerId()); + if (miningHashrateInfoDto != null){ + purchasedMachineDto.setRecordTime(miningHashrateInfoDto.getRecordTime()); + purchasedMachineDto.setPower(miningHashrateInfoDto.getPower()); + } + } + + info.setPurchasedMachines(list); return Result.success(info); } } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java index 6ddc019..f205ccd 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java @@ -1,6 +1,7 @@ package com.m2pool.lease.service.impl; import cn.hutool.json.JSONUtil; +import com.alibaba.druid.support.json.JSONUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -251,7 +252,9 @@ public class LeaseProductServiceImpl extends ServiceImpl shopWalletInfo = leaseShopMapper.getShopWalletInfo(leaseShop.getId()); return Result.success(shopWalletInfo); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseShopServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseShopServiceImpl.java index 0ce65d0..6944fbb 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseShopServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseShopServiceImpl.java @@ -7,10 +7,12 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.m2pool.common.core.utils.StringUtils; import com.m2pool.common.security.utils.SecurityUtils; +import com.m2pool.lease.controller.LeaseShopController; import com.m2pool.lease.dto.*; import com.m2pool.lease.dto.v2.PayWithdrawSellerRecordDto; import com.m2pool.lease.dto.v2.ShopWalletInfoDto; import com.m2pool.lease.entity.*; +import com.m2pool.lease.exception.MachineException; import com.m2pool.lease.exception.PaymentException; import com.m2pool.lease.mapper.*; import com.m2pool.lease.mq.message.RabbitmqPayWithdrawMessage; @@ -66,8 +68,9 @@ public class LeaseShopServiceImpl extends ServiceImpl addShop(ShopVo shopVo) { LeaseShop leaseShop1 = leaseShopMapper.selectOne(new LambdaQueryWrapper() @@ -143,9 +152,11 @@ public class LeaseShopServiceImpl extends ServiceImpl= 1){ + if (leaseProductMachineMapper.checkHasSaleMachineByShopId(baseVo.getId()) >= 1 || leaseMachineMapper.checkHasSaleMachineByShopId(baseVo.getId()) >= 1){ return Result.fail("关闭店铺失败,店铺存在租约中矿机"); } + + if (leaseShop.getState() == 1){ leaseShop.setState(2); boolean b = updateById(leaseShop); @@ -202,16 +213,8 @@ public class LeaseShopServiceImpl extends ServiceImpl= 1){ - return Result.fail("删除店铺失败,店铺存在租约中矿机"); - } - leaseProductMapper.update(LeaseProduct.builder().del(true).build(), new LambdaUpdateWrapper() - .eq(LeaseProduct::getShopId, baseVo.getId())); - leaseProductMachineMapper.update(LeaseProductMachine.builder().del(true).build(), new LambdaUpdateWrapper() - .eq(LeaseProductMachine::getShopId, baseVo.getId())); - + updateMachineInfoV1(baseVo.getId()); + updateMachineInfoV2(baseVo.getId()); boolean b = updateById(LeaseShop.builder().id(baseVo.getId()).del(true).build()); if (b){ return Result.success("删除成功"); @@ -220,6 +223,51 @@ public class LeaseShopServiceImpl extends ServiceImpl= 1){ + throw new MachineException("删除店铺失败,店铺存在租约中矿机"); + } + leaseProductMapper.update(LeaseProduct.builder().del(true).build(), new LambdaUpdateWrapper() + .eq(LeaseProduct::getShopId, shopId)); + leaseProductMachineMapper.update(LeaseProductMachine.builder().del(true).build(), new LambdaUpdateWrapper() + .eq(LeaseProductMachine::getShopId, shopId)); + } + + /** + * 删除店铺时,将店铺下所有矿机和对应钱包删除 V2版本 + * + * */ + public void updateMachineInfoV2(Long shopId){ + //校验是否存在已售出的矿机 + if (leaseMachineMapper.checkHasSaleMachineByShopId(shopId) >= 1){ + throw new MachineException("删除店铺失败,店铺存在租约中矿机"); + } + //校验是否存在余额不为0的钱包 + List leaseShopConfigs = leaseShopConfigMapper.selectList(new LambdaQueryWrapper() + .select(LeaseShopConfig::getId,LeaseShopConfig::getBalance) + .eq(LeaseShopConfig::getShopId, shopId).eq(LeaseShopConfig::getDel, false)); + if (leaseShopConfigs.stream().anyMatch(leaseShopConfig -> leaseShopConfig.getBalance().compareTo(BigDecimal.ZERO) > 0)){ + throw new MachineException("删除店铺失败,店铺存在余额不为0的钱包"); + } + leaseMachineMapper.update(LeaseMachine.builder().del(true).build(), new LambdaUpdateWrapper() + .eq(LeaseMachine::getShopId, shopId)); + + List ids = leaseMachineMapper.selectList(new LambdaQueryWrapper() + .select(LeaseMachine::getId) + .eq(LeaseMachine::getShopId, shopId)) + .stream().map(LeaseMachine::getId) + .collect(Collectors.toList()); + leaseMachineConfigMapper.delete(new LambdaQueryWrapper().in(LeaseMachineConfig::getMachineId, ids)); + + leaseShopConfigMapper.update(LeaseShopConfig.builder().del(true).build(), new LambdaUpdateWrapper() + .eq(LeaseShopConfig::getShopId, shopId)); + } + @Override @@ -444,10 +492,10 @@ public class LeaseShopServiceImpl extends ServiceImpl collect = leaseShopConfigs.stream().peek(leaseShopConfig -> leaseShopConfig.setDel(true)).collect(Collectors.toList()); boolean b = leaseShopConfigService.updateBatchById(collect); if (b){ - leaseProductMachinePriceMapper.update(LeaseProductMachinePrice.builder().del(true).build(), - new LambdaQueryWrapper() - .eq(LeaseProductMachinePrice::getChain, config.getChain()) - .in(LeaseProductMachinePrice::getProductMachineId,ids) + leaseMachinePriceMapper.update(LeaseMachinePrice.builder().del(true).build(), + new LambdaQueryWrapper() + .eq(LeaseMachinePrice::getChain, config.getChain()) + .in(LeaseMachinePrice::getMachineId,ids) ); return Result.success("删除成功"); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/GpuRequestApiTask.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/GpuRequestApiTask.java new file mode 100644 index 0000000..0f659c8 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/GpuRequestApiTask.java @@ -0,0 +1,196 @@ +package com.m2pool.lease.task; + +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.m2pool.lease.constant.BlockInterval; +import com.m2pool.lease.entity.LeaseGpuConfig; +import com.m2pool.lease.entity.LeaseMiningSoftwareConfig; +import com.m2pool.lease.mapper.LeaseGpuConfigMapper; +import com.m2pool.lease.mapper.LeaseMiningSoftwareConfigMapper; +import com.m2pool.lease.task.info.*; +import io.lettuce.core.ScriptOutputType; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @Description 获取gpu 信息三方api:whattomine.com 定时任务 + * @Date 2025/12/16 15:38 + * @Author yyb + */ +@Configuration +@EnableScheduling +public class GpuRequestApiTask { + + @Resource + private LeaseGpuConfigMapper leaseGpuConfigMapper; + + @Resource + private LeaseMiningSoftwareConfigMapper leaseMiningSoftwareConfigMapper; + + @Scheduled(cron = "0 0 0/6 * * ? ") + //@Scheduled(cron = "0 0/5 * * * ? ") + public void gpuInfoTask(){ + List gpuInfos = fetchGpuInfo(); + List leaseGpuConfigs = convertGpuInfoToLeaseConfig(gpuInfos); + List leaseMiningSoftwareConfigs = leaseMiningSoftwareConfigMapper. + selectList(new LambdaQueryWrapper<>()); + //选出挖矿软件只支持的算法和币种 + List leaseGpuConfigs1 = new ArrayList<>(); + for (LeaseGpuConfig leaseGpuConfig : leaseGpuConfigs) { + for (LeaseMiningSoftwareConfig leaseMiningSoftwareConfig : leaseMiningSoftwareConfigs) { + if (leaseMiningSoftwareConfig.getAlgorithm().contains(leaseGpuConfig.getAlgorithm())){ + leaseGpuConfig.setCoin(leaseMiningSoftwareConfig.getCoin()); + leaseGpuConfigs1.add(leaseGpuConfig); + break; + } + } + } + List coinNetPowers = fetchMiningPower(); + if (!coinNetPowers.isEmpty()){ + Map coinPowerMap = coinNetPowers.stream() + .collect(Collectors.toMap(AlgorithmInfo-> AlgorithmInfo.getCoin()+"-"+AlgorithmInfo.getName(), Function.identity())); + for (LeaseGpuConfig leaseGpuConfig : leaseGpuConfigs1) { + AlgorithmInfo coinPower = coinPowerMap.get(leaseGpuConfig.getCoin()+"-"+leaseGpuConfig.getAlgorithm()); + BigDecimal monthIncome = calculateMonthIncome(leaseGpuConfig, coinPower); + leaseGpuConfig.setMonthIncome(monthIncome); + } + + } + leaseGpuConfigMapper.insertOrUpdateBatchByEntity(leaseGpuConfigs1); + } + + /** + * 计算月收入 + * @param leaseGpuConfig + * @param coinPower + * @return + */ + private static BigDecimal calculateMonthIncome(LeaseGpuConfig leaseGpuConfig, AlgorithmInfo coinPower) { + BigDecimal monthIncome = BigDecimal.ZERO; + if (coinPower != null){ + monthIncome = leaseGpuConfig.getHashrate() + .divide(coinPower.getHashrate().divide(BigDecimal.valueOf(1000 * 1000), 8, RoundingMode.HALF_UP), 8, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(24 * 60 * 60) + .divide(coinPower.getBlockInterval(), 8, RoundingMode.HALF_UP)) + .multiply(coinPower.getBlockReward()).multiply(BigDecimal.valueOf(30)) + .multiply(coinPower.getPrice()) + ; + } + return monthIncome; + } + + + /** + * 三方api 获取gpu信息 + * @return + */ + public List fetchGpuInfo() { + String url = "https://whattomine.com/api/v1/gpus?api_token=8ea12738081eaa70a37d62364ddfffecc0c96a6047f02b4cc728af7588fcdbd8"; + String response = HttpRequest.get(url).execute().body(); + + // 将JSONUtil.parseArray改为JSON.parseArray + JSONArray gpusArray = JSON.parseArray(response); + List gpuInfoList = new ArrayList<>(); + + for (Object obj : gpusArray) { + // JSONObject转换方式 + JSONObject gpuJson = (JSONObject) obj; + GpuInfo gpuInfo = new GpuInfo(); + + // 设置基本GPU信息 + gpuInfo.setId(gpuJson.getLong("id")); + gpuInfo.setName(gpuJson.getString("name")); + gpuInfo.setRelease_date(gpuJson.getString("release_date")); + + // 处理算法信息 + JSONArray algorithmsArray = gpuJson.getJSONArray("algorithms"); + List algorithmInfos = new ArrayList<>(); + + for (Object algoObj : algorithmsArray) { + // JSONObject转换方式 + JSONObject algoJson = (JSONObject) algoObj; + AlgorithmInfo algorithmInfo = new AlgorithmInfo(); + + algorithmInfo.setName(algoJson.getString("name")); + algorithmInfo.setHashrate(algoJson.getBigDecimal("hashrate")); + algorithmInfo.setPower(algoJson.getBigDecimal("power")); + + algorithmInfos.add(algorithmInfo); + } + + gpuInfo.setAlgorithms(algorithmInfos); + gpuInfoList.add(gpuInfo); + } + + return gpuInfoList; + } + + + public List convertGpuInfoToLeaseConfig(List gpuInfos) { + List leaseGpuConfigs = new ArrayList<>(); + + for (GpuInfo gpuInfo : gpuInfos) { + if (gpuInfo.getAlgorithms() != null) { + for (AlgorithmInfo algorithm : gpuInfo.getAlgorithms()) { + LeaseGpuConfig config = buildGpuConfig(gpuInfo, algorithm); + leaseGpuConfigs.add(config); + } + } + } + + return leaseGpuConfigs; + } + + private static LeaseGpuConfig buildGpuConfig(GpuInfo gpuInfo, AlgorithmInfo algorithm) { + LeaseGpuConfig config = new LeaseGpuConfig(); + config.setName(gpuInfo.getName()); + config.setAlgorithm(algorithm.getName()); + config.setHashrate(algorithm.getHashrate().divide(BigDecimal.valueOf(1000 * 1000),2, RoundingMode.HALF_UP)); + config.setPowerDissipation(algorithm.getPower()); + return config; + } + + + /** + * 三方api 获取gpu 对应算法的收益信息 + * @return + */ + public static List fetchMiningPower() { + String url = "https://whattomine.com/api/v1/coins?api_token=8ea12738081eaa70a37d62364ddfffecc0c96a6047f02b4cc728af7588fcdbd8"; + String response = HttpRequest.get(url).execute().body(); + JSONArray gpusArray = JSON.parseArray(response); + List hashRateInfos = new ArrayList<>(); + for (int i = 0; i < gpusArray.size(); i++) { + JSONObject item = gpusArray.getJSONObject(i); + AlgorithmInfo info = new AlgorithmInfo(); + info.setCoin(item.getString("tag")); + info.setName(item.getString("algorithm")); + info.setHashrate(new BigDecimal(item.getLong("nethash"))); + info.setBlockReward(BigDecimal.valueOf(item.getDouble("block_reward"))); + info.setBlockInterval(BigDecimal.valueOf(item.getDouble("block_time"))); + // 解析exchanges数组并获取第一个对象的price值 + JSONArray exchanges = item.getJSONArray("exchanges"); + if (!exchanges.isEmpty()) { + JSONObject firstExchange = exchanges.getJSONObject(0); + //30日平均币价 + info.setPrice(BigDecimal.valueOf(firstExchange.getDouble("price30")).multiply(BigDecimal.valueOf(100000))); + } + hashRateInfos.add(info); + } + return hashRateInfos; + } +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/AlgorithmInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/AlgorithmInfo.java new file mode 100644 index 0000000..982991c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/AlgorithmInfo.java @@ -0,0 +1,46 @@ +package com.m2pool.lease.task.info; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Description 算法信息类 + * @Date 2025/12/16 15:43 + * @Author yyb + */ +@Data +public class AlgorithmInfo { + + /** + * 币种名称 + */ + private String coin; + + /** + * 算法名称 + */ + private String name; + + /** + * 挖矿算力 + */ + private BigDecimal hashrate; + + /** + * 功耗 + */ + private BigDecimal power; + + /** + * 报块间隔 + */ + private BigDecimal blockInterval; + + /** + * 报块奖励 + */ + private BigDecimal blockReward; + + private BigDecimal price; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/GpuInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/GpuInfo.java new file mode 100644 index 0000000..8ef3d9c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/GpuInfo.java @@ -0,0 +1,34 @@ +package com.m2pool.lease.task.info; + +import lombok.Data; + +import java.util.List; + +/** + * @Description gpu 信息类 + * @Date 2025/12/16 15:42 + * @Author yyb + */ +@Data +public class GpuInfo { + /** + * gpu id + */ + private Long id; + + /** + * gpu 名称 + */ + private String name; + + /** + * gpu 发布日期 + */ + private String release_date; + + + /** + * gpu 算法信息 + */ + private List algorithms; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MiningRewardInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MiningRewardInfo.java new file mode 100644 index 0000000..10cf78c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MiningRewardInfo.java @@ -0,0 +1,21 @@ +package com.m2pool.lease.task.info; + +import lombok.Data; + +@Data +public class MiningRewardInfo { + private int id; + /** + * 币种名 + */ + private String tag; + private String name; + private String estimated_rewards; + private String estimated_rewards24; + private String btc_revenue; + private String btc_revenue24; + private double revenue; + private double revenue24; + private double profit; + private double profit24; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MonthIncomeInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MonthIncomeInfo.java new file mode 100644 index 0000000..1c58e19 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/info/MonthIncomeInfo.java @@ -0,0 +1,31 @@ +package com.m2pool.lease.task.info; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Description 月收益信息 + * @Date 2025/12/16 15:43 + * @Author yyb + */ +@Builder +@Data +public class MonthIncomeInfo { + + /** + * 算法名称 + */ + private String algorithm; + + /** + * 功耗 + */ + private BigDecimal power; + + /** + * 矿机算力 单位H/S + */ + private BigDecimal hashrate; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/HashUtils.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/HashUtils.java index 394777d..8e33f55 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/HashUtils.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/HashUtils.java @@ -1,12 +1,7 @@ package com.m2pool.lease.utils; -import com.m2pool.lease.entity.LeaseProduct; - import java.math.BigInteger; -import java.security.*; -import java.util.Arrays; -import java.util.Base64; -import java.util.HashMap; +import java.security.MessageDigest; public class HashUtils { @@ -58,25 +53,6 @@ public class HashUtils { return decimalValue.toString(16) + key; } - public static void main(String[] args) throws NoSuchAlgorithmException { - //Long inputStr = 1758610297L; - //System.out.println("加密结果" + sha256(inputStr)); -// 生成RSA密钥对 - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); - keyPairGenerator.initialize(2048); // 密钥长度设置为2048位 - KeyPair keyPair = keyPairGenerator.generateKeyPair(); - PublicKey publicKey = keyPair.getPublic(); - PrivateKey privateKey = keyPair.getPrivate(); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - - // 将公钥转换为Base64字符串格式 - String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded()); - System.out.println("公钥 (Base64): " + publicKeyString); - - // 将私钥转换为Base64字符串格式(注意安全!) - String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded()); - System.out.println("私钥 (Base64): " + privateKeyString); - + public static void main(String[] args) throws Exception { } - } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/RsaUtils.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/RsaUtils.java new file mode 100644 index 0000000..d312f89 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/RsaUtils.java @@ -0,0 +1,31 @@ +package com.m2pool.lease.utils; + +import javax.crypto.Cipher; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; + +public class RsaUtils { + public static final String PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsQVIKYozXCfnXUw8+omYLdcdL1pTzmQh35YPsvn22wM4SQJKvMmXmcS6bI5Bu+5zCjL0F56DzfKz0BNZEwb46UshUOO+KFBUr8CxjYE8NOgIsoe5FUn57O6er9/KySaWlkpGZX49K+l3e90R+dFUEfRE/ijYpeZWkLRwcgWZ+2u6HGpl9h/eF6XD0aW9asDjdAbxUQ48TlaWgfP+OHC+Zy2GKGQG16EcDMczrN6a2HbFnwRIUKrFP67UqyRq11BTUziOhXLY8J0MFuwXUk2OY4VpqjrJjHHjlHYADjIL/5K4Io2AhRU9+QSsKFR2wGxi4e8vw2IXDzscrDuah/7YSwIDAQAB"; // 可公开 + private static final String PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCxBUgpijNcJ+ddTDz6iZgt1x0vWlPOZCHflg+y+fbbAzhJAkq8yZeZxLpsjkG77nMKMvQXnoPN8rPQE1kTBvjpSyFQ474oUFSvwLGNgTw06Aiyh7kVSfns7p6v38rJJpaWSkZlfj0r6Xd73RH50VQR9ET+KNil5laQtHByBZn7a7ocamX2H94XpcPRpb1qwON0BvFRDjxOVpaB8/44cL5nLYYoZAbXoRwMxzOs3prYdsWfBEhQqsU/rtSrJGrXUFNTOI6FctjwnQwW7BdSTY5jhWmqOsmMceOUdgAOMgv/krgijYCFFT35BKwoVHbAbGLh7y/DYhcPOxysO5qH/thLAgMBAAECggEAYE00TczuVfMrbdkcz1ttW3rMWMd2EjDtMJqNXduYjNs6kpVZnUy6WZ/pn0bgweFd2i2QFw1YPQENC2SLL8u6PAhwTnYnK/1PpPFaZlXpMAsPODiX2toMyfWihKFly3pfr9EmbO55TttK8ip5LgPQDZhqtC36dn5Rl5ViGtWrSFgQOJm4Mu7px/6DbAu5c3u9yBqwA5Z90XDGIOivjjquQA4upexCvtBPYm/krCwsZcYHRBeihi+s4mt2Mz+a3u8NkJGxE7+QpXkWC0XR2KKiG4kdD6Sn+d9fG7UZUUBrb1p9Z5n3NV2oh3EKnrV3Pf/J0WEzrDZKBF4I9PMNzEkd2QKBgQDx9uW2HOqGnGv993L57+Twon7BxJHd0WQzdskTNEU7+cdNBYPbailjEOByGBPuupwOc2qTU6j+kyqSH5SoWDpnp1BnmFaJF6X52DJCQ6+2z5MfPApZbMDNSG/MOgPpHRjVcMfdPR/48W0S/1jlPh3ZIQ6bvL/011HYKqNF+NBp5QKBgQC7SfzSgqftZmLiZ4q4DfYGiWjSPQ+G4LwT+ehRNQ1IuJL8yO2tnuOxEN+Egxm5PEY55syeQ41alKWSeoRSFaopdCZZvPnuAEH8rhCgi0ymHIk+24TREZZMJhimBas77JCkRnWfJmfIPCXlv0fS4etzczx+Prntd5B7CKDKYPZWbwKBgQDw6Yblv/yycmQDxbCwse4cuW3Dt9gUJzvBEfA6Mr0MbjHFukwC1rzGajNO5jJSa3Kd4MSoU4/biOPGAbOdudrNAYXI36CpduZG0L+ZwpLdTeeKHdmgF+wPeKP3j3v9Sn9DZLtayFVhI+AaHiuAdEx7t7I31cK6IPjYZfuS252HEQKBgB6WK7r5aZFkyjtta4M5jHdu03aaUEHXy/97LcytXFkHA8JS0jYrn8XYGpjajEXrKRDlt38VSy2C3zN33MpHDX4toOHA8hRDaINqrf56IW9zc5qXYS5/r8sJ4bajcF6d+NVLSIRQUlyqLgpCXel7yecV58g6WEUG5MqjExdaFIDzAoGBAIlhI+jGPRn7lJVTZxik6/Kvj2KKpmpF+WMKer7hLuKd8Tu6iAldNjce9Y9uvD5lvyn+eSGG4OgEKKlPZ4vbY2c3AsYlsJu3ltaz203c61SVYa6tc3xeas9fiLUF7IXd6+6/1nDubG7mDwnMhmGV0pxVJKMUVqx+2LFDFqHaaTAN"; // 这里替换为你的实际私钥 + + public static String decrypt(String encryptedData) throws Exception { + // Base64解码加密数据 + byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData); + + // 加载私钥 + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(PRIVATE_KEY)); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + + // 初始化Cipher进行解密 + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + // 执行解密 + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/ShopConfigVo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/ShopConfigVo.java index c91b1f0..c1fe46e 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/ShopConfigVo.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/ShopConfigVo.java @@ -1,6 +1,6 @@ package com.m2pool.lease.vo; -import com.m2pool.common.core.decrpy.Decrypt; +import com.m2pool.lease.annotation.EncryptedField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -8,8 +8,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - /** *

* 店铺商品配置请求对象 @@ -48,8 +46,8 @@ public class ShopConfigVo extends BaseVo { /** * 卖方对应收款钱包 */ - @Decrypt @ApiModelProperty(value = "卖方对应收款钱包",example = "nexa:nqtsq5g50jkkmklvjyaflg46c4nwuy46z9gzswqe3l0csc7g") + private String payAddress; } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/ShopWalletInfoVo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/ShopWalletInfoVo.java index 823ef7f..27c93d6 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/ShopWalletInfoVo.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/ShopWalletInfoVo.java @@ -1,5 +1,6 @@ package com.m2pool.lease.vo.v2; +import com.m2pool.lease.annotation.EncryptedField; import com.m2pool.lease.vo.BaseVo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -31,6 +32,7 @@ public class ShopWalletInfoVo { private String chain; @ApiModelProperty(value = "卖方对应收款钱包",example = "nexa:nqtsq5g50jkkmklvjyaflg46c4nwuy46z9gzswqe3l0csc7g") + @EncryptedField private String payAddress; } diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseGpuConfigMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseGpuConfigMapper.xml index 430c637..f83aefb 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseGpuConfigMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseGpuConfigMapper.xml @@ -17,17 +17,30 @@ id, brand, name, status, memory, power_dissipation, del - - insert into lease_gpu_config (brand, name, memory) + + insert into lease_gpu_config ( name, algorithm,coin) values - (#{item.brand}, #{item.name}, #{item.mem}) + (#{item.model}, #{item.algorithm},'') ON DUPLICATE KEY UPDATE - brand = VALUES(brand), - `name` = VALUES(`name`), - memory = VALUES(memory) - + name = VALUES(`name`), + `algorithm` = VALUES(`algorithm`), + coin = VALUES(coin) + + + insert into lease_gpu_config ( name, algorithm, power_dissipation,hashrate,month_income) + values + + (#{item.name}, #{item.algorithm}, #{item.powerDissipation},#{item.hashrate},#{item.monthIncome}) + + ON DUPLICATE KEY UPDATE + name = VALUES(`name`), + `algorithm` = VALUES(`algorithm`), + power_dissipation = VALUES(power_dissipation), + hashrate = VALUES(hashrate), + month_income = VALUES(month_income) + diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineConfigMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineConfigMapper.xml index f700fca..546c1bc 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineConfigMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineConfigMapper.xml @@ -66,5 +66,13 @@ GROUP BY lpc.coin, lpc.algorithm + diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMiningSoftwareConfigMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMiningSoftwareConfigMapper.xml index a4aec8b..1d52bd2 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMiningSoftwareConfigMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMiningSoftwareConfigMapper.xml @@ -17,19 +17,40 @@ id, name, coin, algorithm, icon, del diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseOrderMiningMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseOrderMiningMapper.xml index 7d85a99..94497b8 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseOrderMiningMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseOrderMiningMapper.xml @@ -68,22 +68,21 @@ - select id , coin, @@ -91,12 +90,6 @@ pool, pool_url as poolUrl, pool_user as poolUser, - --- worker_id as workerId, --- status, --- start_time as startTime, --- end_time as endTime, - wallet_address as walletAddress, watch_url as watchUrl FROM lease_order_mining @@ -104,12 +97,25 @@ + diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseProductMachineMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseProductMachineMapper.xml index eb83a1c..9e5a209 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseProductMachineMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseProductMachineMapper.xml @@ -295,7 +295,7 @@ WHERE SELECT id FROM - lease_product_machine + lease_machine WHERE shop_id = #{shopId} and `del` = 0