瀏覽代碼

检索对应房型的可用房间数
可用房间和可用房间数按照当前时间进行判定订单是否超时,目前是预抵达时间超时2分钟则不算房间和房间数量,单独计算房型的可用房数

qh 2 年之前
父節點
當前提交
a3c803a7b9

+ 3 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CanUseRequestParamDto.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.rooms.DTO;
 package org.jeecg.modules.rooms.DTO;
 
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
 
@@ -19,6 +20,8 @@ public class CanUseRequestParamDto {
     private String hourRoomRuleId;
     private String hourRoomRuleId;
     // 预约类型 1,全天房,2钟点房
     // 预约类型 1,全天房,2钟点房
     private Integer bookingType;
     private Integer bookingType;
+    @ApiModelProperty(value = "传入房型id,检索对应房型可用房间数")
+    private String layoutId;
 
 
 
 
 }
 }

+ 9 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Vo/AlreadyUseLayoutNumberVo.java

@@ -0,0 +1,9 @@
+package org.jeecg.modules.rooms.Vo;
+
+import lombok.Data;
+
+@Data
+public class AlreadyUseLayoutNumberVo {
+    private String layoutId;
+    private Integer useCount;
+}

+ 2 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesRoomsMapper.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.rooms.mapper;
 package org.jeecg.modules.rooms.mapper;
 
 
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.rooms.Vo.AlreadyUseLayoutNumberVo;
 import org.jeecg.modules.rooms.entity.CesRooms;
 import org.jeecg.modules.rooms.entity.CesRooms;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 
@@ -18,4 +19,5 @@ import java.util.List;
 public interface CesRoomsMapper extends BaseMapper<CesRooms> {
 public interface CesRoomsMapper extends BaseMapper<CesRooms> {
 
 
     List<CesRooms> canUseRooms(String hotelId, Date startOf, Date endOf);
     List<CesRooms> canUseRooms(String hotelId, Date startOf, Date endOf);
+    List<AlreadyUseLayoutNumberVo> alreadyUseLayoutNumber(String hotelId, Date startOf, Date endOf);
 }
 }

+ 40 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/xml/CesRoomsMapper.xml

@@ -20,6 +20,7 @@
                 br.booking_type = 1
                 br.booking_type = 1
               AND br.room_id IS NOT NULL
               AND br.room_id IS NOT NULL
               AND o.booking_status = 1
               AND o.booking_status = 1
+              and TIMESTAMPDIFF(minute, ADDDATE(now(),INTERVAL 8 HOUR),o.arrival_time) > -2 -- 订单超过当前时间2分钟以后 则不算入已预定中 时间 > -2 算是正常预约,超过的一律算做超时订单
               AND (
               AND (
                 ( o.arrival_time &lt;= #{startOf} AND o.due_out_time &gt;= #{startOf} ) -- 预抵时间在别的客人预定时间范围内
                 ( o.arrival_time &lt;= #{startOf} AND o.due_out_time &gt;= #{startOf} ) -- 预抵时间在别的客人预定时间范围内
 		OR ( o.arrival_time &lt;= #{endOf} AND o.due_out_time &gt;= #{endOf} ) -- 或者预离时间在别的客户预定范围内
 		OR ( o.arrival_time &lt;= #{endOf} AND o.due_out_time &gt;= #{endOf} ) -- 或者预离时间在别的客户预定范围内
@@ -39,7 +40,45 @@
 	WHERE
 	WHERE
 		br.booking_type = 2
 		br.booking_type = 2
 		AND br.room_id IS NOT NULL
 		AND br.room_id IS NOT NULL
-	AND o.booking_status = 1
+	    AND o.booking_status = 1
+        and TIMESTAMPDIFF(minute, ADDDATE(now(),INTERVAL 8 HOUR),bi.arrival_time) > -2 -- 计算批次号中如果有超时的批次,则批次关联房间均失效
 	)
 	)
     </select>
     </select>
+    <select id="alreadyUseLayoutNumber" resultType="org.jeecg.modules.rooms.Vo.AlreadyUseLayoutNumberVo">
+        select l.id,count(t.room_layout_id) as useCount from ces_room_layout l left JOIN
+            (
+                SELECT
+                    br.room_layout_id
+                FROM
+                    bus_booking_rooms br
+                        INNER JOIN bus_room_booking_orders o ON br.booking_orders_id = o.id
+                WHERE
+                    br.booking_type = 1
+                  AND o.booking_status = 1
+                  and TIMESTAMPDIFF(minute, ADDDATE(now(),INTERVAL 8 HOUR),o.arrival_time) > -2 -- 订单超过当前时间2分钟以后 则不算入已预定中 时间 > -2 算是正常预约,超过的一律算做超时订单
+                  AND (
+                        ( o.arrival_time &lt;= #{startOf} AND o.due_out_time &gt;= #{startOf} ) -- 预抵时间在别的客人预定时间范围内
+                        OR ( o.arrival_time &lt;= #{endOf} AND o.due_out_time &gt;= #{endOf} ) -- 或者预离时间在别的客户预定范围内
+
+                    ) UNION ALL
+                SELECT
+                    br.room_layout_id
+                FROM
+                    bus_booking_rooms br
+                        INNER JOIN bus_room_booking_orders o ON br.booking_orders_id = o.id
+                        INNER JOIN bus_booking_batch_info bi ON br.booking_batch_id = bi.id
+                        AND (
+                                                                        ( bi.arrival_time &lt;= #{startOf} AND bi.due_out_time &gt;= #{startOf} ) -- 预抵时间在别的客人预定时间范围内
+                                                                        OR ( bi.arrival_time &lt;= #{endOf} AND bi.due_out_time &gt;= #{endOf} ) -- 或者预离时间在别的客户预定范围内
+
+                                                                    )
+                WHERE
+                    br.booking_type = 2
+                  AND o.booking_status = 1
+                  and TIMESTAMPDIFF(minute, ADDDATE(now(),INTERVAL 8 HOUR),bi.arrival_time) > -2 -- 计算批次号中如果有超时的批次,则批次关联房间均失效
+                )
+                as t on
+                l.id = t.room_layout_id and l.hotel_id = #{hotelId}
+        GROUP BY l.id
+    </select>
 </mapper>
 </mapper>

+ 15 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesRoomsServiceImpl.java

@@ -25,6 +25,7 @@ import org.jeecg.modules.business.service.impl.BusHotelServiceImpl;
 import org.jeecg.modules.rooms.DTO.*;
 import org.jeecg.modules.rooms.DTO.*;
 import org.jeecg.modules.rooms.Enum.CouponEnums;
 import org.jeecg.modules.rooms.Enum.CouponEnums;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
+import org.jeecg.modules.rooms.Vo.AlreadyUseLayoutNumberVo;
 import org.jeecg.modules.rooms.Vo.CanUseBuildingRoomsVo;
 import org.jeecg.modules.rooms.Vo.CanUseBuildingRoomsVo;
 import org.jeecg.modules.rooms.Vo.CanUseResultVo;
 import org.jeecg.modules.rooms.Vo.CanUseResultVo;
 import org.jeecg.modules.rooms.Vo.CesRoomsVo;
 import org.jeecg.modules.rooms.Vo.CesRoomsVo;
@@ -258,10 +259,14 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
      */
      */
     public List<CanUseResultVo> getCanUseRooms(CanUseRequestParamDto param) {
     public List<CanUseResultVo> getCanUseRooms(CanUseRequestParamDto param) {
         // 获取房型
         // 获取房型
-       List<CesRoomLayout> layouts = layoutService.list(Wrappers.<CesRoomLayout>query().eq("hotel_id",param.getHotelId())
-               .eq("invalid",false)
-       );
+        QueryWrapper<CesRoomLayout> wrappers = Wrappers.<CesRoomLayout>query().eq("hotel_id",param.getHotelId())
+                .eq("invalid",false);
+        if(param.getLayoutId() != null && !param.getLayoutId().isEmpty()) {
+            wrappers.eq("id",param.getLayoutId());
+        }
+       List<CesRoomLayout> layouts = layoutService.list(wrappers);
        List<CesRooms> allRooms = baseMapper.canUseRooms(param.getHotelId(),param.getStartOf(),param.getEndOf());
        List<CesRooms> allRooms = baseMapper.canUseRooms(param.getHotelId(),param.getStartOf(),param.getEndOf());
+       List<AlreadyUseLayoutNumberVo> useLayoutNumbers = baseMapper.alreadyUseLayoutNumber(param.getHotelId(),param.getStartOf(),param.getEndOf());
        List<CesRoomBuildingFloor> allBuildingFloors = buildingFloorService.list(Wrappers.<CesRoomBuildingFloor>query().eq("hotelId",param.getHotelId()).eq("invalid",false));
        List<CesRoomBuildingFloor> allBuildingFloors = buildingFloorService.list(Wrappers.<CesRoomBuildingFloor>query().eq("hotelId",param.getHotelId()).eq("invalid",false));
        List<CanUseResultVo> results = new ArrayList<>();
        List<CanUseResultVo> results = new ArrayList<>();
        List<CesRoomBuildingFloor> floors = allBuildingFloors.stream().filter(s->!s.getParentId().equals("0")).collect(Collectors.toList());
        List<CesRoomBuildingFloor> floors = allBuildingFloors.stream().filter(s->!s.getParentId().equals("0")).collect(Collectors.toList());
@@ -306,6 +311,13 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
                canUseRoomCount[0] += floorRooms.size();
                canUseRoomCount[0] += floorRooms.size();
                floorVos.add(floorRoomsVo);
                floorVos.add(floorRoomsVo);
            });
            });
+           // 主要为了排除掉未排房数量
+           Optional<AlreadyUseLayoutNumberVo> alreadyUseLayoutNumberVo = useLayoutNumbers.stream().filter(k->k.getLayoutId().equals(s.getId())).findAny();
+           if(alreadyUseLayoutNumberVo.isPresent()){
+               canUseRoomCount[0] = canUseRoomCount[0] - alreadyUseLayoutNumberVo.get().getUseCount();
+               // 算法如果正确 就不需要下面这步,待检验之前步骤正确性
+               if(canUseRoomCount[0] < 0) canUseRoomCount[0] = 0;
+           }
            s.setCanUseCount(canUseRoomCount[0]); //设置可用房间数
            s.setCanUseCount(canUseRoomCount[0]); //设置可用房间数
            item.setLayout(s);
            item.setLayout(s);
            item.setBuildingRooms(floorVos);
            item.setBuildingRooms(floorVos);