From bc2f76662c8f53ae9c737f8db5dda6c9100e995e Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Tue, 23 Dec 2025 10:27:50 +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=E6=96=B0=E5=A2=9E=E5=85=85=E5=80=BC=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E4=BB=98=EF=BC=8C=E6=8F=90=E7=8E=B0=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=B4=A6=E6=9C=AC=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m2pool/lease/annotation/LedgerLog.java | 15 + .../lease/annotation/LedgerLogParam.java | 10 + .../m2pool/lease/annotation/LedgerLogTag.java | 13 + .../m2pool/lease/aspect/LedgerLogService.java | 38 +++ .../lease/aspect/OperationLogAspect.java | 83 ++++++ .../controller/LeaseShopV2Controller.java | 4 +- .../lease/controller/LeaseUserController.java | 4 +- .../lease/mapper/LeaseShopConfigMapper.java | 10 + .../mapper/LeaseUserWalletDataMapper.java | 9 + .../com/m2pool/lease/mq/MessageReceiver.java | 50 ++-- .../RabbitmqPayRechargeReturnMessage.java | 12 +- .../RabbitmqPayWithdrawReturnMessage.java | 20 +- .../service/impl/LeaseShopServiceImpl.java | 25 +- .../service/impl/LeaseUserServiceImpl.java | 5 +- .../m2pool/lease/task/OrderAndPayTask.java | 257 +++++++++--------- .../java/com/m2pool/lease/vo/BalanceVo.java | 7 + .../mapper/lease/LeaseShopConfigMapper.xml | 7 + .../lease/LeaseUserWalletDataMapper.xml | 10 + 18 files changed, 421 insertions(+), 158 deletions(-) create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLog.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogParam.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogTag.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/LedgerLogService.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLog.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLog.java new file mode 100644 index 0000000..3ca7b0c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLog.java @@ -0,0 +1,15 @@ +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 LedgerLog { + String value(); +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogParam.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogParam.java new file mode 100644 index 0000000..d38859c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogParam.java @@ -0,0 +1,10 @@ +package com.m2pool.lease.annotation; + +import java.lang.annotation.*; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LedgerLogParam { + String value() default ""; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogTag.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogTag.java new file mode 100644 index 0000000..21e0d9c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/annotation/LedgerLogTag.java @@ -0,0 +1,13 @@ +package com.m2pool.lease.annotation; + +import java.lang.annotation.*; + +/*** + * 账本日志地址标识注解 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LedgerLogTag { + String value() default ""; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/LedgerLogService.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/LedgerLogService.java new file mode 100644 index 0000000..29a781c --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/LedgerLogService.java @@ -0,0 +1,38 @@ +package com.m2pool.lease.aspect; + +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * 用户账本日志服务类 + */ +@Service +public class LedgerLogService { + private static final String LOG_DIR = "/home/ubuntu/web/logs/ledger/"; + private static final DateTimeFormatter MONTH_FORMAT = DateTimeFormatter.ofPattern("yyyyMM"); + + public void logOperation(String tag, String operation, String content) { + String month = LocalDate.now().format(MONTH_FORMAT); + String fileName = String.format("%s%s_%s.log", LOG_DIR, tag, month); + + try { + Files.createDirectories(Paths.get(LOG_DIR)); + String logEntry = String.format("[%s] %s: %s%n", + LocalDateTime.now(), operation, content); + Files.write(Paths.get(fileName), + logEntry.getBytes(StandardCharsets.UTF_8), + StandardOpenOption.CREATE, + StandardOpenOption.APPEND); + } catch (IOException e) { + System.out.println("创建用户日志文件失败"+e.getMessage()); + } + } +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java new file mode 100644 index 0000000..fe41541 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/aspect/OperationLogAspect.java @@ -0,0 +1,83 @@ +package com.m2pool.lease.aspect; + +import com.m2pool.common.security.utils.SecurityUtils; +import com.m2pool.lease.annotation.EncryptedField; +import com.m2pool.lease.annotation.LedgerLog; +import com.m2pool.lease.annotation.LedgerLogParam; +import com.m2pool.lease.annotation.LedgerLogTag; +import com.m2pool.lease.dto.Result; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +@Aspect +@Component +public class OperationLogAspect { + @Autowired + private LedgerLogService ledgerLogService; + + @Pointcut("@annotation(com.m2pool.lease.annotation.LedgerLog)") + public void operationPointcut() {} + + @AfterReturning(pointcut = "operationPointcut()", returning = "result") + public void afterOperation(JoinPoint joinPoint, Object result) { + // 获取当前登录用户 + String address = ""; + + // 获取操作类型 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + LedgerLog annotation = method.getAnnotation(LedgerLog.class); + //获取操作信息 + StringBuilder ledgerLog = new StringBuilder(); + for (Object arg : joinPoint.getArgs()) { + if (arg != null) { + Field[] fields = arg.getClass().getDeclaredFields(); + for (Field field : fields) { + try { + if (field.isAnnotationPresent(LedgerLogParam.class)) { + field.setAccessible(true); + Object value = field.get(arg); + ledgerLog.append(field.getAnnotation(LedgerLogParam.class).value()) + .append("=") + .append(value) + .append("; "); + + }else if (field.isAnnotationPresent(LedgerLogTag.class)){ + field.setAccessible(true); + address = (String) field.get(arg); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + } + + if (result != null){ + // 添加手续费值的特殊处理(手续不准在请求参数中传递,只能通过返回获取) + if (result instanceof Result) { + ledgerLog.append(((Result) result).getData()).append("; "); + } + ledgerLog.append("\n结果:").append(result); + } + // 记录日志 + ledgerLogService.logOperation(address, annotation.value(), ledgerLog.toString()); + } + + @AfterThrowing(pointcut = "operationPointcut()", throwing = "ex") + public void afterOperationError(JoinPoint joinPoint, Exception ex) { + // 获取当前登录用户 + String username = SecurityUtils.getUsername(); + String operation = joinPoint.getSignature().getName(); + ledgerLogService.logOperation(username, operation, "操作失败: " + ex.getMessage()); + } +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseShopV2Controller.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseShopV2Controller.java index 600f1b2..3613a7f 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseShopV2Controller.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseShopV2Controller.java @@ -2,6 +2,7 @@ package com.m2pool.lease.controller; import com.m2pool.lease.annotation.Decrypt; +import com.m2pool.lease.annotation.LedgerLog; import com.m2pool.lease.dto.PageResult; import com.m2pool.lease.dto.Result; import com.m2pool.lease.dto.v2.PayWithdrawSellerRecordDto; @@ -48,9 +49,10 @@ public class LeaseShopV2Controller { return leaseShopService.getShopConfigV2(baseVo); } + @LedgerLog(value = "卖家钱包--余额提现申请") + @Decrypt @PostMapping("/withdrawBalanceForSeller") @ApiOperation(value = "卖家店铺钱包余额提现") - @Decrypt public Result withdrawBalanceForSeller(@RequestBody BalanceVo balanceVo){ return leaseShopService.withdrawBalanceForSeller(balanceVo); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseUserController.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseUserController.java index 101657e..f8820a3 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseUserController.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseUserController.java @@ -3,6 +3,7 @@ package com.m2pool.lease.controller; import com.m2pool.common.security.annotation.RequiresLogin; import com.m2pool.lease.annotation.Decrypt; +import com.m2pool.lease.annotation.LedgerLog; import com.m2pool.lease.dto.*; import com.m2pool.lease.service.LeaseUserService; import com.m2pool.lease.vo.*; @@ -51,9 +52,10 @@ public class LeaseUserController { } + @LedgerLog(value = "买家钱包--余额提现申请") + @Decrypt @PostMapping("/withdrawBalance") @ApiOperation(value = "申请余额提现") - @Decrypt public Result withdrawBalance(@RequestBody BalanceVo balanceVo){ return leaseUserService.withdrawBalance(balanceVo); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java index 241ab5d..b5a6a62 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java @@ -3,6 +3,7 @@ package com.m2pool.lease.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.m2pool.lease.dto.*; import com.m2pool.lease.dto.v2.ShopWalletInfoDto; +import com.m2pool.lease.entity.LeasePayRecordMessage; import com.m2pool.lease.entity.LeaseShopConfig; import org.apache.ibatis.annotations.Param; @@ -61,4 +62,13 @@ public interface LeaseShopConfigMapper extends BaseMapper { * @return */ ShopWalletInfoDto getShopWalletInfo(@Param("shopId") Long shopId,@Param("address") String address,@Param("chain") String chain,@Param("coin") String coin); + + + + /** + * 根据支付记录修改余额 + * @param reocrdList 钱包信息 + * @return 更新数量 + */ + int updateBalance(@Param("list") List reocrdList); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java index 3bc4225..4c89d6d 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java @@ -3,6 +3,7 @@ package com.m2pool.lease.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.m2pool.lease.dto.ChainAndCoinDto; import com.m2pool.lease.dto.UserWalletDataDto; +import com.m2pool.lease.entity.LeasePayRecordMessage; import com.m2pool.lease.entity.LeaseUserWalletData; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,4 +50,12 @@ public interface LeaseUserWalletDataMapper extends BaseMapper selectWalletByChainAndCoinAndUsername(@Param("list") Set chainAndCoinSet,@Param("username") String username); + + + /** + * 根据支付记录修改余额及冻结余额 + * @param reocrdList 钱包信息 + * @return 更新数量 + */ + int updateBalanceAndBlockBalance(@Param("list") List reocrdList); } 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 9c329e1..3fe6302 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 @@ -4,6 +4,8 @@ import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.m2pool.common.core.utils.StringUtils; +import com.m2pool.lease.annotation.LedgerLog; +import com.m2pool.lease.annotation.LedgerLogParam; import com.m2pool.lease.constant.RabbitmqConstant; import com.m2pool.lease.entity.*; import com.m2pool.lease.exception.PayRechargeException; @@ -14,6 +16,9 @@ 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; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Recover; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -245,6 +250,7 @@ public class MessageReceiver { * 余额充值 消费者 (正常流程一笔充值会有两个消息 2 充值中 1充值成功) * @param payRechargeReturnMessage */ + @LedgerLog(value = "余额充值") @RabbitListener(queues = RabbitmqConstant.PAY_RECHARGE_RETURN_QUEUE,containerFactory ="rabbitListenerContainerFactory") @Transactional(rollbackFor = Exception.class) public void listenerPayRechargeStatusQueueMessage(@Payload RabbitmqPayRechargeReturnMessage payRechargeReturnMessage) { @@ -328,6 +334,7 @@ public class MessageReceiver { * 余额提现 消费者 * @param payWithdrawReturnMessage */ + @LedgerLog(value = "余额提现结果") @RabbitListener(queues = RabbitmqConstant.PAY_WITHDRAW_RETURN_QUEUE,containerFactory ="rabbitListenerContainerFactory") @Transactional(rollbackFor = Exception.class) public void listenerPayWithdrawStatusQueueMessage(@Payload RabbitmqPayWithdrawReturnMessage payWithdrawReturnMessage) { @@ -342,7 +349,8 @@ public class MessageReceiver { LeaseShopConfig leaseShopConfig = leaseShopConfigMapper.selectOne(new LambdaQueryWrapper() .eq(LeaseShopConfig::getPayAddress, leasePayWithdrawMessage.getFromAddress()) .eq(LeaseShopConfig::getChain, leasePayWithdrawMessage.getFromChain()) - .eq(LeaseShopConfig::getPayCoin, leasePayWithdrawMessage.getFromSymbol())); + .eq(LeaseShopConfig::getPayCoin, leasePayWithdrawMessage.getFromSymbol()) + .eq(LeaseShopConfig::getDel, false)); if (leaseShopConfig != null){ //要修改的钱包状态为1 且提现的状态为1 则不处理 if (leasePayWithdrawMessage.getStatus() == 1 && payWithdrawReturnMessage.getStatus() == 1){ @@ -357,6 +365,8 @@ public class MessageReceiver { leasePayWithdrawMessageMapper.updateById(LeasePayWithdrawMessage.builder() .id(leasePayWithdrawMessage.getId()) .status(payWithdrawReturnMessage.getStatus()) + .txHash(payWithdrawReturnMessage.getTx_hash()) + .blockHeight(payWithdrawReturnMessage.getBlock_height()) .build()); //TODO 修改leaseShopConfig 金额(暂时不修改,提现申请的时候就修改了) } @@ -364,6 +374,12 @@ public class MessageReceiver { } + /** + * 处理买家提现消息 + * @param payWithdrawReturnMessage + * @param leasePayWithdrawMessageList + * @return + */ public LeasePayWithdrawMessage handlerBuyerWithdraw(RabbitmqPayWithdrawReturnMessage payWithdrawReturnMessage,List leasePayWithdrawMessageList){ LeasePayWithdrawMessage leasePayWithdrawMessage = leasePayWithdrawMessageList.get(0); //获取对应的提现钱包 @@ -372,6 +388,7 @@ public class MessageReceiver { .eq(LeaseUserWalletData::getFromChain, leasePayWithdrawMessage.getFromChain()) .eq(LeaseUserWalletData::getFromSymbol, leasePayWithdrawMessage.getFromSymbol()) .eq(LeaseUserWalletData::getDel,false)); + //如果不存在,则说明本次提现申请的是卖方钱包提现 if (leaseUserWalletData == null){ return leasePayWithdrawMessage; } @@ -512,7 +529,6 @@ public class MessageReceiver { } } - ////测试 开发环境 支付回调测试 //@RabbitListener(queues = RabbitmqConstant.PAY_AUTO_QUEUE,containerFactory ="rabbitListenerContainerFactory") //@Transactional(rollbackFor = Exception.class) @@ -537,22 +553,22 @@ public class MessageReceiver { // 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 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); // // // //发送充值消息 @@ -567,8 +583,9 @@ public class MessageReceiver { // .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) { @@ -579,6 +596,7 @@ public class MessageReceiver { // .amount(payAutoReturnMessage.getAmount()) // .chain(payAutoReturnMessage.getChain()) // .symbol(payAutoReturnMessage.getSymbol()) + // .from_address(payAutoReturnMessage.getFrom_address()) // .tx_hash(UuidGeneratorUtil.generateUuidWithoutHyphen()) // .fee(payAutoReturnMessage.getFee()) // .build(); diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayRechargeReturnMessage.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayRechargeReturnMessage.java index da4899a..1500cbf 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayRechargeReturnMessage.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayRechargeReturnMessage.java @@ -1,5 +1,7 @@ package com.m2pool.lease.mq.message; +import com.m2pool.lease.annotation.LedgerLogParam; +import com.m2pool.lease.annotation.LedgerLogTag; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -20,44 +22,50 @@ public class RabbitmqPayRechargeReturnMessage { /** * 消息ID */ + @LedgerLogParam(value = "消息ID") private String queue_id; - - /** * 充值地址 */ + @LedgerLogTag(value = "充值地址") private String address; /** * 来源地址(用户自己的钱包) */ + @LedgerLogParam(value = "地址") private String fromAddress; /** * 充值是否成功 */ + @LedgerLogParam(value = "充值结果") private Integer status; /** * 链名称 */ + @LedgerLogParam(value = "链") private String chain; /** * 币种 */ + @LedgerLogParam(value = "币种") private String symbol; /** * 充值金额 */ + @LedgerLogParam(value = "充值金额") private BigDecimal amount; /** * 交易ID */ + @LedgerLogParam(value = "交易ID") private String tx_hash; /** diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayWithdrawReturnMessage.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayWithdrawReturnMessage.java index 44df073..5a6370c 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayWithdrawReturnMessage.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mq/message/RabbitmqPayWithdrawReturnMessage.java @@ -1,5 +1,7 @@ package com.m2pool.lease.mq.message; +import com.m2pool.lease.annotation.LedgerLogParam; +import com.m2pool.lease.annotation.LedgerLogTag; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -20,39 +22,46 @@ public class RabbitmqPayWithdrawReturnMessage { /** * 消息ID */ + @LedgerLogParam(value = "消息ID") private String queue_id; /** * 链名称 */ + @LedgerLogParam(value = "链") private String chain; /** * 币种 */ + @LedgerLogParam(value = "币种") private String symbol; /** * 提现结果 */ + @LedgerLogParam(value = "提现结果") private Integer status; /** * 提现金额 */ + @LedgerLogParam(value = "提现金额") private BigDecimal amount; /** * 手续费 */ + @LedgerLogParam(value = "手续费") private BigDecimal fee; /** * 交易hash */ + @LedgerLogParam(value = "交易hash") private String tx_hash; /** @@ -60,11 +69,12 @@ public class RabbitmqPayWithdrawReturnMessage { */ private Long block_height; - ///** - // * 来源地址 - // */ - //private String from_address; - // + /** + * 来源地址 + */ + @LedgerLogTag(value = "来源地址") + private String from_address; + ///** // * 收款地址 // */ 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 6944fbb..e2d64b9 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 @@ -333,13 +333,13 @@ public class LeaseShopServiceImpl extends ServiceImpl payCoinsList = new ArrayList<>(Arrays.asList(shopConfigVo.getPayCoin().split(","))); LeaseShopConfig configList = leaseShopConfigMapper.selectOne(new LambdaQueryWrapper() - .eq(LeaseShopConfig::getShopId, leaseShop.getId()) + .eq(LeaseShopConfig::getPayAddress, shopConfigVo.getPayAddress()) .eq(LeaseShopConfig::getPayCoin, shopConfigVo.getPayCoin()) .eq(LeaseShopConfig::getChain, shopConfigVo.getChain()) .eq(LeaseShopConfig::getDel, false) ); if (configList != null){ - return Result.fail("绑定钱包失败!已存在" + shopConfigVo.getChain()+"链"+ shopConfigVo.getPayCoin()+ "币种钱包"); + return Result.fail("绑定"+shopConfigVo.getPayAddress()+"钱包失败!" + shopConfigVo.getChain()+"链"+ shopConfigVo.getPayCoin()+ "币种钱包,已被绑定"); } //获取币种图标 @@ -669,9 +669,9 @@ public class LeaseShopServiceImpl extends ServiceImpl 0){ - // return Result.fail("钱包地址余额不为0,请先提现,否则会造成财产丢失"); - //} + LeaseShopConfig byId = leaseShopConfigService.getById(shopWalletInfoVo.getId()); + if (byId.getBalance().compareTo(BigDecimal.ZERO) > 0){ + return Result.fail("钱包地址余额不为0,请先提现,否则会造成财产丢失"); + } + LeaseShopConfig leaseShopConfig = leaseShopConfigMapper.selectOne(new LambdaQueryWrapper() + .eq(LeaseShopConfig::getPayAddress, shopWalletInfoVo.getPayAddress()) + .eq(LeaseShopConfig::getChain, shopWalletInfoVo.getChain()) + .eq(LeaseShopConfig::getPayCoin, byId.getPayCoin()) + .eq(LeaseShopConfig::getDel, false) + ); + if (leaseShopConfig != null){ + return Result.fail("修改失败,该钱包地址下链和币种已被绑定,请重新输入地址或先解绑后重新绑定"); + } boolean b = leaseShopConfigService.updateById(LeaseShopConfig.builder() .id(shopWalletInfoVo.getId()) .payAddress(shopWalletInfoVo.getPayAddress()) 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 04b39dc..239172b 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 @@ -371,10 +371,9 @@ public class LeaseUserServiceImpl extends ServiceImpl orderComplete = new ArrayList<>(); - //本次部分已完成订单详情id + 机器id 集合 + //本次部分已完成订单详情id + 矿机 集合 List itemCompleteIds = new ArrayList<>(); List completeMachines = new ArrayList<>(); @@ -204,7 +206,7 @@ public class OrderAndPayTask { Map> userMapItem = needPayInfos.stream() .collect(Collectors.groupingBy(LeaseOrderItem::getOrderId)); - List rabbitmqPayAutoMessages = new ArrayList<>(); + List recordMessageInfoList = new ArrayList<>(); List saleIngList = new ArrayList<>(); // 按照订单分组 userMapItem.forEach((orderId, items) -> { @@ -213,46 +215,52 @@ public class OrderAndPayTask { //因为同一个订单的queueId相同,所以这里直接使用订单id LeaseOrderInfo orderInfo = queueIdMap.get(orderId); //买方信息 - RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() - .queue_id(orderInfo.getOrderNumber()) - .order_id(String.valueOf(orderId)) - .shopId(leaseOrderItem.getShopId()) - .chain(leaseOrderItem.getChain()) - .symbol(leaseOrderItem.getSymbol()) - .fee(orderInfo.getFee()) - .userId(leaseOrderItem.getUserId()) - .from_address(leaseOrderItem.getFromAddress()) - .to_address(leaseOrderItem.getAddress()) + LeasePayRecordMessageInfo build = LeasePayRecordMessageInfo.builder() + .orderId(String.valueOf(orderId)) + .orderNumber(orderInfo.getOrderNumber()) + .queueId(orderInfo.getOrderNumber()) + .fromAddress(leaseOrderItem.getFromAddress()) + .toAddress(leaseOrderItem.getAddress()) .amount(BigDecimal.ZERO) - .blockAmount(BigDecimal.ZERO) + .realAmount(BigDecimal.ZERO) .needAmount(BigDecimal.ZERO) - .timestamp(timestamp) - .sign(HashUtils.sha256(timestamp)) + .blockAmount(BigDecimal.ZERO) + .fromChain(leaseOrderItem.getChain()) + .fromSymbol(leaseOrderItem.getSymbol()) + .shopId(leaseOrderItem.getShopId()) + .userId(leaseOrderItem.getUserId()) + .toChain(leaseOrderItem.getChain()) + .toSymbol(leaseOrderItem.getSymbol()) .build(); for (LeaseOrderItem item : items) { - BigDecimal amount = orderItemToPriceMap.get(item.getId()); - BigDecimal realPayAmount = amount== null ? BigDecimal.ZERO : amount; - //设置理论支付金额 和 冻结金额 和 已支付理论金额 (冻结金额 = 理论支付金额 = 已支付理论金额) - build.setNeedAmount(build.getNeedAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); - build.setBlockAmount(build.getBlockAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); + BigDecimal realAmount = orderItemToPriceMap.get(item.getId()); + BigDecimal realPayAmount = realAmount== null ? BigDecimal.ZERO : realAmount; + //已支付金额 和实际待支付金额 item.setAlreadyPayAmount(item.getAlreadyPayAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); - //设置待支付真实金额 item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(realPayAmount)); - // mq消息真实支付金额 - build.setAmount(build.getAmount().add(realPayAmount)); + //设置理论支付金额 和 冻结金额 额 (冻结金额 = 理论支付金额) + build.setBlockAmount(build.getBlockAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); + build.setAmount(build.getAmount().add(item.getPrice().multiply(BigDecimal.valueOf(item.getNumbers())))); + // 实际支付金额 + 理论实际应支付金额 + build.setRealAmount(build.getRealAmount().add(realPayAmount)); + build.setNeedAmount(build.getNeedAmount().add(realPayAmount)); saleIngList.add(item); } - - if (build.getAmount().compareTo(BigDecimal.ZERO) > 0){ - rabbitmqPayAutoMessages.add(build); - } + //实际支付金额即使为0也要记录 + recordMessageInfoList.add(build); + //实际支付不为0才记录 + //if (build.getRealAmount().compareTo(BigDecimal.ZERO) > 0){ + // recordMessageInfoList.add(build); + //} }); //修改订单支付金额等相关信息 leaseOrderItemService.updateBatchById(saleIngList); //保存支付信息到支付记录表中 - saveMqMessageToDB(rabbitmqPayAutoMessages); + if (!recordMessageInfoList.isEmpty()){ + leasePayRecordMessageInfoService.saveBatch(recordMessageInfoList); + } } //2.处理完成的订单 (订单部分完成) if(!itemCompleteIds.isEmpty()){ @@ -387,43 +395,10 @@ public class OrderAndPayTask { public void handlerOrderAllComplete(List orderIds){ //修改状态为已完成 leaseOrderInfoMapper.update(LeaseOrderInfo.builder().status(8).build(), new LambdaQueryWrapper().in(LeaseOrderInfo::getId, orderIds)); - //发送支付消息 + //老版本:发送支付消息 sendMessageToMq(orderIds); } - /** - * 保存支付消息到支付记录表中 - * @param rabbitmqPayAutoMessages - */ - public void saveMqMessageToDB( List rabbitmqPayAutoMessages){ - if (!rabbitmqPayAutoMessages.isEmpty()){ - List collect = new ArrayList<>(); - for (RabbitmqPayAutoMessage rabbitmqPayAutoMessage : rabbitmqPayAutoMessages) { - collect.add( LeasePayRecordMessageInfo.builder() - .orderId(rabbitmqPayAutoMessage.getOrder_id()) - .orderNumber(rabbitmqPayAutoMessage.getQueue_id()) - .queueId(rabbitmqPayAutoMessage.getQueue_id()) - .fromAddress(rabbitmqPayAutoMessage.getFrom_address()) - .toAddress(rabbitmqPayAutoMessage.getTo_address()) - .amount(rabbitmqPayAutoMessage.getNeedAmount()) - .realAmount(rabbitmqPayAutoMessage.getAmount()) - .needAmount(rabbitmqPayAutoMessage.getAmount()) - .fromChain(rabbitmqPayAutoMessage.getChain()) - .fromSymbol(rabbitmqPayAutoMessage.getSymbol()) - .blockAmount(rabbitmqPayAutoMessage.getBlockAmount()) - .shopId(rabbitmqPayAutoMessage.getShopId()) - .userId(rabbitmqPayAutoMessage.getUserId()) - .toChain(rabbitmqPayAutoMessage.getChain()) - .toSymbol(rabbitmqPayAutoMessage.getSymbol()) - .build()); - } - leasePayRecordMessageInfoService.saveBatch(collect); - } - } - - - - /** * 处理订单部分完成 * @param itemIds 已完成订单项id @@ -496,36 +471,36 @@ public class OrderAndPayTask { //3.筛选出租期到期的商品 List expireProductList = new ArrayList<>(); - List rabbitmqPayAutoMessages = new ArrayList<>(); + List recordMessageInfoList = new ArrayList<>(); Map orderInfoIdAndIsComplete = new HashMap<>(); List saleIngList = new ArrayList<>(); // 按照订单分组 userMapItem.forEach((orderId, items) -> { LeaseOrderItem leaseOrderItem = items.get(0); List expire = new ArrayList<>(); - long timestamp = System.currentTimeMillis()/1000; //因为同一个订单的queueId相同,所以这里直接使用订单id LeaseOrderInfo orderInfo = queueIdMap.get(leaseOrderItem.getOrderId()); - String queueId =orderInfo.getOrderNumber(); //买方信息 - RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() - .queue_id(queueId) - .order_id(String.valueOf(orderId)) - .shopId(leaseOrderItem.getShopId()) - .chain(leaseOrderItem.getChain()) - .symbol(leaseOrderItem.getSymbol()) - .fee(orderInfo.getFee()) - .userId(leaseOrderItem.getUserId()) - .from_address(leaseOrderItem.getFromAddress()) - .to_address(leaseOrderItem.getAddress()) + LeasePayRecordMessageInfo build = LeasePayRecordMessageInfo.builder() + .orderId(String.valueOf(orderId)) + .orderNumber(orderInfo.getOrderNumber()) + .queueId(orderInfo.getOrderNumber()) + .fromAddress(leaseOrderItem.getFromAddress()) + .toAddress(leaseOrderItem.getAddress()) .amount(BigDecimal.ZERO) - .blockAmount(BigDecimal.ZERO) + .realAmount(BigDecimal.ZERO) .needAmount(BigDecimal.ZERO) - .timestamp(timestamp) - .sign(HashUtils.sha256(timestamp)) + .blockAmount(BigDecimal.ZERO) + .fromChain(leaseOrderItem.getChain()) + .fromSymbol(leaseOrderItem.getSymbol()) + .shopId(leaseOrderItem.getShopId()) + .userId(leaseOrderItem.getUserId()) + .toChain(leaseOrderItem.getChain()) + .toSymbol(leaseOrderItem.getSymbol()) .build(); - for (LeaseOrderItem item : items) { + + for (LeaseOrderItem item : items) { orderInfoIdAndIsComplete.putIfAbsent(item.getOrderId(), true); LocalDateTime expireTime = item.getCreateTime().plusDays(1).toLocalDate().atStartOfDay().plusDays(item.getLeaseTime()); //开发环境 @@ -540,7 +515,7 @@ public class OrderAndPayTask { String key = item.getUser() + "-" + item.getMiner(); LeaseProductMachine machine = idAndMachineMap.get(item.getProductMachineId()); ProductMachineDto productMachineDto = machineDtoMap.get(key); - build.setNeedAmount(build.getNeedAmount().add(item.getPrice())); + build.setAmount(build.getAmount().add(item.getPrice())); build.setBlockAmount(build.getBlockAmount().add(item.getPrice())); if (productMachineDto != null){ //理论算力 @@ -555,11 +530,13 @@ public class OrderAndPayTask { if (divide.compareTo(BigDecimal.valueOf(0.05)) > 0){ BigDecimal add = item.getPrice().multiply(BigDecimal.ONE.subtract(divide)); item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(add)); - build.setAmount(build.getAmount().add(add)); + build.setRealAmount(build.getRealAmount().add(add)); + build.setNeedAmount(build.getNeedAmount().add(add)); }else{ BigDecimal add = item.getPrice(); item.setSettlePayRealAmount(item.getSettlePayRealAmount().add(add)); - build.setAmount(build.getAmount().add(add)); + build.setRealAmount(build.getRealAmount().add(add)); + build.setNeedAmount(build.getNeedAmount().add(add)); } } item.setAlreadyPayAmount(item.getAlreadyPayAmount().add(item.getPrice())); @@ -634,12 +611,18 @@ public class OrderAndPayTask { //}); //build.setTransactions(sellerPayInfoMessages); if (build.getAmount().compareTo(BigDecimal.ZERO) > 0){ - rabbitmqPayAutoMessages.add(build); + recordMessageInfoList.add(build); } expireProductList.addAll(expire); }); - //4.租约到期相关信息修改 + + //4.保存支付消息到支付记录表中 + if (!recordMessageInfoList.isEmpty()){ + leasePayRecordMessageInfoService.saveBatch(recordMessageInfoList); + } + + //5.租约到期相关信息修改 if (!expireProductList.isEmpty()){ List itemIds = new ArrayList<>(); List machineIds = new ArrayList<>(); @@ -647,13 +630,13 @@ public class OrderAndPayTask { itemIds.add(leaseOrderItem.getId()); machineIds.add(leaseOrderItem.getProductMachineId()); } - //4.1 修改订单详情表中状态为 0 租约已过期 + //5.1 修改订单详情表中状态为 0 租约已过期 leaseOrderItemMapper.update(LeaseOrderItem.builder().status(0).build(), new LambdaUpdateWrapper() .in(LeaseOrderItem::getId, itemIds)); - //4.2 修改商品库存矿机表 矿机状态为 0 未售出 + //5.2 修改商品库存矿机表 矿机状态为 0 未售出 leaseProductMachineMapper.update(LeaseProductMachine.builder().saleState(0).build(), new LambdaUpdateWrapper() .in(LeaseProductMachine::getId, machineIds)); - //4.3 修改用户已购矿机表状态为 1 套餐已过期 + //5.3 修改用户已购矿机表状态为 1 套餐已过期 List list = leaseUserOwnedProductService.list(new LambdaQueryWrapper() .select(LeaseUserOwnedProduct::getId,LeaseUserOwnedProduct::getSettleIncome,LeaseUserOwnedProduct::getCurrentIncome).in(LeaseUserOwnedProduct::getProductMachineId, machineIds)); List collect = list.stream().map(item -> { @@ -665,7 +648,7 @@ public class OrderAndPayTask { }).collect(Collectors.toList()); leaseUserOwnedProductService.updateBatchById(collect); - //4.4 矿机对应商品 销售量修改 + //5.4 矿机对应商品 销售量修改 //Map productIdAndCountMap = expireProductList.stream().collect(Collectors.groupingBy(LeaseOrderItem::getProductId, Collectors.counting())); //Set longs = productIdAndCountMap.keySet(); //List leaseProducts = leaseProductService.list(new LambdaQueryWrapper().in(LeaseProduct::getId, longs)); @@ -674,7 +657,7 @@ public class OrderAndPayTask { //}); //leaseProductService.updateBatchById(leaseProducts); - //4.5 找到详情表所有状态为0 租约已过期 ,并且订单info表订单状态为7 进行中的订单 并改为状态8 订单已完成 ; 并且发送支付消息 + //5.5 找到详情表所有状态为0 租约已过期 ,并且订单info表订单状态为7 进行中的订单 并改为状态8 订单已完成 ; 并且发送支付消息 List orderIds = orderInfoIdAndIsComplete.entrySet().stream() .filter(entry -> Boolean.TRUE.equals(entry.getValue())) .map(Map.Entry::getKey) @@ -687,11 +670,9 @@ public class OrderAndPayTask { } } - //5.正在售出中矿机已支付金额 + //6.正在售出中矿机已支付金额 leaseOrderItemService.updateBatchById(saleIngList); - //6.保存支付消息到支付记录表中 - saveMqMessageToDB(rabbitmqPayAutoMessages); } /** @@ -738,34 +719,30 @@ public class OrderAndPayTask { public void sendMessageToMq(List orderIds){ List leasePayRecordMessages = leasePayRecordMessageInfoService.list(new LambdaQueryWrapper() .in(LeasePayRecordMessageInfo::getOrderId, orderIds)); - Map feeMap = getFee(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; LeasePayRecordMessageInfo initForm = payRecordMessagesList.get(0); - RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() - .queue_id(initForm.getQueueId()) - .chain(initForm.getFromChain()) - .symbol(initForm.getFromSymbol()) - .from_address(initForm.getFromAddress()) - .to_address(initForm.getToAddress()) - .fee(feeMap.get(orderId)) - .amount(BigDecimal.ZERO) - .blockAmount(BigDecimal.ZERO) - .needAmount(BigDecimal.ZERO) - .timestamp(timestamp) - .sign(HashUtils.sha256(timestamp)) - .build(); + //long timestamp = System.currentTimeMillis()/1000; + //RabbitmqPayAutoMessage build = RabbitmqPayAutoMessage.builder() + // .queue_id(initForm.getQueueId()) + // .chain(initForm.getFromChain()) + // .symbol(initForm.getFromSymbol()) + // .from_address(initForm.getFromAddress()) + // .to_address(initForm.getToAddress()) + // .fee(feeMap.get(orderId)) + // .amount(BigDecimal.ZERO) + // .blockAmount(BigDecimal.ZERO) + // .needAmount(BigDecimal.ZERO) + // .timestamp(timestamp) + // .sign(HashUtils.sha256(timestamp)) + // .build(); - 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() + LeasePayRecordMessage build = LeasePayRecordMessage.builder() .queueId(initForm.getQueueId()) .fromAddress(initForm.getFromAddress()) .toAddress(initForm.getToAddress()) @@ -773,17 +750,27 @@ public class OrderAndPayTask { .orderId(orderId) .shopId(initForm.getShopId()) .userId(initForm.getUserId()) - .blockAmount(build.getBlockAmount()) - .amount(build.getAmount()) - .realAmount(build.getAmount()) - .needAmount(build.getNeedAmount()) + .blockAmount(BigDecimal.ZERO) + .amount(BigDecimal.ZERO) + .realAmount(BigDecimal.ZERO) + .needAmount(BigDecimal.ZERO) .fromSymbol(initForm.getFromSymbol()) .fromChain(initForm.getFromChain()) .toSymbol(initForm.getToSymbol()) .toChain(initForm.getToChain()) .build(); - reocrdList.add(build1); + for (LeasePayRecordMessageInfo leasePayRecordMessage : payRecordMessagesList) { + build.setAmount(build.getAmount().add(leasePayRecordMessage.getAmount())); + build.setBlockAmount(build.getBlockAmount().add(leasePayRecordMessage.getBlockAmount())); + //现在可以删除NeedAmount这个字段了.新版本不存在需支付真实金额和实际支付真实金额不同的情况 + build.setNeedAmount(build.getNeedAmount().add(leasePayRecordMessage.getNeedAmount())); + build.setRealAmount(build.getRealAmount().add(leasePayRecordMessage.getRealAmount())); + } + reocrdList.add(build); + + //旧版本 + //订单全部完成后不再需要发送支付信息,直接从买家钱包转账到卖家钱包 //try { // rabbitTemplate.convertAndSend(PAY_AUTO_QUEUE, build); //}catch (Exception e){ @@ -793,8 +780,34 @@ public class OrderAndPayTask { //}finally { // reocrdList.add(build1); //} + + //新版本:买家钱包 冻结余额和余额减少 卖家钱包余额增加 + + }); leasePayRecordMessageService.saveBatch(reocrdList); + int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalance(reocrdList); + int sellerUpdate = leaseShopConfigMapper.updateBalance(reocrdList); + + if (buyerUpdate > 0 && sellerUpdate > 0){ + for (LeasePayRecordMessage item : reocrdList) { + String buyerInfo = "订单号:" + item.getOrderNumber() + + "理论支付金额:" + item.getAmount() + + "实际支付金额:" + item.getRealAmount()+ + "收款地址:" + item.getToAddress()+ + "支付链:" + item.getFromChain()+ + "支付币种" + item.getFromSymbol(); + + String sellerInfo = "订单号:" + item.getOrderNumber() + + "收款金额:" + item.getRealAmount()+ + "支付地址:" + item.getFromAddress()+ + "支付链:" + item.getFromChain()+ + "支付币种" + item.getFromSymbol() ; + ledgerLogService.logOperation(item.getFromAddress(), "支付(付款)", buyerInfo); + ledgerLogService.logOperation(item.getToAddress(), "支付(收款)",sellerInfo); + } + } + } @@ -815,10 +828,10 @@ public class OrderAndPayTask { /** - * 一些校验失败的支付消息需要重新发送 + * 一些校验失败的支付消息需要重新发送(新版本不再发送支付消息) */ - @Scheduled(cron = "0 0 0/1 * * ? ") - @Transactional + //@Scheduled(cron = "0 0 0/1 * * ? ") + //@Transactional public void checkPushFailPayMessage(){ //查找出状态为3 校验失败 4 发送消息失败 的消息需要重发 List list = leasePayRecordMessageService.list(new LambdaQueryWrapper() diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/BalanceVo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/BalanceVo.java index f64fea4..c148c35 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/BalanceVo.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/BalanceVo.java @@ -1,6 +1,8 @@ package com.m2pool.lease.vo; import com.m2pool.lease.annotation.EncryptedField; +import com.m2pool.lease.annotation.LedgerLogParam; +import com.m2pool.lease.annotation.LedgerLogTag; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; @@ -30,18 +32,21 @@ public class BalanceVo { * 提现金额 */ @ApiModelProperty(value = "提现 金额",required = true) + @LedgerLogParam("提现金额") private BigDecimal amount; /** * 链 */ @ApiModelProperty(value = "用户自定义的钱包地址链",required = true) + @LedgerLogParam("链") private String toChain; /** * 币种 */ @ApiModelProperty(value = "用户自定义的钱包地址的币种",required = true) + @LedgerLogParam("币种") private String toSymbol; @ApiModelProperty(value = "手续费",required = true) @@ -49,12 +54,14 @@ public class BalanceVo { @ApiModelProperty(value = "绑定的地址",required = true) @EncryptedField + @LedgerLogTag private String fromAddress; /** * 提现地址(用户自定义) */ @ApiModelProperty(value = "提现地址(用户自定义)",required = true) @EncryptedField + @LedgerLogParam("提现目标地址") private String toAddress; @ApiModelProperty(value = "谷歌双重验证验证码",required = true) diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml index fe24f45..9022921 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml @@ -89,5 +89,12 @@ shop_id = #{shopId} AND pay_address = #{address} AND pay_coin = #{coin} AND chain = #{chain} AND del = 0 + + + UPDATE lease_shop_config + SET balance = balance + #{item.realAmount} + WHERE pay_address = #{item.payAddress} AND pay_coin = #{item.payCoin} AND chain = #{item.chain} AND del = false + + diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml index 06eabf8..5643f89 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml @@ -24,6 +24,7 @@ id, user_id, from_address, balance, to_address, from_symbol, from_chain, to_symbol, to_chain, qrcode, create_time, update_time, del + + + + UPDATE lease_user_wallet_data + SET balance = balance - #{item.realAmount}, + blocked_balance = blocked_balance - #{item.blockAmount} + WHERE from_address = #{item.fromAddress} AND from_symbol = #{item.fromSymbol} AND from_chain = #{item.fromChain} AND del = false + + +