day03-1-查看账单&结账功能
  k9rkMOkDb1mz 2023年11月01日 39 0

满汉楼03

4.功能实现05

4.8查看账单功能

image-20221020221951400

按照之间搭建起来的框架,在BillService编写方法

4.8.1代码实现

1.修改Bill类

重写Bill类中的toString方法

@Override
public String toString() {
    return id +
            "\t\t" + menuId +
            "\t\t\t" + nums +
            "\t\t\t" + money +
            "\t" + diningTableId +
            "\t\t" + billDate +
            "\t\t" + 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("\n编号\t\t菜品号\t\t菜品量\t\t金额\t\t桌号\t\t日期\t\t\t\t\t\t\t状态");
    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
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   53   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   109   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
k9rkMOkDb1mz