上回说到房间信息的添加和维护我们都已经写好了,接着就是入住和退房的操作了!!
入住程序
之前我们已经将房间信息写好了,添加入住和退房两个按钮并绑定点击操作
//在hotelInfoForm的方法中添加如下代码
JButton insert = new JButton("入住");
insert.setBounds(50,320,100,50);
panel.add(insert);
JButton del = new JButton("退房");
del.setBounds(180,320,100,50);
panel.add(del);
//将房间信息布局到中部
frame.add(g,BorderLayout.CENTER);
//将按钮布局到底部
frame.add(panel,BorderLayout.SOUTH);
// 设置界面可见
frame.setVisible(true);
//入住按钮添加点击事件
insert.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//将填写的用户信息带过去
userInfo.setName(userNameText.getText());
userInfo.setIdNum(userIdCardText.getText());
userInfo.setAddress(userAddressText.getText());
userInfo.setPhone(userPhoneText.getText());
info.setUser(userInfo);
info.setDeposit(contentText.getText());
checkIn(info,frame);
}
});
//退房按钮添加点击事件
del.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
checkOut(info,frame);
}
});
具体入住程序代码如下
//入住
private void checkIn(HotelInfo info,JFrame frame){
UserInfo user = info.getUser();
if ("已入住".equals(info.getEmpty())){
//选择提示 showConfirmDialog 有两个选项,确定(0)或者取消(1)
int choose = JOptionPane.showConfirmDialog(null, "该房间已录有用户信息,继续将修改已有信息",
"提示",JOptionPane.YES_NO_OPTION);
if(choose == 1){
return;
}
}
//对用户信息校验、身份证、客户名称、联系方式是必要的
if ("".equals(user.getIdNum()) || "".equals(user.getName()) || "".equals(user.getPhone())){
new Tip("缺少客户信息,请先填写");
return;
}
String startTime = JOptionPane.showInputDialog(null, "请输入入住时间(2021-1-1):\n", "入住时间(不填默认为单前日期)", JOptionPane.PLAIN_MESSAGE);
String endTime = JOptionPane.showInputDialog(null, "请输入退房时间(2021-1-1):\n", "退房时间(不填默认为第二天)", JOptionPane.PLAIN_MESSAGE);
if ("".equals(startTime)){
//时间转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String today = sdf.format(new Date());
startTime = today;
}
if ("".equals(endTime)){
//时间转换 一般宾馆退房都是2点左右
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 14:00:00");
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
//1表示明天,-1表示昨天
calendar.add(Calendar.DATE,1);
//这个时间就是明天
Date time = calendar.getTime();
endTime = sdf.format(time);
}
info.setStartTime(startTime);
info.setEndTime(endTime);
int day = daysBetween(startTime,endTime);
//计算价格 房价x天数+押金
int price = Integer.valueOf(info.getPrice());
int total = price * day + 100;
info.setPayment(total + "");
info.setDeposit("100");
//选择提示 showConfirmDialog 有两个选项,确定(0)或者取消(1)
int choose = JOptionPane.showConfirmDialog(null, "居住" + day + "天,加上100元押金一共需要收取" + total + "元" ,
"明细",JOptionPane.YES_NO_OPTION);
if (choose == 0){
info.setEmpty("已入住");
//确认入住 修改房间信息
HotelInfo removeInfo = new HotelInfo();
for (HotelInfo item : baseInfo){
if (item.getRoomNum() == info.getRoomNum()){
//找到房间后填入信息
removeInfo = item;
//结束循环 如果后续还有房间就不进行对比了(没有意义)
break;
}
}
//这里就可以简单粗暴一点 先删除在添加
baseInfo.remove(removeInfo);
baseInfo.add(info);
frame.dispose();
listFrame.dispose();
hotelFrame();
}else{
//取消入住
return;
}
}
填写完信息点击入住后在弹框中输入住时间(不填默认为单前日期)和退房时间(不填默认为单前日期的第二天)
输入完成后会回显入住天数和需要收取的金额,点击是即入住成功刷新主界面,否则入住失败!
退房程序
//退房
private void checkOut(HotelInfo info,JFrame frame){
//先对比时间
int day = daysBetween(info.getStartTime(), info.getEndTime());
//计算价格 提前退房就计算差价退款
int price = Integer.parseInt(info.getPrice());
int total = price * day;
//预存金额
int payment = Integer.parseInt(info.getPayment());
if(total > payment){
new Tip("一共入住了"+ day +"天,价格为:"+ total +"元!除去押金还收你:"+(total - payment)+"元");
}else{
new Tip("一共入住了"+ day +"天,价格为:"+ total +"元!除去押金退还你:"+(payment - total)+"元");
}
//房间信息从房间信息中删除
baseInfo.remove(info);
info.setUser(null);
info.setEmpty("空房");
baseInfo.add(info);
//关闭结算界面
frame.dispose();
listFrame.dispose();
hotelFrame();
}
房间又变空房了
续住
续住和入住其实是一个程序,只是在填写信息时不用重复填写,会提示已有信息,是否继续!修改的只是入住和退房时间和付款
关闭程序
这个程序的数据源是在程序一开始就读取txt文件信息到缓存中使用,期间的操作是没有写入和读取的操作的,这也是简化程序的手段之一,所以在关闭程序之前得先将基础数据回写到txt中,以保持数据
//首先得天啊及界面关闭的监听事件,然后在关闭前保存数据
listFrame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
//关闭程序是,要将房间信息重新入txt
saveHotel(baseInfo);
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
至此,宾馆入住程序就算是完成了;要是各位看客姥爷要是有啥新的想法也可以继续完善其功能!
仔细想想还是还有许多可以优化的:比如:房间的显示界面、房间押金可以根据房间类型社会不同的金额,设置程序背景等等。
照着写的远不及自己动手写的!我想各位肯定能耐写出比这更好的入住程序的!!!