Java大作业——酒店管理系统(四):客房管理

Java大作业(一)介绍了全部功能点

一、Main类——用于启动整个程序

......代码于Java大作业(二)

二、LoginWindowWindow类——用于登录

......代码于Java大作业(二)

三、FunctionSelectionWindow类——用于选择对应的功能

......代码于Java大作业(二)

四、AccountManagementWindow类——用于管理酒店工作人员账户

......代码于Java大作业(三)

   

五、RoomManagementWindow类——用于办理预定、入住、退房

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class RoomManagementWindow extends JFrame {
    private JTable roomTable;//用于展示客房信息的表格
    private DefaultTableModel tableModel;//管理表格数据
    private JButton reserveButton;//触发客房预订操作按钮
    private JButton checkInButton;//办理入住操作按钮
    private JButton checkOutButton;//执行退房操作按钮
    private List<Customer> customers;//存当前入住客户信息
    private List<Customer> customerHistory;//记过往客户入住历史

    //构造客房管理窗口
    public RoomManagementWindow() {
        setTitle("客房管理");
        setSize(1200, 800);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);

        // 初始化房间数据文件
        initializeRoomDataFile();
        customers = loadCustomerData();
        customerHistory = loadCustomerHistoryData();

        // 左侧显示酒店客房管理
        JPanel leftPanel = new JPanel();
        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
        JLabel label = new JLabel("酒店客房管理", SwingConstants.CENTER);
        label.setFont(new Font("Serif", Font.BOLD, 24));
        label.setAlignmentX(Component.CENTER_ALIGNMENT);
        leftPanel.add(Box.createVerticalGlue());
        leftPanel.add(label);
        leftPanel.add(Box.createVerticalGlue());
        leftPanel.setBackground(Color.LIGHT_GRAY);

        // 右侧显示客房信息
        JPanel rightPanel = new JPanel(new BorderLayout());

        // 客房表格
        tableModel = new DefaultTableModel(new Object[]{"房间号", "房型", "金额", "状态", "入住时间", "预计离开日期", "顾客信息"}, 0);
        roomTable = new JTable(tableModel);
        roomTable.getColumnModel().getColumn(6).setCellRenderer(new ButtonRenderer());
        roomTable.getColumnModel().getColumn(6).setCellEditor(new ButtonEditor(new JCheckBox()));
        JScrollPane scrollPane = new JScrollPane(roomTable);

        // 加载房间信息
        loadRooms();

        rightPanel.add(scrollPane, BorderLayout.CENTER);

        // 预定按钮
        reserveButton = new JButton("预定");
        reserveButton.addActionListener(new ReserveActionListener());

        // 入住按钮
        checkInButton = new JButton("入住");
        checkInButton.addActionListener(new CheckInActionListener());

        // 退房按钮
        checkOutButton = new JButton("退房");
        checkOutButton.addActionListener(new CheckOutActionListener());

        // 将三个按钮放在一个面板中
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(reserveButton);
        buttonPanel.add(checkInButton);
        buttonPanel.add(checkOutButton);

        rightPanel.add(buttonPanel, BorderLayout.SOUTH);

        // 分割窗格
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
        splitPane.setDividerLocation(200);

        setContentPane(splitPane);
        setVisible(true);
    }

    //用于加载客房信息
    private void loadRooms() {
        tableModel.setRowCount(0);
        HashMap<String, Room> rooms = loadRoomData();
        for (Map.Entry<String, Room> entry : rooms.entrySet()) {
            Room room = entry.getValue();
            String checkInDate = "";
            String expectedCheckOutDate = "";
            String customerInfo = "查看";
            for (Customer customer : customers) {
                if (customer.getRoomNumber().equals(room.getNumber())) {
                    checkInDate = customer.getCheckInDate();
                    expectedCheckOutDate = customer.getExpectedCheckOutDate();
                    customerInfo = "查看";
                    break;
                }
            }
            tableModel.addRow(new Object[]{
                    room.getNumber(),
                    room.getType(),
                    room.getPrice(),
                    room.getStatus(),
                    checkInDate,
                    expectedCheckOutDate,
                    customerInfo
            });
        }
    }

    //读取指定内容
    private HashMap<String, Room> loadRoomData() {
        HashMap<String, Room> rooms = new HashMap<>();
        String filePath = "Hotel management system/src/Room";

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(",", -1);
                if (parts.length == 4) {
                    String number = parts[0].trim();
                    String type = parts[1].trim();
                    double price = Double.parseDouble(parts[2].trim());
                    String status = parts[3].trim();
                    rooms.put(number, new Room(number, type, price, status));
                } else {
                    System.err.println("Invalid line: " + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Error reading Room file: " + e.getMessage());
        }
        return rooms;
    }

    //读取数据,解析构建Customer对象存进列表
    private List<Customer> loadCustomerData() {
        List<Customer> customers = new ArrayList<>();
        String customerFilePath = "Hotel management system/src/Customer";

        try (BufferedReader br = new BufferedReader(new FileReader(customerFilePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(",", -1);
                if (parts.length == 8) { // 增加预计离开日期字段
                    int id = Integer.parseInt(parts[0].trim());
                    String roomNumber = parts[1].trim();
                    String name = parts[2].trim();
                    String phone = parts[3].trim();
                    String checkInDate = parts[4].trim();
                    String expectedCheckOutDate = parts[5].trim();
                    String status = parts[6].trim();
                    String idCard = parts[7].trim();
                    customers.add(new Customer(id, roomNumber, name, phone, checkInDate, expectedCheckOutDate, status, idCard));
                } else {
                    System.err.println("Invalid line: " + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Error reading customers file: " + e.getMessage());
        }
        return customers;
    }

    //文件读数据,解析并完善Customer对象信息存列表
    private List<Customer> loadCustomerHistoryData() {
        List<Customer> customerHistory = new ArrayList<>();
        String customerHistoryFilePath = "Hotel management system/src/CustomerHistory";

        try (BufferedReader br = new BufferedReader(new FileReader(customerHistoryFilePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(",", -1);
                if (parts.length == 10) { // 增加实际居住天数和消费金额字段
                    int id = Integer.parseInt(parts[0].trim());
                    String roomNumber = parts[1].trim();
                    String name = parts[2].trim();
                    String phone = parts[3].trim();
                    String checkInDate = parts[4].trim();
                    String expectedCheckOutDate = parts[5].trim();
                    String status = parts[6].trim();
                    String idCard = parts[7].trim();
                    int actualDays = Integer.parseInt(parts[8].trim());
                    double totalCost = Double.parseDouble(parts[9].trim());
                    customerHistory.add(new Customer(id, roomNumber, name, phone, checkInDate, expectedCheckOutDate, status, idCard));
                    customerHistory.get(customerHistory.size() - 1).setActualDays(actualDays);
                    customerHistory.get(customerHistory.size() - 1).setTotalCost(totalCost);
                } else {
                    System.err.println("Invalid line: " + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Error reading customer history file: " + e.getMessage());
        }
        return customerHistory;
    }

    //不存在或为空时初始化写入默认客房信息
    private void initializeRoomDataFile() {
        String filePath = "Hotel management system/src/Room";
        File file = new File(filePath);

        if (!file.exists() || file.length() == 0) {
            try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
                bw.write("501,普通单人房,100,未预定\n");
                bw.write("502,普通单人房,100,未预定\n");
                bw.write("503,普通单人房,100,未预定\n");
                bw.write("504,豪华单人房,150,未预定\n");
                bw.write("505,豪华单人房,150,未预定\n");
                bw.write("506,豪华单人房,150,未预定\n");
                bw.write("601,普通双床房,130,未预定\n");
                bw.write("602,普通双床房,130,未预定\n");
                bw.write("603,普通双床房,130,未预定\n");
                bw.write("604,豪华双床房,180,未预定\n");
                bw.write("605,豪华双床房,180,未预定\n");
                bw.write("606,豪华双床房,180,未预定\n");
            } catch (IOException e) {
                e.printStackTrace();
                System.err.println("Error initializing Room file: " + e.getMessage());
            }
        }
    }

    // 响应预订按钮点击,获取用户输入,验证选择房间状态后更新并保存相关信息,
    // 提示预订成功或部分房间问题消息。
    private class ReserveActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            int[] selectedRows = roomTable.getSelectedRows();
            if (selectedRows.length == 0) {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "请选择要预定的房间!");
                return;
            }

            // 弹出预定窗口
            String checkInDate = JOptionPane.showInputDialog(RoomManagementWindow.this, "请输入入住日期(格式:YYYY-MM-DD)");
            if (checkInDate == null) {
                return; // 用户关闭或取消了对话框
            }

            String expectedCheckOutDate = JOptionPane.showInputDialog(RoomManagementWindow.this, "请输入预计离开日期(格式:YYYY-MM-DD)");
            if (expectedCheckOutDate == null) {
                return; // 用户关闭或取消了对话框
            }

            String customerName = JOptionPane.showInputDialog(RoomManagementWindow.this, "请输入顾客姓名");
            if (customerName == null) {
                return; // 用户关闭或取消了对话框
            }

            String customerPhone = JOptionPane.showInputDialog(RoomManagementWindow.this, "请输入顾客电话");
            if (customerPhone == null) {
                return; // 用户关闭或取消了对话框
            }

            boolean allReserved = true;
            HashMap<String, Room> rooms = loadRoomData();
            for (int row : selectedRows) {
                String roomNumber = (String) tableModel.getValueAt(row, 0);
                Room room = rooms.get(roomNumber);
                if (room != null && room.getStatus().equals("未预定")) {
                    room.setStatus("已预定");
                    tableModel.setValueAt("已预定", row, 3);
                    tableModel.setValueAt(checkInDate, row, 4);
                    tableModel.setValueAt(expectedCheckOutDate, row, 5);
                    saveCustomerInfo(roomNumber, customerName, customerPhone, checkInDate, expectedCheckOutDate, "已预定", "");
                } else {
                    allReserved = false;
                }
            }

            if (allReserved) {
                saveAllRoomData(rooms);
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "所有选定房间已成功预定!");
            } else {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "部分房间已被预定或不存在!");
            }
        }
    }

    // 响应入住按钮点击,获取身份证号,依所选房间状态更新并保存相关信息,
    // 提示全部或部分房间入住成功与否消息。
    private class CheckInActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            int[] selectedRows = roomTable.getSelectedRows();
            if (selectedRows.length == 0) {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "请选择要入住的房间!");
                return;
            }

            // 弹出入住窗口
            String customerID = JOptionPane.showInputDialog(RoomManagementWindow.this, "请输入顾客身份证号");
            if (customerID == null) {
                return; // 用户关闭或取消了对话框
            }

            boolean allCheckedIn = true;
            HashMap<String, Room> rooms = loadRoomData();
            for (int row : selectedRows) {
                String roomNumber = (String) tableModel.getValueAt(row, 0);
                Room room = rooms.get(roomNumber);
                if (room != null && room.getStatus().equals("已预定")) {
                    room.setStatus("已入住");
                    tableModel.setValueAt("已入住", row, 3);
                    updateCustomerInfo(roomNumber, customerID, "已入住");
                } else {
                    allCheckedIn = false;
                }
            }

            if (allCheckedIn) {
                saveAllRoomData(rooms);
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "所有选定房间已成功入住!");
            } else {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "部分房间未预定或不存在!");
            }
        }
    }

    // 依房间号从订单数据里统计未支付餐费总和,
    // 标记对应订单为已支付,更新并保存订单数据后返回该总和。
    private double processUnpaidOrders(String roomNumber) {
        double totalUnpaid = 0.0;
        List<Order> orders = loadOrderData();

        for (Order order : orders) {
            if (order.getRoomNumber().equals(roomNumber) && order.getPaymentStatus().equals("未支付")) {
                totalUnpaid += order.getMealCost();
                // 标记订单为已支付
                order.setPaymentStatus("已支付");
            }
        }

        // 保存更新后的订单数据
        saveAllOrderData(orders);

        return totalUnpaid;
    }

    // 响应退房按钮点击,按所选房间情况处理退房,
    // 涉及费用计算、支付方式选择、信息更新等,提示退房成功与否消息。
    private class CheckOutActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            int[] selectedRows = roomTable.getSelectedRows();
            if (selectedRows.length == 0) {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "请选择要退房的房间!");
                return;
            }

            boolean allCheckedOut = true;
            HashMap<String, Room> rooms = loadRoomData();
            for (int row : selectedRows) {
                String roomNumber = (String) tableModel.getValueAt(row, 0);
                Room room = rooms.get(roomNumber);
                Customer customer = null; // 声明 customer 变量

                if (room != null) {
                    // 查找与房间号相关的顾客
                    for (Customer c : customers) {
                        if (c.getRoomNumber().equals(roomNumber)) {
                            customer = c;
                            break;
                        }
                    }

                    if (customer == null) {
                        JOptionPane.showMessageDialog(RoomManagementWindow.this, "找不到与房间号 " + roomNumber + " 相关的顾客信息!");
                        continue;
                    }

                    if (room.getStatus().equals("已预定")) {
                        // 删除预定记录
                        deleteCustomerInfo(roomNumber);
                        room.setStatus("未预定");
                        tableModel.setValueAt("未预定", row, 3);
                        tableModel.setValueAt("", row, 4);
                        tableModel.setValueAt("", row, 5);
                    } else if (room.getStatus().equals("已入住")) {
                        // 弹出输入框让用户输入实际居住天数
                        String daysStr = JOptionPane.showInputDialog(RoomManagementWindow.this, "请输入实际居住天数");
                        if (daysStr == null) {
                            continue; // 用户关闭或取消了对话框
                        }
                        int days;
                        try {
                            days = Integer.parseInt(daysStr);
                        } catch (NumberFormatException ex) {
                            JOptionPane.showMessageDialog(RoomManagementWindow.this, "请输入有效的天数!");
                            continue;
                        }

                        // 处理未支付的订单
                        double mealCost = processUnpaidOrders(roomNumber);
                        double roomCost = room.getPrice() * days; // 计算房费
                        double totalCost = roomCost + mealCost; // 总费用 = 房费 + 餐费

                        // 选择支付方式
                        int paymentOption = JOptionPane.showOptionDialog(
                                RoomManagementWindow.this,
                                "总费用为 " + totalCost + " 元,请选择支付方式:",
                                "支付方式",
                                JOptionPane.YES_NO_OPTION,
                                JOptionPane.QUESTION_MESSAGE,
                                null,
                                new String[]{"线上支付", "现金支付"},
                                "线上支付"
                        );

                        if (paymentOption == JOptionPane.YES_OPTION) {
                            // 线上支付
                            showPaymentImage(totalCost);
                        } else if (paymentOption == JOptionPane.NO_OPTION) {
                            // 现金支付
                            JOptionPane.showMessageDialog(RoomManagementWindow.this, "请支付 " + totalCost + " 元现金。");
                        }

                        // 更新房间状态
                        room.setStatus("未预定");
                        tableModel.setValueAt("未预定", row, 3);
                        tableModel.setValueAt("", row, 4); // 清除入住日期
                        tableModel.setValueAt("", row, 5); // 清除预计离开日期

                        // 更新顾客信息
                        customer.setActualDays(days);
                        customer.setTotalCost(totalCost);

                        // 将顾客信息移到历史记录
                        moveCustomerToHistory(roomNumber);
                    } else {
                        allCheckedOut = false;
                    }
                } else {
                    allCheckedOut = false;
                }
            }

            if (allCheckedOut) {
                saveAllRoomData(rooms);
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "所有选定房间已成功退房!");
            } else {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "部分房间未预定或不存在!");
            }
        }
    }

    //将传入的客房HashMap中各客房信息按格式写入文件,遇异常打印错误消息。
    private void saveAllRoomData(HashMap<String, Room> rooms) {
        String filePath = "Hotel management system/src/Room";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(filePath))) {
            for (Room room : rooms.values()) {
                bw.write(room.getNumber() + "," + room.getType() + "," + room.getPrice() + "," + room.getStatus() + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.err.println("Error saving room data: " + ex.getMessage());
        }
    }

    //创建新Customer对象加入列表,再调用方法保存所有顾客数据,用于新增顾客信息保存。
    private void saveCustomerInfo(String roomNumber, String customerName, String customerPhone, String checkInDate, String expectedCheckOutDate, String status, String idCard) {
        customers.add(new Customer(customers.size() + 1, roomNumber, customerName, customerPhone, checkInDate, expectedCheckOutDate, status, idCard));
        saveAllCustomerData();
    }

    // 按房间号查找顾客,更新其身份证号与状态信息,
    // 随后调用方法保存所有顾客数据,实现顾客信息修改保存。
    private void updateCustomerInfo(String roomNumber, String customerID, String status) {
        for (Customer customer : customers) {
            if (customer.getRoomNumber().equals(roomNumber)) {
                customer.setIdCard(customerID);
                customer.setStatus(status);
                saveAllCustomerData();
                return;
            }
        }
    }

    // 依房间号移除对应顾客信息,重新编号剩余顾客,
    // 再调用方法保存所有顾客数据,用于清理特定顾客记录。
    private void deleteCustomerInfo(String roomNumber) {
        customers.removeIf(customer -> customer.getRoomNumber().equals(roomNumber));
        renumberCustomers();
        saveAllCustomerData();
    }

    // 遍历顾客列表,按顺序为每个顾客设置新的序号(从 1 开始递增),
    // 用于更新顾客编号,保证序号连续性。
    private void renumberCustomers() {
        for (int i = 0; i < customers.size(); i++) {
            customers.get(i).setId(i + 1);
        }
    }

    //将顾客列表中各顾客信息按规定格式写入文件,遇异常则打印错误提示。
    private void saveAllCustomerData() {
        String customerFilePath = "Hotel management system/src/Customer";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(customerFilePath))) {
            for (Customer customer : customers) {
                bw.write(customer.getId() + "," + customer.getRoomNumber() + "," + customer.getName() + "," +
                        customer.getPhone() + "," + customer.getCheckInDate() + "," + customer.getExpectedCheckOutDate() + "," +
                        customer.getStatus() + "," + customer.getIdCard() + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.err.println("Error saving customer data: " + ex.getMessage());
        }
    }

    // 按房间号查找顾客,若找到则展示其详细信息,
    // 没找到则提示房间未预定,用于查看特定房间顾客情况。
    private void loadCustomerInfo(String roomNumber) {
        for (Customer customer : customers) {
            if (customer.getRoomNumber().equals(roomNumber)) {
                JOptionPane.showMessageDialog(RoomManagementWindow.this, "顾客信息:\n" +
                        "序号: " + customer.getId() + "\n" +
                        "房间号: " + customer.getRoomNumber() + "\n" +
                        "姓名: " + customer.getName() + "\n" +
                        "电话号码: " + customer.getPhone() + "\n" +
                        "入住日期: " + customer.getCheckInDate() + "\n" +
                        "预计离开日期: " + customer.getExpectedCheckOutDate() + "\n" +
                        "客房状态: " + customer.getStatus() + "\n" +
                        "身份证号: " + customer.getIdCard());
                return;
            }
        }

        JOptionPane.showMessageDialog(RoomManagementWindow.this, "该房间没有被预定。");
    }

    // 创建新窗口展示支付二维码图片,设置窗口属性、添加含费用提示的标签,
    // 使其可见,用于展示支付相关界面。
    private void showPaymentImage(double totalCost) {
        JFrame paymentFrame = new JFrame("支付二维码");
        paymentFrame.setSize(400, 400);
        paymentFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        paymentFrame.setLocationRelativeTo(this);

        ImageIcon icon = new ImageIcon("Hotel management system/src/weixinzhifuma.jpg");
        JLabel label = new JLabel(icon);
        label.setVerticalTextPosition(SwingConstants.BOTTOM);
        label.setHorizontalTextPosition(SwingConstants.CENTER);
        label.setText("总费用: " + totalCost + " 元");

        paymentFrame.add(label);
        paymentFrame.setVisible(true);
    }

    // 按房间号将顾客从当前列表移到历史列表,
    // 更新相关编号及各数据文件,清除对应房间表格顾客信息。
    private void moveCustomerToHistory(String roomNumber) {
        for (Customer customer : customers) {
            if (customer.getRoomNumber().equals(roomNumber)) {
                customerHistory.add(customer);
                customers.remove(customer);
                renumberCustomers();
                saveAllCustomerData();
                saveAllCustomerHistoryData();
                // 清除当前房间的顾客信息
                for (int i = 0; i < tableModel.getRowCount(); i++) {
                    if (tableModel.getValueAt(i, 0).equals(roomNumber)) {
                        tableModel.setValueAt("", i, 4); // 清除入住日期
                        tableModel.setValueAt("", i, 5); // 清除预计离开日期
                        tableModel.setValueAt("查看", i, 6); // 重置查看按钮
                        break;
                    }
                }
                return;
            }
        }
    }

    //把顾客历史列表信息按格式写入文件,遇异常打印错误提示信息。
    private void saveAllCustomerHistoryData() {
        String customerHistoryFilePath = "Hotel management system/src/CustomerHistory";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(customerHistoryFilePath))) {
            for (int i = 0; i < customerHistory.size(); i++) {
                Customer customer = customerHistory.get(i);
                customer.setId(i + 1); // 重新编号
                bw.write(customer.getId() + "," + customer.getRoomNumber() + "," + customer.getName() + "," +
                        customer.getPhone() + "," + customer.getCheckInDate() + "," + customer.getExpectedCheckOutDate() + "," +
                        customer.getStatus() + "," + customer.getIdCard() + "," + customer.getActualDays() + "," + customer.getTotalCost() + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.err.println("Error saving customer history data: " + ex.getMessage());
        }
    }

    //从文件读取数据,解析构建Order对象存进列表,遇错处理,最后返回该列表。
    private List<Order> loadOrderData() {
        List<Order> orders = new ArrayList<>();
        String orderFilePath = "Hotel management system/src/Customeryrz";

        try (BufferedReader br = new BufferedReader(new FileReader(orderFilePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(",", -1);
                if (parts.length == 8) {
                    int id = Integer.parseInt(parts[0].trim());
                    String orderTime = parts[1].trim();
                    String roomNumber = parts[2].trim();
                    String name = parts[3].trim();
                    String dish = parts[4].trim();
                    double mealCost = Double.parseDouble(parts[5].trim());
                    String status = parts[6].trim();
                    String paymentStatus = parts[7].trim();
                    orders.add(new Order(id, orderTime, roomNumber, name, dish, mealCost, status, paymentStatus));
                } else {
                    System.err.println("Invalid line: " + line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Error reading order data: " + e.getMessage());
        }
        return orders;
    }

    //将传入的订单列表中各订单信息按规定格式写入文件,出错则打印错误内容。
    private void saveAllOrderData(List<Order> orders) {
        String orderFilePath = "Hotel management system/src/Customeryrz";

        try (BufferedWriter bw = new BufferedWriter(new FileWriter(orderFilePath))) {
            for (Order order : orders) {
                bw.write(order.getId() + "," + order.getOrderTime() + "," + order.getRoomNumber() + "," + order.getName() + "," +
                        order.getDish() + "," + order.getMealCost() + "," + order.getStatus() + "," + order.getPaymentStatus() + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.err.println("Error saving order data: " + ex.getMessage());
        }
    }

    // 自定义按钮渲染类,实现TableCellRenderer接口,
    // 设置按钮透明并根据传入值设置按钮文本,用于表格渲染。
    private class ButtonRenderer extends JButton implements TableCellRenderer {
        public ButtonRenderer() {
            setOpaque(true);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setText(value.toString());
            return this;
        }
    }

    // 继承DefaultCellEditor,自定义表格中按钮编辑逻辑,
    // 如设置按钮样式、响应点击,点击时查看对应顾客信息等操作。
    private class ButtonEditor extends DefaultCellEditor {
        private JButton button;
        private String label;
        private boolean isPushed;

        public ButtonEditor(JCheckBox checkBox) {
            super(checkBox);
            button = new JButton();
            button.setOpaque(true);
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    fireEditingStopped();
                }
            });
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (isSelected) {
                button.setForeground(table.getSelectionForeground());
                button.setBackground(table.getSelectionBackground());
            } else {
                button.setForeground(table.getForeground());
                button.setBackground(table.getBackground());
            }
            label = (value == null) ? "" : value.toString();
            button.setText(label);
            isPushed = true;
            return button;
        }

        @Override
        public Object getCellEditorValue() {
            if (isPushed) {
                // 弹出查看顾客信息窗口
                String roomNumber = (String) tableModel.getValueAt(roomTable.getEditingRow(), 0);
                loadCustomerInfo(roomNumber);
            }
            isPushed = false;
            return label;
        }

        @Override
        public boolean stopCellEditing() {
            isPushed = false;
            return super.stopCellEditing();
        }

        protected void fireEditingStopped() {
            super.fireEditingStopped();
        }
    }
}

class Room {
    private String number;
    private String type;
    private double price;
    private String status;

    public Room(String number, String type, double price, String status) {
        this.number = number;
        this.type = type;
        this.price = price;
        this.status = status;
    }

    public String getNumber() {
        return number;
    }

    public String getType() {
        return type;
    }

    public double getPrice() {
        return price;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

class Customer {
    private int id;
    private String roomNumber;
    private String name;
    private String phone;
    private String checkInDate;
    private String expectedCheckOutDate;
    private String status;
    private String idCard;
    private int actualDays; // 新增字段
    private double totalCost; // 新增字段

    public Customer(int id, String roomNumber, String name, String phone, String checkInDate, String expectedCheckOutDate, String status, String idCard) {
        this.id = id;
        this.roomNumber = roomNumber;
        this.name = name;
        this.phone = phone;
        this.checkInDate = checkInDate;
        this.expectedCheckOutDate = expectedCheckOutDate;
        this.status = status;
        this.idCard = idCard;
        this.actualDays = 0; // 默认值
        this.totalCost = 0.0; // 默认值
    }

    // Getters and Setters for new fields
    public int getActualDays() {
        return actualDays;
    }

    public void setActualDays(int actualDays) {
        this.actualDays = actualDays;
    }

    public double getTotalCost() {
        return totalCost;
    }

    public void setTotalCost(double totalCost) {
        this.totalCost = totalCost;
    }

    // Existing getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRoomNumber() {
        return roomNumber;
    }

    public String getName() {
        return name;
    }

    public String getPhone() {
        return phone;
    }

    public String getCheckInDate() {
        return checkInDate;
    }

    public String getExpectedCheckOutDate() {
        return expectedCheckOutDate;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getIdCard() {
        return idCard;
    }
}

class Order {
    private int id;
    private String orderTime;
    private String roomNumber;
    private String name;
    private String dish;
    private double mealCost;
    private String status;
    private String paymentStatus;

    public Order(int id, String orderTime, String roomNumber, String name, String dish, double mealCost, String status, String paymentStatus) {
        this.id = id;
        this.orderTime = orderTime;
        this.roomNumber = roomNumber;
        this.name = name;
        this.dish = dish;
        this.mealCost = mealCost;
        this.status = status;
        this.paymentStatus = paymentStatus;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getOrderTime() {
        return orderTime;
    }

    public void setOrderTime(String orderTime) {
        this.orderTime = orderTime;
    }

    public String getRoomNumber() {
        return roomNumber;
    }

    public void setRoomNumber(String roomNumber) {
        this.roomNumber = roomNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDish() {
        return dish;
    }

    public void setDish(String dish) {
        this.dish = dish;
    }

    public double getMealCost() {
        return mealCost;
    }

    public void setMealCost(double mealCost) {
        this.mealCost = mealCost;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getPaymentStatus() {
        return paymentStatus;
    }

    public void setPaymentStatus(String paymentStatus) {
        this.paymentStatus = paymentStatus;
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值