Java超市收银系统(五、收银统计)

引言

        收银统计功能,显示“请输入销售日期(yyyy-mm-dd):”,如果日期格式不正确,则显示“你输入的日期格式不正确,请重新输入”,输入正确后,查询统计当前日期所有的销售信息,输出显示格式如下:

功能实现

        首先,收银统计和前面介绍的Java超市收银系统(四、收银功能)-CSDN博客原理一致,收银功能用了两个表,商品表和销售明细表,那我们可以在他的数据库基础之上继续写收银统计功能,并且收银统计只要用到销售明细表即可(在大项目系统中,我们可以直接组合这两个功能),所以我们重点看主函数的功能实现及调用。

        程序提供了一个基于命令行的界面,允许用户输入销售日期,查询该日期的销售记录,并显示销售数据和统计信息。用户可以选择继续查询其他日期或退出程序。

获取用户输入的日期:

        SimpleDateFormat 用于格式化日期。

        通过 Scanner 获取用户输入的日期字符串。

        使用 Timestamp.valueOf 方法将日期字符串转换为 Timestamp 对象。如果输入格式不正确,会抛出 IllegalArgumentException 异常,提示用户重新输入。

封装销售数据:

        创建一个 Sale 对象并设置销售时间。

查询销售记录:

        调用 SaleDAO.query(sale) 方法获取销售记录列表。

显示销售记录:

        使用 SimpleDateFormat 格式化日期以显示。

        输出表头和销售记录,使用 printf 方法格式化输出。

计算和显示统计信息:

        计算销售总数、商品总件和销售总金额。

        输出统计信息。

继续查询或退出:

        提示用户是否继续查询。根据用户输入决定继续查询或退出程序。如果输入错误,提示错误信息。 

结果展示

完整代码

ui—Driver

package ui;

import dao.SaleDAO;
import vo.Sale;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Scanner;

public class Driver {
    public static void main(String[] args) {
        query();
    }

    public static void query() {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Timestamp date = null;
            boolean validDate = false;

            while (!validDate) {
                System.out.println("请输入销售日期(yyyy-MM-dd):");
                String dateString = scanner.nextLine();
                try {
                    date = Timestamp.valueOf(dateString + " 00:00:00"); // 将日期字符串转换为 Timestamp 类型
                    validDate = true;
                } catch (IllegalArgumentException e) {
                    System.out.println("日期格式不正确,请重新输入。");
                }
            }

            // 将用户输入的日期包装到 Sale 对象中
            Sale sale = new Sale();
            sale.setSaleTime(date);

            // 调用查询函数并输出结果
            List<Sale> saleList = SaleDAO.query(sale);

            // 输出销售信息的标题
            String formattedDate = new SimpleDateFormat("yyyy年 MM月 dd日").format(date);
            System.out.println(formattedDate + "销售如下:");
            System.out.println("流水号\t商品名称\t单价\t数量\t金额\t时间\t收银员");
            System.out.println("=========================================");

            // 输出销售信息
            for (Sale s : saleList) {
                System.out.printf("%s\t%s\t%.2f\t%d\t%.2f\t%tT\t%s%n",
                        s.getLsh(), s.getProductName(), s.getPrice(), s.getCount(),
                        s.getPrice() * s.getCount(), s.getSaleTime(), s.getOperator());
            }

            // 计算销售总数、商品总件和销售总金额
            int totalSales = 0;
            int totalItems = 0;
            float totalAmount = 0;
            for (Sale s : saleList) {
                totalSales++;
                totalItems += s.getCount();
                totalAmount += s.getPrice() * s.getCount();
            }

            // 输出统计信息
            System.out.printf("销售总数:%d 商品总件:%d 销售总金额:%.2f%n日期:%s%n",
                    totalSales, totalItems, totalAmount, formattedDate);

            System.out.println("是否继续查询(y/n:)");
            String output = scanner.nextLine();
            if(output.equals("y")) {
                continue;
            }else if (output.equals("n")) {
                System.out.println("程序成功退出");
                System.exit(0);
            }else {
                System.out.println("错误");
            }
        }

    }
}

vo—Sale

package vo;

import java.sql.Timestamp;

public class Sale {
    private String lsh;
    private String barCode;
    private String productName;
    private float price;
    private int count;
    private String operator;
    private Timestamp saleTime;

    public Sale() {
    }

    public Sale(String lsh, String barCode, String productName, float price, int count, String operator, Timestamp saleTime) {
        this.lsh = lsh;
        this.barCode = barCode;
        this.productName = productName;
        this.price = price;
        this.count = count;
        this.operator = operator;
        this.saleTime = saleTime;
    }

    public String getLsh() {
        return lsh;
    }

    public void setLsh(String lsh) {
        this.lsh = lsh;
    }

    public String getBarCode() {
        return barCode;
    }

    public void setBarCode(String barCode) {
        this.barCode = barCode;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public Timestamp getSaleTime() {
        return saleTime;
    }

    public void setSaleTime(Timestamp saleTime) {
        this.saleTime = saleTime;
    }
}

dao—SaleDAO

package dao;

import util.DBUtil;
import vo.Sale;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class SaleDAO {
    public static List<Sale> query(Sale sale) {
        Connection con = null;
        PreparedStatement pst = null;
        ResultSet rs = null;
        List<Sale> saleList = new ArrayList<>();
        try {
            con = DBUtil.getConnection();
            StringBuilder sql = new StringBuilder("SELECT * FROM t_shouyinmingxi WHERE 1 = 1");

            // 根据 Sale 对象中的条件构建 SQL 查询语句

            if (sale.getSaleTime() != null) {
                sql.append(" AND DATE(xiaoshoushijian) = ?");
            }

            pst = con.prepareStatement(sql.toString());

            // 设置查询参数
            int paramIndex = 1;

            if (sale.getSaleTime() != null) {
                pst.setDate(paramIndex++, new java.sql.Date(sale.getSaleTime().getTime()));
            }

            rs = pst.executeQuery();
            while (rs.next()) {
                Sale s = new Sale();
                s.setLsh(rs.getString("liushuihao"));
                s.setBarCode(rs.getString("tiaoma"));
                s.setProductName(rs.getString("mingcheng"));
                s.setPrice(rs.getFloat("danjia"));
                s.setCount(rs.getInt("shuliang"));
                s.setOperator(rs.getString("shouyinyuan"));
                s.setSaleTime(rs.getTimestamp("xiaoshoushijian"));
                saleList.add(s);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(con, pst);
        }
        return saleList;
    }
}

util—DBUtil

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DBUtil {

    //驱动加载,只需执行一次
    static{
        String driveName = "com.mysql.cj.jdbc.Driver";
        try {
            Class.forName(driveName);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    //获取链接
    public static Connection getConnection(){
        String url = "jdbc:mysql://localhost:3306/sale?useUnicode=true&characterEncoding=utf-8";
        String user = "root";
        String password = "123456";
        Connection con = null;
        try {
            con = DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return con;
    }

    //关闭资源
    public static void close(Connection con, PreparedStatement pst){
        if(con!=null) {
            try {
                con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if(pst!=null) {
            try {
                pst.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

}

mysql

详见Java超市收银系统(四、收银功能)-CSDN博客

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值