0
点赞
收藏
分享

微信扫一扫

Java XML文档操作——销售数据分析系统

Just_Esme 2022-03-23 阅读 20
javaxml

1.题目

销售数据分析系统
一、 背景:某电商平台需要对季度销售数据进行统计分析,根据分析结果总结经验,并制定下一季度的销售计划,需要你来编写小程序,实现以下数据分析功能
二、 (5分)为了系统设计轻便,采用XML文件记录销售记录,记录包括以下内容:销售单号、售单月份、商品名称、销售数量、单价、营销顾问工号、售单状态(已结款、未结款)
三、 (10分)主要功能界面要求参考如下:
在这里插入图片描述

四、 (25分)选择1时,在控制台打印全部销售单信息:

在这里插入图片描述

五、 (25分)选择2时,要求输入营销顾问工号,显示如下图,要有统计:
在这里插入图片描述


在这里插入图片描述

六、 (10分)选择3时,显示如图:
在这里插入图片描述

七、 (20分)选择4时,要求输入商品编号,显示如图:
在这里插入图片描述

八、 (5分)选择5时,程序结束
九、 (5分)附加分,项目结构设计合理,代码清晰,注释命名等规范,此项额外加分

2.实现

  1. 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>
  1. 销售单类(实体类)
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;
    }
}

  1. 结款类(实体类)创建结款对象,序列化写入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;
    }
}

  1. 工具类(方法实现类)
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();
            }
        }
    }

}
  1. 菜单类(项目主体)
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("欢迎下次使用");
    }



}

  1. 测试类
package sale;

public class saleTest {
    public static void main(String[] args) {
       SaleMgr sale=new SaleMgr();
       sale.start();
    }
}

举报

相关推荐

0 条评论