1.题目
销售数据分析系统
一、 背景:某电商平台需要对季度销售数据进行统计分析,根据分析结果总结经验,并制定下一季度的销售计划,需要你来编写小程序,实现以下数据分析功能
二、 (5分)为了系统设计轻便,采用XML文件记录销售记录,记录包括以下内容:销售单号、售单月份、商品名称、销售数量、单价、营销顾问工号、售单状态(已结款、未结款)
三、 (10分)主要功能界面要求参考如下:
四、 (25分)选择1时,在控制台打印全部销售单信息:
五、 (25分)选择2时,要求输入营销顾问工号,显示如下图,要有统计:
或
六、 (10分)选择3时,显示如图:
七、 (20分)选择4时,要求输入商品编号,显示如图:
八、 (5分)选择5时,程序结束
九、 (5分)附加分,项目结构设计合理,代码清晰,注释命名等规范,此项额外加分
2.实现
- XML文档
<?xml version="1.0" encoding="UTF-8"?>
<sales>
<sale>
<saleId>pd01</saleId>
<saleMonth>1</saleMonth>
<name>可口可乐</name>
<saleNum>102</saleNum>
<price>3.50</price>
<salePId>x01</salePId>
<state>已结款</state>
</sale>
<sale>
<saleId>pd02</saleId>
<saleMonth>1</saleMonth>
<name>笔记本</name>
<saleNum>10</saleNum>
<price>3000</price>
<salePId>x01</salePId>
<state>未结款</state>
</sale>
<sale>
<saleId>pd03</saleId>
<saleMonth>3</saleMonth>
<name>五菱汽车</name>
<saleNum>2</saleNum>
<price>20000</price>
<salePId>x02</salePId>
<state>未结款</state>
</sale>
<sale>
<saleId>pd04</saleId>
<saleMonth>3</saleMonth>
<name>可口可乐</name>
<saleNum>200</saleNum>
<price>3.50</price>
<salePId>x01</salePId>
<state>未结款</state>
</sale>
<sale>
<saleId>pd05</saleId>
<saleMonth>4</saleMonth>
<name>五菱汽车</name>
<saleNum>3</saleNum>
<price>20000</price>
<salePId>x02</salePId>
<state>未结款</state>
</sale>
<sale>
<saleId>pd06</saleId>
<saleMonth>4</saleMonth>
<name>笔记本</name>
<saleNum>20</saleNum>
<price>3000</price>
<salePId>x02</salePId>
<state>未结款</state>
</sale>
</sales>
- 销售单类(实体类)
package sale;
/**
* 销售单类
*/
public class Sale {
private String saleId; //销售单号
private String saleMonth; //销售月份
private String name; //商品名
private String saleNum; //销售数量
private String price; //单价
private String salePId; //营销顾问工号
private String state; //状态
//展示销售单信息
public void showInfo(){
System.out.println(saleId+"\t" + saleMonth+"\t\t" + name+"\t"+saleNum+"\t\t" +price+"\t\t"+salePId+"\t\t"+state);
}
public Sale(String saleId, String saleMonth, String name, String saleNum, String price, String salePId, String state) {
this.saleId = saleId;
this.saleMonth = saleMonth;
this.name = name;
this.saleNum = saleNum;
this.price = price;
this.salePId = salePId;
this.state = state;
}
public String getSaleId() {
return saleId;
}
public void setSaleId(String saleId) {
this.saleId = saleId;
}
public String getSaleMonth() {
return saleMonth;
}
public void setSaleMonth(String saleMonth) {
this.saleMonth = saleMonth;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSaleNum() {
return saleNum;
}
public void setSaleNum(String saleNum) {
this.saleNum = saleNum;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getSalePId() {
return salePId;
}
public void setSalePId(String salePId) {
this.salePId = salePId;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
- 结款类(实体类)创建结款对象,序列化写入txt文档
package sale;
import java.io.Serializable;
public class NewPaid implements Serializable {
private String saleId; //销售单号
private String name; //商品名
private String salePId; //营销顾问工号
private double money; //总金额
private String date; //结款日期
//展示商品信息
public void showInfo(){
System.out.println("销售单号:"+saleId+"\t商品名:"+name+"\t营销顾问工号:"+salePId+
"\t总金额:"+money+"\t结款日期:"+date);
}
public NewPaid(String saleId, String name, String salePId, double money, String date) {
this.saleId = saleId;
this.name = name;
this.salePId = salePId;
this.money = money;
this.date = date;
}
public String getSaleId() {
return saleId;
}
public void setSaleId(String saleId) {
this.saleId = saleId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSalePId() {
return salePId;
}
public void setSalePId(String salePId) {
this.salePId = salePId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
- 工具类(方法实现类)
package sale;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
public class SaleUtil {
Document doc = null;
ArrayList<Sale> sList = new ArrayList<>(); //订单列表
private String saleId, saleMonth, name, saleNum, price, salePId, state;
ArrayList<Sale> tempList = new ArrayList<>(); //缓存列表
ArrayList<NewPaid> paidList=new ArrayList<>(); //结款列表
int number = 0; //订单综述
int unPaid = 0; //未支付订单
double money = 0; //商品总额
//生成DOM树
public void getDom() {
SAXReader reader = new SAXReader();
try {
//读取 生成dom树
doc = reader.read("src/sale/sale.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
}
//解析XML文档 初始化list
public void getXML() {
//获取根节点
Element root = doc.getRootElement();
//迭代器 遍历根节点的子节点 sale
for (Iterator<Element> it = root.elementIterator(); it.hasNext(); ) {
//得到sale元素标签 获取个子节点的文本值
Element saleEle = it.next();
saleId = saleEle.element("saleId").getText();
saleMonth = saleEle.element("saleMonth").getText();
name = saleEle.element("name").getText();
saleNum = saleEle.element("saleNum").getText();
price = saleEle.element("price").getText();
salePId = saleEle.element("salePId").getText();
state = saleEle.element("state").getText();
//通过获取文本值 创建sale对象
Sale sale = new Sale(saleId, saleMonth, name, saleNum, price, salePId, state);
sList.add(sale);
}
}
//显示全部销售信息
public void showAll() {
System.out.println("销售单号\t销售月份\t商品名\t销售数量\t单价\t\t营销顾问工号\t状态");
//遍历输出
for (Sale sale : sList) {
sale.showInfo();
}
}
//业绩查询
public void showOrder(String id) {
boolean isExit = true;
if (isExit) {
//迭代器 遍历签单
for (Iterator<Sale> it = sList.iterator(); it.hasNext(); ) {
Sale sale = it.next();
//判断是否存在指定营销顾问工号的签单
if (sale.getSalePId().equals(id)) {
number++; //数量+1
//未结款数量+1
if (sale.getState().equals("未结款")) {
unPaid++;
}
//计算 商品总额=商品数量*商品单价 累加
money += Integer.parseInt(sale.getSaleNum()) * Double.parseDouble(sale.getPrice());
//添加到缓存列表
tempList.add(sale);
isExit = false; //存在该营销顾问工号
}
}
}
//判断缓存列表是否为空
if (!tempList.isEmpty()) {
System.out.println("【共成功签单" + number + "笔,销售总额" + money + "元,其中有" + unPaid + "笔签单未结款】");
System.out.println("销售单号\t销售月份\t商品名\t销售数量\t单价\t\t营销顾问工号\t状态");
//迭代器 遍历输出签单信息
for (Iterator<Sale> it = tempList.iterator(); it.hasNext(); ) {
Sale sale = it.next();
sale.showInfo();
}
//清零,方便下次使用
number = 0;
money = 0;
unPaid = 0;
tempList.clear();
}
//有营销顾问的订单不会进入if语句
if (isExit) {
System.out.println("不存在的营销顾问工号");
}
System.out.println("查询完毕");
}
//未签单总额查询
public void showUnpaid() {
boolean isExit = true; //判断是否有未结款订单
if (isExit) {
//迭代器遍历商品签单
for (Iterator<Sale> iterator = sList.iterator(); iterator.hasNext(); ) {
Sale sale = iterator.next();
//如果状态未结款
if (sale.getState().equals("未结款")) {
number++; //数量+1
//金额=商品价格*销售数量 累加
money += Integer.parseInt(sale.getSaleNum()) * Double.parseDouble(sale.getPrice());
//将签单添加到缓存列表中
tempList.add(sale);
isExit = false; //找到未结款订单
}
}
//缓存列表是否为空
if (!tempList.isEmpty()) {
System.out.println("【共有" + number + "笔签单未结款,涉及总额" + money + "元】");
System.out.println("销售单号\t销售月份\t商品名\t销售数量\t单价\t\t营销顾问工号\t状态");
for (Iterator<Sale> it = tempList.iterator(); it.hasNext(); ) {
Sale sale = it.next();
sale.showInfo();
}
//清零,方便下次使用
number = 0;
money = 0;
tempList.clear();
}
//有未结款订单不会进入if语句
if (isExit) {
System.out.println("没有未结款清单");
}
}
}
//商品销量查询
public void showSaledNum(String name) {
boolean isExit = true;
if (isExit) {
for (Iterator<Sale> saleIt = sList.iterator(); saleIt.hasNext(); ) {
Sale sale = saleIt.next();
if (sale.getName().indexOf(name) >= 0) {
tempList.add(sale);
number++; //订单数量+1
if (sale.getState().equals("未结款")) {
unPaid++; //未结款数量+1
}
// 金额=数量*单价 累加
money += Integer.parseInt(sale.getSaleNum()) * Double.parseDouble(sale.getPrice());
isExit = false; //存在
}
}
}
if (!tempList.isEmpty()) {
System.out.println("【共成功签单" + number + "笔,销售总额" + money + "元,其中有" + unPaid + "笔签单未结款】");
System.out.println("销售单号\t销售月份\t商品名\t销售数量\t单价\t\t营销顾问工号\t状态");
//迭代器 遍历输出签单信息
for (Iterator<Sale> it = tempList.iterator(); it.hasNext(); ) {
Sale sale = it.next();
sale.showInfo();
}
//清零,方便下次使用
number = 0;
money = 0;
unPaid = 0;
tempList.clear();
}
//有营销顾问的订单不会进入if语句
if (isExit) {
System.out.println("不存在的商品");
}
System.out.println("查询完毕");
}
//结款 修改xml 序列化
public void pay(String saleId) {
boolean isExit=true;
if(isExit){
for(Iterator<Sale> saleIt = sList.iterator();saleIt.hasNext();){
Sale sale = saleIt.next();
if(sale.getSaleId().equals(saleId)){
if(sale.getState().equals("未结款")){
sale.setState("已结款");
modfiy(saleId);
toTxt();
isExit=false; //已结款
}else {
System.out.println("该商品已结款,无须结款");
isExit=false; //查到商品
}
}
}
}
if(isExit){
System.out.println("不存在的订单号");
}
}
//查看结款 反序列化
public void readTxt(){
ObjectInputStream ois=null;
try {
ois=new ObjectInputStream(new FileInputStream("src/sale/sale.txt"));
ArrayList<NewPaid> newPaidList =(ArrayList<NewPaid>)ois.readObject();
for(Iterator<NewPaid> newPaidIterator = newPaidList.iterator();newPaidIterator.hasNext();){
NewPaid newPaid = newPaidIterator.next();
newPaid.showInfo();
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
}
}
//保存xml文件
public void save(){
//新建XMLWriter对象
XMLWriter writer=null;
try {
writer=new XMLWriter(new FileOutputStream("src/sale/sale.xml"));
//将doc写入
writer.write(doc);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("更新XML成功");
}
//修改XML文件
public void modfiy(String saleId){
Element root = doc.getRootElement();
for(Iterator<Element> saleIt = root.elementIterator();saleIt.hasNext();){
Element saleEle = saleIt.next();
if(saleEle.element("saleId").getText().equals(saleId)&&saleEle.element("state").getText().equals("未结款")){
saleEle.element("state").setText("已结款");
System.out.println("结款成功");
//保存xml
save();
//获取属性
String id=saleId;
String name=saleEle.element("name").getText();
String salePId=saleEle.element("salePId").getText();
double money=Integer.parseInt(saleEle.element("saleNum").getText())*Double.parseDouble(saleEle.element("price").getText());
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd");
String date=sdf.format(d);
//根据获取属性新建结款对象
NewPaid newPaid=new NewPaid(id,name,salePId,money,date);
//添加到结款列表中
paidList.add(newPaid);
}
}
}
//序列化
public void toTxt(){
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream("src/sale/sale.txt"));
oos.writeObject(paidList); //写入
oos.flush(); //刷新
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 菜单类(项目主体)
package sale;
import java.util.Scanner;
public class SaleMgr {
SaleUtil util=new SaleUtil();
Scanner sc=new Scanner(System.in);
//菜单
public void menu(){
System.out.println("***销售数据分析系统***");
System.out.println("1.显示全部销售单数据");
System.out.println("2.销售顾问业绩查询");
System.out.println("3.未结款总额查询");
System.out.println("4.商品销量查询");
System.out.println("5.商品结款");
System.out.println("6.查看结款商品");
System.out.println("7.退出系统");
System.out.print("请选择要查询的项目:");
}
public void start(){
util.getDom();
util.getXML();
boolean isExit=true;
do {
menu();
int choise=sc.nextInt();
switch (choise){
case 1:
System.out.println("**显示全部销售单数据**");
util.showAll();
break;
case 2:
System.out.println("**销售顾问业绩查询**");
System.out.print("请输入营销顾问工号:");
String id=sc.next();
util.showOrder(id);
break;
case 3:
System.out.println("**未结款总额查询**");
util.showUnpaid();
break;
case 4:
System.out.println("**商品销量查询**");
System.out.print("请输入商品名称:");
String name=sc.next();
util.showSaledNum(name);
break;
case 5:
System.out.println("**商品结款**");
System.out.print("请输入销售单号");
String saleId=sc.next();
util.pay(saleId);
break;
case 6:
System.out.println("**查看结款商品**");
util.readTxt();
break;
case 7:
System.out.println("退出系统");
isExit=false;
break;
}
if(isExit){
System.out.println("按任意键继续:");
choise = sc.nextInt();
}
}while (isExit);
System.out.println("欢迎下次使用");
}
}
- 测试类
package sale;
public class saleTest {
public static void main(String[] args) {
SaleMgr sale=new SaleMgr();
sale.start();
}
}