UserReservationMapper.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="shop.alien.mapper.UserReservationMapper">
  4. <resultMap id="BaseResultMap" type="shop.alien.entity.store.UserReservation">
  5. <id column="id" property="id" />
  6. <result column="reservation_no" property="reservationNo" />
  7. <result column="user_id" property="userId" />
  8. <result column="store_id" property="storeId" />
  9. <result column="reservation_date" property="reservationDate" />
  10. <result column="start_time" property="startTime" />
  11. <result column="end_time" property="endTime" />
  12. <result column="guest_count" property="guestCount" />
  13. <result column="category_id" property="categoryId" />
  14. <result column="status" property="status" />
  15. <result column="actual_arrival_time" property="actualArrivalTime" />
  16. <result column="remark" property="remark" />
  17. <result column="reservation_user_name" property="reservationUserName" />
  18. <result column="reservation_user_gender" property="reservationUserGender" />
  19. <result column="reservation_user_phone" property="reservationUserPhone" />
  20. <result column="reason" property="reason" />
  21. <result column="type" property="type" />
  22. <result column="delete_flag" property="deleteFlag" />
  23. <result column="created_time" property="createdTime" />
  24. <result column="created_user_id" property="createdUserId" />
  25. <result column="updated_time" property="updatedTime" />
  26. <result column="updated_user_id" property="updatedUserId" />
  27. </resultMap>
  28. <!-- 商家端预约信息列表结果映射 -->
  29. <resultMap id="StoreReservationListVoMap" type="shop.alien.entity.store.vo.StoreReservationListVo">
  30. <id column="id" property="id" />
  31. <result column="reservation_no" property="reservationNo" />
  32. <result column="reservation_date" property="reservationDate" />
  33. <result column="week_day" property="weekDay" />
  34. <result column="category_id" property="categoryId" />
  35. <result column="category_name" property="categoryName" />
  36. <result column="guest_count" property="guestCount" />
  37. <result column="table_numbers" property="tableNumbers" />
  38. <result column="start_time" property="startTime" />
  39. <result column="end_time" property="endTime" />
  40. <result column="time_slot" property="timeSlot" />
  41. <result column="user_id" property="userId" />
  42. <result column="customer_name" property="customerName" />
  43. <result column="contact_phone" property="contactPhone" />
  44. <result column="remark" property="remark" />
  45. <result column="type" property="type" />
  46. <result column="status" property="status" />
  47. <result column="status_text" property="statusText" />
  48. <result column="total_amount" property="totalAmount" />
  49. <result column="deposit_amount" property="depositAmount" />
  50. <result column="order_status" property="orderStatus" />
  51. <result column="order_status_text" property="orderStatusText" />
  52. <result column="actual_arrival_time" property="actualArrivalTime" />
  53. <result column="created_time" property="createdTime" />
  54. </resultMap>
  55. <!-- 桌号分组:预约 + 预约桌关联 + 桌号(左连接桌表,保留 urt.table_id) -->
  56. <resultMap id="StoreBookingTableReservationRowVoMap" type="shop.alien.entity.store.vo.StoreBookingTableReservationRowVo">
  57. <result column="table_id" property="tableId" />
  58. <result column="user_reservation_table_id" property="userReservationTableId" />
  59. <result column="id" property="id" />
  60. <result column="reservation_no" property="reservationNo" />
  61. <result column="user_id" property="userId" />
  62. <result column="store_id" property="storeId" />
  63. <result column="reservation_date" property="reservationDate" />
  64. <result column="start_time" property="startTime" />
  65. <result column="end_time" property="endTime" />
  66. <result column="guest_count" property="guestCount" />
  67. <result column="category_id" property="categoryId" />
  68. <result column="status" property="status" />
  69. <result column="actual_arrival_time" property="actualArrivalTime" />
  70. <result column="remark" property="remark" />
  71. <result column="reservation_user_name" property="reservationUserName" />
  72. <result column="reservation_user_gender" property="reservationUserGender" />
  73. <result column="reservation_user_phone" property="reservationUserPhone" />
  74. <result column="type" property="type" />
  75. <result column="created_time" property="createdTime" />
  76. <result column="updated_time" property="updatedTime" />
  77. </resultMap>
  78. <select id="listReservationRowsWithTableByStoreId" resultMap="StoreBookingTableReservationRowVoMap">
  79. SELECT
  80. urt.id AS user_reservation_table_id,
  81. urt.table_id AS table_id,
  82. ur.id,
  83. ur.reservation_no,
  84. ur.user_id,
  85. ur.store_id,
  86. ur.reservation_date,
  87. ur.start_time,
  88. ur.end_time,
  89. ur.guest_count,
  90. ur.category_id,
  91. ur.status,
  92. ur.actual_arrival_time,
  93. ur.remark,
  94. ur.reservation_user_name,
  95. ur.reservation_user_gender,
  96. ur.reservation_user_phone,
  97. ur.type,
  98. ur.created_time,
  99. ur.updated_time
  100. FROM
  101. user_reservation ur
  102. INNER JOIN user_reservation_table urt ON ur.id = urt.reservation_id AND urt.delete_flag = 0
  103. LEFT JOIN store_table st ON urt.table_id = st.id AND st.delete_flag = 0
  104. WHERE
  105. ur.delete_flag = 0
  106. AND ur.store_id = #{storeId}
  107. ORDER BY
  108. ur.reservation_date DESC,
  109. ur.start_time ASC,
  110. ur.id ASC,
  111. urt.sort ASC,
  112. urt.id ASC
  113. </select>
  114. <!-- 查询商家端预约信息列表 -->
  115. <select id="getStoreReservationList" resultMap="StoreReservationListVoMap">
  116. SELECT
  117. ur.id,
  118. ur.reservation_no,
  119. ur.reservation_date,
  120. CASE DAYOFWEEK(ur.reservation_date)
  121. WHEN 1 THEN '周日'
  122. WHEN 2 THEN '周一'
  123. WHEN 3 THEN '周二'
  124. WHEN 4 THEN '周三'
  125. WHEN 5 THEN '周四'
  126. WHEN 6 THEN '周五'
  127. WHEN 7 THEN '周六'
  128. END AS week_day,
  129. ur.category_id,
  130. sbc.category_name,
  131. ur.guest_count,
  132. GROUP_CONCAT(sbt.table_number ORDER BY urt.sort ASC SEPARATOR ',') AS table_numbers,
  133. ur.start_time,
  134. ur.end_time,
  135. CONCAT(IFNULL(ur.start_time, ''), '-', IFNULL(ur.end_time, '')) AS time_slot,
  136. ur.user_id,
  137. IFNULL(lu.real_name, lu.user_name) AS customer_name,
  138. lu.user_phone AS contact_phone,
  139. ur.remark,
  140. ur.type,
  141. ur.status,
  142. CASE ur.status
  143. WHEN 0 THEN '待确认'
  144. WHEN 1 THEN '待使用'
  145. WHEN 2 THEN '已完成'
  146. WHEN 3 THEN '已取消'
  147. WHEN 4 THEN '未到店'
  148. WHEN 5 THEN '用餐结束'
  149. ELSE '未知'
  150. END AS status_text,
  151. uro.refund_amount,
  152. uro.deposit_amount,
  153. uro.order_status,
  154. CASE uro.order_status
  155. WHEN 0 THEN '待支付'
  156. WHEN 1 THEN '待使用'
  157. WHEN 2 THEN '已完成'
  158. WHEN 3 THEN '已过期'
  159. WHEN 4 THEN '已取消'
  160. WHEN 5 THEN '已关闭'
  161. WHEN 6 THEN '退款中'
  162. WHEN 7 THEN '已退款'
  163. WHEN 8 THEN '商家预订'
  164. ELSE '未知'
  165. END AS order_status_text,
  166. ur.actual_arrival_time,
  167. ur.created_time
  168. FROM
  169. user_reservation ur
  170. LEFT JOIN store_booking_category sbc ON ur.category_id = sbc.id AND sbc.delete_flag = 0
  171. LEFT JOIN user_reservation_table urt ON ur.id = urt.reservation_id AND urt.delete_flag = 0
  172. LEFT JOIN store_table sbt ON urt.table_id = sbt.id AND sbt.delete_flag = 0
  173. LEFT JOIN life_user lu ON ur.user_id = lu.id AND lu.delete_flag = 0
  174. LEFT JOIN user_reservation_order uro ON ur.id = uro.reservation_id AND uro.delete_flag = 0
  175. WHERE
  176. ur.delete_flag = 0
  177. AND ur.store_id = #{storeId}
  178. <if test="status != null">
  179. AND ur.status = #{status}
  180. </if>
  181. <if test="dateFrom != null">
  182. AND ur.reservation_date &gt;= #{dateFrom}
  183. </if>
  184. <if test="dateTo != null">
  185. AND ur.reservation_date &lt;= #{dateTo}
  186. </if>
  187. <if test="orderStatus != null">
  188. AND uro.order_status = #{orderStatus}
  189. </if>
  190. GROUP BY
  191. ur.id
  192. ORDER BY
  193. ur.reservation_date DESC,
  194. ur.start_time ASC,
  195. ur.created_time DESC
  196. </select>
  197. <delete id="physicalDeleteById">
  198. DELETE FROM user_reservation WHERE id = #{id}
  199. </delete>
  200. <!--
  201. 未到店超时:订单待使用(1) + 预约待确认/已确认(0,1)
  202. - retain_position_flag = 1:截止时间 = start_time + retention_duration(分钟),NULL 时长按 0
  203. - 否则:仅按 start_time 判断(当前时间已超过预约开始时间即超时)
  204. start_time 格式 yyyy-MM-dd HH:mm
  205. -->
  206. <select id="listReservationIdsForTimeoutMark" resultType="java.lang.Integer">
  207. SELECT r.id
  208. FROM user_reservation r
  209. INNER JOIN user_reservation_order o ON o.reservation_id = r.id AND o.delete_flag = 0
  210. LEFT JOIN (
  211. SELECT s1.store_id, s1.retain_position_flag, s1.retention_duration
  212. FROM store_booking_settings s1
  213. INNER JOIN (
  214. SELECT store_id, MAX(id) AS max_id
  215. FROM store_booking_settings
  216. WHERE delete_flag = 0
  217. GROUP BY store_id
  218. ) sm ON sm.max_id = s1.id AND sm.store_id = s1.store_id
  219. ) bs ON bs.store_id = r.store_id
  220. WHERE r.delete_flag = 0
  221. AND o.order_status = 1
  222. AND r.status IN (0, 1)
  223. AND r.start_time IS NOT NULL AND TRIM(r.start_time) != ''
  224. AND (
  225. (
  226. bs.retain_position_flag = 1
  227. AND DATE_ADD(
  228. STR_TO_DATE(TRIM(r.start_time), '%Y-%m-%d %H:%i'),
  229. INTERVAL COALESCE(bs.retention_duration, 0) MINUTE
  230. ) &lt; NOW()
  231. )
  232. OR
  233. (
  234. (bs.retain_position_flag IS NULL OR bs.retain_position_flag != 1)
  235. AND STR_TO_DATE(TRIM(r.start_time), '%Y-%m-%d %H:%i') &lt; NOW()
  236. )
  237. )
  238. </select>
  239. <!-- 查询分类下是否有符合条件的预订信息
  240. 条件:订单状态为"待使用"(1)或"已完成"(2)
  241. 对于"已完成"状态的订单,要求 当前时间 < 结束时间 + 3小时 -->
  242. <select id="countReservationsByCategoryAndOrderStatus" resultType="java.lang.Long">
  243. SELECT COUNT(DISTINCT ur.id)
  244. FROM user_reservation ur
  245. INNER JOIN user_reservation_order uro ON ur.id = uro.reservation_id AND uro.delete_flag = 0
  246. WHERE ur.delete_flag = 0
  247. AND ur.category_id = #{categoryId}
  248. AND ur.store_id = #{storeId}
  249. AND uro.order_status IN (1, 2)
  250. AND (
  251. -- 订单状态为"待使用"(1),直接符合条件
  252. uro.order_status = 1
  253. OR
  254. -- 订单状态为"已完成"(2),需要检查 当前时间 小于 订单结束时间+ 3小时
  255. (
  256. uro.order_status = 2
  257. AND ur.end_time IS NOT NULL
  258. AND TRIM(ur.end_time) != ''
  259. AND (
  260. -- 如果 end_time 是完整日期时间格式 (yyyy-MM-dd HH:mm)
  261. (
  262. LENGTH(TRIM(ur.end_time)) &gt; 5
  263. AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') IS NOT NULL
  264. AND DATE_ADD(STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i'), INTERVAL 3 HOUR) &gt; NOW()
  265. )
  266. OR
  267. -- 如果 end_time 是时间格式 (HH:mm),需要结合 reservation_date
  268. (
  269. LENGTH(TRIM(ur.end_time)) &lt;= 5
  270. AND ur.reservation_date IS NOT NULL
  271. 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
  272. 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) &gt; NOW()
  273. )
  274. )
  275. )
  276. )
  277. </select>
  278. <!-- 查询桌号下是否有符合条件的预订信息
  279. 条件:订单状态为"待使用"(1)或"已完成"(2)
  280. 对于"已完成"状态的订单,结束时间需要在当前时间3小时内 -->
  281. <select id="countReservationsByTableAndOrderStatus" resultType="java.lang.Long">
  282. SELECT COUNT(DISTINCT ur.id)
  283. FROM user_reservation ur
  284. INNER JOIN user_reservation_table urt ON ur.id = urt.reservation_id AND urt.delete_flag = 0
  285. INNER JOIN user_reservation_order uro ON ur.id = uro.reservation_id AND uro.delete_flag = 0
  286. WHERE ur.delete_flag = 0
  287. AND urt.table_id = #{tableId}
  288. AND ur.store_id = #{storeId}
  289. AND uro.order_status IN (1, 2)
  290. AND (
  291. -- 订单状态为"待使用"(1),直接符合条件
  292. uro.order_status = 1
  293. OR
  294. -- 订单状态为"已完成"(2),需要检查结束时间在3小时内
  295. (
  296. uro.order_status = 2
  297. AND ur.end_time IS NOT NULL
  298. AND TRIM(ur.end_time) != ''
  299. AND (
  300. -- 如果 end_time 是完整日期时间格式 (yyyy-MM-dd HH:mm)
  301. (
  302. LENGTH(TRIM(ur.end_time)) &gt; 5
  303. AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') IS NOT NULL
  304. AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') &lt; NOW()
  305. AND STR_TO_DATE(TRIM(ur.end_time), '%Y-%m-%d %H:%i') &gt; DATE_SUB(NOW(), INTERVAL 3 HOUR)
  306. )
  307. OR
  308. -- 如果 end_time 是时间格式 (HH:mm),需要结合 reservation_date
  309. (
  310. LENGTH(TRIM(ur.end_time)) &lt;= 5
  311. AND ur.reservation_date IS NOT NULL
  312. 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
  313. AND STR_TO_DATE(CONCAT(DATE_FORMAT(ur.reservation_date, '%Y-%m-%d'), ' ', TRIM(ur.end_time)), '%Y-%m-%d %H:%i') &lt; NOW()
  314. 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)
  315. )
  316. )
  317. )
  318. )
  319. </select>
  320. </mapper>