From db8384f04bd8f4d601aaa20a8e2b5ac4fb4b2b34 Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Wed, 7 Jan 2026 10:37:24 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=88=A0=E9=99=A4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=9C=AA=E7=94=A8=E5=88=B0=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/ProductMachineForWalletConfigVo.java | 1 + .../lease/mapper/LeaseMachineMapper.java | 2 +- .../impl/LeaseOrderInfoServiceImpl.java | 12 ++- .../service/impl/LeaseProductServiceImpl.java | 12 ++- .../impl/LeaseShoppingCartServiceImpl.java | 2 +- .../service/impl/LeaseUserServiceImpl.java | 7 +- .../m2pool/lease/task/OrderAndPayTask.java | 83 +++++++++++++++++-- .../mapper/lease/LeaseMachineMapper.xml | 2 +- 8 files changed, 101 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java b/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java index c071bee..111a626 100644 --- a/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java +++ b/src/main/java/com/m2pool/lease/dto/ProductMachineForWalletConfigVo.java @@ -35,6 +35,7 @@ public class ProductMachineForWalletConfigVo { @ApiModelProperty(value = "支付币种,可以多个以逗号隔开") private String symbol; + @ApiModelProperty(value = "价格列表") private List productMachineForWalletConfigVoList; diff --git a/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java b/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java index 3c2d38f..d37aa18 100644 --- a/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java +++ b/src/main/java/com/m2pool/lease/mapper/LeaseMachineMapper.java @@ -81,7 +81,7 @@ public interface LeaseMachineMapper extends BaseMapper { * @param machineIds * @return */ - List getMachinesByIds(@Param("machineIds") List machineIds); + List getMachinesByIds(@Param("machineIds") List machineIds, @Param("userId") String username); /** diff --git a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java index 645e38c..9a4702a 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java @@ -19,10 +19,7 @@ import com.m2pool.lease.mapper.*; import com.m2pool.lease.netty.handler.ChannelManager; import com.m2pool.lease.netty.message.ClientMessage; import com.m2pool.lease.redis.service.RedisService; -import com.m2pool.lease.service.LeaseOrderInfoService; -import com.m2pool.lease.service.LeaseOrderItemService; -import com.m2pool.lease.service.LeaseProductService; -import com.m2pool.lease.service.LeaseUserOwnedProductService; +import com.m2pool.lease.service.*; import com.m2pool.lease.utils.DateUtils; import com.m2pool.lease.utils.SecurityUtils; import com.m2pool.lease.utils.UuidGeneratorUtil; @@ -69,6 +66,9 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl getProductList(ProductPageVo productPageVo) { @@ -478,22 +481,23 @@ public class LeaseProductServiceImpl extends ServiceImpl priceAndIdList = productMachineForWalletConfigVo.getProductMachineForWalletConfigVoList(); - List leaseProductMachinePriceList = new ArrayList<>(); + List leaseProductMachinePriceList = new ArrayList<>(); for (ProductMachineForWalletConfigVo.PriceVo priceVo : priceAndIdList) { String[] priceList = priceVo.getPrice().split(","); if (priceList.length != symbolList.length){ return Result.fail("绑定钱包失败,存在商品矿机未设置新钱包售价"); } for (int i = 0; i < priceList.length; i++) { - leaseProductMachinePriceList.add(LeaseProductMachinePrice.builder() - .productMachineId(priceVo.getProductMachineId()) + leaseProductMachinePriceList.add(LeaseMachinePrice.builder() + .machineId(priceVo.getProductMachineId()) .price(new BigDecimal(priceList[i])) .coin(symbolList[i]) .chain(chain) .build()); } } - boolean b = leaseProductMachinePriceService.saveBatch(leaseProductMachinePriceList); + + boolean b = leaseMachinePriceService.saveBatch(leaseProductMachinePriceList); if (b || leaseProductMachinePriceList.isEmpty()){ //绑定钱包新钱包 List shopConfigList = leaseShopConfigMapper.getCoinIconByChainAndCoin(chain, payCoinsList); diff --git a/src/main/java/com/m2pool/lease/service/impl/LeaseShoppingCartServiceImpl.java b/src/main/java/com/m2pool/lease/service/impl/LeaseShoppingCartServiceImpl.java index 1d59da7..6f33a56 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseShoppingCartServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseShoppingCartServiceImpl.java @@ -445,7 +445,7 @@ public class LeaseShoppingCartServiceImpl extends ServiceImpl leaseProductMachines = leaseMachineMapper.getMachinesByIds(machineIds); + List leaseProductMachines = leaseMachineMapper.getMachinesByIds(machineIds,userId); //设置每个矿机的售价,并按店铺分组 Map> shopIdAndMachineInfoMap = leaseProductMachines.stream() diff --git a/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java b/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java index e2dfcf4..3fe7fc3 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java @@ -378,9 +378,10 @@ public class LeaseUserServiceImpl extends ServiceImpl closeAccount(CloseAccountVo closeAccountVo) { String userEmail = SecurityUtils.getUsername(); - //1.谷歌验证 和邮箱验证码验证 + //1. GoogleInfo googleInfo = leaseUserMapper.getGoogleInfoByEmail(userEmail); // 开发环境 + //1.1谷歌验证 //if(googleInfo == null || StringUtils.isBlank(googleInfo.getSecret())){ // //未绑定定谷歌验证器 // return Result.fail("您的账号未开启双重验证,请先开启验证!"); @@ -388,8 +389,12 @@ public class LeaseUserServiceImpl extends ServiceImpl() .eq(LeaseUser::getUserId, userEmail)); diff --git a/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java b/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java index bc1c603..6f0c6fe 100644 --- a/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java +++ b/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java @@ -138,7 +138,7 @@ public class OrderAndPayTask { } - @Scheduled(cron = "0 0/2 * * * ? ") + @Scheduled(cron = "0 0/1 * * * ? ") @Async("scheduledTaskExecutor") @DSTransactional public void paymentTaskV2(){ @@ -303,10 +303,9 @@ public class OrderAndPayTask { //LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusDays(orderTimeInfoDto.getLeaseTime()); //TODO 开发环境测试用1分钟当一天 差值改为差1分钟 - LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusMinutes(orderTimeInfoDto.getLeaseTime() * 2); - System.out.println("支付开始"+"开始时间"+now+ "结束时间"+endTime+ "差值:"+Duration.between(now, endTime).toMinutes()); - // 获取订单完成的订单详情:比较 now 和 endTime 的年月日时分秒差值是否小于30分 - if (Duration.between(now, endTime).toMinutes() <= 2) { + LocalDateTime endTime = orderTimeInfoDto.getCreateTime().plusMinutes(orderTimeInfoDto.getLeaseTime() ); + // 获取订单完成的订单详情:比较 now 和 endTime 的年月日时分秒差值是否小于30分 + if (Duration.between(now, endTime).toMinutes() <= 1) { completeMachines.add(LeaseMachine.builder() .id(orderTimeInfoDto.getProductMachineId()) .canSaleNumbers(orderTimeInfoDto.getNumbers()) @@ -427,12 +426,77 @@ public class OrderAndPayTask { leaseOrderItemMapper.update(LeaseOrderItem.builder().status(0).build(), new LambdaUpdateWrapper() .in(LeaseOrderItem::getId, itemIds)); //修改商品库存矿机表 矿机状态为 0 未售出 - leaseMachineMapper.updateBatchSaleNumbers(completeMachines); + System.out.println("打印"+JSONUtil.toJsonPrettyStr(completeMachines)); + // 合并相同 id 的机器,避免 SQL CASE WHEN 只执行第一条的问题 + List mergedMachines = mergeMachines(completeMachines); + leaseMachineMapper.updateBatchSaleNumbers(mergedMachines); //挖矿订单信息 改为状态0 租约已过期 leaseOrderMiningMapper.update(LeaseOrderMining.builder().status(false).build(), new LambdaUpdateWrapper() .in(LeaseOrderMining::getOrderItemId, itemIds)); } + /** + * 合并相同 id 的机器,避免 SQL CASE WHEN 只执行第一条的问题 + * @param machines 机器列表 + * @return 合并后的机器列表 + */ + private List mergeMachines(List machines) { + if (machines == null || machines.isEmpty()) { + return new ArrayList<>(); + } + return new ArrayList<>(machines.stream() + .collect(Collectors.groupingBy( + LeaseMachine::getId, + Collectors.collectingAndThen( + Collectors.toList(), + list -> { + LeaseMachine merged = list.get(0); + Integer totalSaleOutNumbers = list.stream() + .mapToInt(m -> m.getSaleOutNumbers() != null ? m.getSaleOutNumbers() : 0) + .sum(); + Integer totalCanSaleNumbers = list.stream() + .mapToInt(m -> m.getCanSaleNumbers() != null ? m.getCanSaleNumbers() : 0) + .sum(); + merged.setSaleOutNumbers(totalSaleOutNumbers); + merged.setCanSaleNumbers(totalCanSaleNumbers); + return merged; + } + ) + )) + .values()); + } + + /** + * 合并相同查询条件的支付记录消息,避免 SQL CASE WHEN 只执行第一条的问题 + * @param records 支付记录消息列表 + * @return 合并后的支付记录消息列表 + */ + private List mergePayRecordMessages(List records) { + if (records == null || records.isEmpty()) { + return new ArrayList<>(); + } + return new ArrayList<>(records.stream() + .collect(Collectors.groupingBy( + r -> r.getFromAddress() + "_" + r.getFromSymbol() + "_" + r.getFromChain(), + Collectors.collectingAndThen( + Collectors.toList(), + list -> { + LeasePayRecordMessage merged = list.get(0); + BigDecimal totalRealAmount = list.stream() + .map(r -> r.getRealAmount() != null ? r.getRealAmount() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalBlockAmount = list.stream() + .map(r -> r.getBlockAmount() != null ? r.getBlockAmount() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); + merged.setRealAmount(totalRealAmount); + merged.setBlockAmount(totalBlockAmount); + return merged; + } + ) + )) + .values()); + } + /** * 支付 定时任务 */ @@ -819,8 +883,11 @@ public class OrderAndPayTask { }); System.out.println("部分完成"+JSONUtil.toJsonPrettyStr(reocrdList)); leasePayRecordMessageService.saveBatch(reocrdList); - int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalance(reocrdList); - int sellerUpdate = leaseShopConfigMapper.updateBalance(reocrdList); + + // 合并相同查询条件的记录,避免 SQL CASE WHEN 只执行第一条的问题 + List mergedRecordList = mergePayRecordMessages(reocrdList); + int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalance(mergedRecordList); + int sellerUpdate = leaseShopConfigMapper.updateBalance(mergedRecordList); if (buyerUpdate > 0 && sellerUpdate > 0){ for (LeasePayRecordMessage item : reocrdList) { diff --git a/src/main/resources/mapper/lease/LeaseMachineMapper.xml b/src/main/resources/mapper/lease/LeaseMachineMapper.xml index 337177a..f060238 100644 --- a/src/main/resources/mapper/lease/LeaseMachineMapper.xml +++ b/src/main/resources/mapper/lease/LeaseMachineMapper.xml @@ -304,7 +304,7 @@ gpc.coin, gpc.`algorithm` ) sub - JOIN lease_shopping_cart_info ci ON sub.id = ci.product_machine_id + JOIN lease_shopping_cart_info ci ON sub.id = ci.product_machine_id AND ci.user_id = #{userId} AND ci.version = 1 WHERE sub.id IN