行 据
return; // 不执行任何操作
Object selectedDeskNum = numComboBox.getSelectedItem(); int needSelectedRow = -1; // 默认选中的台号未开台 for (int row = 0; row < rowCount; row++) {
// 获得“台号”选择框中的选中项
// 查看选中的台号是否已经开台
if (selectedDeskNum.equals(rightTable.getValueAt(row, 1)))
}
rightTable.clearSelection(); // 取消选择“开台列表”中的选中行
leftTableDataV.removeAllElements(); // 清空“签单列表”中的所有行
leftTableModel.setDataVector(leftTableDataV,
leftTableColumnV); // 刷新“签单列表”表格模型的数
needSelectedRow = row; // 保存其在“开台列表” 中的所在
{ // 已经开台
break; // 跳出循环 }
if (needSelectedRow == -1) { // 选中的台号尚未开台,即将要开台
} else { // 选中的台号已经开台,即将要添加消费项目
rightTable.setRowSelectionInterval(needSelectedRow);// 在“开台列表”
leftTableDataV.removeAllElements(); // 清空“签单列表”
中选中该台号 中的现有项目
leftTableDataV.addAll(itemOfDeskV.get(needSelectedRow)); // 向“签单列表”添加新选中餐台的消费项目 leftTableModel.setDataVector(leftTableDataV, 据
}
leftTable.setRowSelectionInterval(0); // 选中“签单列
表”中的第一行
}
leftTableColumnV); // 刷新“签单列表”表格模型的数
b 点菜与签单实现
21
选中要点的餐台后即可进行点菜,系统支持两种方式点菜:一种是通过菜品的 记助码,这种样式的优点在于快速获取菜品名称,另一种方式通过菜品的编号输入后自动显示菜品名到商品名称框里。 其系统图中显示如下所示
获取菜品功能是通过文本框添加键盘事件监听器实现的,代码如下:
public void keyTyped(KeyEvent e) {// 通过键盘监听器实现控制文本
if (\.indexOf(e
.getKeyChar()) < 0)// 只允许输入字母和数字 e.consume();// 销毁此次键盘事件
框的输入内容
public void keyReleased(KeyEvent e) {// 通过键盘监听器实现智能
if (e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下回车键 makeOutAnInvoice();// 开单 } else {
String input = codeTextField.getText();// 获得输入内容 Vector menuV = null;// 符合条件的菜品 if (input.length() > 0) {// 确认输入了内容
if (codeRadioButton.isSelected()) {// 按助记码查询
Vector menusV = dao.sMenuByCode(input);// 查询if (menusV.size() > 0) {// 存在符合条件的菜品
menuV = (Vector) menusV.get(0);// 获得第一
获取菜品
codeTextField.addKeyListener(new KeyAdapter() {
}
符合条件的菜品
个符合条件的菜品
menuV.remove(0);// 移除菜品的序号 }
22
}
} else {// 按编号查询 }
if (input.length() == 9)// 确认编号是否为9位
menuV = dao.sMenuByNum(input);// 查询符合条
件的菜品 空
if (menuV == null) {// 不存在符合条件的菜品
nameTextField.setText(null);// 设置“商品名称”文本框unitTextField.setText(null);// 设置“单位”文本框为空 priceTextField.setText(null);// 设置“单价”文本框为
为空
} else {// 存在符合条件的菜品
nameTextField.setText(menuV.get(2).toString());// 设置“商品名称”文本
框为符合条件的菜品名称
unitTextField.setText(menuV.get(4).toString());// 设置“单位”文本框为符合条件的菜品单位
priceTextField.setText(menuV.get(5).toString());// 设置“单价”文本框为符合条件的菜品单价 }
}
}
});
orderDishesPanel.add(codeTextField);
注解:
consume():该方法用于销毁此次事件,如果此次事件是向一个文本框中输入一个字符,则取消次输入。
e,getKeyCode()==KeyEventVK_ENTER:该段代码用来判断此处事件是用户按下Enter键触发的,如果是则返回true;否则返回false。
默认情况下点才数量为1,如果不需要修改点菜数量,通过菜品助记码或编号获得菜品后直接单击回车就开单成功从而方面用户操作。
23
确定多点菜品和数量后,也可以通过单击“开单“按钮完成开单工作,签单列表中的新开单菜品前会有一个“NEW”标记,
确定消费“签单列表”中所有菜品后,需要单击“签单“按钮取消所有菜品前所有菜品的“NEW”标记实现“签单”。 c自动结账实现
该功能自动计算“签单列表“中消费金额,在“实收金额”文本框中输入已收金额,系统自动计算应找金额,避免因忙碌繁杂而引起的错误结算。 在结账之前一定要确保所有菜品已经签单,否则将弹出提示信息,并且要保证实收金额不小于消费金额。实现结账代码如下:
final JButton checkOutButton = new JButton();
checkOutButton.setText(\结 账\);
checkOutButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selectedRow = rightTable.getSelectedRow(); if (selectedRow < 0) {// 未选中任何餐台 }
int rowCount = leftTable.getRowCount();// 获得结账餐台的点if (leftTable.getValueAt(rowCount - 1, 0).equals(\))
JOptionPane.showMessageDialog(null, \请先确定未签单商品
\友情提示\,
JOptionPane.showMessageDialog(null, \请选择要结账的餐 JOptionPane.INFORMATION_MESSAGE);// 弹出提示 return;
台!\, \友情提示\,
菜数量
{// 存在未签单菜品 的处理方式!\,
JOptionPane.INFORMATION_MESSAGE);// 弹出提示 return;
}
int expenditure = Integer.valueOf(expenditureTextField .getText());// 获得消费金额 int realWages =
if (realWages < expenditure) {// 查看实收金额是否小于消费金
Integer.valueOf(realWagesTextField.getText());// 获得实收金额
24
额
if (realWages == 0)// 未输入实收金额
JOptionPane.showMessageDialog(null, \请输入实收金
JOptionPane.INFORMATION_MESSAGE);// 弹出提
额!\, \友情提示\, 示
else
// 实收金额小于消费金额
JOptionPane.showMessageDialog(null, \实收金额不能小
\友情提示\,
于消费金额!\,
JOptionPane.INFORMATION_MESSAGE);// 弹出提示
realWagesTextField.requestFocus();// 为“实收金额”文本return;
框请求获得焦点
}
changeTextField.setText((realWages - expenditure) +
\);// 计算并设置“找零金额” String[] orderFormData = { 号
for (int row = 0; row < rowCount; row++) {// 通过循环持久
orderItemData[1] = leftTable.getValueAt(row,
化消费项目信息
dao.iOrderForm(orderFormData);// 持久化到数据库
String[] orderItemData = new String[4];// 用来存储消费项目orderItemData[0] = dao.sOrderFormOfMaxId();// 获得消费单编
getNum(),
rightTable.getValueAt(selectedRow, Today.getDate() + \
+ rightTable.getValueAt(selectedRow, 2),
expenditureTextField.getText(),
1).toString(),
TipWizardFrame.this.managerV.get(0).toString() };// 组织消费单信息
信息
2).toString();// 获得菜品编号 orderItemData[2] = leftTable.getValueAt(row, 5).toString();// 获得菜品数量 orderItemData[3] = leftTable.getValueAt(row, 7).toString();// 获得菜品消费金额
dao.iOrderItem(orderItemData);// 持久化到数据库 }
JOptionPane.showMessageDialog(null,
rightTable.getValueAt(
25
selectedRow, 1)
+ \结账完成!\, \友情提示\,
JOptionPane.INFORMATION_MESSAGE);// 弹出提示 //
rightTableModel.removeRow(selectedRow);// 从“开台列表”中leftTableDataV.removeAllElements();// 清空“签单列表” leftTableModel.setDataVector(leftTableDataV,
realWagesTextField.setText(\);// 清空“实收金额”文本框 changeTextField.setText(\);// 清空“找零金额”文本框
移除结账餐台
leftTableColumnV);// 刷新“签单列表”
itemOfDeskV.remove(selectedRow);// 从数据集中移除结账餐台 }
});
第五章 总结
前台服务模块作为酒店管理系统中为客户服务的主要模块,设计思想体现了整个系统分层分类的特点。以开单,点菜,签单,结账的流程来展现酒店管理中餐饮服务,操作简单,易于上手,销售统计,后台管理,人员管理等模块更为管理员的使用提供了,安全,便捷的帮助。在系统的设计于实现中,组员之间互相探讨认真总结在程序过程中的错误。设计之初,我们希望通过一起合作,共同来用自己的所学写出有一份作品。真正体验整个系统流程的编写。为以后就业有所帮助。事实上对于我个人而言获得远非如此,从全面,细节中感受到软件开发的复杂和意义,也学会了如何运用所学与实际应用结合。
三年的求学使我和同学学会用交流解决问题,用交流去互助合作,相信在也会在我的工作中让我受益匪浅。在此感谢我的指导老师姜燕老师,从入学一直指引我们走向编程之路,并在java的漫长道路上给我们指导和启发,相信我们会在以后的学习中百尺竿头更进一步,让编程真正的成为我们的事业生涯中一个亮点。并且一直走下去??。
26