|
|
@@ -1,5 +1,33 @@
|
|
|
package com.chuanghai.ihotel.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
+import com.chuanghai.ihotel.common.exception.BizCodeEnume;
|
|
|
+import com.chuanghai.ihotel.common.exception.RRException;
|
|
|
+import com.chuanghai.ihotel.config.JXNXSPayConfig;
|
|
|
+import com.chuanghai.ihotel.constant.TimeConstant;
|
|
|
+import com.chuanghai.ihotel.controller.request.ConfrimOrderRequest;
|
|
|
+import com.chuanghai.ihotel.controller.request.SubmitOrderRequest;
|
|
|
+import com.chuanghai.ihotel.dto.LockRoomDTO;
|
|
|
+import com.chuanghai.ihotel.entity.HotelUserEntity;
|
|
|
+import com.chuanghai.ihotel.entity.RoomEntity;
|
|
|
+import com.chuanghai.ihotel.entity.RoomTypeEntity;
|
|
|
+import com.chuanghai.ihotel.entity.SystemSettingEntity;
|
|
|
+import com.chuanghai.ihotel.enums.OrderBillStatuEnum;
|
|
|
+import com.chuanghai.ihotel.enums.OrderStatuEnum;
|
|
|
+import com.chuanghai.ihotel.enums.UserIdentityTypeEnum;
|
|
|
+import com.chuanghai.ihotel.interceptor.LoginInterceptor;
|
|
|
+import com.chuanghai.ihotel.service.HotelUserService;
|
|
|
+import com.chuanghai.ihotel.service.RoomRealtimeStatuService;
|
|
|
+import com.chuanghai.ihotel.service.RoomService;
|
|
|
+import com.chuanghai.ihotel.service.RoomTypeService;
|
|
|
+import com.chuanghai.ihotel.service.SystemSettingService;
|
|
|
+import com.chuanghai.ihotel.util.CommonUtil;
|
|
|
+import com.chuanghai.ihotel.vo.ConfirmOrderVO;
|
|
|
+import com.chuanghai.ihotel.vo.LoginUserVO;
|
|
|
+import com.chuanghai.ihotel.vo.OrderSubmitVO;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
@@ -11,19 +39,170 @@ import com.chuanghai.ihotel.common.utils.PageParam;
|
|
|
import com.chuanghai.ihotel.dao.HotelOrderDao;
|
|
|
import com.chuanghai.ihotel.entity.HotelOrderEntity;
|
|
|
import com.chuanghai.ihotel.service.HotelOrderService;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import javax.validation.constraints.Min;
|
|
|
+import javax.validation.constraints.NotNull;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
|
|
|
|
|
|
@Service("hotelOrderService")
|
|
|
public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrderEntity> implements HotelOrderService {
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SystemSettingService systemSettingService;
|
|
|
+ @Autowired
|
|
|
+ private RoomTypeService roomTypeService;
|
|
|
+ @Autowired
|
|
|
+ private RoomRealtimeStatuService roomRealtimeStatuService;
|
|
|
+ @Autowired
|
|
|
+ private HotelUserService hotelUserService;
|
|
|
+ @Autowired
|
|
|
+ private RoomService roomService;
|
|
|
+ @Autowired
|
|
|
+ private JXNXSPayConfig jxnxsPayConfig;
|
|
|
+
|
|
|
@Override
|
|
|
public PageUtils queryPage(PageParam pageParam) {
|
|
|
IPage<HotelOrderEntity> page = this.page(
|
|
|
new MyQuery<HotelOrderEntity>().getPage(pageParam),
|
|
|
- new QueryWrapper<HotelOrderEntity>()
|
|
|
+ new QueryWrapper<>()
|
|
|
);
|
|
|
|
|
|
return new PageUtils(page);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public ConfirmOrderVO confirmOrder(ConfrimOrderRequest request) {
|
|
|
+ SystemSettingEntity systemSetting = systemSettingService.get();
|
|
|
+
|
|
|
+ // 入住日期校验
|
|
|
+ Integer preDay = systemSetting.getPreDay();
|
|
|
+ if (Math.abs(ChronoUnit.DAYS.between(request.getStartTime(), LocalDate.now())) > preDay) {
|
|
|
+ throw new RRException(BizCodeEnume.PARAMETER_ERROR, "只能预定" + preDay + "天之内的房源");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询房源是否充足
|
|
|
+ Long roomTypeId = request.getRoomTypeId();
|
|
|
+ RoomTypeEntity roomType = roomTypeService.myGetById(roomTypeId);
|
|
|
+ if (roomType == null) {
|
|
|
+ throw new RRException(BizCodeEnume.PARAMETER_ERROR, "房型不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ LocalDateTime startTime = CommonUtil.localDateToTime(request.getStartTime(), TimeConstant.INTO_TIME);
|
|
|
+ LocalDateTime endTime = CommonUtil.localDateToTime(request.getEndTime(), TimeConstant.OUT_TIME);
|
|
|
+ long days = ChronoUnit.DAYS.between(request.getStartTime(), request.getEndTime());
|
|
|
+ int busyNum = roomRealtimeStatuService.getBusyNum(roomTypeId, startTime, endTime);
|
|
|
+
|
|
|
+ int enableNum = roomType.getRoomNum() - busyNum;
|
|
|
+
|
|
|
+ // 查询房型价格
|
|
|
+ BigDecimal discountPrice = roomType.getDiscountPrice();
|
|
|
+
|
|
|
+ // 查询押金
|
|
|
+ BigDecimal deposit = systemSetting.getDeposit();
|
|
|
+
|
|
|
+ BigDecimal totalAmount = discountPrice.add(deposit).multiply(new BigDecimal(Long.toString(days)));
|
|
|
+
|
|
|
+ // 封装确认订单vo
|
|
|
+ ConfirmOrderVO vo = new ConfirmOrderVO();
|
|
|
+ vo.setStartTime(startTime);
|
|
|
+ vo.setEndTime(endTime);
|
|
|
+ vo.setNums(Integer.valueOf((int)days));
|
|
|
+ vo.setRoomTypeId(roomTypeId);
|
|
|
+ vo.setRoomTypeName(roomType.getTypeName());
|
|
|
+ vo.setFreeNum(enableNum >= 0 ? enableNum : 0);
|
|
|
+ vo.setDiscountPrice(roomType.getDiscountPrice());
|
|
|
+ vo.setDeposit(systemSetting.getDeposit());
|
|
|
+ vo.setPriceOfWater(systemSetting.getPriceOfWater());
|
|
|
+ vo.setPriceOfElectric(systemSetting.getPriceOfElectric());
|
|
|
+ vo.setFreeQuotaOfElectric(systemSetting.getPriceOfElectric());
|
|
|
+ vo.setFreeQuotaOfWater(systemSetting.getFreeQuotaOfWater());
|
|
|
+ vo.setFreeQuotaOfElectric(systemSetting.getFreeQuotaOfElectric());
|
|
|
+ vo.setFreeTotal(systemSetting.getFreeTotal());
|
|
|
+ vo.setTotalAmount(totalAmount);
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public OrderSubmitVO submitOrder(String userToken, SubmitOrderRequest request) {
|
|
|
+ LoginUserVO loginUserVO = LoginInterceptor.threadLocal.get();
|
|
|
+ String cardNumber = loginUserVO.getCardNumber();
|
|
|
+
|
|
|
+ // 身份校验
|
|
|
+ HotelUserEntity hotelUser = hotelUserService.findByCardNumber(cardNumber);
|
|
|
+ if (hotelUser == null) {
|
|
|
+ throw new RRException(BizCodeEnume.PERMISSION_DENIED, "非法用户");
|
|
|
+ }
|
|
|
+ String identityType = hotelUser.getIdentityType();
|
|
|
+ if (!UserIdentityTypeEnum.STAFF_OF_TEACHER.getCode().equals(identityType)) {
|
|
|
+ throw new RRException(BizCodeEnume.PERMISSION_DENIED, "非法用户-非教职工");
|
|
|
+ }
|
|
|
+
|
|
|
+ SystemSettingEntity systemSetting = systemSettingService.get();
|
|
|
+ // 入住时间校验
|
|
|
+ Integer preDay = systemSetting.getPreDay();
|
|
|
+ if (Math.abs(ChronoUnit.DAYS.between(request.getEnableStartTime().toLocalDate(), LocalDate.now())) > preDay) {
|
|
|
+ throw new RRException(BizCodeEnume.PARAMETER_ERROR, "只能预定" + preDay + "天之内的房源");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验房型
|
|
|
+ RoomTypeEntity roomType = roomTypeService.myGetById(request.getRoomTypeId());
|
|
|
+ if (roomType == null) {
|
|
|
+ throw new RRException(BizCodeEnume.PARAMETER_ERROR, "房型不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 金额校验
|
|
|
+ BigDecimal discountPrice = roomType.getDiscountPrice();
|
|
|
+ BigDecimal deposit = systemSetting.getDeposit();
|
|
|
+ long days = ChronoUnit.DAYS.between(request.getEnableStartTime().toLocalDate(), request.getEnableEndTime().toLocalDate());
|
|
|
+ BigDecimal totalAmount = discountPrice.add(deposit).multiply(new BigDecimal(Long.toString(days)));
|
|
|
+ if (Math.abs(totalAmount.subtract(request.getPayAmount()).doubleValue()) > 0.01) {
|
|
|
+ throw new RRException(BizCodeEnume.ORDER_SUBMIT_ERROR, "订单金额校验失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 锁定房源
|
|
|
+ long orderId = IdWorker.getId();
|
|
|
+ LockRoomDTO lockRoomDTO = LockRoomDTO.builder()
|
|
|
+ .roomTypeId(roomType.getId())
|
|
|
+ .bizId(orderId)
|
|
|
+ .startTime(request.getEnableStartTime())
|
|
|
+ .endTime(request.getEnableEndTime())
|
|
|
+ .build();
|
|
|
+ Long roomId = roomRealtimeStatuService.lockRoomByRoomTypeId(lockRoomDTO);
|
|
|
+ if (roomId == null) {
|
|
|
+ throw new RRException(BizCodeEnume.ORDER_SUBMIT_ERROR, "【" + roomType.getTypeName() + "】房型房源不足,锁定房源失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ RoomEntity room = roomService.getById(roomId);
|
|
|
+ if (room == null) {
|
|
|
+ throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "系统异常,根据id查询房间失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 订单落库
|
|
|
+ HotelOrderEntity hotelOrder = new HotelOrderEntity();
|
|
|
+ BeanUtils.copyProperties(request, hotelOrder);
|
|
|
+ hotelOrder.setId(orderId);
|
|
|
+ hotelOrder.setOrderNo(IdWorker.getTimeId());
|
|
|
+ hotelOrder.setUserFlag(cardNumber);
|
|
|
+ hotelOrder.setRoomId(roomId);
|
|
|
+ hotelOrder.setRoomNo(room.getRoomNo());
|
|
|
+ hotelOrder.setRoomTypeName(roomType.getTypeName());
|
|
|
+ hotelOrder.setCreateTime(LocalDateTime.now());
|
|
|
+ hotelOrder.setOrderStatu(OrderStatuEnum.WAIT_PAY.getCode());
|
|
|
+ hotelOrder.setBizStatu(OrderBillStatuEnum.WAIT_HANDLE.getCode());
|
|
|
+ hotelOrder.setDeleteFlag("1"); // 0删除、1正常
|
|
|
+ this.save(hotelOrder);
|
|
|
+
|
|
|
+ // 发送mq信息 TODO
|
|
|
+
|
|
|
+ String payUrl = String.format(jxnxsPayConfig.getPayUrl(), hotelOrder.getOrderNo(), request.getPayAmount());
|
|
|
+ return OrderSubmitVO.builder().orderId(hotelOrder.getId()).payUrl(payUrl).build();
|
|
|
+ }
|
|
|
+
|
|
|
}
|