diff --git a/src/main/java/com/example/demo/domain/DTO/WalletDTO.java b/src/main/java/com/example/demo/domain/DTO/WalletDTO.java new file mode 100644 index 0000000..db73ef6 --- /dev/null +++ b/src/main/java/com/example/demo/domain/DTO/WalletDTO.java @@ -0,0 +1,24 @@ +package com.example.demo.domain.DTO; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * @program: gold-java + * @ClassName WalletDTO + * @description: + * @author: Double + * @create: 2026−03-05 11:47 + * @Version 1.0 + **/ + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WalletDTO { + private Integer id; //钱包id + private BigDecimal permanentGold; +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/coin/ConsumeMapper.java b/src/main/java/com/example/demo/mapper/coin/ConsumeMapper.java index 90f9010..4d2635d 100644 --- a/src/main/java/com/example/demo/mapper/coin/ConsumeMapper.java +++ b/src/main/java/com/example/demo/mapper/coin/ConsumeMapper.java @@ -1,6 +1,7 @@ package com.example.demo.mapper.coin; import com.example.demo.domain.DTO.RegionWalletDTO; +import com.example.demo.domain.DTO.WalletDTO; import com.example.demo.domain.entity.UserGoldRecord; import com.example.demo.domain.entity.Wallet; import com.example.demo.domain.vo.coin.ConsumeUser; @@ -51,4 +52,5 @@ public interface ConsumeMapper { List selectRegionWalletByJwcode(Integer jwcode); List selectWallet(); void createRegionWallet(Integer jwcode); + void updateRegionWallet(WalletDTO wallet); } diff --git a/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java index 61ba77e..109cb91 100644 --- a/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java @@ -3,6 +3,7 @@ package com.example.demo.serviceImpl.coin; import com.example.demo.Util.GoldTistV2; import com.example.demo.Util.SimpleIdGenerator; import com.example.demo.domain.DTO.RegionWalletDTO; +import com.example.demo.domain.DTO.WalletDTO; import com.example.demo.domain.entity.User; import com.example.demo.domain.entity.UserGoldRecord; import com.example.demo.domain.vo.coin.*; @@ -227,6 +228,53 @@ public class ConsumeServiceImpl implements ConsumeService { else if (consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO)==0&&consumeUser.getFreeGold().compareTo(BigDecimal.ZERO)==0&&consumeUser.getTaskGold().compareTo(BigDecimal.ZERO)==0){ GoldTistV2.addCoinRecordNew(String.valueOf(consumeUser.getJwcode()), consumeUser.getRemark(),consumeUser.getAdminName(),consumeUser.getGoodsName());} + if(consumeUser.getPermanentGold().compareTo(BigDecimal.ZERO)!=0) { + // 需要扣除的永久金币总量 + BigDecimal remainingPermanentGold = consumeUser.getPermanentGold(); + + // 遍历钱包列表,依次扣款 + for(RegionWalletDTO wallet : regionWallets) { + // 如果剩余需要扣除的金额为0,结束循环 + if(remainingPermanentGold.compareTo(BigDecimal.ZERO) <= 0) { + break; + } + + // 获取当前钱包的永久金币余额 + BigDecimal walletBalance = wallet.getCurrentPermanentGold() != null ? wallet.getCurrentPermanentGold() : BigDecimal.ZERO; + + // 计算当前钱包可以扣除的金额(不超过钱包余额和剩余需要扣除的金额) + BigDecimal deductAmount = BigDecimal.ZERO; + if(walletBalance.compareTo(remainingPermanentGold) >= 0) { + // 钱包余额足够,扣除剩余全部金额 + deductAmount = remainingPermanentGold; + remainingPermanentGold = BigDecimal.ZERO; + } else { + // 钱包余额不足,扣除全部余额 + deductAmount = walletBalance; + remainingPermanentGold = remainingPermanentGold.subtract(deductAmount); + } + + // 如果需要扣除金额大于0,执行扣款操作 + if(deductAmount.compareTo(BigDecimal.ZERO) > 0) { + WalletDTO updateWallet = new WalletDTO(); + updateWallet.setId(wallet.getId()); + // 设置需要扣除的永久金币金额 + updateWallet.setPermanentGold(deductAmount); + + // 调用Mapper方法更新钱包余额 + consumeMapper.updateRegionWallet(updateWallet); + } + } + + // 检查是否所有需要扣除的金额都已扣除 + if(remainingPermanentGold.compareTo(BigDecimal.ZERO) > 0) { + // 如果还有剩余金额未扣除,说明所有钱包余额不足 + String errorMsg = "所有钱包永久金币余额不足,剩余需要扣除:" + remainingPermanentGold; + log.error(errorMsg); + throw new SystemException(errorMsg); + } + } + consumeMapper.add(userGoldRecord); consumeMapper.updateUserGold(userGoldRecord); User user = new User(); diff --git a/src/main/resources/mapper/ConsumeMapper.xml b/src/main/resources/mapper/ConsumeMapper.xml index c91bc07..2dbf36b 100644 --- a/src/main/resources/mapper/ConsumeMapper.xml +++ b/src/main/resources/mapper/ConsumeMapper.xml @@ -365,4 +365,15 @@ FROM user u WHERE u.jwcode = #{jwcode} + + + + UPDATE user_region_wallet + + + current_permanent_gold = current_permanent_gold - #{currentPermanentGold}, + + + WHERE id = #{id} + \ No newline at end of file