فهرست منبع

错误逻辑修改

zhangchen 1 ماه پیش
والد
کامیت
7ae971d149

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

@@ -42,7 +42,9 @@ public interface UserReservationMapper extends BaseMapper<UserReservation> {
     int physicalDeleteById(@Param("id") Integer id);
 
     /**
-     * 关联查询:订单为待使用(1),且当前时间已超过「预约开始时间 + 门店 store_booking_settings.retention_duration(分钟)」的 reservation_id 列表。
+     * 关联查询:订单为待使用(1),且已超过未到店截止时间的 reservation_id 列表。
+     * 当门店 store_booking_settings.retain_position_flag = 1 时:截止时间 = start_time + retention_duration(分钟);
+     * 否则:仅按 start_time 判断超时。
      * 用于定时任务将「未到店超时」的预订与订单批量更新。
      *
      * @return 需要标记为已过期/未到店超时的 user_reservation.id 列表

+ 27 - 12
alien-entity/src/main/resources/mapper/UserReservationMapper.xml

@@ -141,27 +141,42 @@
 
     <!--
       未到店超时:订单待使用(1) + 预约待确认/已确认(0,1)
-      截止时间 = start_time + store_booking_settings.retention_duration(分钟);无设置或 NULL 时长按 0 分钟
-      start_time 格式 yyyy-MM-dd HH:mm(与 STR_TO_DATE 一致)
+      - retain_position_flag = 1:截止时间 = start_time + retention_duration(分钟),NULL 时长按 0
+      - 否则:仅按 start_time 判断(当前时间已超过预约开始时间即超时)
+      start_time 格式 yyyy-MM-dd HH:mm
     -->
     <select id="listReservationIdsForTimeoutMark" resultType="java.lang.Integer">
         SELECT r.id
         FROM user_reservation r
         INNER JOIN user_reservation_order o ON o.reservation_id = r.id AND o.delete_flag = 0
+        LEFT JOIN (
+            SELECT s1.store_id, s1.retain_position_flag, s1.retention_duration
+            FROM store_booking_settings s1
+            INNER JOIN (
+                SELECT store_id, MAX(id) AS max_id
+                FROM store_booking_settings
+                WHERE delete_flag = 0
+                GROUP BY store_id
+            ) sm ON sm.max_id = s1.id AND sm.store_id = s1.store_id
+        ) bs ON bs.store_id = r.store_id
         WHERE r.delete_flag = 0
           AND o.order_status = 1
           AND r.status IN (0, 1)
           AND r.start_time IS NOT NULL AND TRIM(r.start_time) != ''
-          AND DATE_ADD(
-                STR_TO_DATE(TRIM(r.start_time), '%Y-%m-%d %H:%i'),
-                INTERVAL COALESCE((
-                    SELECT s.retention_duration
-                    FROM store_booking_settings s
-                    WHERE s.store_id = r.store_id AND s.delete_flag = 0
-                    ORDER BY s.id DESC
-                    LIMIT 1
-                ), 0) MINUTE
-              ) &lt; NOW()
+          AND (
+              (
+                  bs.retain_position_flag = 1
+                  AND DATE_ADD(
+                        STR_TO_DATE(TRIM(r.start_time), '%Y-%m-%d %H:%i'),
+                        INTERVAL COALESCE(bs.retention_duration, 0) MINUTE
+                      ) &lt; NOW()
+              )
+              OR
+              (
+                  (bs.retain_position_flag IS NULL OR bs.retain_position_flag != 1)
+                  AND STR_TO_DATE(TRIM(r.start_time), '%Y-%m-%d %H:%i') &lt; NOW()
+              )
+          )
     </select>
 
     <!-- 查询分类下是否有符合条件的预订信息

+ 1 - 1
alien-job/src/main/java/shop/alien/job/feign/AlienStoreFeign.java

@@ -70,7 +70,7 @@ public interface AlienStoreFeign {
     public R refunds(@RequestBody Map<String, String> params);
 
     /**
-     * 预订未到店超时定时任务:start_time + 门店 retention_duration(分钟)已过且订单待使用的预订标记为已过期/未到店超时
+     * 预订未到店超时:retain_position_flag=1 时用 start_time+retention_duration,否则仅用 start_time;订单待使用则标记过期
      *
      * @return R.data 为本次更新的预约数量
      */

+ 2 - 2
alien-job/src/main/java/shop/alien/job/store/ReservationTimeoutJob.java

@@ -9,8 +9,8 @@ import shop.alien.job.feign.AlienStoreFeign;
 
 /**
  * 预订未到店超时定时任务
- * 将「user_reservation.start_time + store_booking_settings.retention_duration(分钟)」早于当前时间,
- * 且对应 user_reservation_order 订单状态为「待使用」的预订:
+ * retain_position_flag=1:start_time + retention_duration(分钟)早于当前时间;
+ * 否则仅 start_time 早于当前时间;且 user_reservation_order 为「待使用」的预订:
  * - user_reservation.status 置为 4(未到店超时)
  * - user_reservation_order.order_status 置为 3(已过期)
  */

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

@@ -24,7 +24,7 @@ public class ReservationJobController {
     private final UserReservationService userReservationService;
     private final StoreReservationService storeReservationService;
 
-    @ApiOperation("标记「开始时间+门店保留时长已过且订单待使用」的预订为未到店超时/已过期")
+    @ApiOperation("未到店超时:保留位置=开始时间+保留分钟,否则仅开始时间;订单待使用则标记已过期")
     @PostMapping("/markTimeout")
     public R<Integer> markReservationTimeoutByEndTime() {
         log.info("reservation job: markTimeout 开始");

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

@@ -184,7 +184,8 @@ public interface UserReservationService extends IService<UserReservation> {
     ReservationOrderDetailVo getOrderDetailByOrderId(Integer orderId, String jingdu, String weidu);
 
     /**
-     * 定时任务:将「预约开始时间 + 门店 store_booking_settings.retention_duration(分钟)早于当前时间」且「订单状态为待使用」的预订标记为已过期/未到店超时。
+     * 定时任务:将超过未到店截止时间且「订单状态为待使用」的预订标记为已过期/未到店超时。
+     * retain_position_flag=1:截止 = start_time + retention_duration;否则仅按 start_time 判断超时。
      * 更新:user_reservation.status = 4(未到店超时),user_reservation_order.order_status = 3(已过期)。
      *
      * @return 本次更新的预约数量(即更新的 order 数量)

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

@@ -1161,7 +1161,7 @@ public class UserReservationServiceImpl extends ServiceImpl<UserReservationMappe
 
     @Override
     public int markReservationTimeoutByEndTime() {
-        // 关联查询:订单待使用 + 当前时间已超过 start_time + 门店保留时长(retention_duration 分钟),筛出 reservation_id
+        // 关联查询:订单待使用 + 已超过截止时间(retain_position_flag=1 为 start_time+保留分钟,否则仅 start_time)
         List<Integer> toUpdateReservationIds = baseMapper.listReservationIdsForTimeoutMark();
         if (toUpdateReservationIds == null || toUpdateReservationIds.isEmpty()) {
             return 0;