支付优化
This commit is contained in:
@ -32,7 +32,7 @@ import static cn.iocoder.yudao.module.member.service.amount.LockManager.getUserL
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class CashRechargeServiceImpl implements CashRechargeService{
|
public class CashRechargeServiceImpl implements CashRechargeService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private MemberUserMapper userMapper;
|
private MemberUserMapper userMapper;
|
||||||
@ -57,19 +57,26 @@ public class CashRechargeServiceImpl implements CashRechargeService{
|
|||||||
//明细列表
|
//明细列表
|
||||||
ArrayList<CardDO> addList = new ArrayList<>();
|
ArrayList<CardDO> addList = new ArrayList<>();
|
||||||
|
|
||||||
for (Long userId : memberList){
|
for (Long userId : memberList) {
|
||||||
|
|
||||||
BigDecimal newMoney;
|
BigDecimal newMoney;
|
||||||
BigDecimal wxNewMoney;
|
BigDecimal wxNewMoney;
|
||||||
BigDecimal giftNewMoney;
|
BigDecimal giftNewMoney;
|
||||||
BigDecimal cashNewAmount;
|
BigDecimal cashNewAmount;
|
||||||
|
|
||||||
synchronized (getUserLock(userId)){
|
synchronized (getUserLock(userId)) {
|
||||||
MemberUserDO memberUserDO = userMapper.selectById(userId);
|
MemberUserDO memberUserDO = userMapper.selectById(userId);
|
||||||
//金额变动
|
//金额变动
|
||||||
|
BigDecimal oldMoney = memberUserDO.getMoney();
|
||||||
|
System.out.println(oldMoney);
|
||||||
memberUserDO.setMoney(memberUserDO.getMoney().add(money));
|
memberUserDO.setMoney(memberUserDO.getMoney().add(money));
|
||||||
if (memberUserDO.getMoney().compareTo(BigDecimal.ZERO) > 0) {
|
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);
|
userMapper.updateById(memberUserDO);
|
||||||
|
|
||||||
@ -94,7 +101,7 @@ public class CashRechargeServiceImpl implements CashRechargeService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//处理订单
|
//处理订单
|
||||||
handleOrderCash(memberList,money);
|
handleOrderCash(memberList, money);
|
||||||
|
|
||||||
//批量添加
|
//批量添加
|
||||||
cardMapper.insertBatch(addList);
|
cardMapper.insertBatch(addList);
|
||||||
@ -105,7 +112,7 @@ public class CashRechargeServiceImpl implements CashRechargeService{
|
|||||||
ArrayList<DishOrderDO> updateList = new ArrayList<>();
|
ArrayList<DishOrderDO> updateList = new ArrayList<>();
|
||||||
List<Long> refundOrder = getRefundOrder();
|
List<Long> refundOrder = getRefundOrder();
|
||||||
//查询出所有未完全支付订单
|
//查询出所有未完全支付订单
|
||||||
for (Long userId : userIds){
|
for (Long userId : userIds) {
|
||||||
BigDecimal cashMoney = money;
|
BigDecimal cashMoney = money;
|
||||||
|
|
||||||
List<DishOrderDO> dishOrderDOS = dishOrderMapper.selectList(Wrappers.<DishOrderDO>lambdaQuery()
|
List<DishOrderDO> dishOrderDOS = dishOrderMapper.selectList(Wrappers.<DishOrderDO>lambdaQuery()
|
||||||
@ -114,20 +121,20 @@ public class CashRechargeServiceImpl implements CashRechargeService{
|
|||||||
if (CollectionUtil.isNotEmpty(dishOrderDOS)) {
|
if (CollectionUtil.isNotEmpty(dishOrderDOS)) {
|
||||||
for (DishOrderDO dishOrderDO : dishOrderDOS) {
|
for (DishOrderDO dishOrderDO : dishOrderDOS) {
|
||||||
BigDecimal payAmount = dishOrderDO.getPayAmount();
|
BigDecimal payAmount = dishOrderDO.getPayAmount();
|
||||||
if(payAmount.compareTo(cashMoney)<=0){
|
if (payAmount.compareTo(cashMoney) <= 0) {
|
||||||
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
|
dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE);
|
||||||
dishOrderDO.setPayAmount(BigDecimal.ZERO);
|
dishOrderDO.setPayAmount(BigDecimal.ZERO);
|
||||||
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(payAmount));
|
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(payAmount));
|
||||||
if(refundOrder.contains(dishOrderDO.getId())){
|
if (refundOrder.contains(dishOrderDO.getId())) {
|
||||||
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
|
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(payAmount));
|
dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(payAmount));
|
||||||
cashMoney = cashMoney.subtract(payAmount);
|
cashMoney = cashMoney.subtract(payAmount);
|
||||||
updateList.add(dishOrderDO);
|
updateList.add(dishOrderDO);
|
||||||
}else {
|
} else {
|
||||||
dishOrderDO.setPayAmount(payAmount.subtract(cashMoney));
|
dishOrderDO.setPayAmount(payAmount.subtract(cashMoney));
|
||||||
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(cashMoney));
|
dishOrderDO.setRefundAmount(dishOrderDO.getRefundAmount().add(cashMoney));
|
||||||
if(refundOrder.contains(dishOrderDO.getId())){
|
if (refundOrder.contains(dishOrderDO.getId())) {
|
||||||
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
|
dishOrderDO.setRefundAmount(BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
dishOrderDO.setCashAmount(dishOrderDO.getCashAmount().add(cashMoney));
|
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);
|
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")));
|
List<RefundDO> refundDOS = refundMapper.selectList(Wrappers.<RefundDO>lambdaQuery().in(RefundDO::getStatus, Arrays.asList("2", "3")));
|
||||||
ArrayList<Long> orderIds = new ArrayList<>();
|
ArrayList<Long> orderIds = new ArrayList<>();
|
||||||
if(CollectionUtil.isNotEmpty(refundDOS)){
|
if (CollectionUtil.isNotEmpty(refundDOS)) {
|
||||||
List<Long> collect = refundDOS.stream().map(RefundDO::getOrderId).collect(Collectors.toList());
|
List<Long> collect = refundDOS.stream().map(RefundDO::getOrderId).collect(Collectors.toList());
|
||||||
orderIds.addAll(collect);
|
orderIds.addAll(collect);
|
||||||
}
|
}
|
||||||
|
@ -5,31 +5,14 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
public class LockManager {
|
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<>();
|
private static final ConcurrentHashMap<Long, Object> storeLocks = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
|
||||||
public static Object getUserLock(Long userId) {
|
public static Object getUserLock(Long userId) {
|
||||||
// 从 Map 中获取 WeakReference 对象
|
// 从 Map 中获取 WeakReference 对象
|
||||||
WeakReference<Object> lockRef = userLocks.get(userId);
|
return userLocks.computeIfAbsent(userId, k -> new Object());
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Object getStoreLock(Long storeId) {
|
public static Object getStoreLock(Long storeId) {
|
||||||
|
Reference in New Issue
Block a user