Bladeren bron

商家端 桌号管理 查询该桌号下是否有预约信息

qinxuyang 2 weken geleden
bovenliggende
commit
52a231fb8b

+ 2 - 3
alien-entity/src/main/java/shop/alien/mapper/UserReservationMapper.java

@@ -67,9 +67,8 @@ public interface UserReservationMapper extends BaseMapper<UserReservation> {
     );
 
     /**
-     * 查询桌号下是否有符合条件的预订信息
-     * 条件:订单状态为"待使用"(1)或"已完成"(2)
-     * 对于"已完成"状态的订单,结束时间需要在当前时间3小时内
+     * 查询桌号下是否有符合条件的预订信息(主表仅 user_reservation;桌位用 EXISTS 匹配 user_reservation_table,不用 JOIN;不查订单表)
+     * 待确认(0)、已确认(1) 视为有预订;已到店(2) 仅当当前时间不超过「预约结束时间 + 3 小时」时视为有预订(无结束时间则视为有预订)
      *
      * @param tableId 桌号ID
      * @param storeId 门店ID

+ 41 - 34
alien-entity/src/main/resources/mapper/UserReservationMapper.xml

@@ -284,46 +284,53 @@
           )
     </select>
 
-    <!-- 查询桌号下是否有符合条件的预订信息
-         条件:订单状态为"待使用"(1)或"已完成"(2)
-         对于"已完成"状态的订单,结束时间需要在当前时间3小时内 -->
+    <!-- 主查询只 FROM user_reservation;桌位用 EXISTS(非 JOIN);不查 user_reservation_order
+         0/1 有预订;2 有预订当 NOW() &lt;= 解析后的 end_time + 3 小时(无 end 则算有预订) -->
     <select id="countReservationsByTableAndOrderStatus" resultType="java.lang.Long">
-        SELECT COUNT(DISTINCT ur.id)
+        SELECT COUNT(ur.id)
         FROM user_reservation ur
-        INNER JOIN user_reservation_table urt ON ur.id = urt.reservation_id AND urt.delete_flag = 0
-        INNER JOIN user_reservation_order uro ON ur.id = uro.reservation_id AND uro.delete_flag = 0
         WHERE ur.delete_flag = 0
-          AND urt.table_id = #{tableId}
           AND ur.store_id = #{storeId}
-          AND uro.order_status IN (1, 2)
+          AND EXISTS (
+              SELECT 1
+              FROM user_reservation_table urt
+              WHERE urt.reservation_id = ur.id
+                AND urt.table_id = #{tableId}
+                AND urt.delete_flag = 0
+          )
           AND (
-            -- 订单状态为"待使用"(1),直接符合条件
-            uro.order_status = 1
-            OR
-            -- 订单状态为"已完成"(2),需要检查结束时间在3小时内
-            (
-              uro.order_status = 2
-              AND ur.end_time IS NOT NULL
-              AND TRIM(ur.end_time) != ''
-              AND (
-                -- 如果 end_time 是完整日期时间格式 (yyyy-MM-dd HH:mm)
-                (
-                  LENGTH(TRIM(ur.end_time)) &gt; 5
-                  AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') IS NOT NULL
-                  AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') &lt; NOW()
-                  AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') &gt; DATE_SUB(NOW(), INTERVAL 3 HOUR)
-                )
-                OR
-                -- 如果 end_time 是时间格式 (HH:mm),需要结合 reservation_date
-                (
-                  LENGTH(TRIM(ur.end_time)) &lt;= 5
-                  AND ur.reservation_date IS NOT NULL
-                  AND STR_TO_DATE(CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)), '%Y-%m-%d %H:%i') IS NOT NULL
-                  AND STR_TO_DATE(CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)), '%Y-%m-%d %H:%i') &lt; NOW()
-                  AND STR_TO_DATE(CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)), '%Y-%m-%d %H:%i') &gt; DATE_SUB(NOW(), INTERVAL 3 HOUR)
-                )
+              ur.status IN (0, 1)
+              OR (
+                  ur.status = 2
+                  AND (
+                      ur.end_time IS NULL
+                      OR TRIM(ur.end_time) = ''
+                      OR
+                      (
+                          (
+                              LENGTH(TRIM(ur.end_time)) &gt; 5
+                              AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') IS NOT NULL
+                              AND NOW() &lt;= DATE_ADD(STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i'), INTERVAL 3 HOUR)
+                          )
+                          OR
+                          (
+                              LENGTH(TRIM(ur.end_time)) &lt;= 5
+                              AND ur.reservation_date IS NOT NULL
+                              AND STR_TO_DATE(
+                                  CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)),
+                                  '%Y-%m-%d %H:%i'
+                              ) IS NOT NULL
+                              AND NOW() &lt;= DATE_ADD(
+                                  STR_TO_DATE(
+                                      CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)),
+                                      '%Y-%m-%d %H:%i'
+                                  ),
+                                  INTERVAL 3 HOUR
+                              )
+                          )
+                      )
+                  )
               )
-            )
           )
     </select>
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/controller/StoreBookingTableController.java

@@ -229,7 +229,7 @@ public class StoreBookingTableController {
     }
 
     @ApiOperationSupport(order = 6)
-    @ApiOperation("查询桌号下是否有预订信息")
+    @ApiOperation("查询桌号下是否有预订信息(0/1 有预订;已到店(2) 在结束时间+3h 内算有预订;主查 user_reservation)")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "tableId", value = "桌号ID", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "storeId", value = "门店ID", dataType = "Integer", paramType = "query", required = true)

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/StoreBookingTableService.java

@@ -93,7 +93,7 @@ public interface StoreBookingTableService extends IService<StoreTable> {
     boolean deleteTable(Integer id);
 
     /**
-     * 查询桌号下是否有预订信息
+     * 查询桌号下是否有有效预订(以 user_reservation 为主,桌位 EXISTS;0/1 有预订,2 需未超过结束时间+3h)
      *
      * @param tableId 桌号ID
      * @param storeId 门店ID

+ 1 - 3
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingTableServiceImpl.java

@@ -769,9 +769,7 @@ public class StoreBookingTableServiceImpl extends ServiceImpl<StoreBookingTableM
             return false;
         }
         
-        // 查询该桌号下是否有符合条件的预订信息
-        // 条件:订单状态为"待使用"(1)或"已完成"(2)
-        // 对于"已完成"状态的订单,结束时间需要在当前时间3小时内
+        // 主查 user_reservation,桌位 EXISTS 关联;0/1 有预订;2 在「结束时间+3h」内算有预订(不查订单表、主查询不 JOIN 中间表)
         long count = userReservationMapper.countReservationsByTableAndOrderStatus(tableId, storeId);
         boolean hasReservation = count > 0;