引言
收银统计功能,显示“请输入销售日期(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);
}
}
}
}