|
|
@@ -3,25 +3,30 @@ package org.dromara.hotel.service.impl;
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.RandomUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
+import org.dromara.common.core.constant.*;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
import org.dromara.backstage.api.RemotePtRoomService;
|
|
|
-import org.dromara.common.core.constant.DefaultConstants;
|
|
|
-import org.dromara.common.core.constant.HotelBusinessConstants;
|
|
|
import org.dromara.common.core.domain.R;
|
|
|
import org.dromara.common.core.enums.HotelRoomStatusEnum;
|
|
|
import org.dromara.common.core.exception.ServiceException;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.SmsUtils;
|
|
|
+import org.dromara.common.core.utils.SpringUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.redis.utils.RedisUtils;
|
|
|
import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
|
|
|
import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
|
|
|
import org.dromara.hotel.domain.KfOrder;
|
|
|
+import org.dromara.hotel.domain.bo.ChangeRoomBo;
|
|
|
+import org.dromara.hotel.domain.bo.ChangeRoomStatusBo;
|
|
|
import org.dromara.hotel.domain.bo.KfGuestBo;
|
|
|
import org.dromara.hotel.domain.bo.KfOrderBo;
|
|
|
import org.dromara.hotel.domain.vo.*;
|
|
|
@@ -33,7 +38,9 @@ import org.dromara.hotel.service.IKfTeamService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.time.Duration;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.LinkedBlockingQueue;
|
|
|
|
|
|
/**
|
|
|
* 散客入住Service业务层处理
|
|
|
@@ -49,7 +56,6 @@ public class KfOrderServiceImpl implements IKfOrderService {
|
|
|
|
|
|
private final KfOrderMapper baseMapper;
|
|
|
private final IKfTeamService teamService;
|
|
|
- private final KfGuestMapper guestMapper;
|
|
|
private final IKfGuestTeamRService guestTeamService;
|
|
|
|
|
|
/**
|
|
|
@@ -125,7 +131,7 @@ public class KfOrderServiceImpl implements IKfOrderService {
|
|
|
//2.查询团客入住信息
|
|
|
KfOrder order = baseMapper.selectOne(Wrappers.<KfOrder>lambdaQuery()
|
|
|
.eq(KfOrder::getGuestId, teamGuest.getId())
|
|
|
- .eq(KfOrder::getGuestId, teamGuest.getId()));
|
|
|
+ .eq(KfOrder::getTeamId, teamGuest.getTeamId()));
|
|
|
if(ObjectUtil.isNotEmpty(order)) {
|
|
|
teamGuest.setRoomCode(order.getRoomCode());
|
|
|
teamGuest.setRoomName(order.getRoomName());
|
|
|
@@ -229,6 +235,92 @@ public class KfOrderServiceImpl implements IKfOrderService {
|
|
|
return baseMapper.updateById(update) > 0;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 团客报到
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean teamGuestCheckIn(KfTeamGuestVo bo) {
|
|
|
+ boolean flag = false;
|
|
|
+ //1.根据客人ID和客团ID修改客人客团关系表的报到状态,并发送kafka消息
|
|
|
+ flag = guestTeamService.setGuestCheckInStatus(bo.getId(), bo.getTeamId());
|
|
|
+ String roomCode = bo.getRoomCode();
|
|
|
+ //2.修改订单信息
|
|
|
+ if (bo.getOrderId() != null) {
|
|
|
+ // 参数里面有OrderId,设置订单状态为入住
|
|
|
+ KfOrderBo orderBo = new KfOrderBo();
|
|
|
+ orderBo.setId(bo.getOrderId());
|
|
|
+ orderBo.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_RZ);
|
|
|
+ //3.删除锁房缓存,根据roomCode修改房间状态
|
|
|
+ updateOrderAndRoomStatus(orderBo);
|
|
|
+ } else {
|
|
|
+ // 参数里面没有OrderId,根据团客ID查询锁房订单信息,设置订单状态为入住
|
|
|
+ LambdaQueryWrapper<KfOrder> queryWrapper = new LambdaQueryWrapper<KfOrder>()
|
|
|
+ .eq(KfOrder::getTeamId, bo.getTeamId())
|
|
|
+ .eq(KfOrder::getOrderStatus, HotelBusinessConstants.ORDER_STATUS_SF)
|
|
|
+ .orderByAsc(KfOrder::getOrderIndex);
|
|
|
+
|
|
|
+ List<KfOrderVo> list = baseMapper.selectVoList(queryWrapper);
|
|
|
+ if(ObjectUtil.isNotEmpty(list)){
|
|
|
+ KfOrderVo orderVo = list.get(0);
|
|
|
+ KfOrderBo orderBo = new KfOrderBo();
|
|
|
+ orderBo.setId(orderVo.getId());
|
|
|
+ orderBo.setGuestId(bo.getId());
|
|
|
+ orderBo.setGuestName(bo.getName());
|
|
|
+ orderBo.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_RZ);
|
|
|
+ //3.删除锁房缓存,根据roomCode修改房间状态
|
|
|
+ updateOrderAndRoomStatus(orderBo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<Void> phoneCheckIn(String phone, String phoneCode) {
|
|
|
+ //1.校验验证码
|
|
|
+ if(RedisUtils.isExistsObject(SmsUtils.PHONE_CODE_PREFIX + phone)){
|
|
|
+ if(RedisUtils.getCacheObject(SmsUtils.PHONE_CODE_PREFIX + phone).equals(phoneCode)){
|
|
|
+ //2.根据手机号查询团客信息
|
|
|
+ KfGuestBo guestBo = new KfGuestBo();
|
|
|
+ guestBo.setPhone(phone);
|
|
|
+ R<KfTeamGuestVo> teamGuestVoR = getTeamGuestCheckInfo(guestBo);
|
|
|
+ if("已报到".equals(teamGuestVoR.getData().getCheckInStatus())){
|
|
|
+ return R.ok("该团客已报到");
|
|
|
+ }
|
|
|
+ //3.报到
|
|
|
+ if(teamGuestCheckIn(teamGuestVoR.getData())){
|
|
|
+ return R.ok("报到成功");
|
|
|
+ }else {
|
|
|
+ return R.fail("报到失败");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return R.fail("验证码错误");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return R.fail("验证码错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean updateOrderAndRoomStatus(KfOrderBo bo) {
|
|
|
+ if(ObjectUtil.isNotEmpty(bo)){
|
|
|
+ //更新订单
|
|
|
+ boolean flag = updateByBo(bo);
|
|
|
+ if(flag){
|
|
|
+ String roomStatus = HotelBusinessConstants.orderStatusRoomStatusMap.get(bo.getOrderStatus());
|
|
|
+ //更新房间状态
|
|
|
+ baseMapper.updateRoomStatus(bo.getRoomCode(), roomStatus);
|
|
|
+ //清除缓存
|
|
|
+ String key = CacheNames.CLASS_ROOM + "_" + bo.getTeamId();
|
|
|
+ if(RedisUtils.isExistsObject(key)){
|
|
|
+ LinkedBlockingQueue<String> concurrentLinkedQueue = RedisUtils.getCacheObject(key);
|
|
|
+ concurrentLinkedQueue.poll();
|
|
|
+ RedisUtils.setCacheObject(key, concurrentLinkedQueue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Boolean distributeOrder(KfOrderBo bo) {
|
|
|
boolean flag = false;
|
|
|
@@ -249,6 +341,60 @@ public class KfOrderServiceImpl implements IKfOrderService {
|
|
|
return flag;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 批量取消订单
|
|
|
+ * @param bo 预定和入住的订单
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public Boolean distributeForRoomStatus(List<KfOrderBo> bo) {
|
|
|
+ boolean flag = false;
|
|
|
+ if(CollectionUtil.isEmpty(bo)){
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+ // 1. 修改订单状态 只有预定和入住的可以退房
|
|
|
+ List<String> orderStatusYd = List.of(HotelBusinessConstants.ORDER_STATUS_YD, HotelBusinessConstants.ORDER_STATUS_RZ);
|
|
|
+ List<KfOrderBo> kfOrderBos = bo.stream().filter(item -> orderStatusYd.contains(item.getOrderStatus())).toList();
|
|
|
+ if(CollectionUtil.isEmpty(kfOrderBos)){
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+ List<KfOrder> convert = new ArrayList<>();
|
|
|
+ kfOrderBos.forEach(item -> {
|
|
|
+ KfOrder kfOrder = new KfOrder();
|
|
|
+ kfOrder.setId(item.getId());
|
|
|
+ if(HotelBusinessConstants.ORDER_STATUS_YD.equals(item.getOrderStatus())){
|
|
|
+ kfOrder.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_QX);
|
|
|
+ }else{
|
|
|
+ kfOrder.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_TF);
|
|
|
+ }
|
|
|
+ convert.add(kfOrder);
|
|
|
+ });
|
|
|
+
|
|
|
+ if(CollectionUtil.isEmpty(convert)){
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+ boolean b = baseMapper.updateBatchById(convert);
|
|
|
+ if(!b){
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+ // 2. 修改房间状态 updateRoomStatusBatch
|
|
|
+ List<KfOrderBo> oks = kfOrderBos.stream().filter(item -> HotelBusinessConstants.ORDER_STATUS_YD.equals(item.getOrderStatus())).toList();
|
|
|
+ //ok房
|
|
|
+ List<String> okRoomCodes = oks.stream().map(KfOrderBo::getRoomCode).toList();
|
|
|
+ if(CollectionUtil.isNotEmpty(okRoomCodes)){
|
|
|
+ int i = baseMapper.updateRoomStatusBatch(okRoomCodes, HotelRoomStatusEnum.OK.code());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<KfOrderBo> zfs = kfOrderBos.stream().filter(item -> HotelBusinessConstants.ORDER_STATUS_RZ.equals(item.getOrderStatus())).toList();
|
|
|
+ //脏房
|
|
|
+ List<String> zfRoomCodes = zfs.stream().map(KfOrderBo::getRoomCode).toList();
|
|
|
+ if(CollectionUtil.isNotEmpty(zfRoomCodes)){
|
|
|
+ int j = baseMapper.updateRoomStatusBatch(zfRoomCodes, HotelRoomStatusEnum.ZF.code());
|
|
|
+ }
|
|
|
+
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 保存前的数据校验
|
|
|
*/
|
|
|
@@ -283,6 +429,89 @@ public class KfOrderServiceImpl implements IKfOrderService {
|
|
|
return baseMapper.selectByBo(bo);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public boolean checkInTeamFromRoomStatus(KfOrderBo bo) {
|
|
|
+ // 查询 客人信息 是否有存在的订单
|
|
|
+ LambdaQueryWrapper<KfOrder> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ List<String> orderStatusYd = List.of(HotelBusinessConstants.ORDER_STATUS_YD, HotelBusinessConstants.ORDER_STATUS_RZ);
|
|
|
+ queryWrapper.in(KfOrder::getOrderStatus, orderStatusYd);
|
|
|
+ queryWrapper.and(e -> e.eq(KfOrder::getRoomCode, bo.getRoomCode()).or().eq(KfOrder::getGuestId, bo.getGuestId()));
|
|
|
+ // 已入住、已预定 不能再入住
|
|
|
+ // 房间状态是否为ok房 其他房不能入住
|
|
|
+ if(baseMapper.selectCount(queryWrapper) > 0){
|
|
|
+ throw new ServiceException("不能办理入住,原因:1.已入住或已预定,2.房间不是OK房");
|
|
|
+ }
|
|
|
+
|
|
|
+ //办理入住
|
|
|
+ bo.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_RZ); // 入住
|
|
|
+ bo.setOrderType(HotelBusinessConstants.ORDER_TYPE_TK); // 客团
|
|
|
+ RemoteOrderVo remoteOrderVo = checkInTeamByBoPrivate(bo);
|
|
|
+
|
|
|
+ return remoteOrderVo != null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public boolean changeRoom(ChangeRoomBo bo) {
|
|
|
+ List<KfOrderBo> oldOrderList = bo.getOldOrderList();
|
|
|
+ if(CollectionUtil.isEmpty(oldOrderList)){
|
|
|
+ throw new ServiceException("无原始订单信息,无需办理换房");
|
|
|
+ }
|
|
|
+ //处理原始订单信息
|
|
|
+ //1.修改订单状态为退房
|
|
|
+ List<KfOrder> oldOrders = new ArrayList<>();
|
|
|
+ for (KfOrderBo kfOrderBo : oldOrderList) {
|
|
|
+ KfOrder kfOrder = new KfOrder();
|
|
|
+ kfOrder.setId(kfOrderBo.getId());
|
|
|
+ kfOrder.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_TF);
|
|
|
+ oldOrders.add(kfOrder);
|
|
|
+ }
|
|
|
+ baseMapper.updateBatchById(oldOrders);
|
|
|
+ //2.修改房间状态为脏房
|
|
|
+ String oldRoomCode = oldOrderList.get(0).getRoomCode();
|
|
|
+ baseMapper.updateRoomStatus(oldRoomCode, HotelRoomStatusEnum.ZF.code());
|
|
|
+
|
|
|
+ //新增新订单
|
|
|
+ //1.根据原始订单进行新增订单
|
|
|
+ List<KfOrder> newOrders = new ArrayList<>();
|
|
|
+ oldOrderList.forEach(item -> {
|
|
|
+ KfOrder kfOrder = baseMapper.selectById(item.getId());
|
|
|
+ if(kfOrder != null){
|
|
|
+ KfOrder convert = MapstructUtils.convert(kfOrder, KfOrder.class);
|
|
|
+ assert convert != null;
|
|
|
+ convert.setId(null);
|
|
|
+ convert.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_RZ);
|
|
|
+ convert.setStartTime(bo.getStartTime());
|
|
|
+ convert.setEndTime(bo.getEndTime());
|
|
|
+ convert.setRoomCode(bo.getNewRoomCode());
|
|
|
+ convert.setRoomName(bo.getNewRoomCode());
|
|
|
+ String defaultRemark = "由"+oldRoomCode+"换到"+bo.getNewRoomCode();
|
|
|
+ String remark = StringUtils.isNotBlank(item.getRemark()) ? item.getRemark() + ";" + defaultRemark : defaultRemark;
|
|
|
+ convert.setRemark(remark);
|
|
|
+ newOrders.add(convert);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ baseMapper.insertBatch(newOrders);
|
|
|
+ //2.修改房间状态为入住
|
|
|
+ baseMapper.updateRoomStatus(bo.getNewRoomCode(), HotelRoomStatusEnum.YZ.code());
|
|
|
+
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新房间状态 修改房态
|
|
|
+ *
|
|
|
+ * @param bo
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean updateRoomStatus(ChangeRoomStatusBo bo) {
|
|
|
+ return baseMapper.updateRoomStatusBatch(bo.getRoomCodes(), bo.getStatus()) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 办理团客入住
|
|
|
*
|
|
|
@@ -290,9 +519,14 @@ public class KfOrderServiceImpl implements IKfOrderService {
|
|
|
* @return 入住信息
|
|
|
*/
|
|
|
@Override
|
|
|
+ @Transactional
|
|
|
public RemoteOrderVo checkInTeamByBo(RemoteOrderBo remoteBo) {
|
|
|
- List<String> orderStatusList = Arrays.asList("1", "2");
|
|
|
KfOrderBo bo = MapstructUtils.convert(remoteBo, KfOrderBo.class);
|
|
|
+ return checkInTeamByBoPrivate(bo);
|
|
|
+ }
|
|
|
+
|
|
|
+ private RemoteOrderVo checkInTeamByBoPrivate(KfOrderBo bo) {
|
|
|
+ List<String> orderStatusList = Arrays.asList("1", "2");
|
|
|
if (bo != null) {
|
|
|
KfOrderVo vo = baseMapper.selectVoOne(
|
|
|
new LambdaQueryWrapper<KfOrder>()
|