Forráskód Böngészése

feature: 学员自助
1.自助报到分房和办理入住

luo.yibo@datuai.com 1 éve
szülő
commit
5976aa31da
14 módosított fájl, 299 hozzáadás és 47 törlés
  1. 1 4
      ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/domain/bo/RemoteOrderBo.java
  2. 8 0
      ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteOrderService.java
  3. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  4. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/lock/LockBusiness.java
  5. 78 12
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/self/TraineeBusiness.java
  6. 38 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/controller/self/TraineeController.java
  7. 19 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/bo/yc/YcTraineeBo.java
  8. 13 6
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfOrderBo.java
  9. 17 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/convert/KfOrderVoConvert.java
  10. 17 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/convert/RemoteOrderBoConvert.java
  11. 17 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/convert/RemoteOrderVoConvert.java
  12. 10 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteOrderServiceImpl.java
  13. 7 1
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java
  14. 51 24
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java

+ 1 - 4
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/domain/bo/RemoteOrderBo.java

@@ -51,10 +51,7 @@ public class RemoteOrderBo implements Serializable {
     //endregion
 
     //region 客人入住信息
-    /**
-     * 客团ID
-     */
-    private Long teamId;
+
 
     /**
      * 房间编号

+ 8 - 0
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteOrderService.java

@@ -1,5 +1,6 @@
 package org.dromara.hotel.api.service;
 
+import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
 
 /**
@@ -18,4 +19,11 @@ public interface RemoteOrderService {
      * @return 客人入住信息
      */
     RemoteOrderVo selectGuestOrderByOtherId(String otherId);
+
+    /**
+     * 办理团客入住
+      * @param remoteBo 入住业务对象
+     * @return 入住信息
+     */
+    RemoteOrderVo checkInTeamByBo(RemoteOrderBo remoteBo);
 }

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -133,4 +133,8 @@ public interface CacheNames {
      * 正在进行的培训班
      */
     String DOING_CLASS = "doing_class";
+    /**
+     * 班级锁房
+     */
+    String CLASS_ROOM = "class_room";
 }

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/lock/LockBusiness.java

@@ -0,0 +1,19 @@
+package org.dromara.backstage.business.lock;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @ClassName LockBusiness
+ * @Description 门锁业务
+ * @Author luoyibo
+ * @Date 2024-11-17 16:18
+ * @Version 1.0
+ * @since jdk17
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class LockBusiness {
+}

+ 78 - 12
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/self/TraineeBusiness.java

@@ -16,18 +16,26 @@ import org.dromara.backstage.domain.vo.yc.YcTraineeVo;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.bo.PtUserAccountBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.hotel.api.domain.bo.RemoteTeamBo;
+import org.dromara.hotel.api.domain.vo.RemoteGuestVo;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+import org.dromara.hotel.api.domain.vo.RemoteTeamVo;
+import org.dromara.hotel.api.service.RemoteGuestService;
 import org.dromara.hotel.api.service.RemoteOrderService;
+import org.dromara.hotel.api.service.RemoteTeamService;
 import org.dromara.system.api.RemoteDeptService;
 import org.dromara.system.api.domain.vo.RemoteDeptVo;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
 
 /**
  * @ClassName TraineeBusiness
@@ -45,6 +53,10 @@ public class TraineeBusiness {
     private final RemoteDeptService remoteDeptService;
     @DubboReference
     private final RemoteOrderService kfOrderService;
+    @DubboReference
+    private final RemoteTeamService kfTeamService;
+    @DubboReference
+    private final RemoteGuestService kfGuestService;
 
     private final IPtUserAccountService userAccountService;
     private final IPtCardService cardService;
@@ -55,21 +67,16 @@ public class TraineeBusiness {
                                         .setCategory(bo.getCategory())
                                         .setIdNumber(bo.getIdNumber());
         YcTraineeVo traineeVo = userAccountService.selectTraineeByBo(accountBo, doingDate);
-        if(ObjectUtil.isEmpty(traineeVo)){
+        if (ObjectUtil.isEmpty(traineeVo)) {
             return R.fail("没有您的培训信息");
         }
         // 卡片信息
-        List<PtCardVo> cardVos = cardService.queryList(new PtCardBo().setUserId(Long.valueOf(traineeVo.getUserId())));
-        List<YcCardVo> ycCardVos = new ArrayList<>();
-        if (CollectionUtil.isNotEmpty(cardVos)) {
-            cardVos.parallelStream().forEach(p-> ycCardVos.add(YcVoConvert.cardVoConvert(p)));
-            traineeVo.setUserCards(ycCardVos);
-        }
+        setTraineeCardInfo(traineeVo);
         // 钱包信息
         List<PtBagVo> bagVos = bagService.queryList(new PtBagBo().setUserId(Long.valueOf(traineeVo.getUserId())));
         List<YcBagVo> ycBagVos = new ArrayList<>();
         if (CollectionUtil.isNotEmpty(bagVos)) {
-            bagVos.parallelStream().forEach(p-> ycBagVos.add(YcVoConvert.ycBagVoConvert(p)));
+            bagVos.parallelStream().forEach(p -> ycBagVos.add(YcVoConvert.ycBagVoConvert(p)));
             traineeVo.setUserBags(ycBagVos);
         }
         // 培训班级信息
@@ -77,7 +84,7 @@ public class TraineeBusiness {
         traineeVo.setUserClass(YcVoConvert.ycClassVoConvert(remoteDeptVo));
         // 入住信息
         RemoteOrderVo kfOrderVo = kfOrderService.selectGuestOrderByOtherId(traineeVo.getOtherId());
-        if(ObjectUtil.isNotEmpty(kfOrderVo)){
+        if (ObjectUtil.isNotEmpty(kfOrderVo)) {
             traineeVo.setGuesterId(kfOrderVo.getGuestId().toString());
             traineeVo.setRoomCode(kfOrderVo.getRoomCode());
             traineeVo.setRoomId(kfOrderVo.getRoomId());
@@ -88,4 +95,63 @@ public class TraineeBusiness {
     }
 
 
+    public R<ErrorInfo> registerTrainee(YcTraineeBo bo, YcTraineeVo traineeVo) {
+        Map<String,Long> map = getGuestInfo(bo);
+        // 1.如果当前人员没有住房,则安排房间
+        String roomCode = bo.getRoomCode();
+        if (ObjectUtil.isEmpty(roomCode)) {
+            // 安排房间
+            assignRoomToTrainee(bo);
+            roomCode = bo.getRoomCode();
+        }
+        if (ObjectUtil.isNotEmpty(roomCode)) {
+            // TODO 2024-11-17 luoyibo 办理住宿,获取房卡信息
+        }
+
+        // 设置其它辅助信息
+        return R.ok();
+    }
+
+    public Map<String,Long> getGuestInfo(YcTraineeBo bo) {
+        PtUserAccountVo accountVo = userAccountService.queryById(Long.valueOf(bo.getUserId()));
+        RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(Long.valueOf(bo.getDeptId()));
+        String userOtherId = accountVo.getOtherId();
+        String deptOtherId = remoteDeptVo.getOtherId();
+
+        R<RemoteGuestVo> getGuestVo = kfGuestService.selectGuestByOtherId(userOtherId);
+        RemoteTeamBo teamBo = new RemoteTeamBo().setOtherId(deptOtherId);
+        R<RemoteTeamVo> getTeamVo = kfTeamService.selectTeamByBo(teamBo);
+        Map<String, Long> map = new HashMap<>();
+        map.put("guestId", getGuestVo.getData().getId());
+        map.put("teamId", getTeamVo.getData().getId());
+        bo.setGuestId(getGuestVo.getData().getId());
+        bo.setTeamId(getTeamVo.getData().getId());
+        return map;
+    }
+
+    private void setTraineeCardInfo(YcTraineeVo traineeVo) {
+        List<PtCardVo> cardVos = cardService.queryList(new PtCardBo().setUserId(Long.valueOf(traineeVo.getUserId())));
+        List<YcCardVo> ycCardVos = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(cardVos)) {
+            cardVos.parallelStream().forEach(p -> ycCardVos.add(YcVoConvert.cardVoConvert(p)));
+            traineeVo.setUserCards(ycCardVos);
+        }
+    }
+
+    /**
+     * 给学员分配房间
+     * @param bo 报到学员业务对象
+     */
+    private void assignRoomToTrainee(YcTraineeBo bo) {
+        Long teamId = bo.getTeamId();
+        String key = CacheNames.CLASS_ROOM + "_" + teamId;
+        if (RedisUtils.getCacheObject(key)!=null) {
+            LinkedBlockingQueue<String> concurrentLinkedQueue = RedisUtils.getCacheObject(key);
+            String roomCode = concurrentLinkedQueue.poll();
+            if(ObjectUtil.isNotEmpty(roomCode)){
+                bo.setRoomCode(roomCode);
+                RedisUtils.setCacheObject(key, concurrentLinkedQueue);
+            }
+        }
+    }
 }

+ 38 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/controller/self/TraineeController.java

@@ -13,9 +13,14 @@ import org.dromara.backstage.domain.vo.yc.YcTraineeVo;
 import org.dromara.common.core.api.ResponseResult;
 import org.dromara.common.core.api.ReturnResult;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.ErrorInfo;
 import org.dromara.common.core.enums.ResultCodeEnum;
+import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.concurrent.LinkedBlockingQueue;
+
 /**
  * @ClassName TraineeController
  * @Description 学员自助控制器
@@ -89,7 +94,40 @@ public class TraineeController {
      */
     @PostMapping("/api/v1/register")
     public ReturnResult checkinTrainee(@RequestBody YcTraineeBo bo) {
+        // LinkedBlockingQueue<String> concurrentLinkedQueue = RedisUtils.getCacheObject("class_room_1857338992129335298");
+        //
+        // String roomCode = concurrentLinkedQueue.poll();
+        // if (ObjectUtil.isNotEmpty(roomCode)) {
+        //     log.info(roomCode);
+        //     RedisUtils.setCacheObject("class_room_1857338992129335298", concurrentLinkedQueue);
+        //     return ReturnResult.success(roomCode);
+        // }else {
+        //     return ReturnResult.failure(ResultCodeEnum.DATA_NOT_FOUND, "没有可安排的房间了");
+        // }
+        YcTraineeVo traineeVo = new YcTraineeVo();
+        R<ErrorInfo> result = traineeBusiness.registerTrainee(bo, traineeVo);
+        if (R.isError(result)) {
+            return ReturnResult.failure(ResultCodeEnum.INTERFACE_INNER_INVOKE_ERROR, JsonUtils.toJsonString(result.getData()));
+        }
+        return ReturnResult.success(traineeVo);
+    }
+
+    @PostMapping("/api/v1/lock/room")
+    public ReturnResult lockRoomTest() {
+        LinkedBlockingQueue<String> concurrentLinkedQueue = new LinkedBlockingQueue<>();
+        synchronized (concurrentLinkedQueue) {
+            concurrentLinkedQueue.add("A101");
+            concurrentLinkedQueue.add("A102");
+            concurrentLinkedQueue.add("A105");
+            concurrentLinkedQueue.add("A104");
+            concurrentLinkedQueue.add("A103");
+            concurrentLinkedQueue.add("A106");
+            concurrentLinkedQueue.add("A107");
+            concurrentLinkedQueue.add("A108");
+            concurrentLinkedQueue.add("A109");
 
+            RedisUtils.setCacheObject("class_room_1857338992129335298", concurrentLinkedQueue);
+        }
         return ReturnResult.success();
     }
 }

+ 19 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/domain/bo/yc/YcTraineeBo.java

@@ -32,6 +32,11 @@ public class YcTraineeBo implements Serializable {
      */
     private Date checkInDate;
 
+    /**
+     * 结束日期
+     */
+    private Date checkoutDate;
+
     /**
      * 手机号码
      */
@@ -44,4 +49,18 @@ public class YcTraineeBo implements Serializable {
      * 人员类型
      */
     private String category;
+
+    /**
+     * 房间号
+     */
+    private String roomCode;
+
+    /**
+     * 培训班Id
+     */
+    private String deptId;
+
+    private Long guestId;
+
+    private Long teamId;
 }

+ 13 - 6
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/KfOrderBo.java

@@ -26,13 +26,13 @@ public class KfOrderBo extends BaseEntity {
     /**
      * 主键
      */
-    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    @NotNull(message = "主键不能为空", groups = {EditGroup.class})
     private Long id;
 
     /**
      * 客人ID
      */
-    @NotNull(message = "客人ID不能为空", groups = { AddGroup.class })
+    @NotNull(message = "客人ID不能为空", groups = {AddGroup.class})
     private Long guestId;
 
     /**
@@ -48,7 +48,7 @@ public class KfOrderBo extends BaseEntity {
     /**
      * 房间编号
      */
-    @NotBlank(message = "房间编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotBlank(message = "房间编号不能为空", groups = {AddGroup.class, EditGroup.class})
     private String roomCode;
 
     /**
@@ -59,13 +59,13 @@ public class KfOrderBo extends BaseEntity {
     /**
      * 入住时间
      */
-    @NotNull(message = "入住时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "入住时间不能为空", groups = {AddGroup.class, EditGroup.class})
     private Date startTime;
 
     /**
      * 退住时间
      */
-    @NotNull(message = "退住时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "退住时间不能为空", groups = {AddGroup.class, EditGroup.class})
     private Date endTime;
 
     /**
@@ -93,6 +93,13 @@ public class KfOrderBo extends BaseEntity {
      * 客人原始数据ID
      */
     private String otherId;
-
+    /**
+     * 订单类型
+     */
     private String orderType;
+
+    /**
+     * 客团ID
+     */
+    private Long teamId;
 }

+ 17 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/convert/KfOrderVoConvert.java

@@ -0,0 +1,17 @@
+package org.dromara.hotel.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+import org.dromara.hotel.domain.vo.KfOrderVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 订单转换转换器
+ * @author zhujie
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface KfOrderVoConvert extends BaseMapper<KfOrderVo, RemoteOrderVo> {
+
+}

+ 17 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/convert/RemoteOrderBoConvert.java

@@ -0,0 +1,17 @@
+package org.dromara.hotel.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
+import org.dromara.hotel.domain.bo.KfOrderBo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 客房订单信息转换器
+ * @author zhujie
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteOrderBoConvert extends BaseMapper<RemoteOrderBo, KfOrderBo> {
+
+}

+ 17 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/convert/RemoteOrderVoConvert.java

@@ -0,0 +1,17 @@
+package org.dromara.hotel.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
+import org.dromara.hotel.domain.bo.KfOrderBo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 客房订单信息转换器
+ * @author zhujie
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteOrderVoConvert extends BaseMapper<RemoteOrderBo, KfOrderBo> {
+
+}

+ 10 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteOrderServiceImpl.java

@@ -2,6 +2,7 @@ package org.dromara.hotel.dubbo;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
 import org.dromara.hotel.api.service.RemoteOrderService;
 import org.dromara.hotel.domain.bo.KfOrderBo;
@@ -34,4 +35,13 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
 
         return kfOrderService.selectByBo(bo);
     }
+    /**
+     * 办理团客入住
+      * @param remoteBo 入住业务对象
+     * @return 入住信息
+     */
+    @Override
+    public RemoteOrderVo checkInTeamByBo(RemoteOrderBo remoteBo) {
+        return null;
+    }
 }

+ 7 - 1
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java

@@ -2,6 +2,7 @@ package org.dromara.hotel.service;
 
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
 import org.dromara.hotel.domain.bo.KfOrderBo;
 import org.dromara.hotel.domain.vo.KfOrderVo;
@@ -79,5 +80,10 @@ public interface IKfOrderService {
      * @return 订单信息
      */
     RemoteOrderVo selectByBo(KfOrderBo bo);
-
+    /**
+     * 办理团客入住
+      * @param remoteBo 入住业务对象
+     * @return 入住信息
+     */
+    RemoteOrderVo checkInTeamByBo(RemoteOrderBo remoteBo);
 }

+ 51 - 24
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java

@@ -1,18 +1,18 @@
 package org.dromara.hotel.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 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.apache.dubbo.config.annotation.DubboReference;
-import org.dromara.backstage.api.RemotePtRoomService;
 import org.dromara.common.core.constant.HotelBusinessConstants;
 import org.dromara.common.core.enums.HotelRoomStatusEnum;
 import org.dromara.common.core.utils.MapstructUtils;
 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.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.KfOrderBo;
@@ -44,7 +44,7 @@ public class KfOrderServiceImpl implements IKfOrderService {
      * @return 散客入住
      */
     @Override
-    public KfOrderVo queryById(Long id){
+    public KfOrderVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -91,26 +91,26 @@ public class KfOrderServiceImpl implements IKfOrderService {
         lqw.like(StringUtils.isNotBlank(bo.getTeamName()), KfOrder::getTeamName, bo.getTeamName());
         lqw.like(StringUtils.isNotBlank(bo.getRoomName()), KfOrder::getRoomName, bo.getRoomName());
         lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null,
-            KfOrder::getStartTime ,params.get("beginStartTime"), params.get("endStartTime"));
-        if(StringUtils.isNotBlank(bo.getOrderStatus())){
+                    KfOrder::getStartTime, params.get("beginStartTime"), params.get("endStartTime"));
+        if (StringUtils.isNotBlank(bo.getOrderStatus())) {
             lqw.in(KfOrder::getOrderStatus, bo.getOrderStatus().split(","));
         }
         return lqw;
     }
 
-    private QueryWrapper<KfOrder> buildQueryWrapper(KfOrderBo bo,String tableAlias) {
+    private QueryWrapper<KfOrder> buildQueryWrapper(KfOrderBo bo, String tableAlias) {
         QueryWrapper<KfOrder> lqw = new QueryWrapper<>();
         Map<String, Object> params = bo.getParams();
         String columnPrefix = "";
-        if(StringUtils.isNotBlank(tableAlias)){
+        if (StringUtils.isNotBlank(tableAlias)) {
             columnPrefix = tableAlias + ".";
         }
-        lqw.like(StringUtils.isNotBlank(bo.getGuestName()), columnPrefix+"guest_name", bo.getGuestName());
-        lqw.like(StringUtils.isNotBlank(bo.getTeamName()), columnPrefix+"team_name", bo.getTeamName());
-        lqw.like(StringUtils.isNotBlank(bo.getRoomName()), columnPrefix+"room_name", bo.getRoomName());
+        lqw.like(StringUtils.isNotBlank(bo.getGuestName()), columnPrefix + "guest_name", bo.getGuestName());
+        lqw.like(StringUtils.isNotBlank(bo.getTeamName()), columnPrefix + "team_name", bo.getTeamName());
+        lqw.like(StringUtils.isNotBlank(bo.getRoomName()), columnPrefix + "room_name", bo.getRoomName());
         lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null,
-        columnPrefix+"start_time" ,params.get("beginStartTime"), params.get("endStartTime"));
-        lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), columnPrefix+"order_status", bo.getOrderStatus());
+                    columnPrefix + "start_time", params.get("beginStartTime"), params.get("endStartTime"));
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), columnPrefix + "order_status", bo.getOrderStatus());
         return lqw;
     }
 
@@ -128,10 +128,10 @@ public class KfOrderServiceImpl implements IKfOrderService {
         if (flag) {
             bo.setId(add.getId());
             String roomStatus = "";
-            //修改房间状态
-            if(HotelBusinessConstants.ORDER_STATUS_YD.equals(add.getOrderStatus())){
+            // 修改房间状态
+            if (HotelBusinessConstants.ORDER_STATUS_YD.equals(add.getOrderStatus())) {
                 roomStatus = HotelRoomStatusEnum.YD.code();
-            }else if(HotelBusinessConstants.ORDER_STATUS_RZ.equals(add.getOrderStatus())){
+            } else if (HotelBusinessConstants.ORDER_STATUS_RZ.equals(add.getOrderStatus())) {
                 roomStatus = HotelRoomStatusEnum.YZ.code();
             }
             baseMapper.updateRoomStatus(add.getRoomCode(), roomStatus);
@@ -156,14 +156,14 @@ public class KfOrderServiceImpl implements IKfOrderService {
     public Boolean distributeOrder(KfOrderBo bo) {
         boolean flag = false;
         String roomStatus = "";
-        if(bo != null){
-            //1. 修改订单状态
+        if (bo != null) {
+            // 1. 修改订单状态
             flag = updateByBo(bo);
 
-            //2. 修改房间状态
-            if(HotelBusinessConstants.ORDER_STATUS_QX.equals(bo.getOrderStatus())){
+            // 2. 修改房间状态
+            if (HotelBusinessConstants.ORDER_STATUS_QX.equals(bo.getOrderStatus())) {
                 roomStatus = HotelRoomStatusEnum.OK.code();
-            }else if(HotelBusinessConstants.ORDER_STATUS_TF.equals(bo.getOrderStatus())){
+            } else if (HotelBusinessConstants.ORDER_STATUS_TF.equals(bo.getOrderStatus())) {
                 roomStatus = HotelRoomStatusEnum.ZF.code();
             }
             int res = baseMapper.updateRoomStatus(bo.getRoomCode(), roomStatus);
@@ -175,8 +175,8 @@ public class KfOrderServiceImpl implements IKfOrderService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(KfOrder entity){
-        //TODO 做一些数据校验,如唯一约束
+    private void validEntityBeforeSave(KfOrder entity) {
+        // TODO 做一些数据校验,如唯一约束
     }
 
     /**
@@ -188,8 +188,8 @@ public class KfOrderServiceImpl implements IKfOrderService {
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 做一些业务上的校验,判断是否需要校验
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
@@ -197,6 +197,7 @@ public class KfOrderServiceImpl implements IKfOrderService {
     /**
      * 根据订单业务对象查询指定的入住信息
      * 只查询入住状态为预订或入住的数据
+     *
      * @param bo 订单业务对象
      * @return 订单信息
      */
@@ -204,4 +205,30 @@ public class KfOrderServiceImpl implements IKfOrderService {
     public RemoteOrderVo selectByBo(KfOrderBo bo) {
         return baseMapper.selectByBo(bo);
     }
+
+    /**
+     * 办理团客入住
+     *
+     * @param remoteBo 入住业务对象
+     * @return 入住信息
+     */
+    @Override
+    public RemoteOrderVo checkInTeamByBo(RemoteOrderBo remoteBo) {
+        KfOrderBo bo = MapstructUtils.convert(remoteBo, KfOrderBo.class);
+        if (bo != null) {
+            KfOrderVo vo = baseMapper.selectVoOne(
+                new LambdaQueryWrapper<KfOrder>().eq(KfOrder::getGuestId, bo.getGuestId())
+                    .eq(KfOrder::getTeamId, bo.getTeamId())
+                    .eq(KfOrder::getRoomCode, bo.getRoomCode()));
+            if (ObjectUtil.isNotEmpty(vo)) {
+                bo.setId(vo.getId());
+                this.updateByBo(bo);
+;            } else {
+                this.insertByBo(bo);
+            }
+            vo = this.queryById(bo.getId());
+            return MapstructUtils.convert(vo, RemoteOrderVo.class);
+        }
+        return null;
+    }
 }