基于JSP和MySQL的汽车销售管理系统
一、系统开发平台
1.1 数据库应用的基本框架
本汽车销售管理系统采用B/S架构。
服务器端是一个Web服务器和数据库服务器的组合体,客户端通过Web服务器连接数据库执行各种增删改查的操作。与此同时Web服务器还可以进行各种业务逻辑的运算。
客户端通过一般的浏览器应用访问网页,网页应该易于操作,并且具有一定的美观性,而对于数据库的相关操作,避免了用户与数据库的直接相连,减轻了数据库的负载,提高了安全性。
数据库服务器的管理通过mysql5.7实现。
应用程序的基本框架:用户登陆、权限设置、数据录入、信息查询与更新、报表输出、系统维护、退出功能。
1.2 开发软件介绍
- 开发语言 :Html/CSS+JavaScript+jsp+servlet
-
主要用于开发客户端网页以及Web服务器脚本
-
开发工具 :Eclipse 、 MySQL Workbench 6.3 CE
- Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境
-
MySQL Workbench是为MySQL设计的ER/数据库建模工具。是著名的数据库设计工具DBDesigner4的继任者。具有设计和创建新的数据库图示,建立数据库文档,以及进行复杂的MySQL 迁移的作用
-
服务器 :MySQL Server 5.7+Tomcat7.0
- Mysql提供了一个关系型数据库管理系统,其体积小、速度快、成本低,并且开放源码,这些特点很适合于轻量级数据库的课程设计
-
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选
-
操作系统 :Windows 10
- Windows 10是美国微软公司研发的跨平台及设备应用的操作系统
二、数据库规划
2.1 任务陈述
随着经济的发展和国内汽车市场的不断扩大,某汽车销售公司定单成倍增加,各项业务更加细化,各部门分工更加明确。而目前的人工管理方式显然已是不符合现代企业的管理要求。
基于整体考虑,本次课程设计任务就是设计一个管理系统,利用计算机来代替人工操作。减轻了员工的劳动强度,提高了劳动质量和效率,减少了错误的发生。
本次设计,从需求分析,概念设计,逻辑设计,物理设计,到数据库的建立、运行,再到数据库的安全维护等各个方面进行了详细的分析设计。并且值得一提的是,在认真分析企业的业务需求,公司的主要职责和主要结构等信息的基础上,设计出比较符合公司需要的管理系统。
汽车销售管理系统大致分为以下几个模块:
-
基础信息管理 :包括客户、车辆、职工、车辆配件等基本信息的管理
-
进货业务管理 :管理车辆和车辆配件采购订单(相关的供应商信息)
-
销售业务管理 :管理与车辆的销售和预订相关的信息
-
汽车相关业务管理 :管理汽车售后、维修、加装配件的相关信息
-
仓库库存信息管理 :管理库存车辆和配件的基本信息
-
财务信息管理 :财务支出和收入管理
-
系统维护与升级 :对数据库系统以及网页的维护与升级
2.2 任务目标
各个管理模块的大致内容如下:
-
基础信息管理 :车辆信息、配件信息、客户相关信息、员工信息、供应商信息
-
进货业务管理 :采购订单信息(车辆、配件)
-
销售业务管理 :销售车辆信息、车辆预定信息管理
-
汽车附加业务管理 :汽车维修与保养信息、加装部件。(加装配件、维修保养)
-
仓库库存信息管理 :库存车辆及配件信息,车辆销售、预订出库,配件加装、维修出库,库存转移
-
财务信息管理 :销售统计,采购统计——财务报表及分析(收付款统计表、收款分类统计表、销售利润分析表、营业汇总表、物资采购报表、车辆销售报表)
-
系统维护 :系统管理人员信息
三、系统定义
3.1 系统边界
3.2 用户视图
- 管理员视图
-
拥有数据库中所有的数据表格的任何权限
-
系统用户视图
- 初次客户档案录入
- 已有客户档案查询
- 车辆销售单的提交,车辆预订单据的添加/修改/删除
- 车辆附加业务信息的提交/修改/删除
- 采购订单的查询/添加/修改/删除
- 员工信息的查询/添加/修改/删除
- 库存车辆/配件的查询,库存变动信息查询,库存转移信息提交/修改
- 财务收入查询,车辆销售、附加业务;财务支出:采购支出
- 仓库信息的增添/修改/删除
四、需求分析
4.1 用户需求说明
4.1.1 数据需求
- 实体集
- 车辆信息(合格证号,车牌号,品牌,车型,含税成本,颜色,状态)
- 用户信息(身份证号码,姓名,性别,电话,住址)
- 汽车配件(配件编号,配件名,生产成本,售价)
- 员工信息(身份证号码,姓名,性别,电话,地址,类别)
- 仓库信息(仓库编号,仓库名,仓库容量,管理员身份证号)
-
供应商信息(供应商编号,供应商名称,供应商电话,供应商地址)
-
联系集
- 车辆销售/预订(合格证号,用户ID,员工ID,方式‘销售’or‘预订’,付款金额,时间)
- 车辆/配件采购(合格证号/配件编号,员工ID,供应商编号,采购时间,采购金额)
- 车辆附加配件(合格证号,配件编号,员工ID,费用,时间,服务类型)
- 车辆/配件存储(合格证号/配件编号,仓库编号)
4.1.2 事务需求
-
数据录入 :车辆销售/预订信息录入、用户信息录入、员工信息录入、仓库信息录入、员工采购(车辆/配件)信息录入、供应商信息录入
-
数据更新/修改 :客户、员工、仓库、供应商信息的修改和更新、客户预订车辆信息的结算、删除,客户预订失效信息的更新、库存车辆的转移
-
数据查询 :客户、员工、仓库、供应商信息的查询、客户购车信息以及预订信息的查询、客户维修保养加装信息的查询、财务收入/支出查询、库存车辆/配件信息的查询,车辆/配件采购单的查询
4.2 系统需求说明
- 性能要求
- 软件应能保证系统运行稳定,避免系统崩溃
- 软件必须保证有足够的数据精度,不影响正常业务
- 查询某条记录的时间小于3秒
- 更新/修改某条记录的时间少于4秒
- 对数据进行有效性验证的时间少于1秒。(对任何输入都要进行有效性检查,对部分错误产生报错信息)
-
生成报表的时间少于5秒
-
操作要求
- 拥有良好的交互界面,操作简单的同时保证一定的安全性
- 对某些特定需求产生相应的输出供用户打印(发票开具)
-
不同种类的用户拥有不同的权限,绝对禁止越权级操作;(权限越高的用户,操作流程越严密)
-
数据容量要求
-
运行在本软件系统上的各类数据的最大规模约为40GB(服务器硬盘大小),由于只是一个轻量级的服务器,未来的数据规模的增加会产生不良后果
-
事务故障处理说明
- 用户个人设备的硬件故障可能造成本软件不能运行或不能正常进行输入/输出等后果,系统的资源不足及网络的运输通道阻塞可能造成本软件运行效果不佳,上述故障的处理由用户自行解决
- 软件在运行过程中产生的数据库错误,将由系统自动记入错误日志,非网络传输引起的错误将由系统管理员或软件开发者解决
-
软件在运行过程中产生的其他错误,将根据情况由软件开发者或系统管理员协助解决
-
数据库的备份与恢复
- 数据库每周进行一次的完整备份,每天一次差异备份,每半小时一次事务日志备份。数据库的恢复应该由开发人员或管理人员进行
五、数据库逻辑设计
5.1 E-R图
5.2 数据字典
Car
Customer
Parts
Staff
Storage
外码
5.3 关系表
Car_purchase
外键
Car_sales
外键
Car_storage
外键
Parts_purchase
外键
Parts_storage
外键
Car_parts
外码
六、数据库物理设计
6.1 索引
数据库中的索引:
表名 | 主键 | 外键 |
---|---|---|
car | certificate_id | |
car_puchase | certificate_id | staff_id,supplier_id |
car_sales | certificate_id | customer_id,staff_id |
car_storage | certificate_id | storage_id |
customer | customer_id | |
parts | parts_id | |
parts_storage | parts_id,storage_id | parts_id,storage_id |
parts_purchase | parts_purchase_id | staff_id |
staff | staff_id | |
storage | storage_id | staff_id |
supplier | supplier_id |
6.2 视图
在数据库的查询中,汽车销售单的查询涉及到了多表复杂连接,通过创建视图可以很好地提高查询的效率。
sql
create view car_sales_view as
select *
from (select * from car_sales where sales='销售') as sale
natural join car_purchase natural join car
6.3 安全机制
-
外码依赖 :在本系统中,存在较多的外码依赖,在降低了部分系统灵活性的同时,大大提高了系统的安全性,对于各类基本信息的增删改查,很大限度上限制了用户的某些错误操作
-
输入检查 :对于用户输入的错误信息,(与数据库的数据类型不符,数据冗余,员工信息错误,各类表单提交错误以及各种错误操作)都会产生相应的报错信息
-
数据安全 :对于各类事务的处理,通过jdbc提供的事务处理方法保证了事务的原子性、一致性。同时,通过登陆机制确保了数据库的安全访问
6.4 其他
对于汽车配件这个实体而言,同一配件在仓库中可能存储多件,同时在加装维修保养时,也可能会同时参与多次,所以对于它的联系集而言,拥有一些特殊属性,比如加装次数或者库存数量,会降低数据的数据负担,但同时,这也降低了系统的灵活性,对于同一配件而言,可能多次采购的价格有所不同,这是系统所不允许的,这些任务只能交给了用户自己处理。(一种可能的解决方案是对属性有所不同的配件进行合理编号)
对于汽车销售/预订单而言,将其合并为一个表,并加入一个属性表明数据单类型,这样在处理预订单的结算时提供了很大的方便,同时也避免了表项的冗余。
七、应用程序设计
7.1 功能模块
应用程序大致分为以下六个模块:
- 系统管理
-
查看/添加员工信息
-
销售管理
- 查看/添加车辆预订/销售单
-
查看/添加汽车加装维修保养
-
库存管理
- 库存车辆/配件信息
-
查询/添加仓库信息
-
进货管理
- 查看/添加供应商信息
-
查看/添加汽车/配件采购信息
-
财务管理
-
财务支出/收入表
-
客户管理
- 查看/添加客户信息
7.2 界面设计
注册界面
登陆界面
主界面
基本信息查询界面
基本信息添加界面
车辆预订单的查询
车辆预订单的添加
车辆销售单的查询
车辆销售单的添加
财务收入/支出统计表
7.3 事务设计
(注:通过Servlet实现了事务逻辑,只列出doPost()方法的主要代码)
预订单提交
在数据库中,car_sales记录了所有的预订单,car中描述了车辆的状态,在这个事务中,首先查看car中所预订车辆的状态,若车辆状态为‘在库’且员工为销售时,车辆可以预订并开启事务;否则提示车辆已被预订或销售,或者员工错误;对于已经开启的事务,其流程如下;
-
首先将car表中的对于车辆的状态改为‘预订’
-
然后向car_sales中插入一条关于该车辆的预订单
-
若以上操作出现异常,事务回滚,跳转到提交页面并提示提交失败,否则提示提交成功
代码实现:
java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();//数据库连接对象
Connection c=con.getConn();
String certificateid=request.getParameter("certificateid");//合格证号
String subtime=request.getParameter("subtime");//预订时间
String customerid=request.getParameter("customerid");//用户ID
String submoney=request.getParameter("submoney");//预订金额
String deadline=request.getParameter("deadline");//截止日期
String staffid=request.getParameter("staffid");//员工ID
try{
Statement stm=c.createStatement();
String sql="select id_card from customer where id_card='"+customerid+"'";
ResultSet rs=stm.executeQuery(sql);
if(rs.next()) {
sql="select* from car where certificate_id='"+certificateid+"'";
rs=stm.executeQuery(sql);
if(rs.next()) {
if(rs.getString("car_state").equals("预订")||rs.getString("car_state").equals("已售")) {
request.setAttribute("msg","该车已被预订或售出");
}else {
sql="select id_card from staff where staff_category='销售' and id_card='"+staffid+"'";
rs=stm.executeQuery(sql);
if(!rs.next()) {
request.setAttribute("msg","该员工不是销售");
}
else {
c.setAutoCommit(false);//开启事务
sql="update car set car_state='预订' where certificate_id='"+certificateid+"'";
stm.executeUpdate(sql);
sql="insert into car_sales values('"+certificateid+"','"+customerid+"','"+staffid+"','预订','"+submoney+"','"+subtime+"','"+deadline+"')";
stm.executeUpdate(sql);
c.commit();//try的最后提交事务
request.setAttribute("msg","订单提交成功");
}
stm.close();
rs.close();
}
}else {
request.setAttribute("msg","库存中不存在该车辆");
}
}else {
request.setAttribute("msg","暂无该客户信息");
}
request.getRequestDispatcher("/car_subscribe_edit.jsp").forward(request, response);
} catch(Exception e) {
request.setAttribute("msg","提交预订单失败");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
request.getRequestDispatcher("/car_subscribe_edit.jsp").forward(request, response);
}
}
}
预订单结算
在数据库中,car_sales记录了预订单和销售单的信息,car_storage中描述了汽车与仓库的存储关系,car中记录了车辆状态,在这个事务中,事务的开启不需要特殊条件:
-
首先将car表中的对于车辆的状态改为‘已售’
-
然后将car_sales中关于该车辆的预订单修改为销售单,销售时间修改为系统时间
-
将该车所存储的仓库的容量+40(车的体积默认为40),同时删除car_storage中存储记录
-
若以上操作出现异常,事务回滚,跳转到上一页面并提示结算失败,否则提示结算成功
代码实现:
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
String certificateid=request.getParameter("cid");//结算车辆的合格证号
Date date=new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String time=df.format(date);//系统时间
Connection c=con.getConn();
try {
String sql="update car set car_state='已售' where certificate_id='"+certificateid+"'";
Statement stm=c.createStatement();
c.setAutoCommit(false);//开启事务
stm.executeUpdate(sql);
sql="update car_sales set sales='销售',sales_time='"+time+"' where certificate_id='"+certificateid+"'";
stm.executeUpdate(sql);
sql="update storage set storage_capacity=storage_capacity+40 "
+ "where storage_id=(select storage_id "
+ "from car_storage where certificate_id='"+certificateid+"')";
stm.executeUpdate(sql);
sql="delete from car_storage where certificate_id='"+certificateid+"'";
stm.executeUpdate(sql);
stm.close();
c.commit();//try的最后提交事务
request.setAttribute("msg","结算成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
request.setAttribute("msg","结算失败");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally {
request.getRequestDispatcher("/car_subscribe_list.jsp").forward(request, response);
}
}
```
预订单的删除
数据库中car_sales记录了预订单的信息,car记录了车辆的状态,该事务的开始不需要特殊条件,因此依次执行以下操作:
-
首先将car表中的对于车辆的状态改为‘在库’
-
然后从car_sales中删除关于该车辆的预订单
-
若以上操作出现异常,事务回滚,跳转到上一页面并提示删除失败,否则提示删除成功
代码实现:
java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
Connection c=con.getConn();
String cid=request.getParameter("cid");//被删除预订单的车辆合格证号
try{
c.setAutoCommit(false);//开启事务
String sql="update car set car_state='在库' where certificate_id='"+cid+"'";
Statement stm=c.createStatement();
stm.executeUpdate(sql);
sql="delete from car_sales where certificate_id='"+cid+"'";
stm.executeUpdate(sql);
stm.close();
c.commit();//try的最后提交事务
request.setAttribute("msg","删除成功");
} catch(Exception e) {
request.setAttribute("msg","删除失败");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}//回滚事务
}finally {
request.getRequestDispatcher("/car_subscribe_list.jsp").forward(request, response);
}
}
车辆销售单提交
在数据库中,car_sales中记录了销售单,car记录了车辆状态,car_storage记录了车辆与仓库的存储关系,对于销售单的提交,首先需要判断库存车辆的状态以及员工职务,仅当车辆在库以及员工为销售时,方可开启事务,否则提示相应错误:
-
首先将car表中的对于车辆的状态改为‘销售’
-
然后从car_sales中插入一条关于该车辆的销售单
-
从库存中删除关于该车辆的存储记录
-
若以上操作出现异常,事务回滚,跳转到上一页面并提示提交失败,否则提示提交成功
代码实现:
java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
Connection c=con.getConn();
String certificateid=request.getParameter("certificateid");
String salestime=request.getParameter("salestime");
String customerid=request.getParameter("customerid");
String payprice=request.getParameter("payprice");
String staffid=request.getParameter("staffid");
try{
Statement stm=c.createStatement();
String sql="select id_card from customer where id_card='"+customerid+"'";
ResultSet rs=stm.executeQuery(sql);
if(rs.next()) {
sql="select* from car where certificate_id='"+certificateid+"'";
rs=stm.executeQuery(sql);
if(rs.next()) {
if(rs.getString("car_state").equals("预订")||rs.getString("car_state").equals("已售")) {
request.setAttribute("msg","该车已被预订或售出");
}else {
sql="select id_card from staff where staff_category='销售' and id_card='"+staffid+"'";
rs=stm.executeQuery(sql);
if(!rs.next()) {
request.setAttribute("msg","该员工不是销售");
}
else {
c.setAutoCommit(false);//开启事务
sql="update car set car_state='已售' where certificate_id='"+certificateid+"'";
stm.executeUpdate(sql);
sql="insert into car_sales values('"+certificateid+"','"+customerid+"','"+staffid+"','销售','"+payprice+"','"+salestime+"',null)";
stm.executeUpdate(sql);
sql="update storage set storage_capacity=storage_capacity+40 "
+ "where storage_id=(select storage_id "
+ "from car_storage where certificate_id='"+certificateid+"')";
stm.executeUpdate(sql);
sql="delete from car_storage where certificate_id='"+certificateid+"'";
stm.executeUpdate(sql);
c.commit();//try的最后提交事务
request.setAttribute("msg","订单提交成功");
}
stm.close();
rs.close();
}
}else {
request.setAttribute("msg","库存中不存在该车辆");
}
}else {
request.setAttribute("msg","暂无该客户信息");
}
request.getRequestDispatcher("/car_sales_edit.jsp").forward(request, response);
} catch(Exception e) {
request.setAttribute("msg","提交销售单失败");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
request.getRequestDispatcher("/car_sales_edit.jsp").forward(request, response);
}
}
}
车辆的维修保养加装
数据库中car_parts存储了车辆的维修保养加装信息,对于车辆的维修保养,首先判断该车辆是否已被销售,只有已被销售的车辆方可进行车辆的维修保养加装,否则提示错误,对于开启的事务,主要实现以下操作:
-
从库存中删除相关配件,若配件数量1,则删除存储记录,否则将库存数量-1
-
向car_parts中添加汽车额外服务信息,对于同一日期的同一车辆需求的同一配件,默认为相同服务,只增加服务次数,否则添加一条新的服务信息
-
若以上操作出现异常,事务回滚,跳转到上一页面并提示提交失败,否则提示提交成功
代码实现:
java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
Connection c=con.getConn();
String certificateid=request.getParameter("certificateid");
String partsid=request.getParameter("partsid");
String storageid=request.getParameter("storageid");
String servicetime=request.getParameter("time");
String service=request.getParameter("service");
String staffid=request.getParameter("staffid");
String serviceprice=request.getParameter("service_price");
String sql="select* from car where certificate_id='"+certificateid+"' and car_state='已售'";
String check="select* from parts_storage where storage_id='"+storageid+"' and parts_id='"+partsid+"'";
String checkstaff="select* from staff where id_card='"+staffid+"' and staff_category='维修'";
String sqlx="select service_price from car_parts where certificate_id='"+certificateid+"' "
+ "and staff_id='"+staffid+"' and service='"+service+"' and parts_id='"+partsid+"' and service_time='"+servicetime+"'";
String m=""+con.Count(sqlx);
if(con.isExist(check)==0) {
request.setAttribute("msg","库存中无此配件");
request.getRequestDispatcher("/car_parts_edit.jsp").forward(request, response);
}else if(con.isExist(checkstaff)==0) {
request.setAttribute("msg","该员工不是维修人员");
request.getRequestDispatcher("/car_parts_edit.jsp").forward(request, response);
}else if(!m.equals(serviceprice)&&!m.equals("0")){
request.setAttribute("msg","价格有误");
request.getRequestDispatcher("/car_parts_edit.jsp").forward(request, response);
}else if(con.isExist(sql)==1) {
try {
sql="select parts_num from parts_storage where storage_id='"+storageid+"' and parts_id='"+partsid+"'";
int parts_num=con.Count(sql);
parts_num--;
if(parts_num==0){
sql="delete from parts_storage where storage_id='"+storageid+"' and parts_id='"+partsid+"'";
}else {
sql="update parts_storage set parts_num=parts_num-1 where storage_id='"+storageid+"' and parts_id='"+partsid+"'";
}
c.setAutoCommit(false);//开启事务
Statement stm=c.createStatement();
stm.executeUpdate(sql);
if(m.equals(serviceprice)) {
sql="update car_parts set parts_num=parts_num+1 where certificate_id='"+certificateid+"' "
+ "and staff_id='"+staffid+"' and service='"+service+"' and parts_id='"+partsid+"' and service_time='"+servicetime+"'";
}else if(m.equals("0")) {
sql="insert into car_parts values('"+certificateid+"','"+partsid+"',1,'"+staffid+"','"+servicetime+"','"+serviceprice+"','"+service+"')";
}
stm.executeUpdate(sql);
stm.close();
c.commit();//try的最后提交事务
request.setAttribute("msg","提交成功");
request.getRequestDispatcher("/car_parts_edit.jsp").forward(request, response);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
request.setAttribute("msg","提交失败");
request.getRequestDispatcher("/car_parts_edit.jsp").forward(request, response);
}
}
}
else {
request.setAttribute("msg","该车尚未售出");
request.getRequestDispatcher("/car_parts_edit.jsp").forward(request, response);
}
}
库存车辆的转移
数据库中car_storage记录了车辆的存储关系,库存转移只需将car_storage中关于该车辆的记录修改即可,但首先需要判断所转移的车库容量是否足够才能开启事务,否则将产生报错信息,对于该事务而言,进行的操作为:
-
修改新旧仓库的库存容量,车辆的容积默认为40
-
修改car_storage中关于该车辆的存储记录
-
若以上操作出现异常,事务回滚,跳转到上一页面并提示转移失败,否则提示转移成功
代码实现:
java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
Connection c=con.getConn();
String storageid=request.getParameter("cstorageid");
String certificateid=request.getParameter("certificateid");
String changeid=request.getParameter("newStorage");
String sql="select storage_capacity from storage where storage_id='"+changeid+"'";
int newCap=con.Count(sql);
sql="select storage_capacity from storage where storage_id='"+storageid+"'";
int oldCap=con.Count(sql);
if(newCap<=40) {
request.setAttribute("msg","库存容量不足");
request.getRequestDispatcher("/car_storage_list.jsp").forward(request, response);
}else {
try{
c.setAutoCommit(false);//开启事务
newCap=newCap-40;
oldCap=oldCap+40;
sql="update storage set storage_capacity='"+newCap+"' where storage_id='"+changeid+"'";
Statement stm=c.createStatement();
stm.executeUpdate(sql);
sql="update storage set storage_capacity='"+oldCap+"' where storage_id='"+storageid+"'";
stm.executeUpdate(sql);
sql="update car_storage set storage_id='"+changeid+"' where certificate_id='"+certificateid+"'";
stm.executeUpdate(sql);
stm.close();
c.commit();//try的最后提交事务
request.setAttribute("msg","库存转移成功");
} catch(Exception e) {
request.setAttribute("msg","库存转移失败");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}//回滚事务
}finally {
request.getRequestDispatcher("/car_storage_list.jsp").forward(request, response);
}
}
}
汽车/配件采购单的提交
在该数据库中,car_purchase或者parts_purchase中记录了汽车/配件采购单的信息,对于配件和车辆的采购,首先需要判断员工职务以及库存容量是否足够,若信息错误,提交失败,否则开启事务:
-
向car或者parts中添加车辆/配件信息
-
修改对应storage的库存容量,配件容量默认为5,车辆为40
-
向car_purchase或者parts_purchase添加采购记录
-
若以上操作出现异常,事务回滚,跳转到上一页面并提示提交失败,否则提示提交成功
代码实现:
```java
//车辆采购
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
Connection c=con.getConn();
String certificateid=request.getParameter("certificateid");
String licenseid=request.getParameter("licenseid");
String purchasetime=request.getParameter("purtime");
String brand=request.getParameter("brand");
String supplierid=request.getParameter("supplierid");
String cartype=request.getParameter("cartype");
String staffid=request.getParameter("staffid");
String taxcost=request.getParameter("taxcost");
String storageid=request.getParameter("storageid");
String color=request.getParameter("color");
String sql="select storage_capacity from storage where storage_id='"+storageid+"'";
int cap=con.Count(sql);
sql="select id_card from staff where staff_category='采购' and id_card='"+staffid+"'";
int isExist=con.isExist(sql);
if(cap<40) {
request.setAttribute("msg","库存容量不足");
request.getRequestDispatcher("/car_purchase_edit.jsp").forward(request, response);
}else if(isExist==0) {
request.setAttribute("msg","该员工不是采购人员");
request.getRequestDispatcher("/car_purchase_edit.jsp").forward(request, response);
}
else {
try{
c.setAutoCommit(false);//开启事务
cap=cap-40;
sql="update storage set storage_capacity='"+cap+"' where storage_id='"+storageid+"'";
Statement stm=c.createStatement();
stm.executeUpdate(sql);
sql="insert into car values('"+licenseid+"','"+certificateid+"','"+brand+"','"+cartype+"','"+color+"','在库')";
stm.executeUpdate(sql);
sql="insert into car_storage values('"+certificateid+"','"+storageid+"')";
stm.executeUpdate(sql);
sql="insert into car_purchase values('"+certificateid+"','"+staffid+"','"+supplierid+"','"+purchasetime+"','"+taxcost+"')";
stm.executeUpdate(sql);
stm.close();
c.commit();//try的最后提交事务
request.setAttribute("msg","提交成功");
} catch(Exception e) {
request.setAttribute("msg","提交失败,请检查合格证号或供应商信息");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}//回滚事务
}finally {
request.getRequestDispatcher("/car_purchase_edit.jsp").forward(request, response);
}
}
}
//配件采购
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
DataProcess con=new DataProcess();
Connection c=con.getConn();
String partspurid=request.getParameter("partspurid");
String partsid=request.getParameter("partsid");
String partsname=request.getParameter("partsname");
String partsprice=request.getParameter("partsprice");
String purtime=request.getParameter("purtime");
String puramount=request.getParameter("puramount");
String staffid=request.getParameter("staffid");
String supplierid=request.getParameter("supplierid");
String storageid=request.getParameter("storageid");
String sql="select storage_capacity from storage where storage_id='"+storageid+"'";
int cap=con.Count(sql);
sql="select id_card from staff where staff_category='采购' and id_card='"+staffid+"'";
try {
Double cny = Double.parseDouble(partsprice);
DecimalFormat df = new DecimalFormat("0.00");
partsprice = df.format(cny);
int amount = Integer.parseInt(puramount);
if(cap<amount
5) {
request.setAttribute("msg","库存容量不足");
request.getRequestDispatcher("/parts_purchase_edit.jsp").forward(request, response);
}else if(con.isExist(sql)==0) {
request.setAttribute("msg","该员工不是采购人员");
request.getRequestDispatcher("/parts_purchase_edit.jsp").forward(request, response);
}else {
sql="select
from parts where parts_id='"+partsid+"'";
try{
Statement stm=c.createStatement();
ResultSet rs=stm.executeQuery(sql);
c.setAutoCommit(false);
if(rs.next()) {
if(!rs.getString("parts_name").equals(partsname)||!(rs.getString("parts_price").equals(partsprice))
||!rs.getString("supplier_id").equals(supplierid)) {
request.setAttribute("msg","输入配件信息有误");
request.getRequestDispatcher("/parts_purchase_edit.jsp").forward(request, response);
return;
}
}else {
sql="insert into parts values('"+partsid+"','"+partsname+"','"+partsprice+"','"+supplierid+"')";
stm.executeUpdate(sql);
}
cap=cap-amount*5;
sql="update storage set storage_capacity='"+cap+"' where storage_id='"+storageid+"'";
stm.executeUpdate(sql);
sql="select parts_id from parts_storage where parts_id='"+partsid+"' and storage_id='"+storageid+"'";
if(con.isExist(sql)==1) {
sql="update parts_storage set parts_num=parts_num+"+amount+" where parts_id='"+partsid+"' and storage_id='"+storageid+"'";
}else {
sql="insert into parts_storage values('"+partsid+"','"+storageid+"','"+amount+"')";
}
stm.executeUpdate(sql);
sql="insert into parts_purchase values('"+partspurid+"','"+partsid+"','"+staffid+"','"+purtime+"','"+amount+"')";
stm.executeUpdate(sql);
stm.close();
c.commit();//try的最后提交事务
request.setAttribute("msg","提交成功");
request.getRequestDispatcher("/parts_purchase_edit.jsp").forward(request, response);
} catch(Exception e) {
request.setAttribute("msg","提交失败");
e.printStackTrace();
try {
c.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}//回滚事务
request.getRequestDispatcher("/parts_purchase_edit.jsp").forward(request, response);
}
}
} catch (NumberFormatException e) {
request.setAttribute("msg","请输入正确的价格和数量");
request.getRequestDispatcher("/parts_purchase_edit.jsp").forward(request, response);
e.printStackTrace();
}
}
```
八、总结
8.1 系统优点
在这个系统中,使用了相关的开源JS库以及CSS样式表,所以整个页面看以来比较美观,与用户的交互也做的不错。
对于相关信息的查询结果使用分页来显示,而且分页是用Mysql的limit语句实现的,并且通过索引进行了查询优化,使得查询的效率得到了很大的提高。
对于各类基础信息的修改和删除通过外码约束了大部分极端用户的破坏性行为。(例如删除某些已经销售过车辆的员工,修改已经从其采购过车辆的供应商的编号)
对于各类事务的流程设计比较合理,实现过程考虑比较全面,最终的实现效果符合预期目标,基本完成了实际的汽车4S店的相关事务的处理。其中在数据库实现了一个event,让数据库每天的同一时间检查过期的预订单并删除。
对于财务而言,通过图表的形式来展现收入和支出,这让用户对各类业务的利润分析提供了较好的平台。
9.2系统不足
由于为了测试方便,对于输入的检查只要求符合数据库中数据类型,对于身份证号码以及电话号码这类信息并没进行过多的数据要求。
车辆和配件的容量是默认的,用户无法更改。
汽车销售单对于用户而言是无法修改或删除的,这降低了系统的容错率。对于用户的错误操作会带来无法预计的后果。
汽车预订单只能结算和删除,无法修改,降低了系统操作的灵活性。
对于财务部分而言,只显示了支出和收入的信息,对于员工利润的计算、车辆销售利润的占额以及配件利润的分析并未实现,用户可分析的部分较少。
参考文献
- 基于J2EE的网络银行“e销通”设计与实现(东北师范大学·焦建宇)
- 农用车辆销售管理系统的设计与实现(华中师范大学·刘寅飞)
- 基于ASP.NET电子商务网站的设计、实现及安全性增强(华中师范大学·吴思嫦)
- 山东大众汽车4S店的客户关系管理系统的设计与实现(电子科技大学·李琳)
- 基于ASP.NET的汽车销售管理系统的设计与实现(电子科技大学·牛峰)
- 基于SSH框架的汽车销售服务系统的设计与实现(西安电子科技大学·屈鑫)
- 网上电器销售系统的设计与实现(吉林大学·荆闯)
- 基于Web的销售管理系统的设计与实现(西安电子科技大学·黄婵)
- 中油西北化工销售公司客户关系管理系统的研究和实现(上海交通大学·张兵)
- 手机销售网站设计与实现(电子科技大学·杨俊升)
- 手机销售网站设计与实现(电子科技大学·杨俊升)
- 基于J2EE的网络银行“e销通”设计与实现(东北师范大学·焦建宇)
- 宁波华盛汽车部件有限公司进销存管理系统的设计与实现(电子科技大学·魏少辉)
- 中油西北化工销售公司客户关系管理系统的研究和实现(上海交通大学·张兵)
- 农用车辆销售管理系统的设计与实现(华中师范大学·刘寅飞)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码导航 ,原文地址:https://bishedaima.com/yuanma/35343.html