Browse Source

ReservationTimeoutJob定时逻辑修改:将 user_reservation.start_time与store_booking_settings(预订服务信息设置表)的retention_duration(保留时常分钟)相加,如果小于当前时间且对应 user_reservation_order 订单状态为「待使用」的预订:
* - user_reservation.status 置为 4(未到店超时)
* - user_reservation_order.order_status 置为 3(已过期)

zhangchen 4 weeks ago
parent
commit
de666d13db

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

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

+ 17 - 4
alien-entity/src/main/resources/mapper/UserReservationMapper.xml

@@ -139,16 +139,29 @@
         DELETE FROM user_reservation WHERE id = #{id}
     </delete>
 
-    <!-- 关联查询:订单待使用 + 预约结束时间已过,仅返回 reservation_id。end_time 格式为 yyyy-MM-dd HH:mm -->
+    <!--
+      未到店超时:订单待使用(1) + 预约待确认/已确认(0,1)
+      截止时间 = start_time + store_booking_settings.retention_duration(分钟);无设置或 NULL 时长按 0 分钟
+      start_time 格式 yyyy-MM-dd HH:mm(与 STR_TO_DATE 一致)
+    -->
     <select id="listReservationIdsForTimeoutMark" resultType="java.lang.Integer">
-        SELECT DISTINCT r.id
+        SELECT r.id
         FROM user_reservation r
         INNER JOIN user_reservation_order o ON o.reservation_id = r.id AND o.delete_flag = 0
         WHERE r.delete_flag = 0
           AND o.order_status = 1
           AND r.status IN (0, 1)
-          AND r.end_time IS NOT NULL AND TRIM(r.end_time) != ''
-          AND STR_TO_DATE(TRIM(r.end_time), '%Y-%m-%d %H:%i') &lt; NOW()
+          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()
     </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);
 
     /**
-     * 预订未到店超时定时任务:将 end_time 已过且订单状态为待使用的预订标记为已过期/未到店超时
+     * 预订未到店超时定时任务:start_time + 门店 retention_duration(分钟)已过且订单待使用的预订标记为已过期/未到店超时
      *
      * @return R.data 为本次更新的预约数量
      */

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

@@ -9,7 +9,8 @@ import shop.alien.job.feign.AlienStoreFeign;
 
 /**
  * 预订未到店超时定时任务
- * 将 user_reservation.end_time 小于当前时间且对应 user_reservation_order 订单状态为「待使用」的预订:
+ * 将「user_reservation.start_time + store_booking_settings.retention_duration(分钟)」早于当前时间,
+ * 且对应 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 开始");

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

@@ -184,7 +184,7 @@ public interface UserReservationService extends IService<UserReservation> {
     ReservationOrderDetailVo getOrderDetailByOrderId(Integer orderId, String jingdu, String weidu);
 
     /**
-     * 定时任务:将「预约结束时间已过」且「订单状态为待使用」的预订标记为已过期/未到店超时。
+     * 定时任务:将「预约开始时间 + 门店 store_booking_settings.retention_duration(分钟)早于当前时间」且「订单状态为待使用」的预订标记为已过期/未到店超时。
      * 更新: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() {
-        // 关联查询:订单待使用 + 预约结束时间已过,在库内一次筛出需更新的 reservation_id
+        // 关联查询:订单待使用 + 当前时间已超过 start_time + 门店保留时长(retention_duration 分钟),筛出 reservation_id
         List<Integer> toUpdateReservationIds = baseMapper.listReservationIdsForTimeoutMark();
         if (toUpdateReservationIds == null || toUpdateReservationIds.isEmpty()) {
             return 0;