|
|
@@ -31,9 +31,6 @@ import java.util.stream.Collectors;
|
|
|
@RequiredArgsConstructor
|
|
|
public class DiningServiceImpl implements DiningService {
|
|
|
|
|
|
- private static final String ORDER_LOCK_KEY_PREFIX = "order:lock:table:";
|
|
|
- private static final int ORDER_LOCK_EXPIRE_SECONDS = 300; // 5分钟过期
|
|
|
-
|
|
|
private final StoreTableMapper storeTableMapper;
|
|
|
private final StoreInfoMapper storeInfoMapper;
|
|
|
private final StoreCuisineMapper storeCuisineMapper;
|
|
|
@@ -46,6 +43,7 @@ public class DiningServiceImpl implements DiningService {
|
|
|
private final BaseRedisService baseRedisService;
|
|
|
private final shop.alien.dining.service.StoreOrderService storeOrderService;
|
|
|
private final shop.alien.mapper.StoreOrderMapper storeOrderMapper;
|
|
|
+ private final shop.alien.dining.service.OrderLockService orderLockService;
|
|
|
|
|
|
@Override
|
|
|
public DiningPageInfoVO getDiningPageInfo(Integer tableId, Integer dinerCount) {
|
|
|
@@ -300,7 +298,7 @@ public class DiningServiceImpl implements DiningService {
|
|
|
CartDTO cart = cartService.getCart(tableId);
|
|
|
|
|
|
// 检查订单锁定
|
|
|
- Integer lockUserId = checkOrderLock(tableId);
|
|
|
+ Integer lockUserId = orderLockService.checkOrderLock(tableId);
|
|
|
boolean isLocked = lockUserId != null && !lockUserId.equals(userId);
|
|
|
|
|
|
OrderConfirmVO vo = new OrderConfirmVO();
|
|
|
@@ -379,50 +377,17 @@ public class DiningServiceImpl implements DiningService {
|
|
|
|
|
|
@Override
|
|
|
public boolean lockOrder(Integer tableId, Integer userId) {
|
|
|
- log.info("锁定订单, tableId={}, userId={}", tableId, userId);
|
|
|
-
|
|
|
- String lockKey = ORDER_LOCK_KEY_PREFIX + tableId;
|
|
|
- String existingLock = baseRedisService.getString(lockKey);
|
|
|
- if (StringUtils.hasText(existingLock)) {
|
|
|
- // 已锁定,检查是否是当前用户
|
|
|
- if (existingLock.equals(String.valueOf(userId))) {
|
|
|
- // 刷新过期时间
|
|
|
- baseRedisService.setString(lockKey, existingLock, (long) ORDER_LOCK_EXPIRE_SECONDS);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- // 被其他用户锁定
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 设置锁定
|
|
|
- baseRedisService.setString(lockKey, String.valueOf(userId), (long) ORDER_LOCK_EXPIRE_SECONDS);
|
|
|
- return true;
|
|
|
+ return orderLockService.lockOrder(tableId, userId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void unlockOrder(Integer tableId, Integer userId) {
|
|
|
- log.info("解锁订单, tableId={}, userId={}", tableId, userId);
|
|
|
-
|
|
|
- String lockKey = ORDER_LOCK_KEY_PREFIX + tableId;
|
|
|
- String existingLock = baseRedisService.getString(lockKey);
|
|
|
- if (StringUtils.hasText(existingLock) && existingLock.equals(String.valueOf(userId))) {
|
|
|
- baseRedisService.delete(lockKey);
|
|
|
- }
|
|
|
+ orderLockService.unlockOrder(tableId, userId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public Integer checkOrderLock(Integer tableId) {
|
|
|
- String lockKey = ORDER_LOCK_KEY_PREFIX + tableId;
|
|
|
- String lockUserId = baseRedisService.getString(lockKey);
|
|
|
- if (StringUtils.hasText(lockUserId)) {
|
|
|
- try {
|
|
|
- return Integer.parseInt(lockUserId);
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
+ return orderLockService.checkOrderLock(tableId);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -535,18 +500,8 @@ public class DiningServiceImpl implements DiningService {
|
|
|
shop.alien.entity.store.StoreInfo storeInfo = storeInfoMapper.selectById(order.getStoreId());
|
|
|
|
|
|
// 检查结算锁定
|
|
|
- String lockKey = "settlement:lock:order:" + orderId;
|
|
|
- String lockUserIdStr = baseRedisService.getString(lockKey);
|
|
|
- Integer lockUserId = null;
|
|
|
- boolean isLocked = false;
|
|
|
- if (StringUtils.hasText(lockUserIdStr)) {
|
|
|
- try {
|
|
|
- lockUserId = Integer.parseInt(lockUserIdStr);
|
|
|
- isLocked = !lockUserId.equals(userId);
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- // ignore
|
|
|
- }
|
|
|
- }
|
|
|
+ Integer lockUserId = orderLockService.checkSettlementLock(orderId);
|
|
|
+ boolean isLocked = lockUserId != null && !lockUserId.equals(userId);
|
|
|
|
|
|
shop.alien.entity.store.vo.OrderSettlementVO vo = new shop.alien.entity.store.vo.OrderSettlementVO();
|
|
|
vo.setOrderId(order.getId());
|
|
|
@@ -578,46 +533,17 @@ public class DiningServiceImpl implements DiningService {
|
|
|
|
|
|
@Override
|
|
|
public boolean lockSettlement(Integer orderId, Integer userId) {
|
|
|
- log.info("锁定订单结算, orderId={}, userId={}", orderId, userId);
|
|
|
-
|
|
|
- String lockKey = "settlement:lock:order:" + orderId;
|
|
|
- String existingLock = baseRedisService.getString(lockKey);
|
|
|
- if (StringUtils.hasText(existingLock)) {
|
|
|
- if (existingLock.equals(String.valueOf(userId))) {
|
|
|
- baseRedisService.setString(lockKey, existingLock, (long) ORDER_LOCK_EXPIRE_SECONDS);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- baseRedisService.setString(lockKey, String.valueOf(userId), (long) ORDER_LOCK_EXPIRE_SECONDS);
|
|
|
- return true;
|
|
|
+ return orderLockService.lockSettlement(orderId, userId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void unlockSettlement(Integer orderId, Integer userId) {
|
|
|
- log.info("解锁订单结算, orderId={}, userId={}", orderId, userId);
|
|
|
-
|
|
|
- String lockKey = "settlement:lock:order:" + orderId;
|
|
|
- String existingLock = baseRedisService.getString(lockKey);
|
|
|
- if (StringUtils.hasText(existingLock) && existingLock.equals(String.valueOf(userId))) {
|
|
|
- baseRedisService.delete(lockKey);
|
|
|
- }
|
|
|
+ orderLockService.unlockSettlement(orderId, userId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public Integer checkSettlementLock(Integer orderId) {
|
|
|
- String lockKey = "settlement:lock:order:" + orderId;
|
|
|
- String lockUserId = baseRedisService.getString(lockKey);
|
|
|
- if (StringUtils.hasText(lockUserId)) {
|
|
|
- try {
|
|
|
- return Integer.parseInt(lockUserId);
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
+ return orderLockService.checkSettlementLock(orderId);
|
|
|
}
|
|
|
|
|
|
/**
|