Ver Fonte

Merge remote-tracking branch 'origin/master'

luoyb há 1 ano atrás
pai
commit
74aa8ae812
27 ficheiros alterados com 1074 adições e 30 exclusões
  1. 5 0
      ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/domain/vo/RemoteOrderVo.java
  2. 23 1
      ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteOrderService.java
  3. 51 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtAreaController.java
  4. 11 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomController.java
  5. 3 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomTypeController.java
  6. 4 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtAreaBo.java
  7. 38 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/QueryFloorDataBo.java
  8. 36 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/QueryFloorRoomBo.java
  9. 37 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/FloorDataVo.java
  10. 37 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/FloorRoomsVo.java
  11. 16 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtAreaVo.java
  12. 10 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtRoomTypeVo.java
  13. 24 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtAreaService.java
  14. 13 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtRoomService.java
  15. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtRoomTypeService.java
  16. 381 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtAreaServiceImpl.java
  17. 50 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomServiceImpl.java
  18. 64 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomTypeServiceImpl.java
  19. 0 4
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/basics/room/PtRoomMapper.xml
  20. 21 1
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfOrderController.java
  21. 2 1
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfOrderVo.java
  22. 26 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/OrderAndGuestVo.java
  23. 36 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/dubbo/RemoteOrderServiceImpl.java
  24. 13 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfOrderMapper.java
  25. 19 0
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java
  26. 78 4
      ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java
  27. 70 12
      ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/business/KfOrderMapper.xml

+ 5 - 0
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/domain/vo/RemoteOrderVo.java

@@ -59,6 +59,11 @@ public class RemoteOrderVo implements Serializable {
      */
     private Long teamId;
 
+    /**
+     * 客团名称
+     */
+    private String teamName;
+
     /**
      * 房间编号
      */

+ 23 - 1
ruoyi-api/ruoyi-api-hotel/src/main/java/org/dromara/hotel/api/service/RemoteOrderService.java

@@ -35,5 +35,27 @@ public interface RemoteOrderService {
      * @param teamId 团客Id
      * @return 锁房列表
      */
-    List<RemoteOrderVo> selectTeamRoom(Long teamId);
+    List<RemoteOrderVo> selectTeamRoom(Long otherId);
+
+    /**
+     * 根据订单 状态查询当前订单列表
+     * @param orderStatus 订单状态表
+     * @return
+     */
+    List<RemoteOrderVo> selectCurrentAllOrder(List<String> orderStatus);
+
+
+    /**
+     * 根据 客户姓名或手机号 查询当前订单列表
+     * @param nameOrPhone 客户姓名或手机号
+     * @return
+     */
+    List<RemoteOrderVo> getOrderAndGuestByNameOrPhone(String nameOrPhone);
+
+    /**
+     * 根据房间号查询订单和客户数据
+     * @param roomCode 房间号
+     *
+     */
+    List<RemoteOrderVo> getOrderAndGuestByRoomCodes(List<String> roomCode);
 }

+ 51 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtAreaController.java

@@ -6,6 +6,11 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import oracle.jdbc.proxy.annotation.Post;
+import org.dromara.backstage.basics.domain.bo.QueryFloorDataBo;
+import org.dromara.backstage.basics.domain.bo.QueryFloorRoomBo;
+import org.dromara.backstage.basics.domain.vo.FloorDataVo;
+import org.dromara.backstage.basics.domain.vo.FloorRoomsVo;
 import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -48,6 +53,29 @@ public class PtAreaController extends BaseController {
         return R.ok(list);
     }
 
+    /**
+     * 查询非楼层的区域列表
+     * @param
+     * @return
+     */
+    @GetMapping("/listNoLC")
+    public R<List<PtAreaVo>> listNoLC() {
+        List<PtAreaVo> list = ptAreaService.queryListNoLC();
+        return R.ok(list);
+    }
+
+    /**
+     * 查询楼层列表
+     * @param bo
+     * @return
+     */
+    @PostMapping("/getByLD")
+    public R<List<PtAreaVo>> getByLD(@RequestBody List<PtAreaBo> bo) {
+        return R.ok(ptAreaService.queryByLDList(bo));
+    }
+
+
+
     /**
      * 导出建筑物区域列表
      */
@@ -108,4 +136,27 @@ public class PtAreaController extends BaseController {
                           @PathVariable Long[] areaIds) {
         return toAjax(ptAreaService.deleteWithValidByIds(List.of(areaIds), true));
     }
+
+
+    /**
+     * 获取房态数据
+     * @param param
+     * @return
+     */
+    @PostMapping("/getRoomStatusByParams")
+    public R<List<FloorDataVo>> getRoomStatusByParams(@RequestBody QueryFloorDataBo param) {
+        return R.ok(ptAreaService.getRoomStatusByParams(param));
+    }
+
+    /**
+     * 获取楼层下的房间数据 用于 房态页面显示
+     * @param param
+     * @return
+     */
+    @PostMapping("/getRoomOrderData")
+    public R<List<FloorRoomsVo>> getRoomOrderData(@RequestBody QueryFloorRoomBo param) {
+        return R.ok(ptAreaService.getRoomOrderData(param));
+    }
+
+
 }

+ 11 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomController.java

@@ -14,6 +14,7 @@ import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.vo.PtRoomTempImportVo;
 import org.dromara.backstage.basics.listener.PtRoomImportListener;
 import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.system.api.RemoteDictService;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -167,4 +168,14 @@ public class PtRoomController extends BaseController {
                           @PathVariable Long[] roomIds) {
         return toAjax(ptRoomService.deleteWithValidByIds(List.of(roomIds), true));
     }
+
+
+    /**
+     * 查询所有房间状态的房间数量
+     * @return
+     */
+    @GetMapping("/getCountByStatus")
+    public R<Map<String, Long>> getCountByStatus() {
+        return R.ok(ptRoomService.getCountByStatus());
+    }
 }

+ 3 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomTypeController.java

@@ -48,8 +48,8 @@ public class PtRoomTypeController extends BaseController {
 
 //    @SaCheckPermission("roomType:ptRoomType:list")
     @GetMapping("/all")
-    public R<List<PtRoomTypeVo>> all(PtRoomTypeBo bo) {
-        return R.ok(ptRoomTypeService.queryList(bo));
+    public R<List<PtRoomTypeVo>> all() {
+        return R.ok(ptRoomTypeService.queryAllCount());
     }
 
     /**
@@ -109,4 +109,5 @@ public class PtRoomTypeController extends BaseController {
                           @PathVariable Long[] roomTypeIds) {
         return toAjax(ptRoomTypeService.deleteWithValidByIds(List.of(roomTypeIds), true));
     }
+
 }

+ 4 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtAreaBo.java

@@ -10,6 +10,8 @@ import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 import org.dromara.common.tenant.core.TenantEntity;
 
+import java.io.Serial;
+
 /**
  * 建筑物区域业务对象 t_pt_area
  *
@@ -21,6 +23,8 @@ import org.dromara.common.tenant.core.TenantEntity;
 @AutoMapper(target = PtArea.class, reverseConvertGenerate = false)
 public class PtAreaBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = 5337823460010487012L;
     /**
      * 区域Id,主键
      */

+ 38 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/QueryFloorDataBo.java

@@ -0,0 +1,38 @@
+package org.dromara.backstage.basics.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.backstage.basics.domain.PtArea;
+import org.dromara.backstage.basics.domain.vo.PtAreaVo;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 查询 楼栋 相关数据 的参数类
+ *
+ * @author bing
+ * @date 2024-11-20
+ */
+@Data
+public class QueryFloorDataBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2718754998805220599L;
+
+
+    private String multiParams; // 姓名、手机号、房间号  优先级最高
+    private List<String> roomStatus; // 房态
+    private List<Long> roomTypes; // 房型
+    private List<PtAreaVo> areaLDs; // 区域楼栋
+    private List<Long> finallyFloors; // 最终需要查询的楼层
+
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/QueryFloorRoomBo.java

@@ -0,0 +1,36 @@
+package org.dromara.backstage.basics.domain.bo;
+
+import lombok.Data;
+import org.dromara.backstage.basics.domain.vo.FloorDataVo;
+import org.dromara.backstage.basics.domain.vo.PtAreaVo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 查询 楼层房间 相关数据 的参数类
+ *
+ * @author bing
+ * @date 2024-11-20
+ */
+@Data
+public class QueryFloorRoomBo implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = 806097946041122764L;
+
+    //楼层房栋数据
+    private FloorDataVo floor;
+
+    //楼层id
+    private Long floorId;
+
+    //其他参数
+    private String multiParams; // 姓名、手机号、房间号  优先级最高
+    private List<String> roomStatus; // 房态
+    private List<Long> roomTypes; // 房型
+
+
+}

+ 37 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/FloorDataVo.java

@@ -0,0 +1,37 @@
+package org.dromara.backstage.basics.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 查询 楼栋 相关数据 的返回类
+ *
+ * @author bing
+ * @date 2024-11-20
+ */
+@Data
+public class FloorDataVo implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = 8363558861505718778L;
+
+    // 校区数据
+    private PtAreaVo campus;
+
+    // 楼栋数据
+    private PtAreaVo building;
+
+    // 楼层数据
+    private PtAreaVo floor;
+
+    // 总间数
+    private Long allCount;
+
+    // 可用间数
+    private Long freeCount;
+
+}

+ 37 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/FloorRoomsVo.java

@@ -0,0 +1,37 @@
+package org.dromara.backstage.basics.domain.vo;
+
+import lombok.Data;
+import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 查询 楼层 相关房间数据 的返回类
+ *
+ * @author bing
+ * @date 2024-11-20
+ */
+@Data
+public class FloorRoomsVo implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = -2288776333667315588L;
+
+    //楼层房栋数据
+    private FloorDataVo floor;
+
+    //房间数据
+    private PtRoomVo room;
+
+    //房型数据
+    private PtRoomTypeVo  roomType;
+
+    //订单数据
+    List<RemoteOrderVo> orderList;
+
+
+
+}

+ 16 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtAreaVo.java

@@ -11,7 +11,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
-
+import java.util.List;
 
 
 /**
@@ -71,5 +71,20 @@ public class PtAreaVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    /**
+     * 楼层
+     */
+    private List<PtAreaVo> children;
+
+    /**
+     * 此类 房型 总数
+     */
+    private Long allCount;
+
+    /**
+     * 此类房型 可用数
+     */
+    private Long freeCount;
+
 
 }

+ 10 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtRoomTypeVo.java

@@ -58,5 +58,15 @@ public class PtRoomTypeVo implements Serializable {
     @ExcelProperty(value = "可入住人数")
     private Long capacityNumber;
 
+    /**
+     * 此类 房型 总数
+     */
+    private Long allCount;
+
+    /**
+     * 此类房型 可用数
+     */
+    private Long freeCount;
+
 
 }

+ 24 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtAreaService.java

@@ -1,6 +1,9 @@
 package org.dromara.backstage.basics.service;
 
-import org.dromara.backstage.basics.domain.PtArea;
+import org.dromara.backstage.basics.domain.bo.QueryFloorDataBo;
+import org.dromara.backstage.basics.domain.bo.QueryFloorRoomBo;
+import org.dromara.backstage.basics.domain.vo.FloorDataVo;
+import org.dromara.backstage.basics.domain.vo.FloorRoomsVo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.bo.PtAreaBo;
 
@@ -32,6 +35,8 @@ public interface IPtAreaService {
      * @return 建筑物区域列表
      */
     List<PtAreaVo> queryList(PtAreaBo bo);
+    List<PtAreaVo> queryListNoLC();
+    List<PtAreaVo> queryByLDList(List<PtAreaBo> dataList);
 
     List<PtAreaVo> queryListLD(Long areaId);
 
@@ -61,4 +66,22 @@ public interface IPtAreaService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据条件查询 房间状态 数据
+     *
+     * @param param 参数
+     * @return 房态数据
+     */
+    List<FloorDataVo> getRoomStatusByParams(QueryFloorDataBo param);
+
+    /**
+     * 根据楼层查询房间订单数据 用于房态
+     * @param param 楼层等参数
+     * @return 房间订单数据
+     */
+    List<FloorRoomsVo> getRoomOrderData(QueryFloorRoomBo param);
+
+
+
 }

+ 13 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtRoomService.java

@@ -48,6 +48,13 @@ public interface IPtRoomService {
      */
     List<PtRoomVo> queryList(PtRoomBo bo);
 
+    /**
+     * 查询房间 客房  简单查询
+     * @param bo
+     * @return
+     */
+    List<PtRoomVo> selectList(PtRoomBo bo);
+
     /**
      * 查询房间信息并转换成区域信息
      * @param bo 房间定义
@@ -85,4 +92,10 @@ public interface IPtRoomService {
     List<PtRoomVo> queryByNameOrCode(Long areaId, String roomName, String roomCode);
 
     Long count(Collection<Long> ids);
+
+    /**
+     * 查询所有房间状态的房间数量
+     * @return
+     */
+    Map<String, Long> getCountByStatus();
 }

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtRoomTypeService.java

@@ -42,6 +42,12 @@ public interface IPtRoomTypeService {
      */
     List<PtRoomTypeVo> queryList(PtRoomTypeBo bo);
 
+    /**
+     * 查询所有房型的 总数量 可用数量
+     * @return
+     */
+    List<PtRoomTypeVo> queryAllCount();
+
     /**
      * 新增房型管理
      *

+ 381 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtAreaServiceImpl.java

@@ -1,25 +1,40 @@
 package org.dromara.backstage.basics.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.map.MapUtil;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.basics.domain.PtRoom;
+import org.dromara.backstage.basics.domain.PtRoomType;
+import org.dromara.backstage.basics.domain.bo.PtRoomTypeBo;
+import org.dromara.backstage.basics.domain.bo.QueryFloorDataBo;
+import org.dromara.backstage.basics.domain.bo.QueryFloorRoomBo;
+import org.dromara.backstage.basics.domain.vo.*;
 import org.dromara.backstage.basics.mapper.PtRoomMapper;
+import org.dromara.backstage.basics.mapper.PtRoomTypeMapper;
+import org.dromara.backstage.basics.service.IPtRoomTypeService;
 import org.dromara.common.core.enums.BuildAreaTypeEnum;
+import org.dromara.common.core.enums.FJLXEnum;
+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.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+import org.dromara.hotel.api.service.RemoteOrderService;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.bo.PtAreaBo;
-import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.PtArea;
 import org.dromara.backstage.basics.mapper.PtAreaMapper;
 import org.dromara.backstage.basics.service.IPtAreaService;
 
+import java.text.Collator;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 建筑物区域Service业务层处理
@@ -35,6 +50,11 @@ public class PtAreaServiceImpl implements IPtAreaService {
 
     private final PtRoomMapper ptRoomMapper;
 
+    private final PtRoomTypeMapper roomTypeMapper;
+
+    @DubboReference
+    private RemoteOrderService remoteOrderService;
+
     /**
      * 查询建筑物区域
      *
@@ -59,8 +79,78 @@ public class PtAreaServiceImpl implements IPtAreaService {
         return baseMapper.selectVoList(lqw);
     }
 
+    @Override
+    public List<PtAreaVo> queryListNoLC() {
+//        lqw.notIn(PtArea::getAreaType, BuildAreaTypeEnum.LC.code());
+
+        List<PtAreaVo> ptAreaVos = baseMapper.selectVoList();
+
+        List<PtAreaVo> rs = ptAreaVos.stream().filter(ptAreaVo -> !ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.LC.code())).toList();
+
+        //楼层
+        //根据 楼层 查 类型为客房的房间  然后再 统计 房间总数量 和 ok房的数量  学校与校区的数量交给前端计算
+        List<Long> floorIds = ptAreaVos.stream().filter(ptAreaVo -> ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.LC.code())).map(PtAreaVo::getAreaId).toList();
+        List<PtAreaVo> lcs = ptAreaVos.stream().filter(ptAreaVo -> ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.LC.code())).toList();
+
+        // 客房房间
+        List<PtRoomVo> guestRooms = ptRoomMapper.selectVoList(Wrappers.lambdaQuery(PtRoom.class).eq(PtRoom::getRoomType, FJLXEnum.KF.code()).in(PtRoom::getAreaId, floorIds));
+
+//        System.err.println(guestRooms.stream().filter(e -> e.getRoomId() == 101).collect(Collectors.toList()));
+
+        lcs.forEach(ptAreaVo -> {
+            ptAreaVo.setAllCount(guestRooms.stream().filter(ptRoomVo -> ptRoomVo.getAreaId().equals(ptAreaVo.getAreaId())).count());
+            ptAreaVo.setFreeCount(guestRooms.stream()
+                .filter(ptRoomVo -> ptRoomVo.getAreaId().equals(ptAreaVo.getAreaId()))
+                .filter(ptRoomVo -> HotelRoomStatusEnum.OK.code().equals(ptRoomVo.getStatus())).count());
+        });
+
+        // 楼栋
+        List<PtAreaVo> lds = rs.stream().filter(ptAreaVo -> ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.LD.code())).toList();
+
+        setCount(lcs, lds);
+
+        // 只输出 有客房的 校区 和 楼栋
+        // 过滤 掉无客房的楼栋
+        List<PtAreaVo> vos = rs.stream().filter(ptAreaVo -> !BuildAreaTypeEnum.LD.code().equals(ptAreaVo.getAreaType()) || ptAreaVo.getAllCount() > 0).toList();
+
+        // 还要过滤 掉 无客房的校区
+        // 校区
+        List<PtAreaVo> xqs = vos.stream().filter(ptAreaVo -> ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.XQ.code())).toList();
+        // 排除 没有 子节点的 校区
+        List<PtAreaVo> result = vos.stream().filter(ptAreaVo -> {
+            if (ptAreaVo.getAreaType().equals(BuildAreaTypeEnum.XQ.code())) {
+                return vos.stream().anyMatch(ptAreaVo1 -> ptAreaVo1.getParentId().equals(ptAreaVo.getAreaId()));
+            } else {
+                return true;
+            }
+        }).toList();
+        // 统计校区
+        List<PtAreaVo> capList = result.stream().filter(ptAreaVo -> BuildAreaTypeEnum.XQ.code().equals(ptAreaVo.getAreaType())).toList();
+        setCount(result, capList);
+
+        // 学校
+        List<PtAreaVo> schoolList = result.stream().filter(ptAreaVo -> BuildAreaTypeEnum.XX.code().equals(ptAreaVo.getAreaType())).toList();
+        setCount(result, schoolList);
+
+        return result;
+    }
+
     /**
-     * 查询楼层
+     * 统计某一类型的 房间总数和可用数量
+     * @param allList 所有数据
+     * @param setList 某一类型且需要统计的数据
+     */
+    private void setCount(List<PtAreaVo> allList, List<PtAreaVo> setList) {
+        setList.forEach(ptAreaVo -> {
+            List<PtAreaVo> list = allList.stream().filter(ptAreaVo1 -> ptAreaVo1.getParentId().equals(ptAreaVo.getAreaId())).toList();
+            ptAreaVo.setAllCount(list.stream().map(PtAreaVo::getAllCount).reduce(Long::sum).orElse(0L));
+            ptAreaVo.setFreeCount(list.stream().map(PtAreaVo::getFreeCount).reduce(Long::sum).orElse(0L));
+
+        });
+    }
+
+    /**
+     * 根据楼栋id查询楼层
      * @param areaId
      * @return
      */
@@ -78,6 +168,24 @@ public class PtAreaServiceImpl implements IPtAreaService {
         return baseMapper.selectVoList(lqw);
     }
 
+    /**
+     * 根据楼栋数据查询楼层
+     * @param dataList  楼栋数据
+     * @return
+     */
+    public List<PtAreaVo> queryByLDList(List<PtAreaBo> dataList) {
+        if(dataList==null||dataList.isEmpty()) return ListUtil.empty();
+        LambdaQueryWrapper<PtArea> lqw = Wrappers.lambdaQuery();
+        lqw.eq(PtArea::getAreaType, BuildAreaTypeEnum.LC.code());
+        lqw.in(PtArea::getParentId, dataList.stream().map(PtAreaBo::getAreaId).collect(Collectors.toList()));
+        List<PtAreaVo> allFloors = baseMapper.selectVoList(lqw);
+        List<PtAreaVo> rs = BeanUtil.copyToList(dataList, PtAreaVo.class);
+        rs.forEach(ptAreaVo -> {
+            ptAreaVo.setChildren(allFloors.stream().filter(e->e.getParentId().equals(ptAreaVo.getAreaId())).collect(Collectors.toList()));
+        });
+        return rs;
+    }
+
     @Override
     public Map<Long, PtAreaVo> queryMapByIds(List<Long> ids) {
         List<PtArea> ptAreas = baseMapper.selectBatchIds(ids);
@@ -205,4 +313,275 @@ public class PtAreaServiceImpl implements IPtAreaService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 根据条件查询 房间状态 数据
+     *
+     * @param param 参数
+     * @return 房态数据
+     */
+    @Override
+    public List<FloorDataVo> getRoomStatusByParams(QueryFloorDataBo param) {
+        List<FloorDataVo> rs = new ArrayList<>();
+//        校区-楼栋-楼层-房间
+//        根据 房态-房型-区域-房间号 查询数据,查完之后 在查订单里的名字/手机号
+        //如果有参数 multiParams
+        if(StringUtils.isNotBlank(param.getMultiParams())) {
+            // 1.优先查询 姓名/手机号/房间号
+            // 先查询 房间号
+            LambdaQueryWrapper<PtRoom> roomWrapper = Wrappers.lambdaQuery();
+            roomWrapper.eq(PtRoom::getRoomCode, param.getMultiParams());
+            List<PtRoomVo> ptRoomVos = ptRoomMapper.selectVoList(roomWrapper);
+
+            if(CollectionUtil.isNotEmpty(ptRoomVos)){
+                //房间编码是唯一的
+                PtRoomVo ptRoomVo = ptRoomVos.get(0);
+                PtAreaVo floor = baseMapper.selectVoById(ptRoomVo.getAreaId());
+
+                FloorDataVo floorDataVo = new FloorDataVo();
+                //楼层
+                floorDataVo.setFloor(floor);
+                floorDataVo.setAllCount(1L);
+                floorDataVo.setFreeCount(HotelRoomStatusEnum.OK.code().equals(ptRoomVo.getStatus())? 0L: 1L);
+                //楼栋
+                PtAreaVo building = baseMapper.selectVoById(floor.getParentId());
+                floorDataVo.setBuilding(building);
+                //校区
+                PtAreaVo campus = baseMapper.selectVoById(building.getParentId());
+                floorDataVo.setCampus(campus);
+                rs.add(floorDataVo);
+            }else{
+                // 2.如果房间号没有查询到,则查询姓名/手机号 查询客房系统的订单和客户信息
+                List<RemoteOrderVo> orders = remoteOrderService.getOrderAndGuestByNameOrPhone(param.getMultiParams());
+                if(CollectionUtil.isNotEmpty(orders)){
+                    // 查询房间
+                    LambdaQueryWrapper<PtRoom> queryWrapper = Wrappers.lambdaQuery();
+                    queryWrapper.in(PtRoom::getRoomCode, orders.stream().map(RemoteOrderVo::getRoomCode).toList());
+                    List<PtRoomVo> roomVos = ptRoomMapper.selectVoList(queryWrapper);
+
+                    FloorDataVo floorDataVo = new FloorDataVo();
+                    /*String s = Integer.toString(orders.size());
+                    floorDataVo.setAllCount(Long.valueOf(s));
+                    floorDataVo.setFreeCount(roomVos.stream().filter(ptRoomVo -> HotelRoomStatusEnum.OK.code().equals(ptRoomVo.getStatus())).count());*/
+
+                    //查询楼层 floor
+                    List<Long> floorIds = roomVos.stream().map(PtRoomVo::getAreaId).toList();
+                    List<PtAreaVo> floors = baseMapper.selectVoList(Wrappers.<PtArea>lambdaQuery().in(PtArea::getAreaId, floorIds));
+
+                    LambdaQueryWrapper<PtArea> query = Wrappers.lambdaQuery();
+                    query.in(PtArea::getAreaType, List.of(BuildAreaTypeEnum.XQ.code(), BuildAreaTypeEnum.LD.code()));
+                    List<PtAreaVo> parentAreas = baseMapper.selectVoList(query);
+
+                    for (PtAreaVo floor : floors) {
+                        FloorDataVo floorData = new FloorDataVo();
+                        floorData.setFloor(floor);
+                        List<PtRoomVo> floorRooms = roomVos.stream().filter(ptRoomVo -> floor.getAreaId().equals(ptRoomVo.getAreaId())).toList();
+                        floorData.setAllCount(Long.valueOf(Integer.toString(floorRooms.size())));
+                        floorData.setFreeCount(floorRooms.stream().filter(ptRoomVo -> HotelRoomStatusEnum.OK.code().equals(ptRoomVo.getStatus())).count());
+                        //楼栋
+                        floorData.setBuilding(parentAreas.stream().filter(ptAreaVo -> ptAreaVo.getAreaId().equals(floor.getParentId())).findFirst().orElse(new PtAreaVo()));
+
+                        // 校区
+                        floorData.setCampus(parentAreas.stream().filter(ptAreaVo -> ptAreaVo.getAreaId().equals(floorData.getBuilding().getParentId())).findFirst().orElse(new PtAreaVo()));
+                        rs.add(floorData);
+                    }
+                }
+            }
+
+        }else{
+            // 如果 没有 参数 multiParams
+            // 1.先查询楼层
+            List<PtAreaVo> floors = new ArrayList<>();
+            if(CollectionUtil.isNotEmpty(param.getFinallyFloors())){
+                // a.先查询楼层 如果 finallyFloors 不为空就不查询了
+                List<PtArea> ptAreas = baseMapper.selectBatchIds(param.getFinallyFloors());
+                floors = MapstructUtils.convert(ptAreas, PtAreaVo.class);
+
+            }else if(CollectionUtil.isNotEmpty(param.getAreaLDs())){
+                // b.查询楼栋下的楼层
+                List<Long> longs = param.getAreaLDs().stream().map(PtAreaVo::getAreaId).toList();
+                LambdaQueryWrapper<PtArea> query = Wrappers.lambdaQuery();
+                query.in(PtArea::getParentId, longs);
+                floors = baseMapper.selectVoList(query);
+            }else{
+                // 查询所有楼层
+                LambdaQueryWrapper<PtArea> query = Wrappers.lambdaQuery();
+                query.eq(PtArea::getAreaType, BuildAreaTypeEnum.LC.code());
+                floors = baseMapper.selectVoList(query);
+            }
+
+            if(CollectionUtil.isEmpty(floors)){
+                return rs;
+            }
+            List<Long> floorIds = floors.stream().map(PtAreaVo::getAreaId).toList();
+            // 根据楼层查询所有房间
+            List<PtRoomVo> guestRooms = ptRoomMapper.selectVoList(Wrappers.lambdaQuery(PtRoom.class)
+                // 客房
+                .eq(PtRoom::getRoomType, FJLXEnum.KF.code())
+                //楼层
+                .in(PtRoom::getAreaId, floorIds)
+                // 2.查询 房态
+                .in(CollectionUtil.isNotEmpty(param.getRoomStatus()),PtRoom::getStatus, param.getRoomStatus())
+                // 3.查询 房型
+                .in(CollectionUtil.isNotEmpty(param.getRoomTypes()),PtRoom::getGuestRoomType, param.getRoomTypes())
+            );
+
+            if(CollectionUtil.isEmpty(guestRooms)){
+                return rs;
+            }
+
+            LambdaQueryWrapper<PtArea> query = Wrappers.lambdaQuery();
+            query.in(PtArea::getAreaType, List.of(BuildAreaTypeEnum.XQ.code(), BuildAreaTypeEnum.LD.code()));
+            List<PtAreaVo> parentAreas = baseMapper.selectVoList(query);
+            //组装数据
+            for (PtAreaVo floor : floors) {
+                FloorDataVo floorDataVo = new FloorDataVo();
+                floorDataVo.setFloor(floor);
+                List<PtRoomVo> rooms = guestRooms.stream().filter(guestRoom -> guestRoom.getAreaId().equals(floor.getAreaId())).toList();
+                int size = rooms.size();
+                String s = Integer.toString(size);
+                floorDataVo.setAllCount(Long.valueOf(s));
+                long count = rooms.stream().filter(ptRoomVo -> HotelRoomStatusEnum.OK.code().equals(ptRoomVo.getStatus())).count();
+                floorDataVo.setFreeCount(count);
+
+                if(CollectionUtil.isNotEmpty(parentAreas)){
+                   // 设置 楼栋
+                    parentAreas.stream().filter(ptAreaVo -> ptAreaVo.getAreaId().equals(floor.getParentId())).findAny().ifPresent(floorDataVo::setBuilding);
+                    // 设置 校区
+                    if(floorDataVo.getBuilding() != null){
+                        parentAreas.stream().filter(ptAreaVo -> ptAreaVo.getAreaId().equals(floorDataVo.getBuilding().getParentId())).findAny().ifPresent(floorDataVo::setCampus);
+                    }
+                }
+
+                rs.add(floorDataVo);
+            }
+
+        }
+
+        // 排除总房间数 为 0 的数据
+        rs = rs.stream().filter(floorDataVo -> floorDataVo.getAllCount() > 0).toList();
+
+        //排序 校区名称 楼栋名称 楼层名称
+        if(CollectionUtil.isNotEmpty(rs)){
+            // 使用 Optional 处理可能为 null 的情况
+            // 确保 rs 是可变集合
+            List<FloorDataVo> mutableRs = new ArrayList<>(rs);
+//            Collator instance = Collator.getInstance(Locale.CHINA);
+            mutableRs.sort(Comparator.comparing((FloorDataVo e) -> Optional.ofNullable(e.getCampus()).map(PtAreaVo::getAreaName).orElse(""))
+                .thenComparing(e -> Optional.ofNullable(e.getBuilding()).map(PtAreaVo::getAreaName).orElse(""))
+                .thenComparing((e -> Optional.ofNullable(e.getFloor()).map(PtAreaVo::getAreaId).orElse(0L))));
+            return mutableRs;
+        }
+
+        return rs;
+    }
+
+    /**
+     * 根据楼层查询房间订单数据 用于房态
+     *
+     * @param param 楼层等参数
+     * @return 房间订单数据
+     */
+    @Override
+    public List<FloorRoomsVo> getRoomOrderData(QueryFloorRoomBo param) {
+        List<FloorRoomsVo> rs = new ArrayList<>();
+        List<String> checkStatus =
+                    List.of(HotelRoomStatusEnum.YZ.code(), HotelRoomStatusEnum.CS.code(), HotelRoomStatusEnum.SF.code(), HotelRoomStatusEnum.YD.code());
+        if(StringUtils.isEmpty(param.getMultiParams())){
+//        1.基础平台的房间数据:根据楼层、房型、房间状态、房间号 查询房间数据
+            // 1.1.先查询所有房间数据
+            List<PtRoomVo> guestRooms = ptRoomMapper.selectVoList(Wrappers.lambdaQuery(PtRoom.class)
+                // 客房
+                .eq(PtRoom::getRoomType, FJLXEnum.KF.code())
+                //楼层
+                .eq(PtRoom::getAreaId, param.getFloorId())
+                // 2.查询 房态
+                .in(CollectionUtil.isNotEmpty(param.getRoomStatus()),PtRoom::getStatus, param.getRoomStatus())
+                .in(CollectionUtil.isNotEmpty(param.getRoomTypes()),PtRoom::getGuestRoomType, param.getRoomTypes())
+            );
+
+            if(CollectionUtil.isNotEmpty(guestRooms)){
+                // 2.查询 房型数据
+                List<PtRoomTypeVo> roomTypes = roomTypeMapper.selectVoList();
+                //转成map
+                Map<Long, PtRoomTypeVo> roomTypeMap = roomTypes.stream().collect(Collectors.toMap(PtRoomTypeVo::getRoomTypeId, e -> e));
+
+//        2.锁定、预定、住房、超时的房间 还需要通过调用客户系统接口查询 订单信息、客户信息
+                List<PtRoomVo> needCheckRooms = guestRooms.stream().filter(e -> StringUtils.isNotBlank(e.getStatus()) && checkStatus.contains(e.getStatus())).toList();
+                List<RemoteOrderVo> orders = remoteOrderService.getOrderAndGuestByRoomCodes(needCheckRooms.stream().map(PtRoomVo::getRoomCode).toList());
+
+                //一个房间可能有多个订单
+                Map<String, List<RemoteOrderVo>> ordersMap = orders.stream().collect(Collectors.groupingBy(RemoteOrderVo::getRoomCode));
+
+                //组装数据返回
+                setFloorRoomsResult(rs, guestRooms, roomTypeMap, ordersMap);
+            }
+        }else{
+            String multiParams = param.getMultiParams();
+            // 先根据房间号查询房间数据 房间号
+            PtRoom ptRoom = ptRoomMapper.selectOne(Wrappers.lambdaQuery(PtRoom.class).eq(PtRoom::getRoomCode, multiParams));
+            if(ptRoom != null){
+                // 有数据
+                PtRoomTypeBo ptRoomTypeBo = new PtRoomTypeBo();
+                ptRoomTypeBo.setRoomTypeId(ptRoom.getGuestRoomType());
+                List<PtRoomTypeVo> roomTypes = roomTypeMapper.selectVoList(Wrappers.lambdaQuery(PtRoomType.class).eq(PtRoomType::getRoomTypeId, ptRoomTypeBo.getRoomTypeId()));
+
+                List<RemoteOrderVo> orders = remoteOrderService.getOrderAndGuestByRoomCodes(List.of(ptRoom.getRoomCode()));
+                FloorRoomsVo floorRoomsVo = new FloorRoomsVo();
+                floorRoomsVo.setRoom(MapstructUtils.convert(ptRoom, PtRoomVo.class));
+                floorRoomsVo.setRoomType(CollectionUtil.isNotEmpty(roomTypes)?roomTypes.get(0):null);
+                floorRoomsVo.setOrderList(orders);
+                rs.add(floorRoomsVo);
+            }else{
+                // 没有数据
+                // 查询这个楼层下的所有房间
+                List<PtRoomVo> allRooms = ptRoomMapper.selectVoList(Wrappers.lambdaQuery(PtRoom.class)
+                    // 客房
+                    .eq(PtRoom::getRoomType, FJLXEnum.KF.code())
+                    // 楼层
+                    .eq(PtRoom::getAreaId, param.getFloorId())
+                );
+
+                List<PtRoomVo> needCheckRooms = allRooms.stream().filter(e -> StringUtils.isNotBlank(e.getStatus()) && checkStatus.contains(e.getStatus())).toList();
+                if(CollectionUtil.isEmpty(needCheckRooms)){
+                    return rs;
+                }
+                List<RemoteOrderVo> orders = remoteOrderService.getOrderAndGuestByRoomCodes(needCheckRooms.stream().map(PtRoomVo::getRoomCode).toList());
+
+                // 找出符合条件的订单  姓名 / 手机号
+                List<RemoteOrderVo> filterOrders = orders.stream().filter(e -> multiParams.equals(e.getPhone()) || e.getName().contains(multiParams)).toList();
+
+                if(CollectionUtil.isEmpty(filterOrders)) {
+                    return rs;
+                }
+
+                //找出房间
+                List<PtRoomVo> filterRooms = allRooms.stream().filter(e -> filterOrders.stream().anyMatch(o -> o.getRoomCode().equals(e.getRoomCode()))).toList();
+
+                Map<String, List<RemoteOrderVo>> ordersMap = filterOrders.stream().collect(Collectors.groupingBy(RemoteOrderVo::getRoomCode));
+
+                // 2.查询 房型数据
+                List<PtRoomTypeVo> roomTypes = roomTypeMapper.selectVoList();
+                //转成map
+                Map<Long, PtRoomTypeVo> roomTypeMap = roomTypes.stream().collect(Collectors.toMap(PtRoomTypeVo::getRoomTypeId, e -> e));
+
+                 //组装数据返回
+                setFloorRoomsResult(rs, filterRooms, roomTypeMap, ordersMap);
+            }
+
+        }
+
+        return rs;
+    }
+
+    private void setFloorRoomsResult(List<FloorRoomsVo> rs, List<PtRoomVo> guestRooms,
+                                     Map<Long, PtRoomTypeVo> roomTypeMap, Map<String, List<RemoteOrderVo>> ordersMap) {
+        for (PtRoomVo guestRoom : guestRooms) {
+            FloorRoomsVo floorRoomsVo = new FloorRoomsVo();
+            floorRoomsVo.setRoom(guestRoom);
+            floorRoomsVo.setRoomType(roomTypeMap.get(guestRoom.getGuestRoomType()));
+            floorRoomsVo.setOrderList(ordersMap.get(guestRoom.getRoomCode()));
+            rs.add(floorRoomsVo);
+        }
+    }
 }

+ 50 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomServiceImpl.java

@@ -2,11 +2,13 @@ package org.dromara.backstage.basics.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.enums.FJLXEnum;
+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.TableDataInfo;
@@ -15,6 +17,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.bo.PtRoomBo;
@@ -130,6 +133,18 @@ public class PtRoomServiceImpl implements IPtRoomService {
         return ptRoomVos;
     }
 
+    /**
+     * 查询房间  客房 简单查询
+     *
+     * @param bo
+     * @return
+     */
+    @Override
+    public List<PtRoomVo> selectList(PtRoomBo bo) {
+        LambdaQueryWrapper<PtRoom> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
     /**
      * 仅用于选择房间
      * @param bo 房间定义
@@ -226,6 +241,7 @@ public class PtRoomServiceImpl implements IPtRoomService {
      */
     @Override
     @Transactional
+    @CacheEvict(cacheNames = CacheNames.PT_ROOM, key = "#bo.roomId")
     public Boolean updateByBo(PtRoomBo bo) {
         if(!FJLXEnum.KF.code().equals(bo.getRoomType())){
             bo.setGuestRoomType(null);
@@ -263,6 +279,39 @@ public class PtRoomServiceImpl implements IPtRoomService {
         return 0L;
     }
 
+    /**
+     * 查询所有房间状态的房间数量
+     *
+     * @return
+     */
+    @Override
+    public Map<String, Long> getCountByStatus() {
+
+        Map<String, Long> map = new HashMap<>();
+
+        LambdaQueryWrapper<PtRoom> lambdaQuery = Wrappers.<PtRoom>lambdaQuery();
+        lambdaQuery.eq(PtRoom::getRoomType, FJLXEnum.KF.code());
+
+        List<PtRoomVo> list = baseMapper.selectVoList(lambdaQuery);
+
+        // 按 status 分组 统计
+        Map<String, Long> mapList = list.stream().collect(Collectors.groupingBy(PtRoomVo::getStatus, Collectors.counting()));
+
+        HotelRoomStatusEnum[] values = HotelRoomStatusEnum.values();
+        if (mapList.isEmpty()){
+            for (HotelRoomStatusEnum value : values) {
+                map.put(value.code(), 0L);
+            }
+        }else{
+            for (HotelRoomStatusEnum value : values) {
+                map.put(value.code(), mapList.getOrDefault(value.code(), 0L));
+            }
+        }
+
+        return map;
+    }
+
+
     /**
      * 保存前的数据校验
      */
@@ -291,6 +340,7 @@ public class PtRoomServiceImpl implements IPtRoomService {
      * @return 是否删除成功
      */
     @Override
+    @CacheEvict(cacheNames = CacheNames.PT_ROOM)
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if(isValid){
             //做一些业务上的校验,判断是否需要校验

+ 64 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomTypeServiceImpl.java

@@ -1,6 +1,13 @@
 package org.dromara.backstage.basics.service.impl;
 
-import org.dromara.backstage.basics.domain.PtRoom;
+import cn.hutool.core.collection.CollectionUtil;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.basics.domain.bo.PtRoomBo;
+import org.dromara.backstage.basics.domain.vo.PtRoomVo;
+import org.dromara.backstage.basics.service.IPtRoomService;
+import org.dromara.common.core.constant.HotelBusinessConstants;
+import org.dromara.common.core.enums.FJLXEnum;
+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.StringUtils;
@@ -11,6 +18,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+import org.dromara.hotel.api.service.RemoteOrderService;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.bo.PtRoomTypeBo;
 import org.dromara.backstage.basics.domain.vo.PtRoomTypeVo;
@@ -21,6 +30,8 @@ import org.dromara.backstage.basics.service.IPtRoomTypeService;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 房型管理Service业务层处理
@@ -36,6 +47,9 @@ public class PtRoomTypeServiceImpl implements IPtRoomTypeService {
 
     private final PtRoomServiceImpl roomService;
 
+   /* @DubboReference
+    private final RemoteOrderService orderService;*/
+
     /**
      * 查询房型管理
      *
@@ -57,6 +71,7 @@ public class PtRoomTypeServiceImpl implements IPtRoomTypeService {
     @Override
     public TableDataInfo<PtRoomTypeVo> queryPageList(PtRoomTypeBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<PtRoomType> lqw = buildQueryWrapper(bo);
+        lqw.orderByDesc(PtRoomType::getCreateTime);
         Page<PtRoomTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }
@@ -70,9 +85,57 @@ public class PtRoomTypeServiceImpl implements IPtRoomTypeService {
     @Override
     public List<PtRoomTypeVo> queryList(PtRoomTypeBo bo) {
         LambdaQueryWrapper<PtRoomType> lqw = buildQueryWrapper(bo);
+        lqw.orderByDesc(PtRoomType::getCreateTime);
         return baseMapper.selectVoList(lqw);
     }
 
+    /**
+     * 查询所有房型的 总数量 可用数量
+     *
+     * @return
+     */
+    @Override
+    public List<PtRoomTypeVo> queryAllCount() {
+        LambdaQueryWrapper<PtRoomType> lqw = new LambdaQueryWrapper<>();
+        lqw.orderByDesc(PtRoomType::getCreateTime);
+        List<PtRoomTypeVo> vos = baseMapper.selectVoList(lqw);
+
+        // 房间总数量
+        PtRoomBo bo = new PtRoomBo();
+        bo.setRoomType(FJLXEnum.KF.code());
+        List<PtRoomVo> ptRoomVos = roomService.selectList(bo);
+
+        // 按照房间类型分组统计
+//        Map<Long, Long> allCountMap = ptRoomVos.stream().collect(Collectors.groupingBy(PtRoomVo::getGuestRoomType, Collectors.counting()));
+        Map<Long, List<PtRoomVo>> listMap = ptRoomVos.stream()
+            .filter(vo -> !Objects.isNull(vo.getGuestRoomType()))
+            .collect(Collectors.groupingBy(PtRoomVo::getGuestRoomType, Collectors.toList()));
+
+        vos.forEach(vo -> {
+            Long roomTypeId = vo.getRoomTypeId();
+            List<PtRoomVo> voList = listMap.get(roomTypeId);
+            if(CollectionUtil.isNotEmpty(voList)){
+                int size = voList.size();
+                String s = Integer.toString(size);
+                vo.setAllCount(Long.valueOf(s));
+                long count = voList.stream().filter(ptRoomVo -> HotelRoomStatusEnum.OK.code().equals(ptRoomVo.getStatus())).count();
+                vo.setFreeCount(count);
+            }else{
+                vo.setFreeCount(0L);
+                vo.setAllCount(0L);
+            }
+        });
+
+
+        // 空房 即 ok房
+        // 查询目前所有订单
+//        List<String> params = List.of(HotelBusinessConstants.ORDER_STATUS_RZ, HotelBusinessConstants.ORDER_STATUS_YD, HotelBusinessConstants.ORDER_STATUS_SF);
+//        List<RemoteOrderVo> allOrders = orderService.selectCurrentAllOrder(params);
+
+
+        return vos;
+    }
+
     private LambdaQueryWrapper<PtRoomType> buildQueryWrapper(PtRoomTypeBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<PtRoomType> lqw = Wrappers.lambdaQuery();

+ 0 - 4
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/basics/room/PtRoomMapper.xml

@@ -12,10 +12,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <result property="roomName"    column="room_name"    />
             <result property="roomType"    column="room_type"    />
             <result property="codeOne"    column="code_one"    />
-            <result property="codeTwo"    column="code_two"    />
-            <result property="codeThree"    column="code_three"    />
-            <result property="codeFour"    column="code_four"    />
-            <result property="codeFive"    column="code_five"    />
             <result property="remark"    column="remark"    />
             <result property="delFlag"    column="del_flag"    />
             <result property="createDept"    column="create_dept"    />

+ 21 - 1
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfOrderController.java

@@ -47,13 +47,22 @@ public class KfOrderController extends BaseController {
     }
 
     /**
-     * 根据 guestName 查询散客入住列表
+     * 查询散客信息和散客当前订单信息
      */
     @SaCheckPermission("business:guestOrder:list")
     @GetMapping("/queryListByGuestName")
     public R<List<KfOrderVo>> queryListByGuestName(@RequestParam String guestName) {
         return R.ok(kfOrderService.queryListByGuestName(guestName));
     }
+
+    /**
+     * 查询团客客人信息和当前订单信息
+     */
+    @SaCheckPermission("business:guestOrder:list")
+    @GetMapping("/selectTeamGuest")
+    public R<List<KfOrderVo>> selectTeamLockRoom(@RequestParam Long teamId, @RequestParam String guestName) {
+        return R.ok(kfOrderService.queryTeamGuest(teamId, guestName));
+    }
     /**
      * 导出散客入住列表
      */
@@ -88,6 +97,17 @@ public class KfOrderController extends BaseController {
         return toAjax(kfOrderService.insertByBo(bo));
     }
 
+    /**
+     * 团客锁房指定房间
+     */
+    @SaCheckPermission("business:guestOrder:add")
+    @Log(title = "指定房间", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("roomAssign")
+    public R<Void> roomAssign(@RequestBody KfOrderBo bo) {
+        return toAjax(kfOrderService.roomAssign(bo));
+    }
+
     /**
      * 修改散客入住
      */

+ 2 - 1
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfOrderVo.java

@@ -59,7 +59,8 @@ public class KfOrderVo implements Serializable {
     private String roomCode;
     @ExcelProperty(value = "房间名称")
     private String roomName;
-
+    private String guestRoomType;
+    private Integer bedQuantity;
     /**
      * 入住时间
      */

+ 26 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/OrderAndGuestVo.java

@@ -0,0 +1,26 @@
+package org.dromara.hotel.domain.vo;
+
+import lombok.Data;
+import org.dromara.hotel.domain.KfOrder;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 订单和客户信息
+ *
+ * @author bing
+ * @date 2024-11-20
+ */
+@Data
+public class OrderAndGuestVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8556808065620850675L;
+
+    // 订单信息
+    private KfOrderVo order;
+
+    // 订单对应的客户信息
+    private KfGuestVo guest;
+}

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

@@ -2,10 +2,12 @@ package org.dromara.hotel.dubbo;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.utils.MapstructUtils;
 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;
+import org.dromara.hotel.domain.vo.KfOrderVo;
 import org.dromara.hotel.service.IKfOrderService;
 import org.springframework.stereotype.Service;
 
@@ -53,4 +55,38 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
     public List<RemoteOrderVo> selectTeamRoom(Long teamId) {
         return kfOrderService.selectTeamLockRoom(teamId);
     }
+
+    /**
+     * 根据订单 状态查询当前订单列表
+     *
+     * @param orderStatus 订单状态表
+     * @return 订单列表
+     */
+    @Override
+    public List<RemoteOrderVo> selectCurrentAllOrder(List<String> orderStatus) {
+        List<KfOrderVo> kfOrderVos = kfOrderService.queryCurrentAllOrder(orderStatus);
+        return MapstructUtils.convert(kfOrderVos, RemoteOrderVo.class);
+    }
+
+    /**
+     * 根据 客户姓名或手机号 查询当前订单列表
+     *
+     * @param nameOrPhone 客户姓名或手机号
+     * @return
+     */
+    @Override
+    public List<RemoteOrderVo> getOrderAndGuestByNameOrPhone(String nameOrPhone) {
+        List<KfOrderVo> kfOrderVos = kfOrderService.queryOrderAndGuestByNameOrPhone(nameOrPhone);
+        return MapstructUtils.convert(kfOrderVos, RemoteOrderVo.class);
+    }
+
+    /**
+     * 根据房间号查询订单和客户数据
+     *
+     * @param roomCode 房间号
+     */
+    @Override
+    public List<RemoteOrderVo> getOrderAndGuestByRoomCodes(List<String> roomCode) {
+        return kfOrderService.queryByRoomCodes(roomCode);
+    }
 }

+ 13 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/mapper/KfOrderMapper.java

@@ -21,8 +21,21 @@ public interface KfOrderMapper extends BaseMapperPlus<KfOrder, KfOrderVo> {
 
     List<KfOrderVo> queryListByGuestName(String guestName);
 
+    List<KfOrderVo> queryTeamGuest(Long teamId,String guestName);
+
     RemoteOrderVo selectByBo(@Param("bo") KfOrderBo bo);
 
     /** 根据房间code修改房间状态*/
     int updateRoomStatus(@Param("roomCode") String roomCode, @Param("status") String status);
+
+    /// 根据姓名或手机号查询订单
+    List<KfOrderVo> queryListByGuestNameOrPhone(@Param("nameOrPhone") String nameOrPhone,
+                                                @Param("orderStatusList") List<String> orderStatusList);
+
+    /**
+     * 根据房间code查询订单
+     * @param roomCodes
+     * @return
+     */
+    List<RemoteOrderVo> queryByRoomCodes(@Param("roomCodes")List<String> roomCodes);
 }

+ 19 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java

@@ -6,6 +6,7 @@ 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;
+import org.dromara.hotel.domain.vo.OrderAndGuestVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -43,7 +44,12 @@ public interface IKfOrderService {
      */
     List<KfOrderVo> queryList(KfOrderBo bo);
 
+    List<KfOrderVo> queryCurrentAllOrder(List<String> orderStatus);
+
     List<KfOrderVo> queryListByGuestName(String guestName);
+
+    List<KfOrderVo> queryTeamGuest(Long teamId, String guestName);
+
     /**
      * 新增散客入住
      *
@@ -52,6 +58,7 @@ public interface IKfOrderService {
      */
     Boolean insertByBo(KfOrderBo bo);
 
+    Boolean roomAssign(KfOrderBo bo);
     /**
      * 修改散客入住
      *
@@ -94,4 +101,16 @@ public interface IKfOrderService {
      * @return 锁房信息
      */
     List<RemoteOrderVo> selectTeamLockRoom(Long teamId);
+
+    /**
+     * 根据 客户姓名或者手机号码查询 订单信息和客户信息
+     */
+    List<KfOrderVo> queryOrderAndGuestByNameOrPhone(String nameOrPhone);
+
+    /**
+     * 根据房间号查询订单信息
+     * @param roomCodes 房间号
+     * @return 订单信息
+     */
+    List<RemoteOrderVo> queryByRoomCodes(List<String> roomCodes);
 }

+ 78 - 4
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java

@@ -1,5 +1,7 @@
 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -8,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.constant.HotelBusinessConstants;
 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.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -16,15 +19,18 @@ 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;
+import org.dromara.hotel.domain.vo.KfGuestVo;
 import org.dromara.hotel.domain.vo.KfOrderVo;
+import org.dromara.hotel.domain.vo.KfTeamVo;
+import org.dromara.hotel.domain.vo.OrderAndGuestVo;
+import org.dromara.hotel.mapper.KfGuestMapper;
 import org.dromara.hotel.mapper.KfOrderMapper;
 import org.dromara.hotel.service.IKfOrderService;
+import org.dromara.hotel.service.IKfTeamService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 散客入住Service业务层处理
@@ -37,6 +43,9 @@ import java.util.Map;
 public class KfOrderServiceImpl implements IKfOrderService {
 
     private final KfOrderMapper baseMapper;
+    private final IKfTeamService teamService;
+
+    private final KfGuestMapper guestMapper;
 
     /**
      * 查询散客入住
@@ -74,6 +83,17 @@ public class KfOrderServiceImpl implements IKfOrderService {
         return baseMapper.selectVoList(lqw);
     }
 
+    /**
+     * 根据订单状态查询 订单列表
+     * @param orderStatus 订单状态
+     * @return 订单列表
+     */
+    @Override
+    public List<KfOrderVo> queryCurrentAllOrder(List<String> orderStatus) {
+        LambdaQueryWrapper<KfOrder> in = Wrappers.<KfOrder>lambdaQuery().in(KfOrder::getOrderStatus, orderStatus);
+        return baseMapper.selectVoList(in);
+    }
+
     /**
      * 根据 guestName 查询散客入住列表
      *
@@ -85,6 +105,11 @@ public class KfOrderServiceImpl implements IKfOrderService {
         return baseMapper.queryListByGuestName(guestName);
     }
 
+    @Override
+    public List<KfOrderVo> queryTeamGuest(Long teamId, String guestName) {
+        return baseMapper.queryTeamGuest(teamId, guestName);
+    }
+
     private LambdaQueryWrapper<KfOrder> buildQueryWrapper(KfOrderBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<KfOrder> lqw = Wrappers.lambdaQuery();
@@ -144,6 +169,29 @@ public class KfOrderServiceImpl implements IKfOrderService {
         return flag;
     }
 
+    @Override
+    @Transactional
+    public Boolean roomAssign(KfOrderBo bo) {
+        //校验该团客是否已经有预定或者入住状态的订单
+        if (baseMapper.selectCount(new LambdaQueryWrapper<KfOrder>()
+            .eq(KfOrder::getGuestId, bo.getGuestId())
+            .in(KfOrder::getOrderStatus, HotelBusinessConstants.ORDER_STATUS_YD, HotelBusinessConstants.ORDER_STATUS_RZ)) > 0) {
+            throw new ServiceException("该团客已有预定或者入住状态的订单,请先取消或修改订单");
+        }
+        //根据团客ID查询客团信息
+        KfTeamVo teamVo = teamService.queryById(bo.getTeamId());
+        bo.setTeamName(teamVo.getName());
+        bo.setStartTime(teamVo.getStartTime());
+        bo.setEndTime(teamVo.getEndTime());
+        bo.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_YD);
+        bo.setOrderType(HotelBusinessConstants.ORDER_TYPE_TK);
+        //插入订单
+        boolean flag = insertByBo(bo);
+        //修改房间状态为预定
+        baseMapper.updateRoomStatus(bo.getRoomCode(), HotelRoomStatusEnum.YD.code());
+        return flag;
+    }
+
     /**
      * 修改散客入住
      *
@@ -257,4 +305,30 @@ public class KfOrderServiceImpl implements IKfOrderService {
         return MapstructUtils.convert(vos, RemoteOrderVo.class);
     }
 
+    /**
+     * 根据 客户姓名或者手机号码查询 订单信息和客户信息 只查询入住、预定、锁定状态的订单
+     *
+     * @param nameOrPhone 客户姓名\客户手机号码
+     */
+    @Override
+    public List<KfOrderVo> queryOrderAndGuestByNameOrPhone(String nameOrPhone) {
+        List<KfOrderVo> kfOrderVos = baseMapper.queryListByGuestNameOrPhone(nameOrPhone,
+            List.of(HotelBusinessConstants.ORDER_STATUS_RZ, HotelBusinessConstants.ORDER_STATUS_YD, HotelBusinessConstants.ORDER_STATUS_SF));
+        if (CollectionUtil.isEmpty(kfOrderVos)) {
+            return ListUtil.empty();
+        }
+        return kfOrderVos;
+    }
+
+    /**
+     * 根据房间号查询订单信息
+     *
+     * @param roomCodes 房间号
+     * @return 订单信息
+     */
+    @Override
+    public List<RemoteOrderVo> queryByRoomCodes(List<String> roomCodes) {
+        return baseMapper.queryByRoomCodes(roomCodes);
+    }
+
 }

+ 70 - 12
ruoyi-modules/ruoyi-hotel/src/main/resources/mapper/hotel/business/KfOrderMapper.xml

@@ -30,15 +30,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectPageByBo" resultType="org.dromara.hotel.domain.vo.KfOrderVo">
         select
-        o.id,o.guest_id,g.name as guestName,o.team_id,o.team_name,o.room_code,o.room_name,o.start_time,o.end_time
-             ,o.order_status,o.plan_money,o.actual_money,o.remark,g.phone,g.sex,g.id_card as idCard from t_kf_order o
-        left join
-        t_kf_guest g on o.guest_id = g.id
+            o.id,o.guest_id,g.name as guestName,o.team_id,o.team_name,o.room_code,o.room_name,o.start_time
+            ,o.end_time, o.order_status,o.plan_money,o.actual_money,o.remark,g.phone,g.sex,g.id_card as idCard,
+            rt.room_type_name as guestRoomType, rt.bed_number as bedQuantity, o.order_index as orderIndex
+        from t_kf_order o
+            left join t_kf_guest g on o.guest_id = g.id
+            left join t_pt_room r on r.room_code = o.room_code
+            left join t_pt_room_type rt on r.guest_room_type = rt.room_type_id
         <where>
             o.del_flag = '0'
             <if test="bo.guestName != null and bo.guestName != ''">
                 and g.name like concat('%', #{bo.guestName}, '%')
             </if>
+            <if test="bo.teamId != null and bo.teamId != ''">
+                and o.team_id = #{bo.teamId}
+            </if>
+
             <if test="bo.teamName != null and bo.teamName != ''">
                 and o.team_name like concat('%', #{bo.teamName}, '%')
             </if>
@@ -57,23 +64,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="bo.orderType != null and bo.orderType != ''">
                 and o.order_type = #{bo.orderType}
             </if>
-        order by o.create_time desc
+        order by o.order_index asc, o.create_time desc
         </where>
     </select>
 
     <select id="queryListByGuestName" resultType="org.dromara.hotel.domain.vo.KfOrderVo">
-        select g.id as guestId,
-            concat_ws(' | ',g.name, g.phone, g.id_card, CASE o.order_status
-            WHEN '1' THEN '当前已预定'
-            WHEN '3' THEN '当前已入住'
-            else ''
-            END) AS guestName
+        select g.id as guestId, g.name as guestName,
+                concat('姓名: ',g.name,' | 手机号: ',g.phone, ' | '
+                , CASE o.order_status WHEN '1' THEN '当前已预定' WHEN '3' THEN '当前已入住' else '' END
+                ) AS phone
             from t_kf_guest g left join t_kf_order o on g.id = o.guest_id and o.order_status in ('1','3')
             <where>
                 g.del_flag = '0'
-                and g.name like concat('%', #{guestName}, '%')
+                <if test="guestName != null and guestName != ''">
+                    and g.name like concat('%', #{guestName}, '%')
+                </if>
             </where>
     </select>
+
+    <select id="queryTeamGuest" resultType="org.dromara.hotel.domain.vo.KfOrderVo">
+        select g.id as guestId, g.name as guestName,
+        concat('姓名: ',g.name,' | 手机号: ',g.phone, ' | '
+            , CASE o.order_status WHEN '1' THEN '当前已预定' WHEN '3' THEN '当前已入住' else '' END
+            ) AS phone
+        from t_kf_guest_team_r tgr
+            left join t_kf_guest g on tgr.guest_id = g.id
+            left join t_kf_order o on g.id = o.guest_id and o.order_status in ('1','3')
+        <where>
+            tgr.del_flag = '0'
+            <if test="teamId != null">
+                and tgr.team_id = #{teamId}
+            </if>
+            <if test="guestName != null">
+                and g.name like concat('%', #{guestName}, '%')
+            </if>
+        </where>
+    </select>
+
     <select id="selectByBo" resultType="org.dromara.hotel.api.domain.vo.RemoteOrderVo">
         SELECT tkg.id AS guestId, tkg.name, tkg.sex, tkg.id_card AS idCard, tkg.phone, tkg.other_id AS otherId, tkgtr.team_id AS teamId,
         tko.room_code AS roomCode, tpr.room_id AS roomId, tko.start_time AS checkinDate, tko.end_time AS checkoutDate,
@@ -105,4 +132,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <update id="updateRoomStatus" >
         update t_pt_room set status = #{status} where room_code = #{roomCode}
     </update>
+
+    <select id = "queryListByGuestNameOrPhone" resultType="org.dromara.hotel.domain.vo.KfOrderVo">
+        select o.*, g.name as guestName, g.phone,g.id_card as idCard, g.sex from t_kf_order o
+        left join t_kf_guest g on o.guest_id = g.id
+        <where>
+            g.del_flag = '0' and o.del_flag = '0'
+            <if test="orderStatusList != null and orderStatusList.size() > 0">
+                and o.order_status in
+                <foreach collection="orderStatusList" item="orderStatus" open="(" separator="," close=")">
+                    #{orderStatus}
+                </foreach>
+            </if>
+            <if test="nameOrPhone != null and nameOrPhone != ''">
+                and (g.name like concat('%', #{nameOrPhone}, '%') or g.phone = #{nameOrPhone})
+            </if>
+        </where>
+    </select>
+
+    <select id = "queryByRoomCodes" resultType="org.dromara.hotel.api.domain.vo.RemoteOrderVo">
+        select o.*, g.name as name, g.phone,g.id_card as idCard, g.sex from t_kf_order o
+        left join t_kf_guest g on o.guest_id = g.id
+        <where>
+            g.del_flag = '0' and o.del_flag = '0'
+            <if test="roomCodes != null and roomCodes.size() > 0">
+                and o.room_code in
+                <foreach collection="roomCodes" item="code" open="(" separator="," close=")">
+                    #{code}
+                </foreach>
+            </if>
+        </where>
+    </select>
 </mapper>