支付优化
This commit is contained in:
@ -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<CardDO> 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<DishOrderDO> updateList = new ArrayList<>();
|
||||
List<Long> refundOrder = getRefundOrder();
|
||||
//查询出所有未完全支付订单
|
||||
for (Long userId : userIds){
|
||||
for (Long userId : userIds) {
|
||||
BigDecimal cashMoney = money;
|
||||
|
||||
List<DishOrderDO> dishOrderDOS = dishOrderMapper.selectList(Wrappers.<DishOrderDO>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<Long> getRefundOrder(){
|
||||
public List<Long> getRefundOrder() {
|
||||
List<RefundDO> refundDOS = refundMapper.selectList(Wrappers.<RefundDO>lambdaQuery().in(RefundDO::getStatus, Arrays.asList("2", "3")));
|
||||
ArrayList<Long> orderIds = new ArrayList<>();
|
||||
if(CollectionUtil.isNotEmpty(refundDOS)){
|
||||
if (CollectionUtil.isNotEmpty(refundDOS)) {
|
||||
List<Long> collect = refundDOS.stream().map(RefundDO::getOrderId).collect(Collectors.toList());
|
||||
orderIds.addAll(collect);
|
||||
}
|
||||
|
@ -5,31 +5,14 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class LockManager {
|
||||
|
||||
private static final ConcurrentHashMap<Long, WeakReference<Object>> userLocks = new ConcurrentHashMap<>();
|
||||
private static final ConcurrentHashMap<Long, Object> userLocks = new ConcurrentHashMap<>();
|
||||
|
||||
private static final ConcurrentHashMap<Long, Object> storeLocks = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
public static Object getUserLock(Long userId) {
|
||||
// 从 Map 中获取 WeakReference 对象
|
||||
WeakReference<Object> lockRef = userLocks.get(userId);
|
||||
Object lock = (lockRef != null) ? lockRef.get() : null;
|
||||
|
||||
if (lock == null) {
|
||||
// 如果锁对象不存在或者已被回收,创建新的锁对象
|
||||
lock = new Object();
|
||||
WeakReference<Object> newLockRef = new WeakReference<>(lock);
|
||||
// 使用 putIfAbsent 确保线程安全
|
||||
WeakReference<Object> 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) {
|
||||
|
Reference in New Issue
Block a user