Sfoglia il codice sorgente

商家端 线上预订 分类 桌号删除 修改效验规则

qinxuyang 4 settimane fa
parent
commit
ee520d1312

+ 28 - 0
alien-entity/src/main/java/shop/alien/mapper/UserReservationMapper.java

@@ -48,4 +48,32 @@ public interface UserReservationMapper extends BaseMapper<UserReservation> {
      * @return 需要标记为已过期/未到店超时的 user_reservation.id 列表
      * @return 需要标记为已过期/未到店超时的 user_reservation.id 列表
      */
      */
     List<Integer> listReservationIdsForTimeoutMark();
     List<Integer> listReservationIdsForTimeoutMark();
+
+    /**
+     * 查询分类下是否有符合条件的预订信息
+     * 条件:订单状态为"待使用"(1)或"已完成"(2)
+     * 对于"已完成"状态的订单,结束时间需要在当前时间3小时内
+     *
+     * @param categoryId 分类ID
+     * @param storeId    门店ID
+     * @return 符合条件的预订数量
+     */
+    long countReservationsByCategoryAndOrderStatus(
+            @Param("categoryId") Integer categoryId,
+            @Param("storeId") Integer storeId
+    );
+
+    /**
+     * 查询桌号下是否有符合条件的预订信息
+     * 条件:订单状态为"待使用"(1)或"已完成"(2)
+     * 对于"已完成"状态的订单,结束时间需要在当前时间3小时内
+     *
+     * @param tableId 桌号ID
+     * @param storeId 门店ID
+     * @return 符合条件的预订数量
+     */
+    long countReservationsByTableAndOrderStatus(
+            @Param("tableId") Integer tableId,
+            @Param("storeId") Integer storeId
+    );
 }
 }

+ 85 - 0
alien-entity/src/main/resources/mapper/UserReservationMapper.xml

@@ -151,4 +151,89 @@
           AND STR_TO_DATE(TRIM(r.end_time), '%Y-%m-%d %H:%i') &lt; NOW()
           AND STR_TO_DATE(TRIM(r.end_time), '%Y-%m-%d %H:%i') &lt; NOW()
     </select>
     </select>
 
 
+    <!-- 查询分类下是否有符合条件的预订信息
+         条件:订单状态为"待使用"(1)或"已完成"(2)
+         对于"已完成"状态的订单,结束时间需要在当前时间3小时内 -->
+    <select id="countReservationsByCategoryAndOrderStatus" resultType="java.lang.Long">
+        SELECT COUNT(DISTINCT ur.id)
+        FROM user_reservation ur
+        INNER JOIN user_reservation_order uro ON ur.id = uro.reservation_id AND uro.delete_flag = 0
+        WHERE ur.delete_flag = 0
+          AND ur.category_id = #{categoryId}
+          AND ur.store_id = #{storeId}
+          AND uro.order_status IN (1, 2)
+          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)
+                )
+              )
+            )
+          )
+    </select>
+
+    <!-- 查询桌号下是否有符合条件的预订信息
+         条件:订单状态为"待使用"(1)或"已完成"(2)
+         对于"已完成"状态的订单,结束时间需要在当前时间3小时内 -->
+    <select id="countReservationsByTableAndOrderStatus" resultType="java.lang.Long">
+        SELECT COUNT(DISTINCT 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 (
+            -- 订单状态为"待使用"(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)
+                )
+              )
+            )
+          )
+    </select>
+
 </mapper>
 </mapper>

+ 4 - 7
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingCategoryServiceImpl.java

@@ -323,13 +323,10 @@ public class StoreBookingCategoryServiceImpl extends ServiceImpl<StoreBookingCat
             return false;
             return false;
         }
         }
         
         
-        // 查询该门店该分类下是否有预订信息
-        LambdaQueryWrapper<UserReservation> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(UserReservation::getStoreId, storeId)
-                .eq(UserReservation::getCategoryId, categoryId);
-        // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
-        
-        long count = userReservationMapper.selectCount(wrapper);
+        // 查询该门店该分类下是否有符合条件的预订信息
+        // 条件:订单状态为"待使用"(1)或"已完成"(2)
+        // 对于"已完成"状态的订单,结束时间需要在当前时间3小时内
+        long count = userReservationMapper.countReservationsByCategoryAndOrderStatus(categoryId, storeId);
         boolean hasReservation = count > 0;
         boolean hasReservation = count > 0;
         
         
         log.info("查询分类下是否有预订信息完成,categoryId={}, storeId={}, count={}, hasReservation={}", 
         log.info("查询分类下是否有预订信息完成,categoryId={}, storeId={}, count={}, hasReservation={}", 

+ 4 - 27
alien-store/src/main/java/shop/alien/store/service/impl/StoreBookingTableServiceImpl.java

@@ -420,33 +420,10 @@ public class StoreBookingTableServiceImpl extends ServiceImpl<StoreBookingTableM
             return false;
             return false;
         }
         }
         
         
-        // 查询该桌号下是否有预订信息
-        // 通过 user_reservation_table 关联 user_reservation 表查询
-        // 条件:table_id = 桌号ID,且 user_reservation.store_id = 门店ID,且两个表的 delete_flag = 0
-        LambdaQueryWrapper<UserReservationTable> tableWrapper = new LambdaQueryWrapper<>();
-        tableWrapper.eq(UserReservationTable::getTableId, tableId);
-        // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
-        
-        List<UserReservationTable> reservationTables = userReservationTableMapper.selectList(tableWrapper);
-        
-        if (reservationTables == null || reservationTables.isEmpty()) {
-            log.info("查询桌号下是否有预订信息完成,tableId={}, storeId={}, count=0, hasReservation=false", 
-                    tableId, storeId);
-            return false;
-        }
-        
-        // 检查这些预订是否属于该门店
-        List<Integer> reservationIds = reservationTables.stream()
-                .map(UserReservationTable::getReservationId)
-                .distinct()
-                .collect(Collectors.toList());
-        
-        LambdaQueryWrapper<UserReservation> reservationWrapper = new LambdaQueryWrapper<>();
-        reservationWrapper.in(UserReservation::getId, reservationIds)
-                .eq(UserReservation::getStoreId, storeId);
-        // @TableLogic 会自动过滤已删除的记录(delete_flag=0)
-        
-        long count = userReservationMapper.selectCount(reservationWrapper);
+        // 查询该桌号下是否有符合条件的预订信息
+        // 条件:订单状态为"待使用"(1)或"已完成"(2)
+        // 对于"已完成"状态的订单,结束时间需要在当前时间3小时内
+        long count = userReservationMapper.countReservationsByTableAndOrderStatus(tableId, storeId);
         boolean hasReservation = count > 0;
         boolean hasReservation = count > 0;
         
         
         log.info("查询桌号下是否有预订信息完成,tableId={}, storeId={}, count={}, hasReservation={}", 
         log.info("查询桌号下是否有预订信息完成,tableId={}, storeId={}, count={}, hasReservation={}",