资源描述
企业进销存管理系统
学 院
专 业
班 级
学 号
姓 名
指导老师
老师职称
年
月
日
摘要
【摘要】
进销存管理系统是一个基于Internet应用系统,它是一个面对目前进销存管理工作基础还处于手工和半信息自动化处理状态而应运而生一个基于Internet一个完全信息自动化系统,整个系统从符合操作简便、界面友好、灵活、实用、安全要求出发,完成进货、销售、库存管理全过程。
企业单位只需含有访问Internet条件即可在系统公布站点上进行进销存管理。在图型化人机界面中完成日常进销存管理工作.首先摆脱了时间和空间限制,其次有效处理数据共享问题。
经过实际使用证实,本文所设计企业进销存管理系统能够满足企业进货、销售管理方面需要。
【关键词】库存 销售 企业进销存管理系统
目录
摘要 1
0 引言 1
1 系统分析 2
1.1 需求分析 2
1.2 可行性分析 2
2 总体设计 2
2.1 项目计划 2
2.2 系统功效结构图 3
3 系统设计 3
3.1 设计目标 3
3.2 开发及运行环境 4
3.3 数据库设计 4
4 JavaBean编写 5
4.1 数据库操作JavaBean编写 5
4.2 汉字乱码处理JavaBean编写 7
4.3 用户基础信息JavaBean编写 7
4.4 提交用户信息JavaBean编写 8
4.5 查询、分页JavaBean编写(QuestString.java) 9
4.6 显示系统时间JavaBean编写 14
5 用户登录模块设计 15
6 系统首页设计 16
7 基础信息管理关键功效模块设计 18
7.1 用户信息管理设计 18
7.2 用户信息查询设计 19
8 库存管理关键功效模块设计 22
8.1 商品入库信息设计 23
8.2 商品价格调整设计 26
附录A 参考文件
附录B 数据表
附录C 文件架构图
0 引言
伴随中国电子商务、互联网业务迅猛发展,中国很多企业已跨入电脑网络管理时代,并所以提升了管理效率和市场竞争力。但现在仍有部分企业还停留在原始计账管理阶段。而伴随全球经济信息化进程和WTO成功实现,企业面临着前所未有机遇和挑战,在如此激变社会形势和猛烈市场竞争下,愈来愈多企业管理者意识到效率管理和科学管理关键性,和增强市场竞争力迫切性,所以建立科学、规范、高效管理制度和秉承富有竞争力经营理念是每一个企业管理者渴望,企业采取电脑管理进货、库存、销售等很多步骤也已成为趋势及肯定。
在进货、库存、销售步骤中,因为商品种类繁多、业务量大、库存管理复杂,使用手工操作工作量很大,在操作过程中也很轻易出现多种错误。而采取计算机管理则能够大大提升日常工作效率,不仅将原来由手工操作进货、出货及销售这一整套步骤用计算机进行全程管理,而且消除了手工操作中可能存在不确定原因,达成进销存管理步骤清楚,从而能够比较根当地落实经营者管理模式。
1 系统分析
1.1 需求分析
经过调查研究,要求系统满足以下功效:
q 因为操作人员计算机知识水平有限,所以要求系统含有良好人机界面。
q 假如系统使用对象较多,则要求有很好权限管理。
q 方便数据查询功效,并支持多条件查询。
q 在多种单据中依据输入基础数据自动计算金额,尽可能降低人工干预。
q 对用户或供给商往来账目进行有效管理,绝不存在假账、漏账、差账等情况。
q 经过计算机,能够直接“透视”仓库存放情况。
q 对某一时间段内某种商品销售情况按数量或金额进行升序或降序排行。
q 图表分析年销售额。
1.2 可行性分析
经过计算机网络系统对企业进行全方面管理,满足了企业现代化管理要求。
q 经济性
目前很多中小型企业全部使用人工管理方法(即纸和笔)来管理企业进销存,这么管理方法既困难又浪费时间和成本,而且轻易出现漏账、差账情况,所以中小企业应该向大型企业那样采取优异管理方法,提升企业效率、降低企业运行成本。
q 技术性
企业进销存管理系统从中小企业实际出发,可有效地管理企业进销存情况,并降低企业运行成本、立即调整营销策略、提升库房利用率。
2 总体设计
2.1 项目计划
企业进销存管理系统是一个经典数据库开发应用程序,由基础信息管理、库存管理、商品销售、查询统计、往来管理、系统设置6部分组成。
q 基础信息管理
该模块关键是对企业用户信息、商品信息、供给商信息进行有效管理,并可实现按不一样条件对这些数据进行查询。
q 库存管理
该模块关键是对商品入库及入库退货信息进行有效管理,对商品价格进行调整,同时可按不一样条件查询库存商品。
q 商品销售
该模块关键是对商品销售及销售退货信息进行有效管理。
q 查询统计
该模块关键实现按不一样条件查询商品入库信息及销售信息,并可对某一时间段内某种商品销售情况按数量或金额进行升序或降序排行,同时可对某十二个月度销售额进行图表分析。
q 往来管理
该模块关键实现对商品入库结账、入库退货结账、销售结账、销售退货结账信息进行有效管理,同时可实现销售结账信息及入库结账信息查询操作。
q 系统设置
访模块关键实现对操作员及操作员密码进行有效管理。
2.2 系统功效结构图
企业进销存管理系统功效结构图1所表示。
图1 系统功效结构图
3 系统设计
3.1 设计目标
本系统针对中小型企业进销存管理现实状况,经过网络对企业进销存进行有效管理。本系统关键实现以下目标:
q 系统采取人机对话方法,界面美观友好,信息查询灵活、方便、快捷、正确,数据存放安全可靠。
q 实现企业内部分基础信息设置及查询。
q 商品入库、入库退货、销售、销售退货步骤清楚。
q 数据计算自动完成,提升工作效率。
q 和供给商和用户之间账目清楚。
q 以图表形式对年销售额进行分析。
q 实现多条件查询。
q 可方便快捷地查询库存信息,并可对商品价格进行调整。
q 对某一时间段内某种商品根据销售数量或销售金额进行销售升序排行或降序排行。
q 操作员能够随时修改自己口令。
q 对用户输入数据,系统进行严格数据检验,尽可能排除人为错误。
q 系统最大程度地实现了易维护性和易操作性。
q 系统运行稳定、安全可靠。
3.2 开发及运行环境
硬件平台:
q CPU:P41.8GHz。
q 内存:256MB以上。
软件平台:
q 操作系统:Windows 。
q 数据库:SQL Server 。
q 开发工具包:JDK Version1.4.2。
q JSP服务器:Tomcat。
q 浏览器:IE5.0,推荐使用IE6.0。
q 分辨率:最好效果1024×768像素。
3.3 数据库设计
本系统采取SQL Server 数据库,系统数据库名称为db_shopping。数据库db_shopping中包含17张表。相关数据库中数据表请参见附录B。
4 JavaBean编写
依据系统需求编写需要JavaBean。下面将给出企业进销存管理系统中所需要JavaBean编写过程。
4.1 数据库操作JavaBean编写
数据库连接JavaBean编写代码以下:
package com.mingri.dbconn;
import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
public class DBConn
{
public static synchronized Connection getConnection() throws Exception{
try{
Context initCtx=new javax.naming.InitialContext(); //取得JNDI初始上下文对象
//在JNDI命名空间java:comp/env段里取得上下文对象
Context envCtx=(Context)initCtx.lookup("java:comp/env");
DataSource ds=(DataSource)envCtx.lookup("jdbc/mingri"); //经过JNDI名取得数据源对象
return ds.getConnection();
}
catch(SQLException e){
throw e;
}
catch(NamingException e){
throw e;
}
}
}
数据库操作JavaBean编写代码以下:
package com.mingri.dbconn;
import java.sql.*;
import com.mingri.dbconn.DBConn;
public class DBResult
{
private Connection con;
public DBResult(){
this.con=DBConn.getConnection();
}
/**
* 用于取得实施SQL语句ResultSet对象
*/
public ResultSet getResult(String sql){
try{
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(sql);
return rs;
}
catch(Exception e){}
return null;
}
/**
* 用于实施SQL语句没有返回值
*/
public void doExecute(String sql){
try{
Statement stmt=con.createStatement();
stmt.executeQuery(sql);
}catch(Exception e){}
}
/**
* 用于取得实施SQL语句PreparedStatement(预处理)对象
*/
public PreparedStatement getPreparedStatement(String sql){
try{
PreparedStatement pstmt=con.prepareStatement(sql);
return pstmt;
}
catch(Exception e){}
return null;
}
/**
* 关闭连接
*/
public void closeCon(){
try{
this.con.close();
}catch(Exception e){
e.printStackTrace(); } }
}
4.2 汉字乱码处理JavaBean编写
在JSP开发中,常常出现乱码问题,我们能够指定编码方法,以消除乱码。
package com.mingri.chinese;
import java.io.*;
public class ToChinese
{
public String trans(String chi){
String result=null;
byte temp[];
try{
temp=chi.getBytes("iso-8859-1");
result=new String(temp);
}
catch(UnsupportedEncodingException e){
System.out.println(e.toString());
}
return result;
}
}
4.3 用户基础信息JavaBean编写
这段代码用来封装用户基础信息,并对每个属性提供setXXX()和getXXX()方法,来对其进行操作。
package com.mingri.info;
public class KhinfoBean
{
private String khname; //用户全称
private String khjc; //用户简称
private String address; //地址
private String postcode; //邮政编码
private String tel; //电话
private String fax; //传真
private String lxr; //联络人
private String lxrtel; //联络人电话
private String email; //电子邮箱
private String khyh; //开户银行
private String yhzh; //银行账号
public String getKhname() {
return khname;
}
public void setKhname(String khname) {
this.khname = khname;
}
……//省略部分代码
}
4.4 提交用户信息JavaBean编写
在填写完用户基础信息后,就应该向数据库中实施插入操作。这个类中有两个方法setKhinfo()和Regist()。其中setKhinfo(KhinfoBean khinfo)方法是用来设置该类中属性khinfo,其值为参数传输来KhinfoBean对象。然后实施预处理语句,并经过预处理对象pstmtsetString()方法来设置准备要插入数据库内容,最终经过execute()来实施插入操作。具体代码以下:
package com.mingri.info;
import com.mingri.dbconn.DBResult;
import java.sql.*;
public class KhRegist
{
private KhinfoBean khinfo;
DBResult rst=new DBResult();
public void setKhinfo(KhinfoBean khinfo){
this.khinfo=khinfo;
}
public void regist() throws Exception{
String reg="insert into tb_customer values(?,?,?,?,?,?,?,?,?,?,?)";
try{
PreparedStatement pstmt=rst.getPreparedStatement(reg); //创建一个预处理语句,然后设置她们参数
pstmt.setString(1,khinfo.getKhname());
pstmt.setString(2,khinfo.getKhjc());
pstmt.setString(3,khinfo.getAddress());
pstmt.setString(4,khinfo.getPostcode());
pstmt.setString(5,khinfo.getTel());
pstmt.setString(6,khinfo.getFax());
pstmt.setString(7,khinfo.getLxr());
pstmt.setString(8,khinfo.getLxrtel());
pstmt.setString(9,khinfo.getEmail());
pstmt.setString(10,khinfo.getKhyh());
pstmt.setString(11,khinfo.getYhzh());
//实施更新操作
pstmt.executeUpdate();
}
catch(Exception e){
e.printStackTrace();
throw e;
}
}
}
4.5 查询、分页JavaBean编写(QuestString.java)
该系统中关键方法分为两部分:一部分是依据用户提交不一样请求调用不用方法来获取SQL语句;另一部分是用于分页显示。用于完成份页显示方法有:
q void setQuerySql(String httpfile,String pages,String strCount):经过参数传输来设置Bean中属性。
q void querySql(String countSql):实施SQL语句,取得分页显示时各个属性。
q String pageFooter():用来动态给出一个表单该表单用来进行分页和统计页面间跳转。
这部分代码是本系统中查询部分骨架,全部包含到查询操作代码部分全全部调用了该Bean 中对应方法,并完成了分页显示。代码以下:
package com.mingri.info;
import com.mingri.dbconn.DBResult;
import java.sql.*;
import java.io.*;
public class QuestString
{
private int curPage; //目前页数
private int maxPage; //最大页数
private int maxRowCount; //总统计数(即从数据库中查出全部统计)
private int pageSize=2; //每页要显示统计数
private DBResult db; //统计集对象
private String httpFile; //目前地址栏文件,即具体JSP文件
private String cif; //选择查询字段
private String ccif; //选择查询运算符
private String qvalue; //查询关键字
private String countSql=null; //用来存放select count (*) ……语句
private String topSql=null; //用来存放 select top 2……语句
private String nowPage=null; //初始化目前页curPage变量,即获取目前页具体页号
private String str_parameter; //在做翻页时,传输除pages以外其它参数
private String andor; //查询和/或条件
private String sdate; //查询起始时间,即从什么日期开始查询
private String edate; //查询结束时间,即到什么日期结束
private String orderby; //排序条件,即按什么排序
private String paixu; //排序方法,即升序或降序
public QuestString(){ //结构方法,用来设置db为一个DBResult()对象
db=new DBResult();
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
//省略了对Bean中其它属性设置部分代码
……
/**
* 经过参数传输来设置Bean中属性
*/
public void setQuerySql(String httpfile,String pages,String strCount){
this.nowPage=pages; //将表单提交过来参数pages(第几页)值传输给变量nowPage保留
this.httpFile=httpfile; //用来动态设置处理表单请求JSP文件
this.countSql=strCount; //用来设置实施select count(*)……SQL语句
try{
querySql(countSql); //调用querySql方法,并将参数countSql传输到该方法中
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 实施SQL语句,取得分页显示时各个属性
*/
public void querySql(String countSql) throws SQLException{
//在setQuerySql方法中已经设置了nowPage值,其值就是pages
if(this.nowPage==null){ //假如nowPage值为空,也就是传输pages值为空
this.curPage=1; //那么就将目前页值设为1;
}
else{
this.curPage=Integer.parseInt(this.nowPage);
if(this.curPage<1){ //假如目前页小于1,那么就将目前页值设为1
this.curPage = 1;
}
}
ResultSet rsCount=db.getResult(countSql); //实施SQL语句取得统计总数
if(rsCount.next()){
this.maxRowCount=rsCount.getInt(1); //获取统计总数,即所要查询统计总行数
}
//获取总页数,即假如当总统计数除以每页显示统计余数为0时,总页数就等于两数整除结果
//假如余数不等于0,那么总页数就等于两数整除结果加1
this.maxPage=(this.maxRowCount%this.pageSize==0)?(this.maxRowCount/this.pageSize):(this.maxRowCount/this.pageSize+1);
if(this.curPage>this.maxPage){ //假如目前页大于总页数,则目前页等于总页数
this.curPage=this.maxPage; //那么目前页就是最大页
}
rsCount.close(); //关闭总统计数结果集
}
/**
* 一个字符串,用来动态给出一个表单
* 该表单用来进行分页和统计页面间跳转
*/
public String pageFooter()
{
//创建一个表单
String str = "<form action=" + this.httpFile + " name=formBean methord=post>";
int prev = this.curPage- 1; //向前翻页,即目前页减1
int next = this.curPage +1; //向后翻页,即目前页加1
str = str + "<font style='font-size: 10pt'>总计<font color='red'>" + this.getMaxRowCount() +
"</font>条统计," + "【共<font color='red'>" + this.getMaxPage()+ "</font>页】";
str = str + "【 <font color='red'>" + this.pageSize + "</font>条/页】 目前第<font color='red'>" +
this.getCurPage() + "</font>页 ";
if(this.curPage > 1)
str = str + " <A href=" + this.httpFile + "?pages=1" + str_parameter + ">首页</A> ";
else
str = str + " 首页 ";
if(this.curPage > 1)
str = str + " <A href=" + this.httpFile + "?pages=" + prev + str_parameter + ">上一页</A> ";
else
str = str + " 上一页 ";
if(this.curPage < this.maxPage)
str = str + " <A href=" + this.httpFile + "?pages=" + next + str_parameter + ">下一页</A> ";
else
str = str + " 下一页 ";
if(this.maxPage > 1 && this.curPage!= this.maxPage)
str = str + " <A href=" + this.httpFile + "?pages=" + this.maxPage + str_parameter + ">尾页</A>";
else
str = str + " 尾页</font>";
//在页面跳转间设置隐藏表单,来保留不一样请求
str = str + "转到<input type ='text' name='pages' size='2'>页"+
"<input type='hidden' name='ccif' value='"+this.ccif+
"'><input type ='hidden' name='cif' value='"+this.cif+
"'><input type ='hidden' name='qvalue' value='"+this.qvalue+
"'><input type ='hidden' name='andor' value='"+this.andor+
"'><input type ='hidden' name='sdate' value='"+this.sdate+
"'><input type ='hidden' name='edate' value='"+this.edate+
"'><input type ='hidden' name='orderby' value='"+this.orderby+
"'><input type ='hidden' name='paixu' value='"+this.paixu+
"'><input type='submit' name='sumbmit' value='go'></form>";
return str;
}
/**
* 依据不一样条件来获取不一样查询前N条SQL语句
*/
public String getString(String table){
if(ccif.equals("="))
{
String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
" where"+" "+cif+"="+"'"+qvalue+"'";
return strSql;
}
else if(ccif.equals("LIKE"))
{
String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
" where"+" "+cif+" "+"like"+" "+"'%"+qvalue+"%'";
return strSql;
}
else if(ccif.equals("ALL"))
{
String strSql="select top "+this.pageSize*this.curPage+" * from "+table;
return strSql;
}
else if(ccif.equals("<"))
{
String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
" where "+cif+" < '"+qvalue+"'";
return strSql;
}
return null;
}
/**
* 依据不一样条件来取得不一样计算统计总数SQL语句
*/
public String getCount(String table){
if(ccif.equals("="))
{
String strSql="select count(*) from "+table+" where"+" "+cif+"="+"'"+qvalue+"'";
return strSql;
}
else if(ccif.equals("LIKE"))
{
String strSql="select count(*) from "+table+" where"+" "+cif+" "+"like"+" "+"'%"+qvalue+"%'";
return strSql;
}
else if(ccif.equals("ALL"))
{
String strSql="select count(*) from "+table;
return strSql;
}
else if(ccif.equals("<"))
{
String strSql="select count(*) from "+table+" where "+cif+" < '"+qvalue+"'";
return strSql;
}
return null;
}
/**
* 依据不一样条件和不一样起始日期和结束日期来取得不一样计算统计总数SQL语句
*/
public String getDateCount(String table){
if(ccif.equals("=")) //在sdate到edate时间段中进行正确查询
{
String strSql="select count(*) from "+table+" where "+cif+" = '"+qvalue+"'"+
andor+" xsdate between '"+sdate+"' and '"+edate+"'";
return strSql;
}
else if(ccif.equals("LIKE")) //在sdate到edate时间段中进行模糊查询
{
String strSql="select count(*) from "+table+" where "+cif+" like '%"+qvalue+"%'"+
andor+" xsdate between '"+sdate+"' and '"+edate+"'";
return strSql;
}
else if(ccif.equals("ALL")) //取出表中全部统计
{
String strSql="select count(*) from "+table;
return strSql;
}
return null;
}
/**
* 依据不一样条件和不一样起始日期和结束日期来取得不一样查询,前N条SQL语句
*/
public String getDateString(String table){
if(ccif.equals("="))
{
String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
" where "+cif+"
展开阅读全文