浏览代码

feature: 房态-换房

xiari 1 年之前
父节点
当前提交
ed278cab4e

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

@@ -8,6 +8,9 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.basics.domain.bo.QueryRoomBo;
+import org.dromara.common.core.enums.FJLXEnum;
+import org.dromara.common.core.enums.HotelRoomStatusEnum;
 import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
@@ -59,6 +62,14 @@ public class PtRoomController extends BaseController {
         return ptRoomService.queryPageList(bo, pageQuery);
     }
 
+//    @SaCheckPermission("room:ptRoom:getCountByStatus")
+    @GetMapping("/getPageListByAreaIds")
+    public TableDataInfo<PtRoomVo> getPageListByAreaIds(QueryRoomBo bo, PageQuery pageQuery) {
+        bo.setStatus(HotelRoomStatusEnum.OK.code());
+        bo.setRoomType(FJLXEnum.KF.code());
+        return ptRoomService.queryPageListByAreaIds(bo, pageQuery);
+    }
+
     @SaCheckPermission("room:ptRoom:list")
     @GetMapping("/queryRoom2AreaList")
     public R<Map<Long, List<PtAreaVo>>> queryRoom2AreaList(PtRoomBo bo) {
@@ -178,4 +189,8 @@ public class PtRoomController extends BaseController {
     public R<Map<String, Long>> getCountByStatus() {
         return R.ok(ptRoomService.getCountByStatus());
     }
+
+    /**
+     * 根据房间编号和楼层查询房间信息
+     */
 }

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

@@ -0,0 +1,48 @@
+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.PtRoom;
+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-08-09
+ */
+@Data
+public class QueryRoomBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2066736243150515345L;
+
+
+    /**
+     * 房间编码
+     */
+    private String roomCode;
+
+    /**
+     * 楼层
+     */
+    private List<Long> floorIds;
+
+    private String status;
+
+    private String roomType;
+
+
+
+
+
+}

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

@@ -1,6 +1,7 @@
 package org.dromara.backstage.basics.service;
 
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
+import org.dromara.backstage.basics.domain.bo.QueryRoomBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.vo.PtRoomVo;
 import org.dromara.backstage.basics.domain.bo.PtRoomBo;
@@ -36,6 +37,8 @@ public interface IPtRoomService {
      */
     TableDataInfo<PtRoomVo> queryPageList(PtRoomBo bo, PageQuery pageQuery);
 
+    TableDataInfo<PtRoomVo> queryPageListByAreaIds(QueryRoomBo bo, PageQuery pageQuery);
+
     List<PtRoomVo> queryRoomByAreaId(Long areaId);
 
     /**
@@ -105,4 +108,6 @@ public interface IPtRoomService {
      * @return 更新结果
      */
     Boolean updateGuestRoomStatus(String roomCode, String tenantId, String roomStatus);
+
+
 }

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

@@ -3,8 +3,11 @@ 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.update.LambdaUpdateWrapper;
+import org.dromara.backstage.basics.domain.PtRoomType;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
+import org.dromara.backstage.basics.domain.bo.QueryRoomBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
+import org.dromara.backstage.basics.mapper.PtRoomTypeMapper;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.enums.FJLXEnum;
 import org.dromara.common.core.enums.HotelRoomStatusEnum;
@@ -43,6 +46,8 @@ public class PtRoomServiceImpl implements IPtRoomService {
 
     private final PtAreaServiceImpl areaService;
 
+    private final PtRoomTypeMapper roomTypeMapper;
+
 //    public static final String ROOM_KF = "10";
 
     /**
@@ -90,6 +95,29 @@ public class PtRoomServiceImpl implements IPtRoomService {
         return TableDataInfo.build(result);
     }
 
+    @Override
+    public TableDataInfo<PtRoomVo> queryPageListByAreaIds(QueryRoomBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PtRoom> lqw = new LambdaQueryWrapper<>();
+        lqw.eq(StringUtils.isNotBlank(bo.getRoomType()),PtRoom::getRoomType, bo.getRoomType());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()),PtRoom::getStatus, bo.getStatus());
+        lqw.in(CollectionUtil.isNotEmpty(bo.getFloorIds()),PtRoom::getAreaId, bo.getFloorIds())
+            .and(StringUtils.isNotBlank(bo.getRoomCode()),
+                e -> e.eq(PtRoom::getRoomCode, bo.getRoomCode()).or().eq(PtRoom::getRoomName, bo.getRoomCode()));
+        lqw.orderByDesc(PtRoom::getCreateTime);
+        Page<PtRoomVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<PtRoomVo> records = result.getRecords();
+        if(CollectionUtil.isNotEmpty(records)){
+            List<PtRoomType> ptRoomTypes = roomTypeMapper.selectBatchIds(records.stream().map(PtRoomVo::getGuestRoomType).collect(Collectors.toList()));
+            Map<Long, PtRoomType> ptRoomTypeMap = ptRoomTypes.stream().collect(Collectors.toMap(PtRoomType::getRoomTypeId, e -> e));
+            records.forEach(x -> {
+                PtRoomType ptRoomType = ptRoomTypeMap.get(x.getGuestRoomType() == null ? "" : x.getGuestRoomType());
+                x.setGuestRoomTypeName(Optional.ofNullable(ptRoomType).map(PtRoomType::getRoomTypeName).orElse(""));
+            });
+        }
+
+        return TableDataInfo.build(result);
+    }
+
     /**
      * 根据areaId查询下面的所有房间
      */

+ 8 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfOrderController.java

@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.hotel.domain.bo.ChangeRoomBo;
 import org.dromara.hotel.domain.bo.KfGuestBo;
 import org.dromara.hotel.domain.vo.KfTeamGuestVo;
 import org.springframework.web.bind.annotation.*;
@@ -197,4 +198,11 @@ public class KfOrderController extends BaseController {
         return toAjax(kfOrderService.checkInTeamFromRoomStatus(bo));
     }
 
+    // 更换房间
+    @PostMapping("/changeRoom")
+    @Log(title = "更换房间for房态", businessType = BusinessType.INSERT)
+    public R<Void> changeRoom(@Validated(EditGroup.class) @RequestBody ChangeRoomBo bo) {
+        return toAjax(kfOrderService.changeRoom(bo));
+    }
+
 }

+ 87 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/bo/ChangeRoomBo.java

@@ -0,0 +1,87 @@
+package org.dromara.hotel.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.hotel.domain.KfOrder;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 更换房间Bo
+ *
+ * @author bing
+ * @date 2024-11-13
+ */
+@Data
+public class ChangeRoomBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 4524605401498591013L;
+    /**
+     * 主键
+     */
+    @NotNull(message = "新客房不能为空", groups = {EditGroup.class})
+    private String newRoomCode;
+
+    /**
+     * 客人ID
+     */
+//    @NotNull(message = "客人ID不能为空", groups = {AddGroup.class})
+//    private Long guestId;
+
+    /**
+     * 客人姓名
+     */
+//    private String guestName;
+
+    /**
+     * 客团名称
+     */
+//    private String teamName;
+
+    /**
+     * 房间编号
+     */
+//    @NotBlank(message = "房间编号不能为空", groups = {AddGroup.class, EditGroup.class})
+//    private String roomCode;
+
+    /**
+     * 房间名称
+     */
+//    private String roomName;
+
+    /**
+     * 入住时间
+     */
+    @NotNull(message = "入住时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Date startTime;
+
+    /**
+     * 退住时间
+     */
+    @NotNull(message = "退住时间不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Date endTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 原始订单信息
+     */
+    @Valid
+    @NotNull(message = "原始订单信息不能为空", groups = {AddGroup.class, EditGroup.class})
+    private List<KfOrderBo> oldOrderList;
+
+}

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

@@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
+import org.dromara.hotel.domain.bo.ChangeRoomBo;
 import org.dromara.hotel.domain.bo.KfGuestBo;
 import org.dromara.hotel.domain.bo.KfOrderBo;
 import org.dromara.hotel.domain.vo.KfOrderVo;
@@ -104,6 +105,8 @@ public interface IKfOrderService {
 
 
     boolean checkInTeamFromRoomStatus(KfOrderBo bo);
+
+    boolean changeRoom(ChangeRoomBo bo);
     /**
      * 办理团客入住
       * @param remoteBo 入住业务对象

+ 45 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java

@@ -25,6 +25,7 @@ import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.hotel.api.domain.bo.RemoteOrderBo;
 import org.dromara.hotel.api.domain.vo.RemoteOrderVo;
 import org.dromara.hotel.domain.KfOrder;
+import org.dromara.hotel.domain.bo.ChangeRoomBo;
 import org.dromara.hotel.domain.bo.KfGuestBo;
 import org.dromara.hotel.domain.bo.KfOrderBo;
 import org.dromara.hotel.domain.vo.*;
@@ -446,6 +447,50 @@ public class KfOrderServiceImpl implements IKfOrderService {
         return remoteOrderVo != null;
     }
 
+    @Override
+    @Transactional
+    public boolean changeRoom(ChangeRoomBo bo) {
+        List<KfOrderBo> oldOrderList = bo.getOldOrderList();
+        if(CollectionUtil.isEmpty(oldOrderList)){
+            throw new ServiceException("无原始订单信息,无需办理换房");
+        }
+        //处理原始订单信息
+        //1.修改订单状态为退房
+        List<KfOrder> oldOrders = new ArrayList<>();
+        for (KfOrderBo kfOrderBo : oldOrderList) {
+            KfOrder kfOrder = new KfOrder();
+            kfOrder.setId(kfOrderBo.getId());
+            kfOrder.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_TF);
+            oldOrders.add(kfOrder);
+        }
+        baseMapper.updateBatchById(oldOrders);
+        //2.修改房间状态为脏房
+        String oldRoomCode = oldOrderList.get(0).getRoomCode();
+        baseMapper.updateRoomStatus(oldRoomCode, HotelRoomStatusEnum.ZF.code());
+
+        //新增新订单
+        //1.根据原始订单进行新增订单
+        List<KfOrder> newOrders = MapstructUtils.convert(oldOrderList, KfOrder.class);
+        if (newOrders != null) {
+            newOrders.forEach(item -> {
+                item.setId(null);
+                item.setOrderStatus(HotelBusinessConstants.ORDER_STATUS_RZ);
+                item.setStartTime(bo.getStartTime());
+                item.setEndTime(bo.getEndTime());
+                String defaultRemark = "由"+oldRoomCode+"换到"+bo.getNewRoomCode();
+                String remark = StringUtils.isNotBlank(item.getRemark()) ? item.getRemark() + ";" + defaultRemark : defaultRemark;
+                item.setRemark(remark);
+            });
+
+            baseMapper.insertBatch(newOrders);
+            //2.修改房间状态为入住
+            baseMapper.updateRoomStatus(bo.getNewRoomCode(), HotelRoomStatusEnum.YZ.code());
+        }
+
+
+        return true;
+    }
+
     /**
      * 办理团客入住
      *