day03-1
满汉楼03
4.功能实现05
4.8查看账单功能
按照之间搭建起来的框架,在BillService编写方法
4.8.1代码实现
1.修改Bill类
重写Bill类中的toString方法
@Override
public String toString() {
return id +
" " + menuId +
" " + nums +
" " + money +
" " + diningTableId +
" " + billDate +
" " + state;
}
2.修改BillService类
在该类中增加方法,用来获取所有订单记录
//返回所有的账单,提供给View使用
public List<Bill> list(){
return billDAO.queryMulti("select * from bill",Bill.class);
}
这里也可以按照桌号查询账单,并且将查询到的所有金额相加,返回一个总金额
3.修改MHLView
修改处1:在该类中增加方法listBill(),用来显示账单
//显示账单信息
public void listBill() {
List<Bill> bills = billService.list();
System.out.println("
编号 菜品号 菜品量 金额 桌号 日期 状态");
for (Bill bill : bills) {
System.out.println(bill);
}
System.out.println("============显示完毕============");
}
修改处2:在二级菜单处调用listBill方法
4.8.2测试
测试通过
4.9结账功能
4.9.1功能分析
-
对餐桌编号进行校验
a. 餐桌编号否存在
b. 餐桌编号是否有账单需要结账
-
通过上面的校验后,需要修改bill表的state(账单的状态修改)
-
结账完毕后,需要修改餐桌的状态为“空”,同时置空餐桌的预定人信息
4.9.2代码实现
1.修改BillService类
在该类中分别增加三个方法
- hasPayBillByDiningTable():查看某个餐桌是否有未结账的账单
- allOfMoney():查看某张餐桌是否有未结账的账单
- payBill():完成结账
//查看某个餐桌是否有未结账的账单
public boolean hasPayBillByDiningTable(int diningTableId) {
Bill bill = billDAO.querySingle("select * from bill where diningTableId=? and state="未结账" limit 0,1", Bill.class, diningTableId);
return bill != null;//bill非空,就代表有未结账的账单
}
/**
* 查看某张餐桌是否有未结账的账单
* @param diningTableId 结账的餐桌编号
* @return 返回的某餐桌需要支付的总金额
*/
public Double allOfMoney(int diningTableId) {
//计算该餐桌需要支付的总金额
Double countMoney = Double.valueOf("0");
List<Bill> bills = billDAO.queryMulti("select * from bill where diningTableId=? and state="未结账"", Bill.class, diningTableId);
for (Bill bill1 : bills) {
countMoney += bill1.getMoney();
}
//返回总金额
return countMoney;
}
//完成结账 [前提:1.餐桌编号存在 2.该餐桌有未结账的账单]
public boolean payBill(int diningTableId, String payMode) {
//这里其实应该开启事务--防止上面成功,下面失败的情况
//如果使用事务的话,需要使用ThreadLocal来解决,框架中比如 mybatis就提供了事务支持
//1.修改bill表的state
int update = billDAO.update("update bill set state=? where diningTableId=? and state="未结账"", payMode, diningTableId);
if (update <= 0) {//如果更新没有成功,则表示失败
return false;
}
//2.修改diningTable的state
if (!diningTableService.updateDiningTableToFree(diningTableId, "空")) {
return false;
}
return true;
}
2.修改DiningTableService类
在该类中增加方法updateDiningTableToFree()
//提供方法,将指定餐桌修改为空闲状态
public boolean updateDiningTableToFree(int id, String state) {
int update = diningTableDAO.update("update diningTable set state=?,orderName="",orderTel="" where id=?", state, id);
return update > 0;
}
3.修改MHLView类
修改处1:在该类中增加方法 payBill() 完成结账功能
//完成结账
public void payBill() {
System.out.println("============结账服务============");
System.out.print("请输入要结账的餐桌编号(-1退出): ");
int diningTableId = Utility.readInt();
if (diningTableId == -1) {
System.out.println("============取消结账============");
return;
}
//验证餐桌是否存在
DiningTable diningTable = diningTableService.getDiningTableById(diningTableId);
if (diningTable == null) {
System.out.println("==========餐桌号不存在===========");
return;
}
//验证餐桌是否有需要结账的账单
if (!billService.hasPayBillByDiningTable(diningTableId)) {
System.out.println("==========该餐桌不存在未结账账单===========");
return;
}
System.out.print("请输入结账的方式(现金/支付宝/微信)回车表示退出: ");
String payMode = Utility.readString(3, "");//如果回车,返回的就是空串""
if ("".equals(payMode)) {
System.out.println("============取消结账============");
return;
}
if (!(payMode.equals("现金") || payMode.equals("支付宝") || payMode.equals("微信"))) {
System.out.println("============输入有误============");
return;
}
char key = Utility.readConfirmSelection();
if (key == "Y") {
//计算总金额
System.out.println("==========" + diningTableId + "号餐桌消费总金额为: " + billService.allOfMoney(diningTableId) + " 元===========");
//调用结账方法
if (billService.payBill(diningTableId, payMode)) {
System.out.println("==========结账完成===========");
} else {
System.out.println("==========结账失败===========");
}
} else {
System.out.println("============取消结账============");
}
}
修改处2:在二级菜单调用该方法
4.9.3测试
-
未结账前餐桌和账单状态
- 非法数据输入
- 正确数据
- 此时的餐桌状态和账单状态