diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java index 88ea857f..dde67df0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/CashRechargeServiceImpl.java @@ -32,7 +32,7 @@ import static cn.iocoder.yudao.module.member.service.amount.LockManager.getUserL */ @Service @Slf4j -public class CashRechargeServiceImpl implements CashRechargeService{ +public class CashRechargeServiceImpl implements CashRechargeService { @Resource private MemberUserMapper userMapper; @@ -57,19 +57,26 @@ public class CashRechargeServiceImpl implements CashRechargeService{ //明细列表 ArrayList addList = new ArrayList<>(); - for (Long userId : memberList){ + for (Long userId : memberList) { BigDecimal newMoney; BigDecimal wxNewMoney; BigDecimal giftNewMoney; BigDecimal cashNewAmount; - synchronized (getUserLock(userId)){ + synchronized (getUserLock(userId)) { MemberUserDO memberUserDO = userMapper.selectById(userId); //金额变动 + BigDecimal oldMoney = memberUserDO.getMoney(); + System.out.println(oldMoney); memberUserDO.setMoney(memberUserDO.getMoney().add(money)); if (memberUserDO.getMoney().compareTo(BigDecimal.ZERO) > 0) { - memberUserDO.setCashAmount(memberUserDO.getCashAmount().add(money)); + if (oldMoney.compareTo(BigDecimal.ZERO) > 0) { + memberUserDO.setCashAmount(memberUserDO.getCashAmount().add(money)); + } else { + memberUserDO.setCashAmount(memberUserDO.getMoney()); + } + } userMapper.updateById(memberUserDO); @@ -94,7 +101,7 @@ public class CashRechargeServiceImpl implements CashRechargeService{ } //处理订单 - handleOrderCash(memberList,money); + handleOrderCash(memberList, money); //批量添加 cardMapper.insertBatch(addList); @@ -105,7 +112,7 @@ public class CashRechargeServiceImpl implements CashRechargeService{ ArrayList updateList = new ArrayList<>(); List refundOrder = getRefundOrder(); //查询出所有未完全支付订单 - for (Long userId : userIds){ + for (Long userId : userIds) { BigDecimal cashMoney = money; List dishOrderDOS = dishOrderMapper.selectList(Wrappers.lambdaQuery() @@ -114,20 +121,20 @@ public class CashRechargeServiceImpl implements CashRechargeService{ if (CollectionUtil.isNotEmpty(dishOrderDOS)) { for (DishOrderDO dishOrderDO : dishOrderDOS) { BigDecimal payAmount = dishOrderDO.getPayAmount(); - if(payAmount.compareTo(cashMoney)<=0){ + if (payAmount.compareTo(cashMoney) <= 0) { dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE); dishOrderDO.setPayAmount(BigDecimal.ZERO); dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(payAmount)); - if(refundOrder.contains(dishOrderDO.getId())){ + if (refundOrder.contains(dishOrderDO.getId())) { dishOrderDO.setRefundAmount(BigDecimal.ZERO); } dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(payAmount)); cashMoney = cashMoney.subtract(payAmount); updateList.add(dishOrderDO); - }else { + } else { dishOrderDO.setPayAmount(payAmount.subtract(cashMoney)); dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(cashMoney)); - if(refundOrder.contains(dishOrderDO.getId())){ + if (refundOrder.contains(dishOrderDO.getId())) { dishOrderDO.setRefundAmount(BigDecimal.ZERO); } dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(cashMoney)); @@ -137,16 +144,16 @@ public class CashRechargeServiceImpl implements CashRechargeService{ } } } - if(CollectionUtil.isNotEmpty(updateList)){ + if (CollectionUtil.isNotEmpty(updateList)) { dishOrderMapper.updateBatch(updateList); } } - public List getRefundOrder(){ + public List getRefundOrder() { List refundDOS = refundMapper.selectList(Wrappers.lambdaQuery().in(RefundDO::getStatus, Arrays.asList("2", "3"))); ArrayList orderIds = new ArrayList<>(); - if(CollectionUtil.isNotEmpty(refundDOS)){ + if (CollectionUtil.isNotEmpty(refundDOS)) { List collect = refundDOS.stream().map(RefundDO::getOrderId).collect(Collectors.toList()); orderIds.addAll(collect); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java index 93a20a70..c3562b82 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java @@ -5,31 +5,14 @@ import java.util.concurrent.ConcurrentHashMap; public class LockManager { - private static final ConcurrentHashMap> userLocks = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap userLocks = new ConcurrentHashMap<>(); private static final ConcurrentHashMap storeLocks = new ConcurrentHashMap<>(); public static Object getUserLock(Long userId) { // 从 Map 中获取 WeakReference 对象 - WeakReference lockRef = userLocks.get(userId); - Object lock = (lockRef != null) ? lockRef.get() : null; - - if (lock == null) { - // 如果锁对象不存在或者已被回收,创建新的锁对象 - lock = new Object(); - WeakReference newLockRef = new WeakReference<>(lock); - // 使用 putIfAbsent 确保线程安全 - WeakReference existingLockRef = userLocks.putIfAbsent(userId, newLockRef); - if (existingLockRef != null) { - lock = existingLockRef.get(); - if (lock == null) { - // 如果弱引用对象已经被 GC 回收,更新锁对象 - userLocks.put(userId, newLockRef); - } - } - } - return lock; + return userLocks.computeIfAbsent(userId, k -> new Object()); } public static Object getStoreLock(Long storeId) {