diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/AuthInterceptor.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/AuthInterceptor.java deleted file mode 100644 index 52b2d8a..0000000 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/AuthInterceptor.java +++ /dev/null @@ -1,39 +0,0 @@ -//package com.m2pool.lease.config; -// -//import com.m2pool.common.core.constant.SecurityConstants; -//import com.m2pool.common.core.context.SecurityContextHolder; -//import com.m2pool.common.core.utils.JwtUtils; -//import com.m2pool.common.core.utils.ServletUtils; -//import com.m2pool.common.security.utils.SecurityUtils; -//import org.springframework.stereotype.Component; -//import org.springframework.web.servlet.HandlerInterceptor; -// -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -// -////生产环境 -//@Component -//public class AuthInterceptor implements HandlerInterceptor { -// -// @Override -// public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { -// // 获取请求头中的 Authorization 字段 -// -// //System.out.println("获取到的Authorization:"+authorization + "666"+ SecurityUtils.getToken()); -// //if (authorization != null) { -// // // 将 Authorization 值存入 ThreadLocal -// // -// //} -// String authorization = request.getHeader("Authorization"); -// -// String userName = JwtUtils.getUserName(authorization); -// SecurityContextHolder.setUserName("liuyiqing0119@gmail.com"); -// return true; -// } -// -// @Override -// public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { -// // 请求完成后清除 ThreadLocal 中的值,避免内存泄漏 -// SecurityContextHolder.remove(); -// } -//} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/CorsConfig.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/CorsConfig.java deleted file mode 100644 index 9d640f2..0000000 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/CorsConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.m2pool.lease.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -@Configuration -public class CorsConfig implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/api/**") - .allowedOrigins("*") // 允许跨域 - .allowedMethods("GET", "POST") - .allowedHeaders("Content-Type") - .allowCredentials(true); - } -} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/WebMvcConfig.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/WebMvcConfig.java deleted file mode 100644 index ad24b7c..0000000 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/config/WebMvcConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -//package com.m2pool.lease.config; -// -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -// -//@Configuration -//public class WebMvcConfig implements WebMvcConfigurer { -// -// @Autowired -// private AuthInterceptor authInterceptor; -// -// @Override -// public void addInterceptors(InterceptorRegistry registry) { -// // 注册拦截器并指定拦截路径 -// registry.addInterceptor(authInterceptor) -// .addPathPatterns("/**") // 拦截所有请求 -// .excludePathPatterns("/login", "/register") // 可选:排除不需要拦截的路径 -// .excludePathPatterns("/swagger-ui.html", "/webjars/**", "/v2/api-docs", "/swagger-resources/**"); // 可选:排除Swagger相关路径 -// } -//} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineEffectDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineEffectDto.java index 35bbaae..0f41d46 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineEffectDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineEffectDto.java @@ -11,5 +11,5 @@ import lombok.Data; public class MachineEffectDto { private Long machineId; - private Boolean effect; + private Integer effect; } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java index 1391d5f..194e7b7 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/MachineInfoDto.java @@ -71,25 +71,25 @@ public class MachineInfoDto { private Integer saleOutNumbers; //动态列名(方便前端显示) - private BigDecimal c1; + private String c1; - private BigDecimal c2; + private String c2; - private BigDecimal c3; + private String c3; - private BigDecimal c4; + private String c4; - private BigDecimal c5; + private String c5; - private BigDecimal c6; + private String c6; - private BigDecimal c7; + private String c7; - private BigDecimal c8; + private String c8; - private BigDecimal c9; + private String c9; - private BigDecimal c10; + private String c10; diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/OrderMiningInfoDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/OrderMiningInfoDto.java index 7201ce9..b17527d 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/OrderMiningInfoDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/OrderMiningInfoDto.java @@ -40,4 +40,7 @@ public class OrderMiningInfoDto { @ApiModelProperty(value = "矿工号(用户自己输入)") private String workerId; + + @ApiModelProperty(value = "挖矿钱包币种") + private String coin; } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineListDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineListDto.java index 29435bf..e34617b 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineListDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/PurchasedMachineListDto.java @@ -46,9 +46,6 @@ public class PurchasedMachineListDto { private String poolUser; - @ApiModelProperty(value = "矿工号") - private String workerId; - @ApiModelProperty(value = "收款钱包") private String walletAddress; @@ -56,16 +53,18 @@ public class PurchasedMachineListDto { private String watchUrl; - @ApiModelProperty(value = "0 租约已到期 1挖矿中 2卖家矿机启动中") - private Integer status; - - - @ApiModelProperty(value = "挖矿开始时间") - private LocalDateTime startTime; - - - @ApiModelProperty(value = "挖矿结束时间") - private LocalDateTime endTime; + private String workerId; + // + //@ApiModelProperty(value = "0 租约已到期 1挖矿中 2卖家矿机启动中") + //private Integer status; + // + // + //@ApiModelProperty(value = "挖矿开始时间") + //private LocalDateTime startTime; + // + // + //@ApiModelProperty(value = "挖矿结束时间") + //private LocalDateTime endTime; private Long orderItemId; diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/SellerMachineInfoDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/SellerMachineInfoDto.java index 82afb62..3e8ff0f 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/SellerMachineInfoDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/SellerMachineInfoDto.java @@ -86,7 +86,7 @@ public class SellerMachineInfoDto { private Boolean onlineStatus; @ApiModelProperty(value = "矿机是否能够上架 0 不能 1 能") - private Boolean effect; + private Integer effect; //@ApiModelProperty(value = "gpu和asic对应币种算力和月收益信息") //private List powerIncomeInfoList; 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 index 44d1fb4..b93d9f0 100644 --- 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 @@ -113,6 +113,11 @@ public class LeaseOrderItem implements Serializable { */ private String coin; + /** + * 单机理论算力 + */ + private BigDecimal theoryPower; + /** * 单机理论收益 */ diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java index 6452228..976b953 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java @@ -146,4 +146,13 @@ public interface LeaseMachineMapper extends BaseMapper { */ @MapKey("machineId") Map checkIsEffect(@Param("list") List ids); + + + + /** + * 批量修改矿机已售可售数量 + * @param list + * @return + */ + boolean updateBatchSaleNumbers(@Param("list") List list); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ChannelManager.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ChannelManager.java index 713f71e..2fe7f92 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ChannelManager.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/netty/handler/ChannelManager.java @@ -3,6 +3,7 @@ package com.m2pool.lease.netty.handler; import io.netty.channel.Channel; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -19,9 +20,14 @@ public class ChannelManager { private static final Map channelMap = new ConcurrentHashMap<>(); /** - * key mac value ip + * key channel value mac */ - private static final Map macMap = new ConcurrentHashMap<>(); + public static final Map macMap = new ConcurrentHashMap<>(); + + /** + * key channel value id + */ + public static final Map idMap = new ConcurrentHashMap<>(); /** * 添加Channel @@ -40,34 +46,39 @@ public class ChannelManager { * @param ip */ public static void removeChannel(String ip) { - // 需要先移除MAC映射 - macMap.values().removeIf(value -> value.equals(ip)); - channelMap.remove(ip); + Channel channel = channelMap.get(ip); + if (channel != null){ + idMap.remove(channel); + macMap.remove(channel); + channelMap.remove(ip); + + } + + } - /** - * 根据ip获取Channel - * @param ip - * @return - */ - public static Channel getChannelByIp(String ip) { - return channelMap.get(ip); + public static String getIdByChannel(String ip) { + Channel channel = channelMap.get(ip); + if (channel != null){ + return idMap.get(channel); + } + return null; } - /** * 根据mac地址获取Channel * @param mac * @return */ public static Channel getChannelByMac(String mac) { - String ip = macMap.get(mac); - if (ip != null) { - return channelMap.get(ip); - } - return null; + Optional key = macMap.entrySet() + .stream() + .filter(entry -> mac.equals(entry.getValue())) + .map(Map.Entry::getKey) + .findFirst(); + return key.orElse(null); } public static boolean sendToClient(String mac, Object message) { 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 a3641d4..3a0cfba 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 @@ -23,7 +23,6 @@ import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static com.m2pool.lease.netty.message.MethodConstant.PING; @@ -88,11 +87,14 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler msg){ String id = msg.getId(); - String[] split = id.split("\\."); + 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])){ Object params = msg.getParams(); if (params instanceof GpuAndSoftMessage){ + System.out.println("客户端消息"+JSONUtil.toJsonPrettyStr(params)); GpuAndSoftMessage gpuAndSoftMessage = (GpuAndSoftMessage) params; Map gpus = gpuAndSoftMessage.getGpus(); List miningsofts = gpuAndSoftMessage.getMiningsofts(); @@ -121,6 +123,8 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler needUpdateInfo = packageInsert(leaseMachine.getId(),gpus, supportAlgorithmAndCoin); //带检测矿机 @@ -157,7 +161,6 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler msg){ String id = msg.getId(); - String[] split = id.split("\\."); + String[] split = id.split("::"); if (split.length == 2 && checkMessage(ctx,id,split[0])){ Object params = msg.getParams(); if (params instanceof ClientConfigurationMining){ @@ -289,6 +292,9 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler().eq(LeaseMachine::getHostMac,mac)); + } ChannelManager.removeChannel(getIPString(ctx)); ctx.close(); } @@ -376,15 +387,18 @@ public class ServerChannelHandler extends SimpleChannelInboundHandler { - } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseMachineServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseMachineServiceImpl.java index 4fa6bbc..39b73e7 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseMachineServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseMachineServiceImpl.java @@ -1,8 +1,6 @@ package com.m2pool.lease.service.impl; -import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -15,7 +13,6 @@ import com.m2pool.lease.entity.LeaseMachineConfig; import com.m2pool.lease.entity.LeaseMachinePrice; import com.m2pool.lease.entity.LeaseShop; import com.m2pool.lease.exception.MachineException; -import com.m2pool.lease.exception.ProductSoldOutException; import com.m2pool.lease.mapper.*; import com.m2pool.lease.service.LeaseMachineConfigService; import com.m2pool.lease.service.LeaseMachinePriceService; @@ -28,7 +25,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -179,34 +175,34 @@ public class LeaseMachineServiceImpl extends ServiceImpl * 订单表 服务实现类 @@ -685,7 +689,8 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl orderInfoVoList = orderAndCodeVo.getOrderInfoVoList(); List orderMiningInfoDtoList = orderAndCodeVo.getOrderMiningInfoDtoList(); - String errors = checkMiningMinersExist(orderMiningInfoDtoList); + + String errors = checkMiningMinersExistAndAddress(orderMiningInfoDtoList); if (StringUtils.isNotEmpty(errors)){ return Result.fail(errors); } @@ -927,22 +932,34 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl orderMiningInfoDtoList){ + private String checkMiningMinersExistAndAddress(List orderMiningInfoDtoList){ List orderMiningInfoDtos = leaseOrderMiningMapper.checkMiningMinersExist(orderMiningInfoDtoList); StringBuilder errors = new StringBuilder(); + String addressVerify = ""; + List addressInfos = new ArrayList(); if(!orderMiningInfoDtos.isEmpty()){ Map> collect = orderMiningInfoDtos.stream().collect(Collectors.groupingBy(OrderMiningInfoDto::getWalletAddress)); - collect.forEach((address,list)->{ errors.append("钱包地址: ").append(address).append("-已存在挖矿中矿工号"); for (OrderMiningInfoDto orderMiningInfoDto : list) { errors.append(orderMiningInfoDto.getWorkerId()).append(" "); } errors.append("请重新输入矿工号\n"); + addressInfos.add(list.get(0)); }); } - return errors.toString(); + + if (StringUtils.isNotEmpty(errors.toString())){ + return errors.toString(); + } + for (OrderMiningInfoDto addressInfo : addressInfos) { + if (!WalletRuleCheckUtils.checkAddress(addressInfo.getCoin(),addressInfo.getWalletAddress())){ + addressVerify = addressInfo.getWalletAddress() + "钱包地址格式错误"; + break; + } + } + return addressVerify; } /** @@ -955,7 +972,7 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl coinAndAlgoMap = leaseMachineMapper.getCoinAndAlgoById(configIds); Map idAndMacMap = gpuMachines.stream().collect(Collectors .toMap(LeaseMachine::getId, Function.identity())); - Map macMessageMap = new HashMap<>(); + Map> macMessageMap = new HashMap<>(); List orderMiningList = new ArrayList<>(); for (OrderMiningInfoDto orderMiningInfoDto : orderMiningInfo) { @@ -975,8 +992,8 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl message = new ClientMessage<>(); + MiningConfigDto build = MiningConfigDto.builder() .algo(algo) .coin(coin) .pool(poolName) @@ -985,7 +1002,12 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl message){ ChannelManager.sendToClient(mac,message); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java index 2cb9d06..9083a34 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java @@ -156,12 +156,13 @@ public class OrderAndPayTask { List orderComplete = new ArrayList<>(); //本次部分已完成订单详情id + 机器id 集合 List itemCompleteIds = new ArrayList<>(); - List completeMachineIds = new ArrayList<>(); + + List completeMachines = new ArrayList<>(); //本此需支付订单详情id 集合 List needPayIds = new ArrayList<>(); //本次需支付订单详情 集合 List needPayInfos = new ArrayList<>(); - getCompleteOrderAndNeedPayOrder(orderComplete,completeMachineIds,itemCompleteIds,needPayIds,needPayInfos,leaseOrderItems); + getCompleteOrderAndNeedPayOrder(orderComplete,completeMachines,itemCompleteIds,needPayIds,needPayInfos,leaseOrderItems); //订单进行过程中,卖方可能修改收款地址。所以每天支付前,需要修改旧收款地址为新地址 needPayInfos = updateOrderItemSellerWalletAddress(needPayInfos); @@ -255,7 +256,7 @@ public class OrderAndPayTask { } //2.处理完成的订单 (订单部分完成) if(!itemCompleteIds.isEmpty()){ - handlerOrderPartComplete(itemCompleteIds,completeMachineIds); + handlerOrderPartComplete(itemCompleteIds,completeMachines); } //3.处理完成的订单 + 发送mq消息去支付(订单全部完成) @@ -274,7 +275,7 @@ public class OrderAndPayTask { * @param needPayInfos 本次需要支付的订单信息(租赁数量,租赁天数,单价等) * @param oneDayApartOrder */ - public void getCompleteOrderAndNeedPayOrder(List orderComplete,List completeMachineIds ,List completeIds,List needPayIds,List needPayInfos,List oneDayApartOrder){ + public void getCompleteOrderAndNeedPayOrder(List orderComplete,List completeMachines,List completeIds,List needPayIds,List needPayInfos,List oneDayApartOrder){ LocalDateTime now = LocalDateTime.now(); Map orderCompleteMap = new HashMap<>(); for (LeaseOrderItem orderTimeInfoDto : oneDayApartOrder) { @@ -287,7 +288,12 @@ public class OrderAndPayTask { // 比较 now 和 endTime 的差值是否小于30分 if (Duration.between(now, endTime).toMinutes() <= 1) { - completeMachineIds.add(orderTimeInfoDto.getProductMachineId()); + completeMachines.add(LeaseMachine.builder() + .id(orderTimeInfoDto.getProductMachineId()) + .canSaleNumbers(orderTimeInfoDto.getNumbers()) + .saleOutNumbers(orderTimeInfoDto.getNumbers()) + .saleState(false) + .build()); completeIds.add(orderTimeInfoDto.getId()); needPayIds.add(orderTimeInfoDto.getId()); needPayInfos.add(orderTimeInfoDto); @@ -324,15 +330,14 @@ public class OrderAndPayTask { Map orderItemIdToWaveMap = new HashMap<>(); orderIdToHashrateMap.forEach((orderItemId, realPowerList) -> { - // 计算平均值 - BigDecimal average = realPowerList.stream() - .map(RealHashrateInfoDto::getPower) - .reduce(BigDecimal.ZERO, BigDecimal::add) - .divide(BigDecimal.valueOf(realPowerList.size()), 2, RoundingMode.HALF_UP); - // 计算每个数据点与平均值的比值 + LeaseOrderItem itemInfo = orderIdToPriceMap.get(orderItemId); + + + // 计算每个数据点 理论算力的比值 List ratios = realPowerList.stream() - .map(dto -> dto.getPower().divide(average, 4, RoundingMode.HALF_UP)) + .map(dto -> dto.getPower() + .divide(itemInfo.getTheoryPower(), 4, RoundingMode.HALF_UP)) .collect(Collectors.toList()); // 补零到48个数据点 @@ -345,11 +350,10 @@ public class OrderAndPayTask { .reduce(BigDecimal.ZERO, BigDecimal::add) .divide(BigDecimal.valueOf(48), 2, RoundingMode.HALF_UP); - LeaseOrderItem itemInfo = orderIdToPriceMap.get(orderItemId); + BigDecimal payAmount = itemInfo.getPrice() - .multiply(BigDecimal.valueOf(itemInfo.getNumbers())) - .multiply(BigDecimal.valueOf(itemInfo.getLeaseTime())); + .multiply(BigDecimal.valueOf(itemInfo.getNumbers())); if (finalValue.compareTo(BigDecimal.valueOf(0.95)) <= 0){ payAmount = payAmount.multiply(finalValue); } @@ -423,15 +427,14 @@ public class OrderAndPayTask { /** * 处理订单部分完成 * @param itemIds 已完成订单项id - * @param machineIds 已完成机器id + * @param completeMachines 已完成机器id */ - public void handlerOrderPartComplete(List itemIds,List machineIds){ + public void handlerOrderPartComplete(List itemIds,List completeMachines){ //修改订单详情表中状态为 0 租约已过期 leaseOrderItemMapper.update(LeaseOrderItem.builder().status(0).build(), new LambdaUpdateWrapper() .in(LeaseOrderItem::getId, itemIds)); //修改商品库存矿机表 矿机状态为 0 未售出 - leaseMachineMapper.update(LeaseMachine.builder().saleState(false).build(), new LambdaUpdateWrapper() - .in(LeaseMachine::getId, machineIds)); + leaseMachineMapper.updateBatchSaleNumbers(completeMachines); //挖矿订单信息 改为状态0 租约已过期 leaseOrderMiningMapper.update(LeaseOrderMining.builder().status(false).build(), new LambdaUpdateWrapper() .in(LeaseOrderMining::getOrderItemId, itemIds)); @@ -779,15 +782,17 @@ public class OrderAndPayTask { .toSymbol(initForm.getToSymbol()) .toChain(initForm.getToChain()) .build(); - try { - rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build); - }catch (Exception e){ - //设置状态为消息发送失败 - build1.setStatus(4); - System.out.println("消息发送失败"+e.getMessage()); - }finally { reocrdList.add(build1); - } + + //try { + // rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build); + //}catch (Exception e){ + // //设置状态为消息发送失败 + // build1.setStatus(4); + // System.out.println("消息发送失败"+e.getMessage()); + //}finally { + // reocrdList.add(build1); + //} }); leasePayRecordMessageService.saveBatch(reocrdList); 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 39a5a5d..394777d 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 @@ -3,8 +3,9 @@ package com.m2pool.lease.utils; import com.m2pool.lease.entity.LeaseProduct; import java.math.BigInteger; -import java.security.MessageDigest; +import java.security.*; import java.util.Arrays; +import java.util.Base64; import java.util.HashMap; public class HashUtils { @@ -57,9 +58,24 @@ public class HashUtils { return decimalValue.toString(16) + key; } - public static void main(String[] args) { + 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); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/WalletRuleCheckUtils.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/WalletRuleCheckUtils.java index fe3037b..b270b0d 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/WalletRuleCheckUtils.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/utils/WalletRuleCheckUtils.java @@ -7,36 +7,56 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.m2pool.common.core.utils.StringUtils; -import java.math.BigInteger; import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.regex.Pattern; public class WalletRuleCheckUtils { - - // ---------------TRON校验------------------- - - private static final String API_KEY = "0925bdd7-7def-4a46-b65f-e17f02dc67c7"; - - public static boolean checkAddress(String chain, String address){ + /** + * 校验地址 + * @param chainOrCoin + * @param address + * @return + */ + public static boolean checkAddress(String chainOrCoin, String address) { if (address == null) { return false; } - chain = chain.toUpperCase(); - switch (chain) { + chainOrCoin = chainOrCoin.toUpperCase(); + switch (chainOrCoin) { case "TRON": return checkTRON(address); case "ETH": return checkETH(address); + case "XTM": + return checkXTM(address); + case "IRON": + return checkIRON(address); + case "XEL": + return checkXEL(address); + case "RVN": + return checkRVN(address); + case "ERG": + return checkERG(address); + case "CFX": + return checkCFX(address); + case "NEXA": + return checkNEXA(address); + case "XNA": + return checkXNA(address); + case "KLS": + return checkKLS(address); + case "CLORE": + return checkCLORE(address); default: return false; } } + // ---------------TRON校验------------------- + + private static final String API_KEY = "0925bdd7-7def-4a46-b65f-e17f02dc67c7"; + /** * 调用 Tronscan API 获取账户信息 * @param address 要查询的账户地址 @@ -89,6 +109,73 @@ public class WalletRuleCheckUtils { return ETH_BASIC_PATTERN.matcher(address).matches(); } // ---------------ETH校验------------------- + + + + // ---------------XTM校验------------------- + private static final Pattern XTM_PATTERN = Pattern.compile("^P[0-9a-zA-Z]{34}$"); + public static boolean checkXTM(String address) { + return StringUtils.isNotEmpty( address) && XTM_PATTERN.matcher(address).matches(); + } + + // ---------------IRON校验------------------- + private static final Pattern IRON_PATTERN = Pattern.compile("^i[0-9a-zA-Z]{33}$"); + public static boolean checkIRON(String address) { + return StringUtils.isNotEmpty( address) && IRON_PATTERN.matcher(address).matches(); + } + + // ---------------XEL校验------------------- + private static final Pattern XEL_PATTERN = Pattern.compile("^XEL[0-9a-zA-Z]{33}$"); + public static boolean checkXEL(String address) { + return StringUtils.isNotEmpty( address) && XEL_PATTERN.matcher(address).matches(); + } + + // ---------------RVN校验------------------- + private static final Pattern RVN_PATTERN = Pattern.compile("^R[0-9a-zA-Z]{33}$"); + public static boolean checkRVN(String address) { + return StringUtils.isNotEmpty( address) && RVN_PATTERN.matcher(address).matches(); + } + + // ---------------ERG校验------------------- + private static final Pattern ERG_PATTERN = Pattern.compile("^9[0-9a-zA-Z]{50}$"); + public static boolean checkERG(String address) { + return StringUtils.isNotEmpty( address) && ERG_PATTERN.matcher(address).matches(); + } + + // ---------------CFX校验------------------- + private static final Pattern CFX_PATTERN = Pattern.compile("^cfx:[a-z0-9]{42}$"); + public static boolean checkCFX(String address) { + return StringUtils.isNotEmpty( address) && CFX_PATTERN.matcher(address).matches(); + } + + // ---------------NEXA校验------------------- + private static final Pattern NEXA_PATTERN = Pattern.compile("^nexa:[0-9a-zA-Z]{40}$"); + private static final Pattern NEXA_PATTERN2 = Pattern.compile("^[0-9a-zA-Z]{40}$"); + public static boolean checkNEXA(String address) { + if (address.startsWith("nexa:")){ + return StringUtils.isNotEmpty(address) && NEXA_PATTERN.matcher(address).matches(); + }else{ + return StringUtils.isNotEmpty(address) && NEXA_PATTERN2.matcher(address).matches(); + } + } + + // ---------------XNA校验------------------- + private static final Pattern XNA_PATTERN = Pattern.compile("^X[0-9a-zA-Z]{33}$"); + public static boolean checkXNA(String address) { + return StringUtils.isNotEmpty( address) && XNA_PATTERN.matcher(address).matches(); + } + + // ---------------KLS校验------------------- + private static final Pattern KLS_PATTERN = Pattern.compile("^k[0-9a-zA-Z]{33}$"); + public static boolean checkKLS(String address) { + return StringUtils.isNotEmpty( address) && KLS_PATTERN.matcher(address).matches(); + } + + // ---------------CLORE校验------------------- + private static final Pattern CLORE_PATTERN = Pattern.compile("^C[0-9a-zA-Z]{33}$"); + public static boolean checkCLORE(String address) { + return StringUtils.isNotEmpty( address) && CLORE_PATTERN.matcher(address).matches(); + } public static void main(String[] args) { } 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 19082af..c91b1f0 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,5 +1,6 @@ package com.m2pool.lease.vo; +import com.m2pool.common.core.decrpy.Decrypt; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -47,6 +48,7 @@ public class ShopConfigVo extends BaseVo { /** * 卖方对应收款钱包 */ + @Decrypt @ApiModelProperty(value = "卖方对应收款钱包",example = "nexa:nqtsq5g50jkkmklvjyaflg46c4nwuy46z9gzswqe3l0csc7g") private String payAddress; diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineMapper.xml index fba6a8e..55ef04a 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseMachineMapper.xml @@ -126,7 +126,7 @@ FROM lease_machine lm JOIN - lease_machine_config gpc ON lm.id = gpc.machine_id AND lm.type = #{shopMachineVo.type} AND lm.shop_id = #{shopMachineVo.shopId} AND lm.online_status = true + lease_machine_config gpc ON lm.id = gpc.machine_id AND lm.type = #{shopMachineVo.type} AND lm.shop_id = #{shopMachineVo.shopId} AND lm.online_status = true AND lm.sale_state = 0 GROUP BY lm.id,gpc.coin,gpc.algorithm ) sub LEFT JOIN lease_machine_price mp @@ -337,7 +337,9 @@ UPDATE lease_machine SET - sale_state = 1 + sale_state = 1, + can_sale_numbers = 0, + sale_out_numbers = 1 WHERE id IN @@ -350,13 +352,15 @@ UPDATE lease_machine SET sale_out_numbers = #{item.saleOutNumbers}, - sale_state = CASE WHEN #{item.saleOutNumbers} = sale_numbers THEN 1 ELSE sale_state END + sale_state = CASE WHEN #{item.saleOutNumbers} = sale_numbers THEN 1 ELSE sale_state END, + can_sale_numbers = sale_numbers - #{item.saleOutNumbers} WHERE id = #{item.id} AND sale_out_numbers = #{item.lockNumbers} + + + + UPDATE lease_machine + SET + sale_out_numbers = sale_out_numbers - #{item.saleOutNumbers}, + can_sale_numbers = can_sale_numbers + #{item.canSaleNumbers} + WHERE + id = #{item.id} + + 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 8a8436e..7d85a99 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,7 +68,6 @@