当前位置: 首页 > article >正文

Java全栈项目:酒店客房管理系统

项目介绍

酒店客房管理系统是一个基于Spring Boot + Vue.js的全栈应用项目,主要用于酒店日常客房管理、预订、入住等业务操作的管理系统。

技术栈

后端

  • Spring Boot 2.7.x
  • MyBatis Plus
  • MySQL 8.0
  • Spring Security
  • JWT认证
  • Redis缓存

前端

  • Vue.js 3
  • Element Plus
  • Axios
  • Vuex
  • Vue Router

核心功能模块

  1. 用户管理

    • 员工账号管理
    • 角色权限控制
    • 登录认证
  2. 客房管理

    • 房间类型管理
    • 房间状态监控
    • 房间维护记录
  3. 预订管理

    • 在线预订
    • 预订变更
    • 预订取消
  4. 入住管理

    • 客人入住登记
    • 房间分配
    • 退房结算

核心代码示例

1. 房间实体类

@Data
@TableName("t_room")
public class Room {
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String roomNumber;
    
    private Integer roomType;
    
    private BigDecimal price;
    
    private Integer status; // 0-空闲 1-已预订 2-已入住 3-维护中
    
    private String description;
    
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

2. 预订服务接口

@Service
public class BookingServiceImpl implements BookingService {
    
    @Autowired
    private RoomMapper roomMapper;
    
    @Transactional
    public boolean createBooking(BookingDTO bookingDTO) {
        // 检查房间是否可预订
        Room room = roomMapper.selectById(bookingDTO.getRoomId());
        if (room == null || room.getStatus() != 0) {
            throw new BusinessException("房间不可预订");
        }
        
        // 创建预订记录
        Booking booking = new Booking();
        BeanUtils.copyProperties(bookingDTO, booking);
        
        // 更新房间状态
        room.setStatus(1);
        roomMapper.updateById(room);
        
        return bookingMapper.insert(booking) > 0;
    }
}

3. 前端预订表单组件

<template>
  <el-form :model="bookingForm" :rules="rules" ref="bookingForm">
    <el-form-item label="入住日期" prop="checkInDate">
      <el-date-picker
        v-model="bookingForm.checkInDate"
        type="date"
        placeholder="选择入住日期">
      </el-date-picker>
    </el-form-item>
    
    <el-form-item label="退房日期" prop="checkOutDate">
      <el-date-picker
        v-model="bookingForm.checkOutDate"
        type="date"
        placeholder="选择退房日期">
      </el-date-picker>
    </el-form-item>
    
    <el-form-item>
      <el-button type="primary" @click="submitBooking">提交预订</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      bookingForm: {
        checkInDate: '',
        checkOutDate: ''
      },
      rules: {
        checkInDate: [
          { required: true, message: '请选择入住日期', trigger: 'blur' }
        ],
        checkOutDate: [
          { required: true, message: '请选择退房日期', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    submitBooking() {
      this.$refs.bookingForm.validate(async (valid) => {
        if (valid) {
          try {
            await this.$api.booking.create(this.bookingForm)
            this.$message.success('预订成功')
          } catch (error) {
            this.$message.error('预订失败:' + error.message)
          }
        }
      })
    }
  }
}
</script>

项目亮点

  1. 采用前后端分离架构,提高开发效率和系统可维护性
  2. 使用JWT + Redis实现安全认证和权限控制
  3. 引入MyBatis Plus简化数据库操作
  4. 使用Vue.js 3 Composition API提升代码复用性
  5. 统一异常处理,规范接口响应格式

项目收获

  1. 深入理解Spring Boot全家桶的使用
  2. 掌握Vue.js 3新特性和开发模式
  3. 了解酒店业务流程和数据模型设计
  4. 提升项目架构和代码规范意识

项目优化方向

  1. 引入ElasticSearch优化搜索功能
  2. 添加微信小程序端
  3. 接入支付功能
  4. 优化系统性能和安全性
  5. 添加数据统计和可视化功能

Java酒店管理系统 - 用户管理与客房管理模块详解

一、用户管理模块

1. 数据库设计

-- 用户表
CREATE TABLE `sys_user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `real_name` varchar(50) COMMENT '真实姓名',
  `phone` varchar(20) COMMENT '手机号',
  `email` varchar(100) COMMENT '邮箱',
  `status` tinyint DEFAULT 1 COMMENT '状态:0-禁用 1-正常',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 角色表
CREATE TABLE `sys_role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) NOT NULL COMMENT '角色名称',
  `role_code` varchar(50) NOT NULL COMMENT '角色编码',
  `description` varchar(200) COMMENT '描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 用户角色关联表
CREATE TABLE `sys_user_role` (
  `user_id` bigint NOT NULL,
  `role_id` bigint NOT NULL,
  PRIMARY KEY (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 核心实体类

@Data
@TableName("sys_user")
public class SysUser {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String password;
    private String realName;
    private String phone;
    private String email;
    private Integer status;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
    
    @TableField(exist = false)
    private List<SysRole> roles;
}

@Data
@TableName("sys_role")
public class SysRole {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String roleName;
    private String roleCode;
    private String description;
}

3. 用户认证与权限控制

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    private UserDetailsServiceImpl userDetailsService;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/api/auth/login").permitAll()
            .antMatchers("/api/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager()))
            .addFilter(new JwtAuthorizationFilter(authenticationManager()));
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

4. 用户服务实现

@Service
@Transactional
public class UserServiceImpl implements UserService {
    
    @Autowired
    private SysUserMapper userMapper;
    
    @Autowired
    private PasswordEncoder passwordEncoder;
    
    public void createUser(UserDTO userDTO) {
        SysUser user = new SysUser();
        BeanUtils.copyProperties(userDTO, user);
        // 密码加密
        user.setPassword(passwordEncoder.encode(userDTO.getPassword()));
        userMapper.insert(user);
        
        // 保存用户角色关系
        if (userDTO.getRoleIds() != null) {
            userMapper.insertUserRoles(user.getId(), userDTO.getRoleIds());
        }
    }
    
    public void updateUserStatus(Long userId, Integer status) {
        SysUser user = new SysUser();
        user.setId(userId);
        user.setStatus(status);
        userMapper.updateById(user);
    }
}

二、客房管理模块

1. 数据库设计

-- 房间类型表
CREATE TABLE `room_type` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `type_name` varchar(50) NOT NULL COMMENT '类型名称',
  `price` decimal(10,2) NOT NULL COMMENT '价格',
  `capacity` int NOT NULL COMMENT '容纳人数',
  `description` varchar(500) COMMENT '描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 房间表
CREATE TABLE `room` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `room_number` varchar(20) NOT NULL COMMENT '房间号',
  `type_id` bigint NOT NULL COMMENT '房间类型ID',
  `floor` int NOT NULL COMMENT '楼层',
  `status` tinyint NOT NULL COMMENT '状态:0-空闲 1-已预订 2-已入住 3-维护中',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_room_number` (`room_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 房间维护记录表
CREATE TABLE `room_maintenance` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `room_id` bigint NOT NULL COMMENT '房间ID',
  `maintenance_type` varchar(50) NOT NULL COMMENT '维护类型',
  `description` varchar(500) COMMENT '维护描述',
  `start_time` datetime NOT NULL COMMENT '开始时间',
  `end_time` datetime COMMENT '结束时间',
  `status` tinyint NOT NULL COMMENT '状态:0-进行中 1-已完成',
  `operator` varchar(50) NOT NULL COMMENT '操作人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 房间状态监控服务

@Service
public class RoomMonitorService {
    
    @Autowired
    private RoomMapper roomMapper;
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    // 获取所有房间状态
    public Map<String, RoomStatusVO> getAllRoomStatus() {
        List<Room> rooms = roomMapper.selectList(null);
        Map<String, RoomStatusVO> statusMap = new HashMap<>();
        
        rooms.forEach(room -> {
            RoomStatusVO statusVO = new RoomStatusVO();
            statusVO.setRoomNumber(room.getRoomNumber());
            statusVO.setStatus(room.getStatus());
            statusVO.setFloor(room.getFloor());
            
            // 从Redis获取实时状态信息
            String key = "room:status:" + room.getId();
            RoomStatusDetail detail = (RoomStatusDetail) redisTemplate.opsForValue().get(key);
            if (detail != null) {
                statusVO.setLastUpdateTime(detail.getLastUpdateTime());
                statusVO.setCurrentGuest(detail.getCurrentGuest());
            }
            
            statusMap.put(room.getRoomNumber(), statusVO);
        });
        
        return statusMap;
    }
}

3. 房间维护记录管理

@Service
@Transactional
public class MaintenanceServiceImpl implements MaintenanceService {
    
    @Autowired
    private RoomMaintenanceMapper maintenanceMapper;
    
    @Autowired
    private RoomMapper roomMapper;
    
    // 创建维护记录
    public void createMaintenance(MaintenanceDTO dto) {
        // 检查房间状态
        Room room = roomMapper.selectById(dto.getRoomId());
        if (room.getStatus() == 2) {
            throw new BusinessException("房间已入住,无法进行维护");
        }
        
        // 创建维护记录
        RoomMaintenance maintenance = new RoomMaintenance();
        BeanUtils.copyProperties(dto, maintenance);
        maintenance.setStatus(0);
        maintenanceMapper.insert(maintenance);
        
        // 更新房间状态为维护中
        room.setStatus(3);
        roomMapper.updateById(room);
    }
    
    // 完成维护
    public void completeMaintenance(Long maintenanceId) {
        RoomMaintenance maintenance = maintenanceMapper.selectById(maintenanceId);
        if (maintenance == null) {
            throw new BusinessException("维护记录不存在");
        }
        
        maintenance.setStatus(1);
        maintenance.setEndTime(LocalDateTime.now());
        maintenanceMapper.updateById(maintenance);
        
        // 更新房间状态为空闲
        Room room = roomMapper.selectById(maintenance.getRoomId());
        room.setStatus(0);
        roomMapper.updateById(room);
    }
}

4. 前端房间状态监控组件

<template>
  <div class="room-monitor">
    <el-card v-for="floor in floors" :key="floor">
      <template #header>
        <div class="floor-title">{{ floor }}层</div>
      </template>
      
      <div class="room-grid">
        <el-tooltip
          v-for="room in getRoomsByFloor(floor)"
          :key="room.roomNumber"
          :content="getRoomTooltip(room)"
          placement="top"
        >
          <div
            class="room-item"
            :class="getRoomStatusClass(room.status)"
            @click="handleRoomClick(room)"
          >
            {{ room.roomNumber }}
          </div>
        </el-tooltip>
      </div>
    </el-card>
    
    <!-- 房间详情对话框 -->
    <el-dialog
      v-model="dialogVisible"
      title="房间详情"
      width="500px"
    >
      <room-detail
        v-if="selectedRoom"
        :room="selectedRoom"
        @update="handleRoomUpdate"
      />
    </el-dialog>
  </div>
</template>

<script>
import { ref, computed, onMounted } from 'vue'
import { useStore } from 'vuex'

export default {
  setup() {
    const store = useStore()
    const rooms = ref([])
    const selectedRoom = ref(null)
    const dialogVisible = ref(false)
    
    // 获取所有楼层
    const floors = computed(() => {
      const floorSet = new Set(rooms.value.map(room => room.floor))
      return Array.from(floorSet).sort()
    })
    
    // 按楼层获取房间
    const getRoomsByFloor = (floor) => {
      return rooms.value.filter(room => room.floor === floor)
    }
    
    // 获取房间状态样式
    const getRoomStatusClass = (status) => {
      const statusMap = {
        0: 'status-vacant',
        1: 'status-reserved',
        2: 'status-occupied',
        3: 'status-maintenance'
      }
      return statusMap[status]
    }
    
    // 初始化数据
    onMounted(async () => {
      const response = await store.dispatch('room/fetchRoomStatus')
      rooms.value = response.data
    })
    
    return {
      rooms,
      floors,
      selectedRoom,
      dialogVisible,
      getRoomsByFloor,
      getRoomStatusClass
    }
  }
}
</script>

<style scoped>
.room-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  gap: 10px;
}

.room-item {
  padding: 10px;
  text-align: center;
  border-radius: 4px;
  cursor: pointer;
}

.status-vacant {
  background-color: #67C23A;
  color: white;
}

.status-reserved {
  background-color: #E6A23C;
  color: white;
}

.status-occupied {
  background-color: #F56C6C;
  color: white;
}

.status-maintenance {
  background-color: #909399;
  color: white;
}
</style>

三、系统优化建议

  1. 用户管理优化:

    • 实现用户操作日志记录
    • 添加用户行为分析
    • 引入RBAC权限模型
    • 支持多因素认证
  2. 客房管理优化:

    • 添加房态图可视化展示
    • 实现房间实时状态推送
    • 引入房间清洁管理
    • 支持批量房间操作
  3. 性能优化:

    • 使用Redis缓存热点数据
    • 添加数据库索引
    • 实现分页查询
    • 优化SQL语句
  4. 安全性优化:

    • 加强密码策略
    • 实现操作审计
    • 防止SQL注入
    • XSS防护

Java酒店管理系统 - 预订与入住管理模块详解

三、预订管理模块

1. 数据库设计

-- 预订表
CREATE TABLE `booking` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `room_id` bigint NOT NULL COMMENT '房间ID',
  `guest_id` bigint NOT NULL COMMENT '客人ID',
  `check_in_date` date NOT NULL COMMENT '入住日期',
  `check_out_date` date NOT NULL COMMENT '退房日期',
  `status` tinyint NOT NULL COMMENT '状态:0-待确认 1-已确认 2-已取消 3-已完成',
  `total_amount` decimal(10,2) NOT NULL COMMENT '总金额',
  `remark` varchar(500) COMMENT '备注',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 客人信息表
CREATE TABLE `guest` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `id_card` varchar(20) NOT NULL COMMENT '身份证号',
  `phone` varchar(20) NOT NULL COMMENT '手机号',
  `email` varchar(100) COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 核心实体类

@Data
@TableName("booking")
public class Booking {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long roomId;
    private Long guestId;
    private LocalDate checkInDate;
    private LocalDate checkOutDate;
    private Integer status; // 使用BookingStatus枚举
    private BigDecimal totalAmount;
    private String remark;
    private LocalDateTime createTime;
    
    @TableField(exist = false)
    private Room room;
    
    @TableField(exist = false)
    private Guest guest;
}

public enum BookingStatus {
    PENDING_CONFIRMATION(0),
    CONFIRMED(1),
    CANCELLED(2),
    COMPLETED(3);
    
    private final int code;
    // 构造函数和getter
}

3. 预订服务实现

@Service
@Transactional
public class BookingServiceImpl implements BookingService {
    
    @Autowired
    private BookingMapper bookingMapper;
    
    @Autowired
    private RoomService roomService;
    
    @Autowired
    private GuestService guestService;
    
    // 创建预订
    public BookingVO createBooking(BookingCreateDTO dto) {
        // 验证房间可用性
        Room room = roomService.validateRoomAvailable(
            dto.getRoomId(), 
            dto.getCheckInDate(), 
            dto.getCheckOutDate()
        );
        
        // 创建/更新客人信息
        Guest guest = guestService.createOrUpdateGuest(dto.getGuestInfo());
        
        // 计算预订金额
        BigDecimal totalAmount = calculateTotalAmount(
            room.getPrice(),
            dto.getCheckInDate(),
            dto.getCheckOutDate()
        );
        
        // 保存预订记录
        Booking booking = new Booking();
        BeanUtils.copyProperties(dto, booking);
        booking.setGuestId(guest.getId());
        booking.setTotalAmount(totalAmount);
        booking.setStatus(BookingStatus.PENDING_CONFIRMATION.getCode());
        bookingMapper.insert(booking);
        
        // 更新房间状态
        roomService.updateRoomStatus(room.getId(), RoomStatus.RESERVED);
        
        return convertToVO(booking);
    }
    
    // 取消预订
    public void cancelBooking(Long bookingId) {
        Booking booking = bookingMapper.selectById(bookingId);
        if (booking.getStatus() != BookingStatus.CONFIRMED.getCode()) {
            throw new BusinessException("只有已确认的预订可以取消");
        }
        
        // 更新预订状态
        booking.setStatus(BookingStatus.CANCELLED.getCode());
        bookingMapper.updateById(booking);
        
        // 释放房间
        roomService.updateRoomStatus(booking.getRoomId(), RoomStatus.VACANT);
    }
}

4. 前端预订组件

<template>
  <div class="booking-container">
    <el-steps :active="currentStep" finish-status="success">
      <el-step title="选择房型"></el-step>
      <el-step title="填写信息"></el-step>
      <el-step title="确认订单"></el-step>
    </el-steps>
    
    <!-- 步骤1:房型选择 -->
    <div v-show="currentStep === 0">
      <room-type-selector 
        :check-in-date="form.checkInDate"
        :check-out-date="form.checkOutDate"
        @select="handleRoomSelect"
      />
    </div>
    
    <!-- 步骤2:客人信息 -->
    <div v-show="currentStep === 1">
      <guest-info-form 
        v-model="form.guestInfo"
        @validate="handleGuestValidate"
      />
    </div>
    
    <!-- 步骤3:订单确认 -->
    <div v-show="currentStep === 2">
      <booking-summary 
        :booking-info="form"
        @confirm="handleConfirm"
      />
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'

const currentStep = ref(0)
const form = ref({
  checkInDate: '',
  checkOutDate: '',
  roomId: null,
  guestInfo: {},
  totalAmount: 0
})

const handleRoomSelect = (room) => {
  form.value.roomId = room.id
  currentStep.value++
}

const handleConfirm = async () => {
  try {
    await api.booking.create(form.value)
    router.push('/booking/success')
  } catch (error) {
    ElMessage.error('预订失败: ' + error.message)
  }
}
</script>

四、入住管理模块

1. 数据库设计

-- 入住记录表
CREATE TABLE `check_in` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `booking_id` bigint COMMENT '关联预订ID',
  `room_id` bigint NOT NULL,
  `guest_id` bigint NOT NULL,
  `check_in_time` datetime NOT NULL,
  `expected_check_out` date NOT NULL,
  `actual_check_out` datetime COMMENT '实际退房时间',
  `deposit` decimal(10,2) COMMENT '押金',
  `status` tinyint NOT NULL COMMENT '0-已入住 1-已退房',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 消费明细表
CREATE TABLE `consumption` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `check_in_id` bigint NOT NULL,
  `item_name` varchar(100) NOT NULL COMMENT '消费项目',
  `amount` decimal(10,2) NOT NULL,
  `quantity` int NOT NULL DEFAULT 1,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 入住服务实现

@Service
@Transactional
public class CheckInServiceImpl implements CheckInService {
    
    @Autowired
    private CheckInMapper checkInMapper;
    
    @Autowired
    private RoomService roomService;
    
    @Autowired
    private BookingService bookingService;
    
    // 办理入住
    public CheckInVO processCheckIn(CheckInDTO dto) {
        // 验证预订信息
        Booking booking = bookingService.validateBooking(
            dto.getBookingId(), 
            BookingStatus.CONFIRMED
        );
        
        // 分配房间
        Room room = roomService.assignRoom(booking.getRoomId());
        
        // 创建入住记录
        CheckIn checkIn = new CheckIn();
        checkIn.setBookingId(dto.getBookingId());
        checkIn.setRoomId(room.getId());
        checkIn.setGuestId(booking.getGuestId());
        checkIn.setCheckInTime(LocalDateTime.now());
        checkIn.setExpectedCheckOut(booking.getCheckOutDate());
        checkIn.setDeposit(dto.getDeposit());
        checkIn.setStatus(CheckInStatus.CHECKED_IN.getCode());
        checkInMapper.insert(checkIn);
        
        // 更新房间状态
        roomService.updateRoomStatus(room.getId(), RoomStatus.OCCUPIED);
        
        return convertToVO(checkIn);
    }
    
    // 退房结算
    public CheckOutVO processCheckOut(Long checkInId) {
        CheckIn checkIn = checkInMapper.selectById(checkInId);
        if (checkIn.getStatus() != CheckInStatus.CHECKED_IN.getCode()) {
            throw new BusinessException("该房间未处于入住状态");
        }
        
        // 计算总费用
        BigDecimal roomCharge = calculateRoomCharge(checkIn);
        BigDecimal consumptionTotal = calculateConsumptionTotal(checkInId);
        BigDecimal totalAmount = roomCharge.add(consumptionTotal);
        
        // 更新入住记录
        checkIn.setActualCheckOut(LocalDateTime.now());
        checkIn.setStatus(CheckInStatus.CHECKED_OUT.getCode());
        checkInMapper.updateById(checkIn);
        
        // 生成结算单
        CheckOutVO vo = new CheckOutVO();
        vo.setRoomCharge(roomCharge);
        vo.setConsumptionTotal(consumptionTotal);
        vo.setDepositDeduct(checkIn.getDeposit());
        vo.setTotalAmount(totalAmount);
        vo.setBalance(totalAmount.subtract(checkIn.getDeposit()));
        
        // 更新房间状态
        roomService.updateRoomStatus(checkIn.getRoomId(), RoomStatus.VACANT);
        
        return vo;
    }
}

3. 前端入住管理组件

<template>
  <div class="check-in-management">
    <!-- 入住登记 -->
    <el-card class="check-in-form">
      <el-form :model="checkInForm" label-width="120px">
        <el-form-item label="预订编号">
          <el-input 
            v-model="checkInForm.bookingId"
            placeholder="输入预订编号或扫描二维码"
          >
            <template #append>
              <el-button icon="el-icon-search" @click="searchBooking"/>
            </template>
          </el-input>
        </el-form-item>
        
        <el-form-item label="分配房间">
          <room-selector 
            v-model="checkInForm.roomId"
            :status-filter="[0,1]" 
          />
        </el-form-item>
        
        <el-form-item label="押金金额">
          <el-input-number 
            v-model="checkInForm.deposit" 
            :min="0" 
            :precision="2"
          />
        </el-form-item>
      </el-form>
    </el-card>
    
    <!-- 退房结算 -->
    <el-dialog title="退房结算" v-model="checkOutDialogVisible">
      <div v-if="currentCheckIn">
        <el-descriptions :column="1" border>
          <el-descriptions-item label="房号">{{ currentCheckIn.roomNumber }}</el-descriptions-item>
          <el-descriptions-item label="入住日期">{{ currentCheckIn.checkInTime }}</el-descriptions-item>
          <el-descriptions-item label="退房日期">{{ currentCheckIn.actualCheckOut }}</el-descriptions-item>
          <el-descriptions-item label="房费总计">{{ currentCheckOut.roomCharge }}</el-descriptions-item>
          <el-descriptions-item label="消费合计">{{ currentCheckOut.consumptionTotal }}</el-descriptions-item>
          <el-descriptions-item label="应退押金">{{ currentCheckOut.balance }}</el-descriptions-item>
        </el-descriptions>
        
        <el-button type="primary" @click="printInvoice">打印发票</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { useCheckInStore } from '@/stores/checkIn'

const checkInStore = useCheckInStore()
const checkInForm = ref({
  bookingId: null,
  roomId: null,
  deposit: 500
})

const searchBooking = async () => {
  try {
    const booking = await api.booking.getById(checkInForm.value.bookingId)
    checkInForm.value.roomId = booking.roomId
  } catch (error) {
    ElMessage.error('未找到预订信息')
  }
}
</script>

五、系统优化建议

  1. 预订管理优化:

    • 引入工作流引擎处理复杂预订流程
    • 添加房价日历功能
    • 实现超额预订控制
    • 集成第三方支付
  2. 入住管理优化:

    • 添加人脸识别登记
    • 实现电子门锁集成
    • 开发移动端房务管理
    • 添加钟点房支持
  3. 业务扩展:

    • 会议室预订管理
    • 餐饮消费集成
    • 会员积分系统
    • 团体客户管理
  4. 技术增强:

    • 使用WebSocket实现实时房态更新
    • 添加分布式事务支持
    • 实现自动分房算法
    • 构建数据中台进行业务分析

http://www.kler.cn/a/536587.html

相关文章:

  • 【C#】任务调度的实现原理与组件应用Quartz.Net
  • 第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)
  • $route 和 $router 的区别是什么?
  • Spring容器初始化扩展点:ApplicationContextInitializer
  • 华为OD机试E卷 --矩阵扩散--24年OD统一考试(Java JS Python C C++)
  • LLMs之data:synthetic-data-generator的简介、安装和使用方法、案例应用之详细攻略
  • 【华为OD机考】2024E+D卷真题【完全原创题解 详细考点分类 不断更新题目 六种主流语言Py+Java+Cpp+C+Js+Go】
  • Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端
  • OnlyOffice 全面指南:从基础使用到深度自定义
  • postgreSQL16.6源码安装
  • unity学习29:摄像机camera相关skybox 和 Render Texture测试效果
  • IDEA启动项目慢问题处理
  • 详解代理模式
  • VSCode便捷开发
  • JS逆向案例-ali231补环境 - 14
  • 日本游戏机市场5年来首次陷入萎缩;特斯拉招人推进人形机器人量产;任天堂专利显示Switch2手柄可用作鼠标...| 游戏智眼日报
  • AWS SMS短信通知实战:使用 Pinpoint SMS Voice V2 完整指南
  • MFC 应用最小化到系统托盘
  • NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理
  • 如何轻松将Matlab生成的图表嵌入PowerPoint演示文稿
  • 23、深入理解 Java Stream:高效处理数据的利器
  • 什么是高光谱成像相机?
  • .NET周刊【1月第3期 2025-01-19】
  • 网站改HTTPS方法
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-downloads.py
  • PHP云调查考试问卷系统小程序