支付优化

This commit is contained in:
seesaw
2024-10-22 15:55:54 +08:00
parent dbe0c9a61b
commit a995bbbe8b
2 changed files with 22 additions and 32 deletions

View File

@ -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);
}

View File

@ -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) {