Browse Source

管理端实时房态查询

wangzhengliang 3 years ago
parent
commit
0b5898c65b

+ 34 - 64
src/main/java/com/chuanghai/ihotel/controller/RoomRealtimeStatuController.java

@@ -1,22 +1,22 @@
 package com.chuanghai.ihotel.controller;
 package com.chuanghai.ihotel.controller;
 
 
-import java.util.Arrays;
-
+import com.chuanghai.ihotel.anno.AdminLoginCheck;
+import com.chuanghai.ihotel.anno.ParamCheck;
+import com.chuanghai.ihotel.common.exception.BizCodeEnume;
+import com.chuanghai.ihotel.common.exception.RRException;
+import com.chuanghai.ihotel.common.utils.CommonResult;
+import com.chuanghai.ihotel.controller.request.RoomRealtimeStatuRequest;
+import com.chuanghai.ihotel.service.RoomRealtimeStatuService;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
-import com.chuanghai.ihotel.entity.RoomRealtimeStatuEntity;
-import com.chuanghai.ihotel.service.RoomRealtimeStatuService;
-import com.chuanghai.ihotel.common.utils.PageUtils;
-import com.chuanghai.ihotel.common.utils.CommonResult;
-import com.chuanghai.ihotel.common.utils.PageParam;
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
 
 
 
 
 /**
 /**
@@ -34,62 +34,32 @@ public class RoomRealtimeStatuController {
     private RoomRealtimeStatuService roomRealtimeStatuService;
     private RoomRealtimeStatuService roomRealtimeStatuService;
 
 
     /**
     /**
-     * 列表
+     * 房态信息
+     * @param request 请求参数
+     * @param adminToken 管理员token
+     * @return
      */
      */
-    @GetMapping("/list")
-    public CommonResult<PageUtils<RoomRealtimeStatuEntity>> list(PageParam pageParam){
-        PageUtils page = roomRealtimeStatuService.queryPage(pageParam);
-
-        return CommonResult.ok().setResult(page);
-    }
-
-
-    /**
-     * 信息
-     */
-    @GetMapping("/info/{id}")
-    public CommonResult<RoomRealtimeStatuEntity> info(@PathVariable("id") Long id){
-		RoomRealtimeStatuEntity roomRealtimeStatu = roomRealtimeStatuService.getById(id);
-
-        return CommonResult.ok().setResult(roomRealtimeStatu);
-    }
-
-    /**
-     * 保存
-     */
-    @PostMapping("/save")
-    public CommonResult<String> save(@RequestBody RoomRealtimeStatuEntity roomRealtimeStatu){
-		roomRealtimeStatuService.save(roomRealtimeStatu);
-
-        return CommonResult.ok();
-    }
-
-    /**
-     * 修改
-     */
-    @PutMapping("/update")
-    public CommonResult<String> update(@RequestBody RoomRealtimeStatuEntity roomRealtimeStatu){
-		boolean flag = roomRealtimeStatuService.updateById(roomRealtimeStatu);
-
-		if (flag) {
-            return CommonResult.ok();
-        } else {
-		    return CommonResult.fail();
+    @ParamCheck
+    @AdminLoginCheck
+    @GetMapping("/realData")
+    public CommonResult<List<RoomRealDataStatuVO>> realData(RoomRealtimeStatuRequest request,
+                                                            @RequestHeader("admin_token") String adminToken) {
+        LocalDate startDay = request.getStartDay();
+        LocalDate endDay = request.getEndDay();
+        if (startDay.isEqual(endDay)) {
+            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "查询开始时间和结束时间不能为同一天");
         }
         }
-    }
 
 
-    /**
-     * 删除
-     */
-    @DeleteMapping("/delete")
-    public CommonResult<String> delete(@RequestBody Long[] ids){
-        boolean flag = roomRealtimeStatuService.removeByIds(Arrays.asList(ids));
+        if (endDay.isBefore(startDay)) {
+            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "查询日期错误");
+        }
 
 
-        if (flag) {
-            return CommonResult.ok();
-        } else {
-            return CommonResult.fail();
+        if (ChronoUnit.DAYS.between(startDay, endDay) > 1) {
+            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "查询日期最多间隔一天");
         }
         }
+
+        List<RoomRealDataStatuVO> realData = roomRealtimeStatuService.realData(request);
+        return CommonResult.ok().setResult(realData);
     }
     }
 
 
 }
 }

+ 37 - 0
src/main/java/com/chuanghai/ihotel/controller/request/RoomRealtimeStatuRequest.java

@@ -0,0 +1,37 @@
+package com.chuanghai.ihotel.controller.request;
+
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Author: codingliang
+ * @Description: 实时房态查询
+ * @Date: 2022-08-04 16:22
+ * @Version: V1.0
+ **/
+@Data
+public class RoomRealtimeStatuRequest {
+    /**
+     * 开始时间 yyyy-MM-dd
+     */
+    @NotNull(message = "开始时间不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDay;
+    /**
+     * 结束时间 yyyy-MM-dd
+     */
+    @NotNull(message = "结束时间不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDay;
+    /**
+     * 房间id集合
+     */
+    @NotNull(message = "房间id集合不能为空")
+    @Size(min = 1, message = "房间id集合不能为空")
+    private List<Long> roomIds;
+}

+ 7 - 1
src/main/java/com/chuanghai/ihotel/dao/HotelOrderDao.java

@@ -2,7 +2,12 @@ package com.chuanghai.ihotel.dao;
 
 
 import com.chuanghai.ihotel.entity.HotelOrderEntity;
 import com.chuanghai.ihotel.entity.HotelOrderEntity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
 
 
 /**
 /**
  * 酒店订单 
  * 酒店订单 
@@ -13,5 +18,6 @@ import org.apache.ibatis.annotations.Mapper;
  */
  */
 @Mapper
 @Mapper
 public interface HotelOrderDao extends BaseMapper<HotelOrderEntity> {
 public interface HotelOrderDao extends BaseMapper<HotelOrderEntity> {
-	
+
+    List<RoomRealDataStatuVO.RoomUseInfo> getRoomUseInfoByOrderIds(@Param("orderIds") Set<Long> orderIds);
 }
 }

+ 2 - 0
src/main/java/com/chuanghai/ihotel/dao/RoomRealtimeStatuDao.java

@@ -21,4 +21,6 @@ public interface RoomRealtimeStatuDao extends BaseMapper<RoomRealtimeStatuEntity
     int getBusyNum(@Param("roomTypeId") Long roomTypeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
     int getBusyNum(@Param("roomTypeId") Long roomTypeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 
 
     List<Long> getBusyRoomId(@Param("roomTypeId") Long roomTypeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
     List<Long> getBusyRoomId(@Param("roomTypeId") Long roomTypeId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
+
+    List<RoomRealtimeStatuEntity> getByRoomIdsAndTime(@Param("roomIds") List<Long> roomIds, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 }
 }

+ 10 - 0
src/main/java/com/chuanghai/ihotel/service/HotelOrderService.java

@@ -11,9 +11,12 @@ import com.chuanghai.ihotel.entity.HotelOrderEntity;
 import com.chuanghai.ihotel.vo.ConfirmOrderVO;
 import com.chuanghai.ihotel.vo.ConfirmOrderVO;
 import com.chuanghai.ihotel.vo.OrderBillHandleVO;
 import com.chuanghai.ihotel.vo.OrderBillHandleVO;
 import com.chuanghai.ihotel.vo.OrderSubmitVO;
 import com.chuanghai.ihotel.vo.OrderSubmitVO;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 import com.chuanghai.ihotel.vo.UserOrderDetailVO;
 import com.chuanghai.ihotel.vo.UserOrderDetailVO;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
 
 
 /**
 /**
  * 酒店订单 
  * 酒店订单 
@@ -116,5 +119,12 @@ public interface HotelOrderService extends IService<HotelOrderEntity> {
      * @return
      * @return
      */
      */
     OrderBillHandleVO userReturnOrder(Long orderId);
     OrderBillHandleVO userReturnOrder(Long orderId);
+
+    /**
+     * 根据订单id查询订单用户信息
+     * @param orderIds
+     * @return
+     */
+    List<RoomRealDataStatuVO.RoomUseInfo> getRoomUseInfoByOrderIds(Set<Long> orderIds);
 }
 }
 
 

+ 10 - 0
src/main/java/com/chuanghai/ihotel/service/RoomRealtimeStatuService.java

@@ -3,11 +3,14 @@ package com.chuanghai.ihotel.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.chuanghai.ihotel.common.utils.PageUtils;
 import com.chuanghai.ihotel.common.utils.PageUtils;
 import com.chuanghai.ihotel.common.utils.PageParam;
 import com.chuanghai.ihotel.common.utils.PageParam;
+import com.chuanghai.ihotel.controller.request.RoomRealtimeStatuRequest;
 import com.chuanghai.ihotel.dto.LockRoomDTO;
 import com.chuanghai.ihotel.dto.LockRoomDTO;
 import com.chuanghai.ihotel.entity.RoomRealtimeStatuEntity;
 import com.chuanghai.ihotel.entity.RoomRealtimeStatuEntity;
 import com.chuanghai.ihotel.entity.RoomTypeEntity;
 import com.chuanghai.ihotel.entity.RoomTypeEntity;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.List;
 
 
 /**
 /**
  * 实时房态 
  * 实时房态 
@@ -43,5 +46,12 @@ public interface RoomRealtimeStatuService extends IService<RoomRealtimeStatuEnti
      * @param bizId 业务id
      * @param bizId 业务id
      */
      */
     void releaseByBizId(Long bizId);
     void releaseByBizId(Long bizId);
+
+    /**
+     * 房态信息查询
+     * @param request
+     * @return
+     */
+    List<RoomRealDataStatuVO> realData(RoomRealtimeStatuRequest request);
 }
 }
 
 

+ 10 - 0
src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderServiceImpl.java

@@ -46,6 +46,7 @@ import com.chuanghai.ihotel.vo.ConfirmOrderVO;
 import com.chuanghai.ihotel.dto.LoginUserDTO;
 import com.chuanghai.ihotel.dto.LoginUserDTO;
 import com.chuanghai.ihotel.vo.OrderBillHandleVO;
 import com.chuanghai.ihotel.vo.OrderBillHandleVO;
 import com.chuanghai.ihotel.vo.OrderSubmitVO;
 import com.chuanghai.ihotel.vo.OrderSubmitVO;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
 import com.chuanghai.ihotel.vo.UserOrderDetailVO;
 import com.chuanghai.ihotel.vo.UserOrderDetailVO;
 import com.chuanghai.ihotel.vo.UserOrderIndexVO;
 import com.chuanghai.ihotel.vo.UserOrderIndexVO;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -62,6 +63,7 @@ import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Slf4j
 @Slf4j
@@ -538,6 +540,14 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         return vo;
         return vo;
     }
     }
 
 
+    @Override
+    public List<RoomRealDataStatuVO.RoomUseInfo> getRoomUseInfoByOrderIds(Set<Long> orderIds) {
+        if (orderIds.size() <= 0) {
+            return null;
+        }
+        return this.baseMapper.getRoomUseInfoByOrderIds(orderIds);
+    }
+
     /**
     /**
      * 用户根据订单id获取订单
      * 用户根据订单id获取订单
      * @param orderId
      * @param orderId

+ 48 - 0
src/main/java/com/chuanghai/ihotel/service/impl/RoomRealtimeStatuServiceImpl.java

@@ -9,21 +9,31 @@ import com.chuanghai.ihotel.common.utils.MyQuery;
 import com.chuanghai.ihotel.common.utils.PageParam;
 import com.chuanghai.ihotel.common.utils.PageParam;
 import com.chuanghai.ihotel.common.utils.PageUtils;
 import com.chuanghai.ihotel.common.utils.PageUtils;
 import com.chuanghai.ihotel.constant.RedisKey;
 import com.chuanghai.ihotel.constant.RedisKey;
+import com.chuanghai.ihotel.constant.TimeConstant;
+import com.chuanghai.ihotel.controller.request.RoomRealtimeStatuRequest;
 import com.chuanghai.ihotel.dao.RoomRealtimeStatuDao;
 import com.chuanghai.ihotel.dao.RoomRealtimeStatuDao;
 import com.chuanghai.ihotel.dto.LockRoomDTO;
 import com.chuanghai.ihotel.dto.LockRoomDTO;
 import com.chuanghai.ihotel.entity.RoomRealtimeStatuEntity;
 import com.chuanghai.ihotel.entity.RoomRealtimeStatuEntity;
 import com.chuanghai.ihotel.entity.RoomTypeEntity;
 import com.chuanghai.ihotel.entity.RoomTypeEntity;
 import com.chuanghai.ihotel.enums.RoomStatuEnum;
 import com.chuanghai.ihotel.enums.RoomStatuEnum;
+import com.chuanghai.ihotel.service.HotelOrderService;
 import com.chuanghai.ihotel.service.RoomRealtimeStatuService;
 import com.chuanghai.ihotel.service.RoomRealtimeStatuService;
 import com.chuanghai.ihotel.service.RoomService;
 import com.chuanghai.ihotel.service.RoomService;
 import com.chuanghai.ihotel.service.RoomTypeService;
 import com.chuanghai.ihotel.service.RoomTypeService;
+import com.chuanghai.ihotel.util.CommonUtil;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO;
+import com.chuanghai.ihotel.vo.RoomRealDataStatuVO.RoomUseInfo;
 import org.redisson.api.RLock;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 
 
 
 @Service("roomRealtimeStatuService")
 @Service("roomRealtimeStatuService")
@@ -35,6 +45,8 @@ public class RoomRealtimeStatuServiceImpl extends ServiceImpl<RoomRealtimeStatuD
     private RoomTypeService roomTypeService;
     private RoomTypeService roomTypeService;
     @Autowired
     @Autowired
     private RoomService roomService;
     private RoomService roomService;
+    @Autowired
+    private HotelOrderService orderService;
 
 
     @Override
     @Override
     public PageUtils queryPage(PageParam pageParam) {
     public PageUtils queryPage(PageParam pageParam) {
@@ -105,6 +117,42 @@ public class RoomRealtimeStatuServiceImpl extends ServiceImpl<RoomRealtimeStatuD
         }
         }
     }
     }
 
 
+    @Override
+    public List<RoomRealDataStatuVO> realData(RoomRealtimeStatuRequest request) {
+        // 查询实时房态
+        LocalDateTime startTime = CommonUtil.localDateToTime(request.getStartDay(), TimeConstant.INTO_TIME);
+        LocalDateTime endTime = CommonUtil.localDateToTime(request.getEndDay(), TimeConstant.OUT_TIME);
+        List<RoomRealtimeStatuEntity> realTimeStatuList = this.getBaseMapper().getByRoomIdsAndTime(request.getRoomIds(), startTime, endTime);
+        Map<Long, RoomRealtimeStatuEntity> realtimeStatuMap = realTimeStatuList.stream().collect(Collectors.toMap(RoomRealtimeStatuEntity::getRoomId, value -> value));
+
+        // 查询订单信息
+        Set<Long> orderIds = realTimeStatuList.stream().filter(e -> e.getBizId() != -1).map(e -> e.getBizId()).collect(Collectors.toSet());
+        Map<Long, RoomUseInfo> roomUseInfoMap = new HashMap<>();
+        if (orderIds.size() > 0) {
+            List<RoomUseInfo> roomUseInfos = orderService.getRoomUseInfoByOrderIds(orderIds);
+            roomUseInfoMap = roomUseInfos.stream().collect(Collectors.toMap(RoomUseInfo::getOrderId, roomUseInfo -> roomUseInfo));
+        }
+
+        // 封装结果
+        Map<Long, RoomUseInfo> finalRoomUseInfoMap = roomUseInfoMap;
+        List<RoomRealDataStatuVO> result = request.getRoomIds().stream().map(roomId -> {
+            RoomRealDataStatuVO vo = new RoomRealDataStatuVO();
+            vo.setRoomId(roomId);
+
+            RoomRealtimeStatuEntity roomRealTimeStatu = realtimeStatuMap.get(roomId);
+            if (roomRealTimeStatu != null) {
+                vo.setStatu(roomRealTimeStatu.getStatu());
+                vo.setUseInfo(finalRoomUseInfoMap.get(roomRealTimeStatu.getBizId()));
+            } else {
+                vo.setStatu("1");
+            }
+
+            return vo;
+        }).collect(Collectors.toList());
+
+        return result;
+    }
+
     /**
     /**
      * 随机根据房型选房
      * 随机根据房型选房
      * @param lockRoomDTO 锁房参数
      * @param lockRoomDTO 锁房参数

+ 60 - 0
src/main/java/com/chuanghai/ihotel/vo/RoomRealDataStatuVO.java

@@ -0,0 +1,60 @@
+package com.chuanghai.ihotel.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: codingliang
+ * @Description: 房间实时状态vo
+ * @Date: 2022-08-04 16:46
+ * @Version: V1.0
+ **/
+@Data
+public class RoomRealDataStatuVO {
+
+    /**
+     * 房间id
+     */
+    private Long roomId;
+    /**
+     * 当前状态 1空闲、2预定、3入住、4脏房、5锁定
+     */
+    private String statu;
+    /**
+     * 房间使用信息 当前状态为2、3、4时该字段有值
+     */
+    private RoomUseInfo useInfo;
+
+    @Data
+    public static class RoomUseInfo {
+        /**
+         * 订单id
+         */
+        private Long orderId;
+        /**
+         * 客人姓名
+         */
+        private String userName;
+        /**
+         * 开始时间
+         */
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime enableStartTime;
+        /**
+         * 退房时间
+         */
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime enableEndTime;
+        /**
+         * 水起码 单位:吨
+         */
+        private String startOfWater;
+        /**
+         * 电起码 单位:度
+         */
+        private String startOfElectric;
+    }
+
+}

+ 12 - 0
src/main/resources/mapper/ihotel/HotelOrderDao.xml

@@ -30,5 +30,17 @@
         <result property="deleteFlag" column="delete_flag"/>
         <result property="deleteFlag" column="delete_flag"/>
     </resultMap>
     </resultMap>
 
 
+    <!-- 根据订单id查询用户信息 -->
+    <select id="getRoomUseInfoByOrderIds" resultType="com.chuanghai.ihotel.vo.RoomRealDataStatuVO$RoomUseInfo">
+        select
+               o.id orderId, o.user_name userName, o.enable_start_time enableStartTime, o.enable_end_time enableEndTime,
+               ob.start_of_water startOfWater, ob.start_of_electric startOfElectric
+        from hotel_order o
+            left join hotel_order_bill ob on o.id = ob.hotel_order_id
+        where
+              o.id in
+                <foreach collection="orderIds" item="item" open="(" close=")" index="i" separator=","> #{item} </foreach>
+    </select>
+
 
 
 </mapper>
 </mapper>

+ 13 - 0
src/main/resources/mapper/ihotel/RoomRealtimeStatuDao.xml

@@ -24,6 +24,7 @@
             and not(end_time <![CDATA[<]]> #{startTime} or start_time <![CDATA[>]]> #{endTime})
             and not(end_time <![CDATA[<]]> #{startTime} or start_time <![CDATA[>]]> #{endTime})
     </select>
     </select>
 
 
+    <!-- 查询指定时间段内处于繁忙状态的房间id -->
     <select id="getBusyRoomId" resultType="java.lang.Long">
     <select id="getBusyRoomId" resultType="java.lang.Long">
         select room_id
         select room_id
         from room_realtime_statu
         from room_realtime_statu
@@ -32,4 +33,16 @@
           and statu != '1'
           and statu != '1'
           and not(end_time <![CDATA[<]]> #{startTime} or start_time <![CDATA[>]]> #{endTime})
           and not(end_time <![CDATA[<]]> #{startTime} or start_time <![CDATA[>]]> #{endTime})
     </select>
     </select>
+
+    <select id="getByRoomIdsAndTime" resultMap="roomRealtimeStatuMap">
+        select *
+        from room_realtime_statu
+        where
+          statu != '1'
+          and room_id in
+            <foreach collection="roomIds" item="item" open="(" close=")" index="i" separator=","> #{item}
+            </foreach>
+          and not(end_time <![CDATA[<]]> #{startTime} or start_time <![CDATA[>]]> #{endTime})
+        group by room_id
+    </select>
 </mapper>
 </mapper>