Эх сурвалжийг харах

维护更新购物车数量接口 如果不存在商品 直接新增

lutong 2 сар өмнө
parent
commit
2da80caa9d

+ 7 - 0
alien-dining/src/main/java/shop/alien/dining/service/StoreOrderService.java

@@ -121,4 +121,11 @@ public interface StoreOrderService extends IService<StoreOrder> {
      * @return 变更记录批次列表
      */
     List<OrderChangeLogBatchVO> getOrderChangeLogs(Integer orderId);
+
+    /**
+     * 支付完成后重置餐桌(保留订单数据,只重置餐桌绑定关系)
+     *
+     * @param tableId 餐桌ID
+     */
+    void resetTableAfterPayment(Integer tableId);
 }

+ 45 - 0
alien-dining/src/main/java/shop/alien/dining/service/impl/CartServiceImpl.java

@@ -269,6 +269,7 @@ public class CartServiceImpl implements CartService {
                 .orElse(null);
 
         if (item != null) {
+            // 商品已存在,更新数量
             // 检查已下单数量:不允许将数量减少到小于已下单数量
             Integer lockedQuantity = item.getLockedQuantity();
             if (lockedQuantity != null && lockedQuantity > 0) {
@@ -292,6 +293,50 @@ public class CartServiceImpl implements CartService {
             cart.setTotalQuantity(totalQuantity);
 
             saveCart(cart);
+        } else {
+            // 商品不存在,自动添加
+            log.info("商品不在购物车中,自动添加, tableId={}, cuisineId={}, quantity={}", tableId, cuisineId, quantity);
+            
+            // 验证菜品
+            StoreCuisine cuisine = storeCuisineMapper.selectById(cuisineId);
+            if (cuisine == null) {
+                throw new RuntimeException("菜品不存在");
+            }
+            if (cuisine.getShelfStatus() != 1) {
+                throw new RuntimeException("菜品已下架");
+            }
+
+            // 获取当前用户信息
+            Integer userId = TokenUtil.getCurrentUserId();
+            String userPhone = TokenUtil.getCurrentUserPhone();
+
+            // 创建新的购物车商品项
+            CartItemDTO newItem = new CartItemDTO();
+            newItem.setCuisineId(cuisine.getId());
+            newItem.setCuisineName(cuisine.getName());
+            newItem.setCuisineType(cuisine.getCuisineType());
+            newItem.setCuisineImage(cuisine.getImages());
+            newItem.setUnitPrice(cuisine.getTotalPrice());
+            newItem.setQuantity(quantity);
+            newItem.setSubtotalAmount(cuisine.getTotalPrice()
+                    .multiply(BigDecimal.valueOf(quantity)));
+            newItem.setAddUserId(userId);
+            newItem.setAddUserPhone(userPhone);
+            items.add(newItem);
+
+            // 重新计算总金额和总数量
+            BigDecimal totalAmount = items.stream()
+                    .map(CartItemDTO::getSubtotalAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            Integer totalQuantity = items.stream()
+                    .mapToInt(CartItemDTO::getQuantity)
+                    .sum();
+            cart.setTotalAmount(totalAmount);
+            cart.setTotalQuantity(totalQuantity);
+
+            // 保存到Redis和数据库(双写策略)
+            saveCart(cart);
+            log.info("商品已自动添加到购物车, tableId={}, cuisineId={}, quantity={}", tableId, cuisineId, quantity);
         }
 
         return cart;

+ 59 - 2
alien-dining/src/main/java/shop/alien/dining/service/impl/StoreOrderServiceImpl.java

@@ -361,8 +361,9 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
             }
         }
 
-        // 支付成功后,清空购物车
-        cartService.clearCart(order.getTableId());
+        // 支付完成后,自动重置餐桌(保留订单数据,只重置餐桌绑定关系和购物车)
+        // resetTableAfterPayment 方法会完全清空购物车,所以不需要单独调用 clearCart
+        resetTableAfterPayment(order.getTableId());
 
         log.info("订单支付成功, orderId={}", orderId);
         return order;
@@ -807,6 +808,62 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
         return true;
     }
 
+    /**
+     * 支付完成后重置餐桌(保留订单数据,只重置餐桌绑定关系)
+     *
+     * @param tableId 餐桌ID
+     */
+    @Override
+    public void resetTableAfterPayment(Integer tableId) {
+        log.info("支付完成后重置餐桌, tableId={}", tableId);
+
+        // 验证餐桌是否存在
+        StoreTable table = storeTableMapper.selectById(tableId);
+        if (table == null) {
+            log.warn("餐桌不存在,跳过重置, tableId={}", tableId);
+            return;
+        }
+
+        // 1. 完全清空购物车(包括已下单的商品,因为订单已支付完成)
+        // 逻辑删除所有购物车数据
+        LambdaQueryWrapper<StoreCart> cartWrapper = new LambdaQueryWrapper<>();
+        cartWrapper.eq(StoreCart::getTableId, tableId);
+        cartWrapper.eq(StoreCart::getDeleteFlag, 0);
+        List<StoreCart> cartList = storeCartMapper.selectList(cartWrapper);
+        if (cartList != null && !cartList.isEmpty()) {
+            List<Integer> cartIds = cartList.stream()
+                    .map(StoreCart::getId)
+                    .collect(Collectors.toList());
+            storeCartMapper.deleteBatchIds(cartIds);
+            log.info("支付完成后删除购物车数据, tableId={}, count={}", tableId, cartList.size());
+        }
+
+        // 2. 清空Redis中的购物车缓存
+        String cartKey = "cart:table:" + tableId;
+        baseRedisService.delete(cartKey);
+        log.info("清空Redis购物车缓存, tableId={}", tableId);
+
+        // 3. 清除优惠券使用标记
+        cartService.clearCouponUsed(tableId);
+        log.info("清除优惠券使用标记, tableId={}", tableId);
+
+        // 4. 重置餐桌表(使用 LambdaUpdateWrapper 来显式设置 null 值)
+        LambdaUpdateWrapper<StoreTable> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StoreTable::getId, tableId)
+                .set(StoreTable::getCurrentOrderId, null)  // 显式设置 null
+                .set(StoreTable::getCurrentCouponId, null)  // 显式设置 null
+                .set(StoreTable::getCartItemCount, 0)
+                .set(StoreTable::getCartTotalAmount, BigDecimal.ZERO)
+                .set(StoreTable::getStatus, 0)  // 空闲
+                .set(StoreTable::getUpdatedTime, new Date());
+        Integer userId = TokenUtil.getCurrentUserId();
+        if (userId != null) {
+            updateWrapper.set(StoreTable::getUpdatedUserId, userId);
+        }
+        storeTableMapper.update(null, updateWrapper);
+        log.info("支付完成后重置餐桌表完成, tableId={}", tableId);
+    }
+
     @Override
     public OrderInfoVO getOrderInfo(Integer orderId) {
         log.info("查询订单信息, orderId={}", orderId);

+ 11 - 3
alien-dining/src/main/java/shop/alien/dining/strategy/payment/impl/WeChatPaymentMininProgramStrategyImpl.java

@@ -303,11 +303,19 @@ public class WeChatPaymentMininProgramStrategyImpl implements PaymentStrategy {
             if(tradeState.equals("SUCCESS")){
                 String transactionId = jsonObject.getString("transaction_id");
                 StoreOrder storeOrder = storeOrderService.getOne(new QueryWrapper<StoreOrder>().eq("transaction_id", transactionId));
-                if(storeOrder.getPayStatus() != 1){
+                if(storeOrder != null && storeOrder.getPayStatus() != 1){
                     storeOrder.setPayStatus(1);
+                    storeOrder.setOrderStatus(1); // 已支付
                     if(storeOrderService.updateById(storeOrder)){
-                        log.info("小程序更新订单成功,订单号transactionId:{}", transactionId);
-                    };
+                        log.info("小程序更新订单成功,订单号transactionId:{}", transactionId);
+                        // 支付成功后,清空购物车并重置餐桌
+                        try {
+                            storeOrderService.resetTableAfterPayment(storeOrder.getTableId());
+                            log.info("支付完成后重置餐桌成功, tableId={}", storeOrder.getTableId());
+                        } catch (Exception e) {
+                            log.error("支付完成后重置餐桌失败, tableId={}, error={}", storeOrder.getTableId(), e.getMessage(), e);
+                        }
+                    }
                 }
             }
             return R.success("Verified OK");