HotelOrderController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package com.chuanghai.ihotel.controller;
  2. import com.chuanghai.ihotel.anno.AdminLoginCheck;
  3. import com.chuanghai.ihotel.anno.ParamCheck;
  4. import com.chuanghai.ihotel.anno.RepeatSubmit;
  5. import com.chuanghai.ihotel.anno.UserLoginCheck;
  6. import com.chuanghai.ihotel.aop.LoginCheckAspect;
  7. import com.chuanghai.ihotel.common.exception.BizCodeEnume;
  8. import com.chuanghai.ihotel.common.exception.RRException;
  9. import com.chuanghai.ihotel.common.utils.CommonResult;
  10. import com.chuanghai.ihotel.common.utils.PageParam;
  11. import com.chuanghai.ihotel.common.utils.PageUtils;
  12. import com.chuanghai.ihotel.constant.RedisKey;
  13. import com.chuanghai.ihotel.controller.request.ConfrimOrderRequest;
  14. import com.chuanghai.ihotel.controller.request.OrderQueryRequest;
  15. import com.chuanghai.ihotel.controller.request.SubmitOrderRequest;
  16. import com.chuanghai.ihotel.entity.HotelOrderEntity;
  17. import com.chuanghai.ihotel.service.HotelOrderService;
  18. import com.chuanghai.ihotel.util.CommonUtil;
  19. import com.chuanghai.ihotel.vo.ConfirmOrderVO;
  20. import com.chuanghai.ihotel.dto.LoginUserDTO;
  21. import com.chuanghai.ihotel.vo.OrderBillHandleVO;
  22. import com.chuanghai.ihotel.vo.OrderSubmitTokenVO;
  23. import com.chuanghai.ihotel.vo.OrderSubmitVO;
  24. import com.chuanghai.ihotel.vo.UserOrderDetailVO;
  25. import com.chuanghai.ihotel.vo.UserOrderIndexVO;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.data.redis.core.StringRedisTemplate;
  28. import org.springframework.web.bind.annotation.DeleteMapping;
  29. import org.springframework.web.bind.annotation.GetMapping;
  30. import org.springframework.web.bind.annotation.PathVariable;
  31. import org.springframework.web.bind.annotation.PostMapping;
  32. import org.springframework.web.bind.annotation.PutMapping;
  33. import org.springframework.web.bind.annotation.RequestBody;
  34. import org.springframework.web.bind.annotation.RequestHeader;
  35. import org.springframework.web.bind.annotation.RequestMapping;
  36. import org.springframework.web.bind.annotation.RestController;
  37. import java.time.LocalDate;
  38. import java.time.LocalDateTime;
  39. import java.time.ZoneOffset;
  40. import java.time.temporal.ChronoUnit;
  41. import java.util.concurrent.TimeUnit;
  42. /**
  43. * 酒店订单
  44. *
  45. * @author codingliang
  46. * @email codingliang@gmail.com
  47. * @date 2022-07-27 10:02:04
  48. */
  49. @RestController
  50. @RequestMapping("hotelOrder")
  51. public class HotelOrderController {
  52. @Autowired
  53. private StringRedisTemplate redisTemplate;
  54. @Autowired
  55. private HotelOrderService hotelOrderService;
  56. /**
  57. * 获取请求令牌
  58. * @param userToken 用户token
  59. * @return
  60. */
  61. @UserLoginCheck
  62. @GetMapping("/user/submit/token")
  63. public CommonResult<OrderSubmitTokenVO> getOrderToken(@RequestHeader("user_token") String userToken){
  64. LoginUserDTO loginUserVO = LoginCheckAspect.threadLocal.get();
  65. String cardNumber = loginUserVO.getCardNumber();
  66. String token = CommonUtil.getStringNumRandom(32);
  67. String key = String.format(RedisKey.SUBMIT_ORDER_TOKEN_KEY_FOR_TOKEN, cardNumber, token);
  68. // 令牌有效时间是30分钟
  69. redisTemplate.opsForValue().set(key, String.valueOf(Thread.currentThread().getId()),30, TimeUnit.MINUTES);
  70. OrderSubmitTokenVO tokenVO = OrderSubmitTokenVO.builder()
  71. .submitToken(token)
  72. .expire(LocalDateTime.now().plusMinutes(30).toInstant(ZoneOffset.ofHours(8)).toEpochMilli())
  73. .build();
  74. return CommonResult.ok().setResult(tokenVO);
  75. }
  76. /**
  77. * 确认订单
  78. * @param request 预定参数
  79. * @return
  80. */
  81. @GetMapping("/user/order/confirm")
  82. @ParamCheck
  83. public CommonResult<ConfirmOrderVO> confirmOrder(ConfrimOrderRequest request) {
  84. // 时间校验
  85. timeCheck(CommonUtil.localDateToTime(request.getStartTime(), "00:00:00"),
  86. CommonUtil.localDateToTime(request.getEndTime(), "00:00:00"));
  87. ConfirmOrderVO vo = hotelOrderService.confirmOrder(request);
  88. return CommonResult.ok().setResult(vo);
  89. }
  90. /**
  91. * 提交订单
  92. * @param userToken 用户卡号
  93. * @param requestToken 请求令牌,从【获取请求令牌】接口获取
  94. * @param request 请求参数
  95. * @return
  96. */
  97. @UserLoginCheck
  98. @ParamCheck(index = 3)
  99. @RepeatSubmit(limitType = RepeatSubmit.Type.TOKEN)
  100. @PostMapping("user/order/submit")
  101. public CommonResult<OrderSubmitVO> submitOrder(@RequestHeader("user_token") String userToken,
  102. @RequestHeader("request_token") String requestToken,
  103. @RequestBody SubmitOrderRequest request) {
  104. // 时间校验
  105. timeCheck(request.getEnableStartTime(), request.getEnableEndTime());
  106. OrderSubmitVO vo = hotelOrderService.submitOrder(request);
  107. return CommonResult.ok().setResult(vo);
  108. }
  109. /**
  110. * 订单列表【用户端】
  111. * @param userToken 用户token
  112. * @param pageParam 分页参数
  113. * @param request 查询参数
  114. * @return
  115. */
  116. @UserLoginCheck
  117. @GetMapping("/user/order/page")
  118. public CommonResult<PageUtils<UserOrderIndexVO>> userOrderPage(@RequestHeader("user_token") String userToken,
  119. PageParam pageParam,
  120. OrderQueryRequest request) {
  121. PageUtils page = hotelOrderService.userOrderPage(pageParam, request);
  122. return CommonResult.ok().setResult(page);
  123. }
  124. /**
  125. * 订单列表【管理端】
  126. */
  127. @AdminLoginCheck
  128. @GetMapping("/admin/order/page")
  129. public CommonResult<PageUtils<HotelOrderEntity>> page(@RequestHeader("admin_token") String adminToken,
  130. PageParam pageParam,
  131. OrderQueryRequest request){
  132. PageUtils page = hotelOrderService.queryPage(pageParam, request);
  133. return CommonResult.ok().setResult(page);
  134. }
  135. /**
  136. * 订单详情 【用户端】
  137. * @param userToken 用户token
  138. * @param orderId 订单id
  139. * @return
  140. */
  141. @UserLoginCheck
  142. @GetMapping("user/order/{orderId}")
  143. public CommonResult<UserOrderDetailVO> userOrderDetail(@RequestHeader("user_token") String userToken,
  144. @PathVariable("orderId") Long orderId) {
  145. UserOrderDetailVO detailVO = hotelOrderService.userOrderDetail(orderId);
  146. return CommonResult.ok().setResult(detailVO);
  147. }
  148. /**
  149. * 获取订单支付参数
  150. * @param userToken 用户token
  151. * @param orderId 订单id
  152. * @return
  153. */
  154. @UserLoginCheck
  155. @GetMapping("/user/order/pay/{orderId}")
  156. public CommonResult<OrderSubmitVO> getOrderPayParam(@RequestHeader("user_token") String userToken,
  157. @PathVariable("orderId") Long orderId) {
  158. OrderSubmitVO vo = hotelOrderService.getOrderPayParam(orderId);
  159. return CommonResult.ok().setResult(vo);
  160. }
  161. /**
  162. * 获取订单结账信息
  163. * @param userToken 用户token
  164. * @param orderId 订单id
  165. * @return
  166. */
  167. @UserLoginCheck
  168. @GetMapping("/user/order/bill/{orderId}")
  169. public CommonResult<OrderBillHandleVO> getOrderBillInfo(@RequestHeader("user_token") String userToken,
  170. @PathVariable("orderId") Long orderId) {
  171. OrderBillHandleVO vo = hotelOrderService.getOrderBillInfo(orderId);
  172. return CommonResult.ok().setResult(vo);
  173. }
  174. /**
  175. * 删除订单【用户端】
  176. * @param userToken 用户token
  177. * @param orderId 订单id
  178. * @return
  179. */
  180. @UserLoginCheck
  181. @DeleteMapping("user/order/{orderId}")
  182. public CommonResult<String> userDeleteOrder(@RequestHeader("user_token") String userToken,
  183. @PathVariable("orderId") Long orderId) {
  184. hotelOrderService.userDeleteOrder(orderId);
  185. return CommonResult.ok();
  186. }
  187. /**
  188. * 取消订单
  189. * @param userToken 用户token
  190. * @param orderId 订单id
  191. * @return
  192. */
  193. @UserLoginCheck
  194. @PutMapping("user/order/cancel/{orderId}")
  195. public CommonResult<String> userCancelOrder(@RequestHeader("user_token") String userToken,
  196. @PathVariable("orderId") Long orderId) {
  197. hotelOrderService.userCancelOrder(orderId);
  198. return CommonResult.ok();
  199. }
  200. /**
  201. * 办理入住
  202. * @param userToken 用户token
  203. * @param orderId 订单id
  204. * @return
  205. */
  206. @UserLoginCheck
  207. @PutMapping("user/order/hold/{orderId}")
  208. public CommonResult<String> userHoldOrder(@RequestHeader("user_token") String userToken,
  209. @PathVariable("orderId") Long orderId) {
  210. hotelOrderService.userHoldOrder(orderId);
  211. return CommonResult.ok();
  212. }
  213. /**
  214. * 办理退房
  215. * @param userToken 用户token
  216. * @param orderId 订单id
  217. * @return
  218. */
  219. @UserLoginCheck
  220. @PutMapping("user/order/return/{orderId}")
  221. public CommonResult<OrderBillHandleVO> userReturnOrder(@RequestHeader("user_token") String userToken,
  222. @PathVariable("orderId") Long orderId) {
  223. OrderBillHandleVO orderBillHandleVO = hotelOrderService.userReturnOrder(orderId);
  224. return CommonResult.ok().setResult(orderBillHandleVO);
  225. }
  226. /**
  227. * 时间校验
  228. * @param startTime
  229. * @param endTime
  230. */
  231. private void timeCheck(LocalDateTime startTime, LocalDateTime endTime) {
  232. // 校验参数
  233. LocalDateTime currentTime = LocalDateTime.now();
  234. LocalDate currentDay = currentTime.toLocalDate();
  235. LocalDate startDay = startTime.toLocalDate();
  236. LocalDate endDay = endTime.toLocalDate();
  237. if (startDay.isBefore(currentDay)) {
  238. long between = ChronoUnit.DAYS.between(startDay, currentDay);
  239. if (between > 1) {
  240. throw new RRException(BizCodeEnume.PARAMETER_ERROR, "预定日期错误,不能预定以前的房源");
  241. }
  242. // 当天上午10点之前可以预定前一天的房源
  243. if (currentTime.getHour() >= 10) {
  244. throw new RRException(BizCodeEnume.PARAMETER_ERROR, "预定日期错误,10点之后不可预定前一天房源");
  245. }
  246. }
  247. if (startDay.isEqual(endDay)) {
  248. throw new RRException(BizCodeEnume.PARAMETER_ERROR, "入住时间和离店时间不能为同一天");
  249. }
  250. if (endTime.isBefore(startTime)) {
  251. throw new RRException(BizCodeEnume.PARAMETER_ERROR, "离店时间必须晚于入住时间");
  252. }
  253. if (ChronoUnit.DAYS.between(startDay, endDay) > 7) {
  254. throw new RRException(BizCodeEnume.PARAMETER_ERROR, "最多预定7天");
  255. }
  256. }
  257. }