行业知识
java 实训课程设计:仓库管理系统
| 实现配送中心管理系统的基本功能:针对产品实现该配送中心的货物的初始化处理,完成对货物的进仓、出仓、报废等管理,实现货物的库存统计等操作。 |
| 基本要求:
6、必须要用面向对象设计思想编程实现 高级要求: 1、界面友好; 2、对货物信息进行统计(例如某单位时间内流量排序等); |
大二期末的实训,共有十五个课设可以选择,博主选择的是仓库管理系统。
这是整个系统的设计模块图(仓库有很多种,博主做的是快递超市仓库管理系统)
不多说,上代码
货物类Cargo:
public class Cargo{ String name; int id; String type; String source; int picking; String state; int weight; String time; public Cargo(String name,int id,String type,String source,int picking,int weight) { this.name=name; this.id =id; this.type =type; this.source =source; this.picking=picking; this.state="正常"; this.weight=weight; this.time= null; } public String getSource() { return source; } public String getName() { return name; } public int getId() { return id; } public String getType() { return type; } public int getPicking(){ return picking; } public String getState(){ return state; } public int getWeight(){ return weight; } public String getTime() {return time;} public void setName(String name) { this.name = name; } public void setType(String type) { this.type = type; } public void setSource(String source) { this.source = source; } public void setPicking(int picking) { this.picking = picking; } public void setState(String state) { this.state = state; } public void setWeight(int weight) {this.weight = weight;} public void setTime(String time) {this.time = time;} @Override public String toString() { return "Cargo{" + "name='" + name + '\'' + ", , type='" + type + '\'' + ", source='" + source + '\'' + ", picking='" + picking + '\'' + ", state='" + state + '\'' + ", weight=" + weight + ", time=" + time + '}'; }} 仓库类Warehouse:
import java.text.SimpleDateFormat;import java.util.Collection;import java.util.Date;import java.util.HashMap;public class Warehouse{ private HashMap cargos = new HashMap(); private int capacity = 0; public int getInventory() { int inventory = 0; for(Cargo cargo : cargos.values()){ inventory +=cargo.getWeight(); } return inventory; } public String getNewTime(){ SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String str =sdf.format(date); return str; } public int getCapacity() { return capacity; } public void setCapacity(int capacity) { this.capacity = capacity; } public boolean addCargo(Cargo cargo) { if(getInventory()+cargo.getWeight() 0.9 * capacity) { return WarehouseWarning.FULL; }else{ return WarehouseWarning.NONE; } } public Collection getCargos() { return cargos.values(); } @Override public String toString() { String str = ""; for (Cargo cargo : cargos.values()) { str += cargo.getName() + "\n"; } return str; }} 仓库类中用到的枚举WarehouseWarning
public enum WarehouseWarning { EMPTY, FULL, NONE} 由于高级要求中有一条界面友好的要求,博主是用GUI来实现的表现层(另一个高级要求没有完成)
下面是GUI的主界面MainFrame:
import javax.swing.*;import java.awt.*;import java.awt.event.*;public class MainFrame extends JFrame { private JPanel cn; private Warehouse warehouse; public MainFrame(String str, Warehouse warehouse) { super(str); this.warehouse = warehouse; setSize(800, 600); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBackground(Color.white); Box box = Box.createVerticalBox(); setContentPane(box); JPanel an = new JPanel(); an.setSize(800, 200); JButton big = new JButton("容量设置"); big.setPreferredSize(new Dimension(120, 60)); JButton in = new JButton("进仓"); in.setPreferredSize(new Dimension(120, 60)); JButton out = new JButton("出仓"); out.setPreferredSize(new Dimension(120, 60)); JButton useless = new JButton("报废"); useless.setPreferredSize(new Dimension(120, 60)); JButton warning = new JButton("预警"); warning.setPreferredSize(new Dimension(150, 75)); warning.setBackground(Color.cyan); //warning.setEnabled(false); an.add(big); an.add(in); an.add(out); an.add(useless); an.add(warning); box.add(an); setVisible(true); JLabel x = new JLabel(); an.add(x); cn = new JPanel(); cn.setVisible(true); cn.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20)); JScrollPane scrollPane = new JScrollPane(cn); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //cn.setPreferredSize(new Dimension(780, cn.getPreferredSize().height)); Dimension preferredSize = new Dimension(800, 600); cn.setPreferredSize(preferredSize); scrollPane.setPreferredSize(preferredSize); box.add(scrollPane); changeCargoButton(); big.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new cabacityAdd("输入容量", warehouse); } }); in.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new CargoAdd("进仓", warehouse, MainFrame.this); } }); out.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new CargoRemove("出仓", warehouse, MainFrame.this); } }); useless.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new Useless("报废", warehouse, MainFrame.this); } }); warning.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { x.setText(warehouse.getInventory() + " / " + warehouse.getCapacity()); if (warehouse.warning(warehouse.getCapacity()) == WarehouseWarning.EMPTY) { warning.setBackground(Color.green); warning.setText("预警" + "\n" + "EMPLY(零状态)"); } else if (warehouse.warning(warehouse.getCapacity()) == WarehouseWarning.FULL) { warning.setBackground(Color.red); warning.setText("预警" + "\n" + "FULL(满状态)"); } else { warning.setBackground(Color.cyan); warning.setText("预警" + "\n" + "NONE(正常)"); } } }); } void changeCargoButton() { cn.removeAll(); validate(); repaint(); for (Cargo cargo : warehouse.getCargos()) { JButton y1 = new JButton(); y1.setPreferredSize(new Dimension(170, 80)); y1.setBackground(Color.pink); y1.setText(" " + cargo.getId()+ "\n" + " " + cargo.getName() + "\n" + " " + cargo.getState()); if (cargo.getState().equals("已报废")) { y1.setText(" " + cargo.getId() + "\n" + " " + cargo.getName() + "\n" + " " + cargo.getState()); y1.setBackground(Color.GRAY); } cn.add(y1); y1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new CargoMessege(cargo); } }); validate(); } } } 容量添加界面cabacityAdd:
import javax.swing.*;import java.awt.*;public class cabacityAdd extends JFrame { public cabacityAdd (String str,Warehouse warehouse) { super(str); setSize(210, 400); setLocationRelativeTo(null); setBackground(Color.white); JPanel c1 = new JPanel(); JLabel a1 = new JLabel("容量大小"); JTextField b1 = new JTextField(16); JButton jButton = new JButton("确定"); c1.add(a1); c1.add(b1); c1.add(jButton); add(c1); setVisible(true); jButton.addActionListener((actionEvent -> { int s1 = Integer.parseInt(b1.getText()); warehouse.setCapacity(s1); if(s1==0){ new determine("容量不可为0");}else{ new determine("容量设置成功"); dispose(); } } )); }} 货物进仓界面CargoAdd:
import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class CargoAdd extends JFrame { private MainFrame mainFrame; public CargoAdd(String str, Warehouse warehouse,MainFrame mainFrame) { super(str); this.mainFrame = mainFrame; setSize(210, 400); setLocationRelativeTo(null); setBackground(Color.white); JPanel c1 = new JPanel(); JLabel a1 = new JLabel("名称"); JLabel a2 = new JLabel("编号"); JLabel a3 = new JLabel("类型"); JLabel a4 = new JLabel("来源"); JLabel a5 = new JLabel("出库码"); JLabel a6 = new JLabel("重量"); JTextField b1 = new JTextField(16); JTextField b2 = new JTextField(16); JTextField b3 = new JTextField(16); JTextField b4 = new JTextField(16); JTextField b5 = new JTextField(16); JTextField b6 = new JTextField(16); JButton jButton = new JButton("确定"); c1.add(a1); c1.add(b1); c1.add(a2); c1.add(b2); c1.add(a3); c1.add(b3); c1.add(a4); c1.add(b4); c1.add(a5); c1.add(b5); c1.add(a6); c1.add(b6); c1.add(jButton); add(c1); setVisible(true); jButton.setActionCommand("myButton"); jButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String s1 = b1.getText(); int s2 = Integer.parseInt(b2.getText()); String s3 = b3.getText(); String s4 = b4.getText(); int s5 = Integer.parseInt(b5.getText()); int s6 = Integer.parseInt(b6.getText()); Cargo cargo = new Cargo(s1,s2,s3,s4,s5,s6); // warehouse.addCargo(cargo); if(s1==null||s3==null||s4==null||s6==0){ new determine("请输入正确的信息"); } else if(warehouse.addCargo(cargo)==false) { new determine("入库失败(超出库存)"); }else{ //mainFrame.addCargoButton(cargo); mainFrame.changeCargoButton(); new determine("入库成功"); dispose(); } } }); }} 货物出库界面CargoRemove:
import javax.swing.*;import java.awt.*;public class CargoRemove extends JFrame { private MainFrame mainFrame; public CargoRemove (String str,Warehouse warehouse,MainFrame mainFrame) { super(str); setSize(210, 400); setLocationRelativeTo(null); setBackground(Color.white); this.mainFrame = mainFrame; JPanel c1 = new JPanel(); JLabel a1 = new JLabel("出仓货物编号"); JLabel a2 = new JLabel("出库码"); JTextField b1 = new JTextField(16); JTextField b2 = new JTextField(16); JButton jButton2 = new JButton("确定"); c1.add(a1); c1.add(b1); c1.add(a2); c1.add(b2); c1.add(jButton2); add(c1); setVisible(true); jButton2.addActionListener((actionEvent -> { int s1 = Integer.parseInt(b1.getText()); int s2 = Integer.valueOf(Integer.parseInt(b2.getText())); if(warehouse.getCargo(s1)==false){ new determine("编号不存在"); }else{ if(warehouse.getCargoPicking(s1)!=s2){ new determine("出仓码错误"); }else { warehouse.removeCargo(s1); new determine("出仓成功"); mainFrame.changeCargoButton(); dispose(); } } } )); }} 货物报废界面useless:
import javax.swing.*;import java.awt.*;public class Useless extends JFrame { private MainFrame mainFrame; public Useless (String str,Warehouse warehouse,MainFrame mainFrame) { super(str); setSize(210, 400); setLocationRelativeTo(null); setBackground(Color.white); this.mainFrame = mainFrame; JPanel c1 = new JPanel(); JLabel a1 = new JLabel("货物报废"); JTextField b1 = new JTextField(16); JButton jButton3 = new JButton("确定"); c1.add(a1); c1.add(b1); c1.add(jButton3); add(c1); setVisible(true); jButton3.addActionListener((actionEvent -> { int s3 = Integer.parseInt(b1.getText()); warehouse.stateChange(s3); if(warehouse.stateChange(s3)==false){ new determine("编号不存在"); }else{ new determine("报废成功"); mainFrame.changeCargoButton(); } } )); }} 货物详细信息弹窗界面CargoMessege:
import javax.swing.*;import java.awt.*;public class CargoMessege extends JDialog { public CargoMessege(Cargo cargo) { setVisible(true); setBounds(800, 300, 200, 300); Container container = getContentPane(); container.setLayout(null); Panel jPanel = new Panel(); JLabel jLabel1 = new JLabel("货物名字" +": " + cargo.getName()); JLabel jLabel2 = new JLabel("编号" +": " + cargo.getId() + " "); JLabel jLabel3 = new JLabel("类型" + ": " + cargo.getType() + " "); JLabel jLabel4 = new JLabel("来源" + ": " + cargo.getSource() + " "); JLabel jLabel5 = new JLabel("取件码" + ": " + cargo.getPicking() + " "); JLabel jLabel6 = new JLabel("状态" + ": " + cargo.getState() + " "); JLabel jLabel7 = new JLabel("重量" + ": " + cargo.getWeight() + " "); JLabel jLabel8 = new JLabel(" 入库时间" + cargo.getTime()); jPanel.setSize(140, 300); jPanel.add(jLabel1); jPanel.add(jLabel2); jPanel.add(jLabel3); jPanel.add(jLabel4); jPanel.add(jLabel5); jPanel.add(jLabel6); jPanel.add(jLabel7); jPanel.add(jLabel8); container.add(jPanel); }}import javax.swing.*;import java.awt.*;public class CargoMessege extends JDialog { public CargoMessege(Cargo cargo) { setVisible(true); setBounds(800, 300, 200, 300); Container container = getContentPane(); container.setLayout(null); Panel jPanel = new Panel(); JLabel jLabel1 = new JLabel("货物名字" +": " + cargo.getName()); JLabel jLabel2 = new JLabel("编号" +": " + cargo.getId() + " "); JLabel jLabel3 = new JLabel("类型" + ": " + cargo.getType() + " "); JLabel jLabel4 = new JLabel("来源" + ": " + cargo.getSource() + " "); JLabel jLabel5 = new JLabel("取件码" + ": " + cargo.getPicking() + " "); JLabel jLabel6 = new JLabel("状态" + ": " + cargo.getState() + " "); JLabel jLabel7 = new JLabel("重量" + ": " + cargo.getWeight() + " "); JLabel jLabel8 = new JLabel(" 入库时间" + cargo.getTime()); jPanel.setSize(140, 300); jPanel.add(jLabel1); jPanel.add(jLabel2); jPanel.add(jLabel3); jPanel.add(jLabel4); jPanel.add(jLabel5); jPanel.add(jLabel6); jPanel.add(jLabel7); jPanel.add(jLabel8); container.add(jPanel); }} 提示信息弹窗界面determine:
import javax.swing.*;import java.awt.*;public class determine extends JDialog { public determine(String str) { setVisible(true); setBounds(600, 400, 200, 100); Container container = getContentPane(); container.setLayout(null); JLabel jLabel = new JLabel(str); jLabel.setSize(130, 30); container.add(jLabel); }} 最后是主函数Delivery(添加了一些测试用例)
public class Delivery { public static void main(String[] args) { Warehouse warehouse = new Warehouse(); warehouse.setCapacity(1000);// Cargo cargo1 = new Cargo("康师傅",1,"食品","京东",114514,1);// Cargo cargo2 = new Cargo("洗发水",2,"生活用品","淘宝",114514,1);// Cargo cargo3 = new Cargo("洗手液",3,"生活用品","淘宝",114514,960);// Cargo cargo4 = new Cargo("餐巾纸",4,"生活用品","淘宝",114514,2);// Cargo cargo5 = new Cargo("面包",5,"食品","京东",114514,1);// Cargo cargo6 = new Cargo("面包",6,"食品","京东",114514,1);// Cargo cargo7 = new Cargo("康师傅",7,"食品","京东",114514,1);// Cargo cargo8 = new Cargo("洗发水",8,"生活用品","淘宝",114514,1);// Cargo cargo9 = new Cargo("洗手液",9,"生活用品","淘宝",114514,960);// Cargo cargo10 = new Cargo("餐巾纸",10,"生活用品","淘宝",114514,2);// Cargo cargo11 = new Cargo("面包",11,"食品","京东",114514,1);// Cargo cargo12 = new Cargo("面包",12,"食品","京东",114514,1);// Cargo cargo13 = new Cargo("面包",13,"食品","京东",114514,1);// Cargo cargo14 = new Cargo("面包",14,"食品","京东",114514,1);// Cargo cargo15 = new Cargo("康师傅",15,"食品","京东",114514,1);// Cargo cargo16 = new Cargo("洗发水",16,"生活用品","淘宝",114514,1);// Cargo cargo17 = new Cargo("洗手液",17,"生活用品","淘宝",114514,960);// Cargo cargo18 = new Cargo("餐巾纸",18,"生活用品","淘宝",114514,2);// Cargo cargo19 = new Cargo("面包",19,"食品","京东",114514,1);// Cargo cargo20 = new Cargo("面包",20,"食品","京东",114514,1);// Cargo cargo21= new Cargo("康师傅",21,"食品","京东",114514,1);// Cargo cargo22 = new Cargo("洗发水",22,"生活用品","淘宝",114514,1);// Cargo cargo23 = new Cargo("洗手液",23,"生活用品","淘宝",114514,960);//// warehouse.addCargo(cargo1);// warehouse.addCargo(cargo2);// warehouse.addCargo(cargo3);// warehouse.addCargo(cargo4);// warehouse.addCargo(cargo5);// warehouse.addCargo(cargo6);// warehouse.addCargo(cargo7);// warehouse.addCargo(cargo8);// warehouse.addCargo(cargo9);// warehouse.addCargo(cargo10);// warehouse.addCargo(cargo11);// warehouse.addCargo(cargo12);// warehouse.addCargo(cargo13);// warehouse.addCargo(cargo14);// warehouse.addCargo(cargo15);// warehouse.addCargo(cargo16);// warehouse.addCargo(cargo17);// warehouse.addCargo(cargo18);// warehouse.addCargo(cargo19);// warehouse.addCargo(cargo20);// warehouse.addCargo(cargo21);// warehouse.addCargo(cargo22);// warehouse.addCargo(cargo23); MainFrame mainFrame = new MainFrame("仓库管理系统",warehouse); }} 主界面:
添加超出容量的货物后可使用滚动条
仓库容量设置界面:
进仓出仓界面:
既然是快递超市仓库管理系统,当然需要出仓码才能出仓啦(doge)
点击预警按钮后三种预警界面(正常,零状态,满状态):
报废界面:
点击货物对应按钮后弹出的详细消息弹窗:
信息提示界面:
最后再来谈谈该系统没有完善的地方
首先,系统的预警系统需要手动点击触发,其实这里可以关联在进仓出仓按钮上,实现自动预警,这里纯粹是博主在设计的时候没有想到。
另外,在进仓26个货物之后,后面进仓的(第27个以及27以后)货物可能会无法在主界面显示,这个应该是代码问题但博主一直没有解决,如有大佬指正欢迎在讨论区留言。