| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="shop.alien.mapper.UserReservationMapper">
- <resultMap id="BaseResultMap" type="shop.alien.entity.store.UserReservation">
- <id column="id" property="id" />
- <result column="reservation_no" property="reservationNo" />
- <result column="user_id" property="userId" />
- <result column="store_id" property="storeId" />
- <result column="reservation_date" property="reservationDate" />
- <result column="start_time" property="startTime" />
- <result column="end_time" property="endTime" />
- <result column="guest_count" property="guestCount" />
- <result column="category_id" property="categoryId" />
- <result column="status" property="status" />
- <result column="actual_arrival_time" property="actualArrivalTime" />
- <result column="remark" property="remark" />
- <result column="reservation_user_name" property="reservationUserName" />
- <result column="reservation_user_gender" property="reservationUserGender" />
- <result column="reservation_user_phone" property="reservationUserPhone" />
- <result column="reason" property="reason" />
- <result column="type" property="type" />
- <result column="delete_flag" property="deleteFlag" />
- <result column="created_time" property="createdTime" />
- <result column="created_user_id" property="createdUserId" />
- <result column="updated_time" property="updatedTime" />
- <result column="updated_user_id" property="updatedUserId" />
- </resultMap>
- <!-- 商家端预约信息列表结果映射 -->
- <resultMap id="StoreReservationListVoMap" type="shop.alien.entity.store.vo.StoreReservationListVo">
- <id column="id" property="id" />
- <result column="reservation_no" property="reservationNo" />
- <result column="reservation_date" property="reservationDate" />
- <result column="week_day" property="weekDay" />
- <result column="category_id" property="categoryId" />
- <result column="category_name" property="categoryName" />
- <result column="guest_count" property="guestCount" />
- <result column="table_numbers" property="tableNumbers" />
- <result column="start_time" property="startTime" />
- <result column="end_time" property="endTime" />
- <result column="time_slot" property="timeSlot" />
- <result column="user_id" property="userId" />
- <result column="customer_name" property="customerName" />
- <result column="contact_phone" property="contactPhone" />
- <result column="remark" property="remark" />
- <result column="type" property="type" />
- <result column="status" property="status" />
- <result column="status_text" property="statusText" />
- <result column="total_amount" property="totalAmount" />
- <result column="deposit_amount" property="depositAmount" />
- <result column="order_status" property="orderStatus" />
- <result column="order_status_text" property="orderStatusText" />
- <result column="actual_arrival_time" property="actualArrivalTime" />
- <result column="created_time" property="createdTime" />
- </resultMap>
- <!-- 桌号分组:预约 + 预约桌关联 + 桌号(左连接桌表,保留 urt.table_id) -->
- <resultMap id="StoreBookingTableReservationRowVoMap" type="shop.alien.entity.store.vo.StoreBookingTableReservationRowVo">
- <result column="table_id" property="tableId" />
- <result column="user_reservation_table_id" property="userReservationTableId" />
- <result column="id" property="id" />
- <result column="reservation_no" property="reservationNo" />
- <result column="user_id" property="userId" />
- <result column="store_id" property="storeId" />
- <result column="reservation_date" property="reservationDate" />
- <result column="start_time" property="startTime" />
- <result column="end_time" property="endTime" />
- <result column="guest_count" property="guestCount" />
- <result column="category_id" property="categoryId" />
- <result column="status" property="status" />
- <result column="actual_arrival_time" property="actualArrivalTime" />
- <result column="remark" property="remark" />
- <result column="reservation_user_name" property="reservationUserName" />
- <result column="reservation_user_gender" property="reservationUserGender" />
- <result column="reservation_user_phone" property="reservationUserPhone" />
- <result column="type" property="type" />
- <result column="created_time" property="createdTime" />
- <result column="updated_time" property="updatedTime" />
- </resultMap>
- <select id="listReservationRowsWithTableByStoreId" resultMap="StoreBookingTableReservationRowVoMap">
- SELECT
- urt.id AS user_reservation_table_id,
- urt.table_id AS table_id,
- ur.id,
- ur.reservation_no,
- ur.user_id,
- ur.store_id,
- ur.reservation_date,
- ur.start_time,
- ur.end_time,
- ur.guest_count,
- ur.category_id,
- ur.status,
- ur.actual_arrival_time,
- ur.remark,
- ur.reservation_user_name,
- ur.reservation_user_gender,
- ur.reservation_user_phone,
- ur.type,
- ur.created_time,
- ur.updated_time
- FROM
- user_reservation ur
- INNER JOIN user_reservation_table urt ON ur.id = urt.reservation_id AND urt.delete_flag = 0
- LEFT JOIN store_table st ON urt.table_id = st.id AND st.delete_flag = 0
- WHERE
- ur.delete_flag = 0
- AND ur.store_id = #{storeId}
- ORDER BY
- ur.reservation_date DESC,
- ur.start_time ASC,
- ur.id ASC,
- urt.sort ASC,
- urt.id ASC
- </select>
- <!-- 查询商家端预约信息列表 -->
- <select id="getStoreReservationList" resultMap="StoreReservationListVoMap">
- SELECT
- ur.id,
- ur.reservation_no,
- ur.reservation_date,
- CASE DAYOFWEEK(ur.reservation_date)
- WHEN 1 THEN '周日'
- WHEN 2 THEN '周一'
- WHEN 3 THEN '周二'
- WHEN 4 THEN '周三'
- WHEN 5 THEN '周四'
- WHEN 6 THEN '周五'
- WHEN 7 THEN '周六'
- END AS week_day,
- ur.category_id,
- sbc.category_name,
- ur.guest_count,
- GROUP_CONCAT(sbt.table_number ORDER BY urt.sort ASC SEPARATOR ',') AS table_numbers,
- ur.start_time,
- ur.end_time,
- CONCAT(IFNULL(ur.start_time, ''), '-', IFNULL(ur.end_time, '')) AS time_slot,
- ur.user_id,
- IFNULL(lu.real_name, lu.user_name) AS customer_name,
- lu.user_phone AS contact_phone,
- ur.remark,
- ur.type,
- ur.status,
- CASE ur.status
- WHEN 0 THEN '待确认'
- WHEN 1 THEN '待使用'
- WHEN 2 THEN '已完成'
- WHEN 3 THEN '已取消'
- WHEN 4 THEN '未到店'
- WHEN 5 THEN '用餐结束'
- ELSE '未知'
- END AS status_text,
- uro.refund_amount,
- uro.deposit_amount,
- uro.order_status,
- CASE uro.order_status
- WHEN 0 THEN '待支付'
- WHEN 1 THEN '待使用'
- WHEN 2 THEN '已完成'
- WHEN 3 THEN '已过期'
- WHEN 4 THEN '已取消'
- WHEN 5 THEN '已关闭'
- WHEN 6 THEN '退款中'
- WHEN 7 THEN '已退款'
- WHEN 8 THEN '商家预订'
- ELSE '未知'
- END AS order_status_text,
- ur.actual_arrival_time,
- ur.created_time
- FROM
- user_reservation ur
- LEFT JOIN store_booking_category sbc ON ur.category_id = sbc.id AND sbc.delete_flag = 0
- LEFT JOIN user_reservation_table urt ON ur.id = urt.reservation_id AND urt.delete_flag = 0
- LEFT JOIN store_table sbt ON urt.table_id = sbt.id AND sbt.delete_flag = 0
- LEFT JOIN life_user lu ON ur.user_id = lu.id AND lu.delete_flag = 0
- LEFT JOIN user_reservation_order uro ON ur.id = uro.reservation_id AND uro.delete_flag = 0
- WHERE
- ur.delete_flag = 0
- AND ur.store_id = #{storeId}
- <if test="status != null">
- AND ur.status = #{status}
- </if>
- <if test="dateFrom != null">
- AND ur.reservation_date >= #{dateFrom}
- </if>
- <if test="dateTo != null">
- AND ur.reservation_date <= #{dateTo}
- </if>
- <if test="orderStatus != null">
- AND uro.order_status = #{orderStatus}
- </if>
- GROUP BY
- ur.id
- ORDER BY
- ur.reservation_date DESC,
- ur.start_time ASC,
- ur.created_time DESC
- </select>
- <delete id="physicalDeleteById">
- DELETE FROM user_reservation WHERE id = #{id}
- </delete>
- <!--
- 未到店超时:订单待使用(1) + 预约待确认/已确认(0,1)
- - 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 (
- (
- 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
- ) < 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') < NOW()
- )
- )
- </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)) > 5
- AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') IS NOT NULL
- AND DATE_ADD(STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i'), INTERVAL 3 HOUR) > NOW()
- )
- OR
- -- 如果 end_time 是时间格式 (HH:mm),需要结合 reservation_date
- (
- LENGTH(TRIM(ur.end_time)) <= 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 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) > NOW()
- )
- )
- )
- )
- </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)) > 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') < NOW()
- AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') > DATE_SUB(NOW(), INTERVAL 3 HOUR)
- )
- OR
- -- 如果 end_time 是时间格式 (HH:mm),需要结合 reservation_date
- (
- LENGTH(TRIM(ur.end_time)) <= 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') < NOW()
- AND STR_TO_DATE(CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)), '%Y-%m-%d %H:%i') > DATE_SUB(NOW(), INTERVAL 3 HOUR)
- )
- )
- )
- )
- </select>
- </mapper>
|