上周老师要求我们做个作业,那么我们就做一个Java企业商品进销存管理系统
源码+实训报告+系统测试报告已经打包好,方便给需要的同学使用!
链接:https://pan.baidu.com/s/14SaUQeWkt7uEa_yOBdVs0w
提取码:lwmb
这是做出来的样品:
本系统的开发适用于多个行业,可以帮助企业快速有效管理进货、销售、库存、查询统计等各项业务,合理控制进销存各个环节,提高资金利用率,实现管理高效率和实时性。本系统是根据人们在日常生活中的实际需求而开发的,完全能够实现人们对商品的基础信息管理、进货管理、销售管理、查询统计、库存管理、系统管理等功能,一般而言,通过使用进销存管理系统,可以在以下几方面提高企业的管理水平:
提供商业数据智能分析,了解商业动态,为管理者提供决策依据。
流程图:
程序环境:
SQL server 2005和myeclipse8.5。
具体过程
1-1:安装“MS Sql Server 2005(SP2)”(内置帐户选择sa,密码设为123;如果没有设置内置帐户sa的话,请直接使用WinNT登录“SQL Server Management Studio”,选择安全性→登录名→sa→登录属性,然后设置密码123,关闭“SQL Server Management Studio”)
1-2:安装“MyEclipse 5.5.1 GA”
1-3:下载连接驱动包“sqljdbc.jar”
1-4:设置SQL Server服务器:
2-1:启动“SQL Server Management Studio”,并用帐户sa、密码123登录(SQL Server服务器设置正确的话应该能登录成功),创建一个数据库JSPTest,内建一个表regist
2-2:创建测试的Java工程和代码
2-3:启动“MyEclipse”→“File”→“New”→“Project”→“Java Project”,命名为Test
2-4:打开Test的“Properties”→“Java Build Path”→“Libraries”→“Add External JARs”,选择下载好的连接驱动包“sqljdbc.jar”,然后点击“OK”确定
2-5:SQL Server 2005中加载驱动和URL的语句为:
protected static String dbClassName= "com.microsoft.sqlserver.jdbc.SQLServerDriver";
protected static String dbUrl= "jdbc:sqlserver://localhost:1433;DatabaseName=db_JXC";
protected static String dbUser="sa";
protected static String dbPwd="123";
主窗体是系统的欢迎界面。用程序的主窗体包括系统菜单和工具栏,其中系统菜单是包含系统中所有功能的菜单项,工具栏是提供常用的功能的快捷访问按钮。(该系统采用了导航面板综合了系统菜单和工具栏的优点,导航面板的界面更美观,操作更快捷。)
Frame=new JFrame(“企业进销存管理系统”);//创建窗体对象
desktopPanel=new JDeskPanel();//创建桌面面板
JTabbedPane navigationPanel=createNavigationPanel();//创建导航面板
JTabbedPane tabbedPane=new JTabbedPane();//创建JTabbePanel选项卡面板对象
JPanel baseManagePanel=new JPanel();//基础信息管理面板
JPanel depotManagePanel=new JPanel();//库存管理面板
JPanel sellManagePanel=new JPanel();//销售管理面板
JPanel searchStatisticPanel=new JPanel();//查询统计面板
JPanel stockManagePanel=new JPanel();//进货管理面板
JPanel sysManagePanel=new JPanel();//管理系统面板
Icon icon=new ImageIcon(imgUrl);//创建按钮图标
Icon_roll=new ImageIcon(imgUrl_roll);//创建鼠标经过按钮的图标
Icon_down=new ImageIcon(imgUrl_down);//创建按钮按下的图标
Action action=new openFrameAction(fName,cname,icon);//用openFrameAction类创建Actio对象
Class.forName(dbClassName).newInstance();//加载数据库驱动类
conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);//获取数据库连接
该方法用于添加供应商的基础信息,它接收供应商的实体类TbGysinfo作方法的参数,然后把实体对象中的所有属性存入供应商数据表中。
该方法将根据Item对象中封装的供应商ID编号和供应商名称获取供应商的数据,然后将该供应商的数据封装到实体对象中,然后返回该实体对象。
该方法用于更新供应商的基础信息,它接收供应商的实体类TbGysinfo作方法参数,在方法中直接解析供应商实体对象中的属性,并且将这些属性更新到数据表中。
该方法负责完成入库单信息的添加,(库存表、入库主表、入库详细表等多个数据表的操作)。为了保证数据的完整性,该方法将入库信息的添加操作放在事务中完成,方法将接收入库主表的实体类TbRukuMain作为参数,该实体类中包含了入库详细表的引用。
该方法用于获取指定商品ID编号或者名称的库存信息,方法接收一个Item对象作参数,该对象中封装了商品的ID编号和商品的名称信息,如果库存表中存在该商品的库存记录,就获取该记录并将记录中的数据封装到库存表的实体对象中,然后将该实体对象作为方法的返回值。
Item类主要用于封装和传递参数信息,这是典型命令模式的实现。
在Dao类中经常使用该类作为方法参数;在各个窗体界面中也经常使用该类作组件数据,其toString()方法将返回name属性值,所以显示到各个组件上的内容是Item类的对象所代表的商品、供应商、或者客户等信息的名称。
基础信息管理模块的有三个功能:客户信息管理、商品信息管理和供应商信息管理。其中客户信息管理所使用的的数据表是tb_khinfo,其功能类包括KeHuTianJiaPanel类和KeHuXiuGaiPanel类;商品信息管理所使用的数据表是tb_spinfo,其功能类包括ShangPinTianJiaPanel类和ShangPinXiuGaiPanel类;供应商信息管理所使用的数据表是tb_gysinfo,其功能类包括GysTianJiaPanel类和GysXiuGaiPanel类。整个基础信息管理模块的技术分析以供应商信息管理面板为例,下面简单介绍一下供应商信息管理的添加、修改和删除的实现过程。
该类用于实现系统供应商添加功能,实现在界面将显示多个用于输入供应商信息的文本框。界面中主要包括以下控件:
控件类型 |
控件名称 |
主要属性 |
用途 |
JtextField |
quanChengF |
无 |
供应商全称 |
JianChengF |
无 |
简称 |
|
BianMaF |
无 |
邮政编码 |
|
DiZhiF |
无 |
地址 |
|
DianHuaF |
无 |
电话 |
|
ChuangZhenF |
无 |
传真 |
|
LianXiRenF |
无 |
联系人 |
|
lianXiRenDianHuaF |
无 |
联系人电话 |
|
YinHangF |
无 |
银行 |
|
EmailF |
无 |
邮箱 |
|
Jbutton |
TjButton |
设置按钮文本为“添加” 设置动作监听器为TjActionListener类的实例对象 |
添加 |
ResetButton |
设置按钮文本为“重填” 设置动作监听器为 ResetActionListener类的实例对象 |
重填 |
要点介绍:
代码如下:
代码如下:
该类主要实现供应商修改和删除的功能。在该界面中有许多文本框用于输入供应商信息,这些文本框会根据所选供应商自动填充内容,点击修改按钮后回自动写入修改后的供应商内容。
控件类型 |
控件名称 |
主要属性 |
用途 |
JtextField |
quanChengF |
无 |
供应商全称 |
JianChengF |
无 |
简称 |
|
BianMaF |
无 |
邮政编码 |
|
DiZhiF |
无 |
地址 |
|
DianHuaF |
无 |
电话 |
|
ChuangZhenF |
无 |
传真 |
|
LianXiRenF |
无 |
联系人 |
|
lianXiRenDianHuaF |
无 |
联系人电话 |
|
YinHangF |
无 |
银行 |
|
EmailF |
无 |
邮箱 |
|
JComboBox |
Gys |
设置初始大小为(230,21) 调用initComboBox()方法初始化下拉列表 设置组件选择事件调用doGysSelectAction()方法 |
选择供应商 |
Jbutton |
tjjButton |
设置按钮文本为“修改” 设置动作监听器为ModifyActionListener类的实例对象 |
修改 |
resetButton |
设置按钮文本为“删除” 设置动作监听器为 DeltActionListener类的实例对象 |
删除 |
要点介绍:
代码:
代码如下:
代码:
代码:
企业进销存管理系统中的进货模块管理主要包括进货单和进货退货两个部分。由于它们的实现方法相似,这里主要以进货单功能为主,介绍进货模块对本系统的意义和实现的业务逻辑。
主要负责记录企业的商品进货信息,可以单击“添加”按钮,在商品表中添加进货的商品信息。在“供应商”下拉列表框中选择不同的供应商,将会改变商品中可以添加的商品。进货单的程序界面如下图:
进货退货功能主要负责记录进货管理中的退货信息,界面效果如下图。在选择了退货的商品之后,单价“退货”,将把表格中商品退货信息更新到数据库中。
进货管理模块使用JDBC实现事务操作,因为进货和退货的业务逻辑涉及到3个数据表,为保证数据的完整性,将3个数据表的操作放在事务中实现,如果对任何一个数据表的操作出现错误或是不可执行的操作,那么事务中的所有操作都将取消,并恢复到事务执行的数据状态;否则3个数据表的操作全部执行。下面是JDBC事务操作的关键方法。
该方法用于连接对象的自动提交模式。如果连接处对象的自动提交模式为true,则它的所有SQL语句被执行作为单个事务提交;否则,该连接对象的SQL语句将聚集到事务中,直到调用commit()方法或rollback()方法为止。默认情况下,新连接的自动提交模式为true。
语句:
Void setAutoCommit(boolean autoCommit)
autoCommit:该参数为true表示启用连接对象的自动提交模式:false表示禁用链接对象的自动提交模式。
getAutoCommit()
判断此连接对象是否启用了自动提交模式。
语法:
Boolean getAutoCommit()
该方法将执行提交SQL语句执行数据库操作,并释放此连接对象当前持有的所有数据库锁。此方法只在禁用自动提交模式情况下使用。
语法:
Void commit()
该方法将取消在事务中进行的所有更改,并释放此连接对象当前持有的所有数据库锁。此方法只在禁止自动提交模式情况下使用。
语法:
Void rollback()
创建jinhuodan类,用于实现本系统的进货单功能的界面和业务逻辑。界面中定义的主要控件如表:
进货单界面中的主要控件
private void initTable(){
String[]columnNames={"商品名称","商品编号","产地","单位","规格","包装","单价",
"数量","批号","批准文号"};
((DefaultTableModel)table.getModel())
.setColumnIdentifiers(columnNames);
TableColumn column=table.getColumnModel().getColumn(0);
final DefaultCellEditor editor=new DefaultCellEditor(sp);
editor.setClickCountToStart(2);
column.setCellEditor(editor);
}
private void initSpBox(){
List list=new ArrayList();
ResultSet set=Dao.query("select*from tb_spinfo where gysName='"
+gys.getSelectedItem()+"'");
sp.removeAllItems();
sp.addItem(new TbSpinfo());
for(int i=0;table!=null&&i
TbSpinfo tmpInfo=(TbSpinfo)table.getValueAt(i,0);
if(tmpInfo!=null&&tmpInfo.getId()!=null)
list.add(tmpInfo.getId());
}
try{
while(set.next()){
TbSpinfo spinfo=new TbSpinfo();
spinfo.setId(set.getString("id").trim());
//如果表格中以存在同样商品,商品下拉框中就不再包含该商品
if(list.contains(spinfo.getId()))
continue;
spinfo.setSpname(set.getString("spname").trim());
spinfo.setCd(set.getString("cd").trim());
spinfo.setJc(set.getString("jc").trim());
spinfo.setDw(set.getString("dw").trim());
spinfo.setGg(set.getString("gg").trim());
spinfo.setBz(set.getString("bz").trim());
spinfo.setPh(set.getString("ph").trim());
spinfo.setPzwh(set.getString("pzwh").trim());
spinfo.setMemo(set.getString("memo").trim());
spinfo.setGysname(set.getString("gysname").trim());
sp.addItem(spinfo);
}
}catch(SQLException e){
e.printStackTrace();
}
}
库存管理是指在上产经营中为销售和耗用而存储的各种资产。企业存货不当都会增加不必要的费用:存货过多将导致物资的积压、存储费用增加、流动资金周转不利,并且过量的库存会掩盖管理不善的问题。存货不足则影响企业的正常销售活动。库存管理的目标是需求最佳存货数量,使库存的成本总额最小化。其主要功能如下:
库存盘点和价格调整等日常处理。
价格调整功能主要用于调整库存中指定商品的单价,当用户选择了此商品,价格调整功能的界面会显示该商品在库存中的单价、数量、金额、单位、产地等信息,用户可以单击“单价”后即可修改商品的价格。如下图所示:
库存管理模块中包括库存盘点和价格调整两个功能,库存盘点功能是将库存信息显示在表格中,由操作员输入盘点的商品数量,然后自动计算损益值,价格调整功能涉及下拉列表框的选择事件监听和事件处理技术,为防止用户的错误输入,程序界面经常需要将可枚举的输入内容封装在下拉列表框中,限制用户的输入。但是,想要知道下拉列表框的改变,还需要为下拉列表框添加相应的事件监听器。下面就进行简单的介绍:
价格调整实现过程:
创建JiaGeTiaoZheng类,用于实现本系统的价格调整功能界面和业务逻辑。界面中的主要控件如下:
控件类型 |
控件名称 |
主要属性设置 |
用途 |
JTextField |
KuCunJinE |
无 |
库存金额 |
KuCunShuLiang |
无 |
库存数量 |
|
DanJia |
无 |
库存单价 |
|
Jlabel |
ShangPinMingCheng |
无 |
商品名称 |
GuiGe |
无 |
规格 |
|
ChanDi |
无 |
产地 |
|
DanWei |
无 |
单位 |
|
Jbutton |
OkButton |
无 |
确定 |
CloseButton |
无 |
关闭 |
private void updateJinE(){//更新库存金额的方法
Double dj=Double.valueOf(danJia.getText());
Integer sl=Integer.valueOf(kuCunShuLiang.getText());
kuCunJinE.setText((dj*sl)+"");
}
ItemListener:下拉列表框的事件监听器必须实现的分接口。
ITemStateChanged():当下拉列表框的选中项发生改变时将触发该方法。
ItemEvent:这是选项事件类,在用户更改带有多项选择内容的组件选项时,将产生该事件。例如下拉选择框组件。