diff --git a/src/main/java/com/m2pool/lease/dto/BuyerWalletQueryDto.java b/src/main/java/com/m2pool/lease/dto/BuyerWalletQueryDto.java new file mode 100644 index 0000000..8fad5ef --- /dev/null +++ b/src/main/java/com/m2pool/lease/dto/BuyerWalletQueryDto.java @@ -0,0 +1,73 @@ +package com.m2pool.lease.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 买家钱包查询结果DTO + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BuyerWalletQueryDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + private Long authId; + + /** + * 钱包地址 + */ + private String fromAddress; + + /** + * 余额 + */ + private BigDecimal balance; + + /** + * 冻结余额 + */ + private BigDecimal blockedBalance; + + /** + * 收款地址 + */ + private String toAddress; + + /** + * 币种 + */ + private String fromSymbol; + + /** + * 链名称 + */ + private String fromChain; + + /** + * 收款币种 + */ + private String toSymbol; + + /** + * 收款链名称 + */ + private String toChain; + + /** + * 未修改前冻结余额(乐观锁) + */ + private BigDecimal lock; +} diff --git a/src/main/java/com/m2pool/lease/dto/SellerWalletQueryDto.java b/src/main/java/com/m2pool/lease/dto/SellerWalletQueryDto.java new file mode 100644 index 0000000..11e82d9 --- /dev/null +++ b/src/main/java/com/m2pool/lease/dto/SellerWalletQueryDto.java @@ -0,0 +1,54 @@ +package com.m2pool.lease.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 卖家钱包查询结果DTO + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SellerWalletQueryDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + private String shopId; + + /** + * 链名称 + */ + private String chain; + + /** + * 币种 + */ + private String payCoin; + + /** + * 支付地址 + */ + private String payAddress; + + /** + * 余额 + */ + private BigDecimal balance; + + + /** + * 未修改前余额(乐观锁) + */ + private BigDecimal lock; +} diff --git a/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java b/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java index b5a6a62..f71e0df 100644 --- a/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java +++ b/src/main/java/com/m2pool/lease/mapper/LeaseShopConfigMapper.java @@ -63,12 +63,17 @@ public interface LeaseShopConfigMapper extends BaseMapper { */ ShopWalletInfoDto getShopWalletInfo(@Param("shopId") Long shopId,@Param("address") String address,@Param("chain") String chain,@Param("coin") String coin); - - /** - * 根据支付记录修改余额 - * @param reocrdList 钱包信息 + * 根据卖家钱包信息批量更新余额 + * @param list 卖家钱包信息列表 * @return 更新数量 */ - int updateBalance(@Param("list") List reocrdList); + int updateBalanceById(@Param("list") List list); + + /** + * 根据支付记录批量查询卖家钱包配置信息 + * @param list 支付记录列表 + * @return 卖家钱包配置信息列表 + */ + List selectSellerWalletsByPayRecords(@Param("list") List list); } diff --git a/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java b/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java index 84940f6..e326a5c 100644 --- a/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java +++ b/src/main/java/com/m2pool/lease/mapper/LeaseUserWalletDataMapper.java @@ -1,6 +1,7 @@ package com.m2pool.lease.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.m2pool.lease.dto.BuyerWalletQueryDto; import com.m2pool.lease.dto.ChainAndCoinDto; import com.m2pool.lease.dto.UserWalletDataDto; import com.m2pool.lease.entity.LeasePayRecordMessage; @@ -51,11 +52,17 @@ public interface LeaseUserWalletDataMapper extends BaseMapper selectWalletByChainAndCoinAndUsername(@Param("list") Set chainAndCoinSet,@Param("authId") Long authId); - /** - * 根据支付记录修改余额及冻结余额 - * @param reocrdList 钱包信息 + * 根据买家钱包信息批量更新余额及冻结余额 + * @param list 买家钱包信息列表 * @return 更新数量 */ - int updateBalanceAndBlockBalance(@Param("list") List reocrdList); + int updateBalanceAndBlockBalanceById(@Param("list") List list); + + /** + * 根据支付记录批量查询买家钱包信息 + * @param list 支付记录列表 + * @return 买家钱包信息列表 + */ + List selectBuyerWalletsByPayRecords(@Param("list") List list); } 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 36c957a..9b597bb 100644 --- a/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java +++ b/src/main/java/com/m2pool/lease/service/impl/LeaseOrderInfoServiceImpl.java @@ -759,9 +759,10 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl>> chainAndCoinMap = new HashMap<>(); Map orderTotalPriceGroupByChainAndCoin = leaseMachinePriceMapper.getOrderTotalPriceGroupByChainAndCoin(orderInfoVoList); @@ -949,9 +950,10 @@ public class LeaseOrderInfoServiceImpl extends ServiceImpl mergedRecordList = mergePayRecordMessages(reocrdList); - System.out.println("yyb-订单信息合并后"+JSONUtil.toJsonPrettyStr(mergedRecordList)); + + // 合并修改买家条件相同数据(按 fromAddress, fromSymbol, fromChain) + List buyerRecordList = mergePayRecordMessages(reocrdList); + System.out.println("yyb-买家信息合并后"+JSONUtil.toJsonPrettyStr(buyerRecordList)); + + // 合并修改卖家条件相同数据(按 toAddress, fromSymbol, fromChain) + List sellerRecordList = mergeSellerPayRecordMessages(reocrdList); + System.out.println("yyb-卖家信息合并后"+JSONUtil.toJsonPrettyStr(sellerRecordList)); + //订单详情结算待结算金额 - leaseOrderItemMapper.updateSettleAmount(mergedRecordList); - int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalance(mergedRecordList); - int sellerUpdate = leaseShopConfigMapper.updateBalance(mergedRecordList); + leaseOrderItemMapper.updateSettleAmount(buyerRecordList); + + //批量查询买家钱包信息 + List buyerWallets = leaseUserWalletDataMapper.selectBuyerWalletsByPayRecords(buyerRecordList); + //批量查询卖家钱包配置信息 + List sellerWallets = leaseShopConfigMapper.selectSellerWalletsByPayRecords(sellerRecordList); + + //根据查询到的钱包信息,构建更新记录 + List buyerUpdateRecords = updateBuyerRecordAmounts(buyerRecordList, buyerWallets); + List sellerUpdateRecords = updateSellerRecordAmounts(sellerRecordList, sellerWallets); + + System.out.println("yyb-买家钱包查询结果"+JSONUtil.toJsonPrettyStr(buyerWallets)); + System.out.println("yyb-卖家钱包查询结果"+JSONUtil.toJsonPrettyStr(sellerWallets)); + System.out.println("yyb-买家最终更新记录"+JSONUtil.toJsonPrettyStr(buyerUpdateRecords)); + System.out.println("yyb-卖家最终更新记录"+JSONUtil.toJsonPrettyStr(sellerUpdateRecords)); + + //修改买家和卖家账户余额 + int buyerUpdate = leaseUserWalletDataMapper.updateBalanceAndBlockBalanceById(buyerUpdateRecords); + int sellerUpdate = leaseShopConfigMapper.updateBalanceById(sellerUpdateRecords); if (buyerUpdate > 0 || sellerUpdate > 0){ for (LeasePayRecordMessage item : reocrdList) { recordLog(item); @@ -851,6 +874,90 @@ public class OrderAndPayTask { } } + /** + * 合并相同卖家条件的支付记录消息(按 toAddress, fromSymbol, fromChain) + * @param records 支付记录消息列表 + * @return 合并后的支付记录消息列表 + */ + private List mergeSellerPayRecordMessages(List records) { + if (records == null || records.isEmpty()) { + return new ArrayList<>(); + } + return new ArrayList<>(records.stream() + .collect(Collectors.groupingBy( + r -> r.getToAddress() + "_" + 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 totalReceivedAmount = list.stream() + .map(r -> r.getReceivedAmount() != null ? r.getReceivedAmount() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); + merged.setRealAmount(totalRealAmount); + merged.setReceivedAmount(totalReceivedAmount); + return merged; + } + ) + )) + .values()); + } + + /** + * 根据查询到的买家钱包信息,更新余额并返回 + * @param buyerRecords 买家记录列表 + * @param buyerWallets 买家钱包列表 + * @return 更新后的买家钱包列表 + */ + private List updateBuyerRecordAmounts(List buyerRecords, List buyerWallets) { + Map recordMap = buyerRecords.stream() + .collect(Collectors.toMap( + record -> record.getFromAddress() + "_" + record.getFromSymbol() + "_" + record.getFromChain(), + Function.identity() + )); + + + for (BuyerWalletQueryDto wallet : buyerWallets) { + String key = wallet.getFromAddress() + "_" + wallet.getFromSymbol() + "_" + wallet.getFromChain(); + LeasePayRecordMessage record = recordMap.get(key); + if (record != null) { + // 修改钱包的余额和冻结余额 + wallet.setBalance(wallet.getBalance().subtract(record.getRealAmount())); + wallet.setBlockedBalance(wallet.getBlockedBalance().subtract(record.getBlockAmount())); + } + } + + return buyerWallets; + } + + /** + * 根据查询到的卖家钱包信息,更新余额并返回 + * @param sellerRecords 卖家记录列表 + * @param sellerWallets 卖家钱包列表 + * @return 更新后的卖家钱包列表 + */ + private List updateSellerRecordAmounts(List sellerRecords, List sellerWallets) { + Map recordMap = sellerRecords.stream() + .collect(Collectors.toMap( + record -> record.getToAddress() + "_" + record.getFromSymbol() + "_" + record.getFromChain(), + Function.identity() + )); + + + for (SellerWalletQueryDto wallet : sellerWallets) { + String key = wallet.getPayAddress() + "_" + wallet.getPayCoin() + "_" + wallet.getChain(); + LeasePayRecordMessage record = recordMap.get(key); + if (record != null) { + // 修改钱包的余额 + wallet.setBalance(wallet.getBalance().add(record.getReceivedAmount())); + } + } + + return sellerWallets; + } + /** * 记录日志 * @param item diff --git a/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml b/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml index d38947a..d80e926 100644 --- a/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml +++ b/src/main/resources/mapper/lease/LeaseShopConfigMapper.xml @@ -89,21 +89,45 @@ shop_id = #{shopId} AND pay_address = #{address} AND pay_coin = #{coin} AND chain = #{chain} AND del = 0 - + UPDATE lease_shop_config SET balance = CASE - WHEN pay_address = #{item.toAddress} AND pay_coin = #{item.fromSymbol} AND chain = #{item.fromChain} AND del = false - THEN balance + #{item.receivedAmount} + WHEN id = #{item.id} + THEN #{item.balance} ELSE balance END - WHERE (pay_address,pay_coin,chain) IN( + WHERE id IN( - (#{item.toAddress}, #{item.fromSymbol}, #{item.fromChain}) + #{item.id} ) AND del = false - + AND balance = CASE + + WHEN id = #{item.id} + THEN #{item.lock} + + ELSE balance + END + + diff --git a/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml b/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml index 0e4d9c4..cdd43f5 100644 --- a/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml +++ b/src/main/resources/mapper/lease/LeaseUserWalletDataMapper.xml @@ -106,29 +106,57 @@ ) + - + UPDATE lease_user_wallet_data SET balance = CASE - WHEN from_address = #{item.fromAddress} AND from_symbol = #{item.fromSymbol} AND from_chain = #{item.fromChain} AND del = false - THEN balance - #{item.realAmount} + WHEN id = #{item.id} + THEN #{item.balance} ELSE balance END, blocked_balance = CASE - WHEN from_address = #{item.fromAddress} AND from_symbol = #{item.fromSymbol} AND from_chain = #{item.fromChain} AND del = false - THEN blocked_balance - #{item.blockAmount} + WHEN id = #{item.id} + THEN #{item.blockedBalance} ELSE blocked_balance END - WHERE (from_address, from_symbol, from_chain) IN ( + WHERE id IN ( - (#{item.fromAddress}, #{item.fromSymbol}, #{item.fromChain}) + #{item.id} ) AND del = false + AND blocked_balance = CASE + + WHEN id = #{item.id} + THEN #{item.lock} + + ELSE blocked_balance + END