diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java index 7481386..bfc9bc3 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/constant/CoinCharge.java @@ -48,6 +48,22 @@ public enum CoinCharge { return BigDecimal.ONE; } + /** + * 根据 chain 和 coin 查找对应的手续费,未找到则返回 1 + * @param chain 链名 + * @param coin 币种名 + * @return 对应的手续费,未找到返回 1 + */ + public static BigDecimal getDeductibleAmountByChainAndCoin(String chain, String coin) { + for (CoinCharge charge : CoinCharge.values()) { + if (charge.chain.equals(chain) && charge.coin.equals(coin)) { + return charge.amount.divide(charge.feeRate, 4, RoundingMode.HALF_UP); + } + } + return BigDecimal.ONE; + } + + /** * 根据 chain 和 coin 找到手续费和费率,然后比较totalPrice是否小于 费率/手续费 * @param chain 链名 @@ -59,7 +75,7 @@ public enum CoinCharge { for (CoinCharge charge : CoinCharge.values()) { if (charge.chain.equals(chain) && charge.coin.equals(coin)) { BigDecimal feeRate = charge.feeRate; - BigDecimal deductible= feeRate.divide(charge.amount, 4, RoundingMode.HALF_UP); + BigDecimal deductible= charge.amount.divide(feeRate, 4, RoundingMode.HALF_UP); if(deductible.compareTo(totalPrice) < 0){ fee = BigDecimal.ZERO; }else{ diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java index f48b749..263541a 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/PayConfigDto.java @@ -48,4 +48,7 @@ public class PayConfigDto { @ApiModelProperty(value = "起付金额") private BigDecimal deductibleAmount; + + @ApiModelProperty(value = "手续费") + private BigDecimal fee; } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java new file mode 100644 index 0000000..016a5b2 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/entity/LeasePayRecordMessageInfo.java @@ -0,0 +1,138 @@ +package com.m2pool.lease.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.*; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + *

+ * 支付消息记录表 + *

+ * + * @author yyb + * @since 2025-09-10 + */ +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class LeasePayRecordMessageInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 消息ID + */ + private String queueId; + + /** + * 买家充值地址 + */ + private String fromAddress; + + /** + * 卖家充值地址 + */ + private String toAddress; + + + /** + * 订单id + */ + private String orderId; + + /** + * 订单号 + */ + private String orderNumber; + + /** + * 店铺ID + */ + private Long shopId; + + /** + * 用户邮箱 + */ + private String userId; + + /** + * 理论支付金额(根据商家定价) + */ + private BigDecimal amount; + + /** + *真实支付金额 + */ + private BigDecimal realAmount; + + /** + * 实际应支付金额(根据一天内预估算力和实际算力差值计算得来) + */ + private BigDecimal needAmount; + + /** + * 钱包冻结金额 + */ + private BigDecimal blockAmount; + /** + * 币种 + */ + private String toSymbol; + + /** + * 链名称 + */ + private String toChain; + + + /** + * 币种 + */ + private String fromSymbol; + + /** + * 链名称 + */ + private String fromChain; + + /** + * 交易hash + */ + private String txHash; + + private Long blockHeight; + + + /** + * 支付时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 0 支付失败 1 支付成功 2 等待校验 + */ + private Integer status; + + /** + * 逻辑删除字段 + */ + private boolean del; + +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java new file mode 100644 index 0000000..b1bf8e0 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeasePayRecordMessageInfoMapper.java @@ -0,0 +1,30 @@ +package com.m2pool.lease.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.m2pool.lease.dto.CheckAddressDto; +import com.m2pool.lease.dto.PayRecordMessageDto; +import com.m2pool.lease.dto.RecentlyTransactionDto; +import com.m2pool.lease.dto.TransactionRecordDto; +import com.m2pool.lease.entity.LeasePayRecordMessage; +import com.m2pool.lease.entity.LeasePayRecordMessageInfo; +import com.m2pool.lease.entity.LeaseShopConfig; +import com.m2pool.lease.entity.LeaseUserWalletData; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * LeasePayRecordMessageMapper 接口 + *

+ * + * @author yyb + * @since 2025-09-10 + */ +@Mapper +public interface LeasePayRecordMessageInfoMapper extends BaseMapper { + +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java index 17c11e6..4c564b4 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/MessageReceiver.java @@ -10,6 +10,7 @@ import com.m2pool.lease.exception.PayRechargeException; import com.m2pool.lease.mapper.*; import com.m2pool.lease.mq.message.*; import com.m2pool.lease.service.LeaseOrderItemService; +import com.m2pool.lease.utils.UuidGeneratorUtil; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.messaging.handler.annotation.Payload; @@ -92,11 +93,15 @@ public class MessageReceiver { @Transactional(rollbackFor = Exception.class) public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoReturnMessage payAutoReturnMessage) { System.out.println("支付消费者"+JSONUtil.toJsonPrettyStr(payAutoReturnMessage)); - //查找到数据库对应的支付记录 + //查找到数据库对应的支付记录 现在已经每日记录和总记录拆分开了,实际查出来的只会有一条记录 List leasePayRecordMessagesList = leasePayRecordMessageMapper.selectList(new LambdaQueryWrapper() .eq(LeasePayRecordMessage::getQueueId, payAutoReturnMessage.getQueue_id())); + if (leasePayRecordMessagesList.isEmpty()){ + return ; + } //买家钱包 LeasePayRecordMessage payRecordMessage = leasePayRecordMessagesList.get(0); + LeaseUserWalletData buyer = leaseUserWalletDataMapper.selectOne(new LambdaQueryWrapper() .eq(LeaseUserWalletData::getFromAddress,payRecordMessage.getFromAddress()) .eq(LeaseUserWalletData::getFromChain, payRecordMessage.getFromChain()) @@ -247,6 +252,9 @@ public class MessageReceiver { .eq(LeaseUserWalletData::getFromAddress, payRechargeReturnMessage.getAddress()) .eq(LeaseUserWalletData::getDel, false) ); + if (leaseUserWalletDataList.isEmpty()){ + return; + } LeaseUserWalletData leaseUserWalletData = null; for (LeaseUserWalletData item : leaseUserWalletDataList) { if (item.getFromSymbol().equals(payRechargeReturnMessage.getSymbol())){ @@ -277,6 +285,7 @@ public class MessageReceiver { if (leasePayRechargeMessage != null){ return; } + LeasePayRechargeMessage build = LeasePayRechargeMessage.builder() .queueId(payRechargeReturnMessage.getQueue_id()) .chain(payRechargeReturnMessage.getChain()) @@ -300,7 +309,6 @@ public class MessageReceiver { } //处理支付成功消息 if (payRechargeReturnMessage.getStatus() == 1){ - System.out.println("余额"+balance); leaseUserWalletData.setBalance(balance.add(payRechargeReturnMessage.getAmount())); //使用乐观锁防止余额少加 int update = leaseUserWalletDataMapper.update(leaseUserWalletData, new LambdaQueryWrapper() @@ -324,7 +332,9 @@ public class MessageReceiver { System.out.println("提现消费者----"+ JSONUtil.toJsonPrettyStr(payWithdrawReturnMessage)); List leasePayWithdrawMessageList = leasePayWithdrawMessageMapper.selectList(new LambdaQueryWrapper() .eq(LeasePayWithdrawMessage::getQueueId, payWithdrawReturnMessage.getQueue_id())); - + if (leasePayWithdrawMessageList.isEmpty()){ + return ; + } LeasePayWithdrawMessage leasePayWithdrawMessage = leasePayWithdrawMessageList.get(0); //获取对应的提现钱包 LeaseUserWalletData leaseUserWalletData = leaseUserWalletDataMapper.selectOne(new LambdaQueryWrapper() @@ -472,76 +482,77 @@ public class MessageReceiver { } - //测试 开发环境 支付回调测试 - @RabbitListener(queues = RabbitmqConstant.PAY_AUTO_QUEUE,containerFactory ="rabbitListenerContainerFactory") - @Transactional(rollbackFor = Exception.class) - public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoMessage payAutoReturnMessage) { - //消费消息 - System.out.println("自动支付功能queueId"+payAutoReturnMessage.getQueue_id()); - - RabbitmqPayAutoReturnMessage rabbitmqPayAutoReturnMessage = RabbitmqPayAutoReturnMessage.builder() - .queue_id(payAutoReturnMessage.getQueue_id()) - .from_address(payAutoReturnMessage.getFrom_address()) - .to_address(payAutoReturnMessage.getTo_address()) - .chain(payAutoReturnMessage.getChain()) - .symbol(payAutoReturnMessage.getSymbol()) - .fee(payAutoReturnMessage.getFee()) - .amount(payAutoReturnMessage.getAmount()) - .status(1) - .tx_hash(payAutoReturnMessage.getQueue_id()) - .block_height(1000L) - .order_id(payAutoReturnMessage.getOrder_id()) - .build(); - - rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_AUTO_RETURN_QUEUE,rabbitmqPayAutoReturnMessage); - } - - //测试 开发环境 充值测试 - @RabbitListener(queues = RabbitmqConstant.PAY_RECHARGE_QUEUE,containerFactory ="rabbitListenerContainerFactory") - @Transactional(rollbackFor = Exception.class) - public void listenerPayRechargeQueueMessage(@Payload RabbitmqPayRechargeMessage payAutoReturnMessage) { - //发送充值消息 - RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayRechargeReturnMessage.builder() - .queue_id(payAutoReturnMessage.getQueue_id()) - .status(2) - .amount(BigDecimal.valueOf(20)) - .chain(payAutoReturnMessage.getChain()) - .symbol(payAutoReturnMessage.getSymbol()) - .address(payAutoReturnMessage.getAddress()) - .tx_hash(payAutoReturnMessage.getQueue_id()+"第四笔") - .build(); - rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage); - - - //发送充值消息 - RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage1 = RabbitmqPayRechargeReturnMessage.builder() - .queue_id(payAutoReturnMessage.getQueue_id()) - .status(1) - .amount(BigDecimal.valueOf(20)) - .chain(payAutoReturnMessage.getChain()) - .symbol(payAutoReturnMessage.getSymbol()) - .address(payAutoReturnMessage.getAddress()) - .tx_hash(payAutoReturnMessage.getQueue_id()+"第四笔") - .build(); - rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage1); - } - - //提现 - @RabbitListener(queues = RabbitmqConstant.PAY_WITHDRAW_QUEUE,containerFactory ="rabbitListenerContainerFactory") - @Transactional(rollbackFor = Exception.class) - public void listenerWithdrawQueueMessage(@Payload RabbitmqPayWithdrawMessage payAutoReturnMessage) { - //发送充值消息 - RabbitmqPayWithdrawReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayWithdrawReturnMessage.builder() - .queue_id(payAutoReturnMessage.getQueue_id()) - .status(1) - .amount(payAutoReturnMessage.getAmount()) - .chain(payAutoReturnMessage.getChain()) - .symbol(payAutoReturnMessage.getSymbol()) - .tx_hash(payAutoReturnMessage.getQueue_id()+"第一笔") - .fee(payAutoReturnMessage.getFee()) - .build(); - rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage); - } + ////测试 开发环境 支付回调测试 + //@RabbitListener(queues = RabbitmqConstant.PAY_AUTO_QUEUE,containerFactory ="rabbitListenerContainerFactory") + //@Transactional(rollbackFor = Exception.class) + //public void listenerPayBalanceStatusQueueMessage(@Payload RabbitmqPayAutoMessage payAutoReturnMessage) { + // //消费消息 + // System.out.println("自动支付功能queueId"+payAutoReturnMessage.getQueue_id()); + // + // RabbitmqPayAutoReturnMessage rabbitmqPayAutoReturnMessage = RabbitmqPayAutoReturnMessage.builder() + // .queue_id(payAutoReturnMessage.getQueue_id()) + // .from_address(payAutoReturnMessage.getFrom_address()) + // .to_address(payAutoReturnMessage.getTo_address()) + // .chain(payAutoReturnMessage.getChain()) + // .symbol(payAutoReturnMessage.getSymbol()) + // .fee(payAutoReturnMessage.getFee()) + // .amount(payAutoReturnMessage.getAmount()) + // .status(1) + // .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen()) + // .block_height(1000L) + // .order_id(payAutoReturnMessage.getOrder_id()) + // .build(); + // + // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_AUTO_RETURN_QUEUE,rabbitmqPayAutoReturnMessage); + //} + // + ////测试 开发环境 充值测试 + //@RabbitListener(queues = RabbitmqConstant.PAY_RECHARGE_QUEUE,containerFactory ="rabbitListenerContainerFactory") + //@Transactional(rollbackFor = Exception.class) + //public void listenerPayRechargeQueueMessage(@Payload RabbitmqPayRechargeMessage payAutoReturnMessage) { + // String s = UuidGeneratorUtil.generateUuidWithoutHyphen(); + // //发送充值消息 + // RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayRechargeReturnMessage.builder() + // .queue_id(payAutoReturnMessage.getQueue_id()) + // .status(2) + // .amount(BigDecimal.valueOf(20)) + // .chain(payAutoReturnMessage.getChain()) + // .symbol(payAutoReturnMessage.getSymbol()) + // .address(payAutoReturnMessage.getAddress()) + // .tx_hash(s) + // .build(); + // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage); + // + // + // //发送充值消息 + // RabbitmqPayRechargeReturnMessage rabbitmqPayRechargeReturnMessage1 = RabbitmqPayRechargeReturnMessage.builder() + // .queue_id(payAutoReturnMessage.getQueue_id()) + // .status(1) + // .amount(BigDecimal.valueOf(20)) + // .chain(payAutoReturnMessage.getChain()) + // .symbol(payAutoReturnMessage.getSymbol()) + // .address(payAutoReturnMessage.getAddress()) + // .tx_hash(s) + // .build(); + // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage1); + //} + // + ////提现 + //@RabbitListener(queues = RabbitmqConstant.PAY_WITHDRAW_QUEUE,containerFactory ="rabbitListenerContainerFactory") + //@Transactional(rollbackFor = Exception.class) + //public void listenerWithdrawQueueMessage(@Payload RabbitmqPayWithdrawMessage payAutoReturnMessage) { + // //发送充值消息 + // RabbitmqPayWithdrawReturnMessage rabbitmqPayRechargeReturnMessage = RabbitmqPayWithdrawReturnMessage.builder() + // .queue_id(payAutoReturnMessage.getQueue_id()) + // .status(1) + // .amount(payAutoReturnMessage.getAmount()) + // .chain(payAutoReturnMessage.getChain()) + // .symbol(payAutoReturnMessage.getSymbol()) + // .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen()) + // .fee(payAutoReturnMessage.getFee()) + // .build(); + // rabbitTemplate.convertAndSend(RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,rabbitmqPayRechargeReturnMessage); + //} ////测试 开发环境 删除钱包测试 diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java new file mode 100644 index 0000000..eca0502 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeasePayRecordMessageInfoService.java @@ -0,0 +1,16 @@ +package com.m2pool.lease.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.m2pool.lease.entity.LeasePayRecordMessage; +import com.m2pool.lease.entity.LeasePayRecordMessageInfo; + +/** + *

+ * service层支付 + *

+ * + * @author yyb + * @since 2025-09-10 + */ +public interface LeasePayRecordMessageInfoService extends IService { +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java new file mode 100644 index 0000000..c38b506 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeasePayRecordMessageInfoServiceImpl.java @@ -0,0 +1,22 @@ +package com.m2pool.lease.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.m2pool.lease.entity.LeasePayRecordMessage; +import com.m2pool.lease.entity.LeasePayRecordMessageInfo; +import com.m2pool.lease.mapper.LeasePayRecordMessageInfoMapper; +import com.m2pool.lease.mapper.LeasePayRecordMessageMapper; +import com.m2pool.lease.service.LeasePayRecordMessageInfoService; +import com.m2pool.lease.service.LeasePayRecordMessageService; +import org.springframework.stereotype.Service; + +/** + *

+ * service层支付 + *

+ * + * @author yyb + * @since 2025-09-10 + */ +@Service +public class LeasePayRecordMessageInfoServiceImpl extends ServiceImpl implements LeasePayRecordMessageInfoService { +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java index 3cbf152..dacd53a 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductMachineServiceImpl.java @@ -66,7 +66,7 @@ public class LeaseProductMachineServiceImpl extends ServiceImpl userMinersList = leaseProductMachineMapper.getUserMinersList(userId,userMinerVo.getCoin()); Map> collect = userMinersList.stream().collect(Collectors.groupingBy(UserMinerDto::getCoin)); return Result.success(collect); diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java index 89efe42..efebdbc 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseProductServiceImpl.java @@ -1,5 +1,6 @@ package com.m2pool.lease.service.impl; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -158,8 +159,8 @@ public class LeaseProductServiceImpl extends ServiceImpl> payConfigMap = shopWalletInfo.stream() .map(payConfigDto->{ - payConfigDto.setDeductibleAmount(CoinCharge.getChargeByChainAndCoin(payConfigDto.getPayChain(), payConfigDto.getPayCoin())); + payConfigDto.setDeductibleAmount(CoinCharge.getDeductibleAmountByChainAndCoin(payConfigDto.getPayChain(), payConfigDto.getPayCoin())); + payConfigDto.setFee(CoinCharge.getChargeByChainAndCoin(payConfigDto.getPayChain(), payConfigDto.getPayCoin())); return payConfigDto; }) .collect(Collectors.groupingBy(PayConfigDto::getShopId)); diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java index 8ee349b..49cae46 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserOwnedProductServiceImpl.java @@ -56,7 +56,7 @@ public class LeaseUserOwnedProductServiceImpl extends ServiceImpl pageInfo = new PageInfo<>(leaseUserOwnedProducts); if (leaseUserOwnedProducts.isEmpty()){ PageResult fail = PageResult.fail(null, "用户未购买商品"); diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java index ab42e59..ce0b7e9 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java @@ -1,5 +1,6 @@ package com.m2pool.lease.service.impl; +import cn.hutool.json.JSONUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java index d8ae1c6..b2cfddb 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/OrderAndPayTask.java @@ -3,16 +3,14 @@ package com.m2pool.lease.task; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.m2pool.common.core.utils.bean.BeanUtils; import com.m2pool.lease.constant.PowerUnit; import com.m2pool.lease.dto.*; import com.m2pool.lease.entity.*; import com.m2pool.lease.mapper.*; import com.m2pool.lease.mq.message.RabbitmqDeleteWalletMessage; import com.m2pool.lease.mq.message.RabbitmqPayAutoMessage; -import com.m2pool.lease.service.LeaseOrderItemService; -import com.m2pool.lease.service.LeasePayRecordMessageService; -import com.m2pool.lease.service.LeaseProductService; -import com.m2pool.lease.service.LeaseUserOwnedProductService; +import com.m2pool.lease.service.*; import com.m2pool.lease.utils.HashUtils; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.context.annotation.Configuration; @@ -65,19 +63,19 @@ public class OrderAndPayTask { @Resource private LeaseAutoAddressMapper leaseAutoAddressMapper; @Resource - private LeaseProductService leaseProductService; - @Resource private LeaseShopConfigMapper leaseShopConfigMapper; @Resource private LeaseOrderItemService leaseOrderItemService; + @Resource + private LeasePayRecordMessageInfoService leasePayRecordMessageInfoService; /** * 检查钱包半年内是否有 支付,充值,提现操作 */ - //@Scheduled(cron = "0 5 1 * * ? ") - @Scheduled(cron = "0 0/1 * * * ? ") + @Scheduled(cron = "0 5 1 * * ? ") + //@Scheduled(cron = "0 0/1 * * * ? ") @Transactional public void checkOperator(){ //1.查询lease_auto_address 表 状态为1 已使用 的钱包 @@ -192,6 +190,7 @@ public class OrderAndPayTask { RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() .queue_id(queueId) .order_id(String.valueOf(orderId)) + .shopId(leaseOrderItem.getShopId()) .chain(leaseOrderItem.getChain()) .symbol(leaseOrderItem.getSymbol()) .fee(orderInfo.getFee()) @@ -372,9 +371,9 @@ public class OrderAndPayTask { //6.根据这些订单发送今天的支付消息到mq if (!rabbitmqPayAutoMessages.isEmpty()){ - List collect = new ArrayList<>(); + List collect = new ArrayList<>(); for (RabbitmqPayAutoMessage rabbitmqPayAutoMessage : rabbitmqPayAutoMessages) { - collect.add( LeasePayRecordMessage.builder() + collect.add( LeasePayRecordMessageInfo.builder() .orderId(rabbitmqPayAutoMessage.getOrder_id()) .orderNumber(rabbitmqPayAutoMessage.getQueue_id()) .queueId(rabbitmqPayAutoMessage.getQueue_id()) @@ -392,7 +391,7 @@ public class OrderAndPayTask { .toSymbol(rabbitmqPayAutoMessage.getSymbol()) .build()); } - leasePayRecordMessageService.saveBatch(collect); + leasePayRecordMessageInfoService.saveBatch(collect); } } @@ -432,41 +431,29 @@ public class OrderAndPayTask { } - /** - * 订单完成后---发送支付消息到mq 一个买家对应一个卖家 - * @param orderIds - */ - public void sendMessageToMq(List orderIds){ - List leasePayRecordMessages = leasePayRecordMessageMapper.selectList(new LambdaQueryWrapper() - .in(LeasePayRecordMessage::getOrderId, orderIds)); - List leaseOrderInfos = leaseOrderInfoMapper.selectList(new LambdaQueryWrapper() - .select(LeaseOrderInfo::getFee,LeaseOrderInfo::getOrderNumber) - .in(LeaseOrderInfo::getId, orderIds)); - Map feeMap = leaseOrderInfos.stream() - .collect(Collectors.toMap(LeaseOrderInfo::getOrderNumber, LeaseOrderInfo::getFee)); - sendMessageToMq(leasePayRecordMessages,feeMap); - } - /** *订单完成后---发送支付消息到mq 一个买家对应一个卖家 - * @param leasePayRecordMessages - * @param feeMap + * @param orderIds */ - public void sendMessageToMq(List leasePayRecordMessages,Map feeMap){ - Map> collect = leasePayRecordMessages.stream() - .collect(Collectors.groupingBy(LeasePayRecordMessage::getOrderId)); + public void sendMessageToMq(List orderIds){ + List leasePayRecordMessages = leasePayRecordMessageInfoService.list(new LambdaQueryWrapper() + .in(LeasePayRecordMessageInfo::getOrderId, orderIds)); + Map feeMap = getFee(orderIds); + Map> collect = leasePayRecordMessages.stream() + .collect(Collectors.groupingBy(LeasePayRecordMessageInfo::getOrderId)); + List reocrdList = new ArrayList<>(); //遍历按订单id分组后的map collect.forEach((orderId, payRecordMessagesList) -> { long timestamp = System.currentTimeMillis()/1000; - LeasePayRecordMessage initForm = payRecordMessagesList.get(0); + LeasePayRecordMessageInfo initForm = payRecordMessagesList.get(0); RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() .queue_id(initForm.getQueueId()) .chain(initForm.getFromChain()) .symbol(initForm.getFromSymbol()) - .fee(feeMap.get(orderId)) .from_address(initForm.getFromAddress()) .to_address(initForm.getToAddress()) + .fee(feeMap.get(orderId)) .amount(BigDecimal.ZERO) .blockAmount(BigDecimal.ZERO) .needAmount(BigDecimal.ZERO) @@ -474,20 +461,55 @@ public class OrderAndPayTask { .sign(HashUtils.sha256(timestamp)) .build(); - for (LeasePayRecordMessage leasePayRecordMessage : payRecordMessagesList) { + for (LeasePayRecordMessageInfo leasePayRecordMessage : payRecordMessagesList) { build.setAmount(build.getAmount().add(leasePayRecordMessage.getRealAmount())); build.setBlockAmount(build.getBlockAmount().add(leasePayRecordMessage.getBlockAmount())); build.setNeedAmount(build.getNeedAmount().add(leasePayRecordMessage.getNeedAmount())); } + LeasePayRecordMessage build1 = LeasePayRecordMessage.builder() + .queueId(initForm.getQueueId()) + .fromAddress(initForm.getFromAddress()) + .toAddress(initForm.getToAddress()) + .orderNumber(initForm.getOrderNumber()) + .orderId(orderId) + .shopId(initForm.getShopId()) + .userId(initForm.getUserId()) + .blockAmount(build.getBlockAmount()) + .amount(build.getAmount()) + .realAmount(build.getAmount()) + .needAmount(build.getNeedAmount()) + .fromSymbol(initForm.getFromSymbol()) + .fromChain(initForm.getFromChain()) + .toSymbol(initForm.getToSymbol()) + .toChain(initForm.getToChain()) + .build(); try { rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build); }catch (Exception e){ - System.out.println("消息发送失败(5分)"+e.getMessage()); + //设置状态为消息发送失败 + build1.setStatus(4); + System.out.println("消息发送失败"+e.getMessage()); + }finally { + reocrdList.add(build1); } }); + leasePayRecordMessageService.saveBatch(reocrdList); } + /** + * 获取手续费 + * @param orderIds + * @return + */ + private Map getFee(List< Long> orderIds){ + List leaseOrderInfos = leaseOrderInfoMapper.selectList(new LambdaQueryWrapper() + .select(LeaseOrderInfo::getFee,LeaseOrderInfo::getOrderNumber) + .in(LeaseOrderInfo::getId, orderIds)); + return leaseOrderInfos.stream() + .collect(Collectors.toMap(LeaseOrderInfo::getOrderNumber, LeaseOrderInfo::getFee)); + } + ///** // * 订单完成后---发送支付消息到mq 一个买家对应多个卖家 // * @param orderIds @@ -546,15 +568,41 @@ public class OrderAndPayTask { @Scheduled(cron = "0 0 0/1 * * ? ") @Transactional public void checkPushFailPayMessage(){ - //查找出状态为三 消息发送失败的订单 再次发送支付消息。直到成功为止 + //查找出状态为3 校验失败 4 发送消息失败 的消息需要重发 List list = leasePayRecordMessageService.list(new LambdaQueryWrapper() .eq(LeasePayRecordMessage::getStatus, 3) - .ge(LeasePayRecordMessage::getCreateTime, LocalDateTime.now().minusHours(3))); + .ge(LeasePayRecordMessage::getCreateTime, LocalDateTime.now().minusHours(3)) + .or().eq(LeasePayRecordMessage::getStatus, 4)); if (list.isEmpty()){ return; } - List orderIds = list.stream().map(leasePayRecordMessage-> Long.valueOf(leasePayRecordMessage.getOrderId())).distinct().collect(Collectors.toList()); - sendMessageToMq(orderIds); + List orderIds = list.stream().map(leasePayRecordMessage->Long.valueOf(leasePayRecordMessage.getOrderId())).collect(Collectors.toList()); + Map feeMap = getFee(orderIds); + List againSendList = new ArrayList<>(); + for (LeasePayRecordMessage leasePayRecordMessage : list) { + Long timestamp = System.currentTimeMillis()/1000; + RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() + .queue_id(leasePayRecordMessage.getQueueId()) + .order_id(leasePayRecordMessage.getOrderId()) + .chain(leasePayRecordMessage.getFromChain()) + .symbol(leasePayRecordMessage.getFromSymbol()) + .from_address(leasePayRecordMessage.getFromAddress()) + .to_address(leasePayRecordMessage.getToAddress()) + .fee(feeMap.get(leasePayRecordMessage.getOrderId())) + .amount(leasePayRecordMessage.getAmount()) + .timestamp(timestamp) + .sign(HashUtils.sha256(timestamp)) + .build(); + try { + rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build); + leasePayRecordMessage.setStatus(2); + againSendList.add(leasePayRecordMessage); + }catch (Exception e){ + System.out.println("消息发送失败"+e.getMessage()); + } + } + leasePayRecordMessageService.updateBatchById(againSendList); + } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java index cc7dcdd..aa964b0 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/task/RealPowerInsetTask.java @@ -11,6 +11,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -73,7 +75,12 @@ public class RealPowerInsetTask { public List getRealPower(String coin){ List leaseProductMachines = leaseProductMachineMapper.selectList(new LambdaQueryWrapper() .eq(LeaseProductMachine::getDel, false)); - return leaseProductMachineMapper.getRecentlyFiveMinutesData(leaseProductMachines, coin); + List recentlyFiveMinutesData = leaseProductMachineMapper.getRecentlyFiveMinutesData(leaseProductMachines, coin); + for (ProductMachineDto recentlyFiveMinutesDatum : recentlyFiveMinutesData) { + recentlyFiveMinutesDatum.setComputingPower(recentlyFiveMinutesDatum.getComputingPower() + .divide(BigDecimal.valueOf(24 * 60 * 60),2, RoundingMode.HALF_UP)); + } + return recentlyFiveMinutesData; } diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml new file mode 100644 index 0000000..86f81c1 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageInfoMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, queue_id, from_address, to_address, amount, `to_chain`, to_symbol,from_chain,from_symbol, order_id,create_time, status, del + + diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml index fd9466e..5fa997f 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeasePayRecordMessageMapper.xml @@ -38,7 +38,17 @@ (from_address = #{item.fromAddress} AND `from_chain` = #{item.fromChain} AND from_symbol = #{item.fromSymbol}) ) AND create_time >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 6 MONTH) AND del = 0 - GROUP BY from_address, from_chain, from_symbol; + GROUP BY from_address, from_chain, from_symbol + UNION + SELECT DISTINCT from_address as fromAddress,from_chain as fromChain,from_symbol as fromSymbol, true AS hasOperator + FROM lease_pay_record_message_info + WHERE + ( + (from_address = #{item.fromAddress} AND `from_chain` = #{item.fromChain} AND from_symbol = #{item.fromSymbol}) + ) + AND create_time >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 6 MONTH) AND del = 0 + GROUP BY from_address, from_chain, from_symbol +