day03-1

满汉楼03

4.功能实现05

4.8查看账单功能

image-20221020221951400

按照之间搭建起来的框架,在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方法

image-20221020224843374

4.8.2测试

image-20221020224952786

测试通过

4.9结账功能

image-20221020225122340

4.9.1功能分析

  1. 对餐桌编号进行校验

    a. 餐桌编号否存在

    b. 餐桌编号是否有账单需要结账

  2. 通过上面的校验后,需要修改bill表的state(账单的状态修改)

  3. 结账完毕后,需要修改餐桌的状态为“空”,同时置空餐桌的预定人信息

4.9.2代码实现

1.修改BillService类

在该类中分别增加三个方法

  1. hasPayBillByDiningTable():查看某个餐桌是否有未结账的账单
  2. allOfMoney():查看某张餐桌是否有未结账的账单
  3. 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:在二级菜单调用该方法

image-20221021181030477

4.9.3测试

  • 未结账前餐桌和账单状态

    image-20221021175758515


image-20221021175652551

  • 非法数据输入

image-20221021175915429


image-20221021175943702


image-20221021180019101

  • 正确数据

image-20221021180113039

  • 此时的餐桌状态和账单状态

image-20221021180227571


image-20221021180308826

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » day03-1