首页 > 基础资料 博客日记
java 实训课程设计:仓库管理系统
2023-12-27 21:30:34基础资料围观242次
实现配送中心管理系统的基本功能:针对产品实现该配送中心的货物的初始化处理,完成对货物的进仓、出仓、报废等管理,实现货物的库存统计等操作。 |
基本要求:
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 + '\'' +
", id=" + id +
", 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<Integer, Cargo> 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()<=capacity) {
cargos.put(cargo.getId(), cargo);
cargo.setTime(getNewTime());
return true;
} else {
return false;
}
}
public boolean getCargo(int id){
return cargos.get(id) != null;
}
public boolean removeCargo(int id){
return cargos.remove(id) != null;
}
public int getCargoPicking(int id){
Cargo cargo = cargos.get(id);
return cargo.getPicking();
}
public Cargo seekCargo(int id){
return cargos.get(id);
}
public boolean stateChange(int id){
Cargo cargo = cargos.get(id);
if(cargo != null) {
cargo.setState("已报废");
return true;
}else {
return false;
}
}
public WarehouseWarning warning(int capacity){
if(getInventory() < 0.1 * capacity){
return WarehouseWarning.EMPTY;
} else if (getInventory() > 0.9 * capacity) {
return WarehouseWarning.FULL;
}else{
return WarehouseWarning.NONE;
}
}
public Collection<Cargo> 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以后)货物可能会无法在主界面显示,这个应该是代码问题但博主一直没有解决,如有大佬指正欢迎在讨论区留言。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: