大家好,我是程序员爱酸奶,希望您能喜欢我的文章。可以专注我个人公众号获取更多内容。有什么问题可以通过公众号加我微信交流~~ 手动比心 ♥
关于毕业论文,还需要大家自行编写,这里是提供给大家一些参考,如果大家想要一些毕业设计的项目,可以关注公众号,回复 "毕设" 获取,或者加我微信获取。这些项目只是提供大家参考的,不是完全功能。希望能帮助到大家
下面开始正文啦~~~
在信息化的时代,效率和速度就变得尤为重要了,具有高效率和速度就具有更好的竞争力,更受客户欢迎。与此同时,网购与人们的生活息息相关,相应的人们在网上购买的商品需要通过物流公司对这些商品进行管理和配送,那么物流的管理在这个过程中就显得尤为重要了,怎样高效快速的对仓库的商品进行管理,直接影响物流的速度,从而影响顾客的满意程度,这将直接关系到公司利益的盈亏。现在也有很多成熟的网上仓库管理系统,对仓库商品进行很好的管理,但是不是所有的仓库公司的商品都是一样的,那些流程也不是一成不变的,所以这些成熟的网上仓库管理系统不可能适应所有的仓库公司。所以我想做一个通用性强功能简约的仓库管理系统,来适应大部分仓库公司的基本需求,虽然这样不能满足这些仓库公司的一些特定的要求,但是所有公司可以在此基础上进行简单的修改和添加就能满足自己仓库管理的功能,这样一来一个基本的通用性强的仓库管理系统我觉得就很有意义了。所以本次毕业设计就是做一个针对仓库公司的仓库管理系统。
我之所以选择仓库管理系统是因为我觉得现在的物流空前繁荣,对应的仓库管理也同样的重要,很多卖家公司都有自己的的仓库,那么一个仓库管理系统的设计与实现的课题也就变得有有意义了。我想设计一个简单基本的仓库物流管理系统,包含订单管理,配车管理,车辆管理,商品管理以及货主管理的一些功能,仓库使用者可以通过可视化的图形界面进行操作,从而实现更简单更高效的对仓库进行管理。所以本系统的最大特点就是系统界面友好,操作简单,使用方便。
我设计的仓库管理系统中,首先有订单管理的功能,一个订单表中含有货主,发货地址和送货地址,及商品信息,还有配车订单的信息,这些都是通过外键进行连接,然后送货地址,发货地址,商品信息都和货主有关系,组成联合主键。配车订单中有车辆信息和该车中所有订单的信息。主要实现的功能有,对订单的增删改查,通过用户选择一些查询条件对订单进行查找,把满足条件的订单返回界面,对已经查找到的订单可以进行修改和删除的操作,进行删除和修改的操作后返回操作结果信息显示在界面上,并且上次的查询条件和满足条件的查询结果也会显示在界面上,让用户接着进行选择,同时用户还可以添加新的订单,只有满足订单的条件才能添加成功。新添加的订单的出货状态都是“订单状态”。在配车管理界面,可以通过出货日期对当天出货的订单和车辆查询出来并显示在界面上, “订单状态”的订单单独一块显示,“配车状态”的订单则和所配的车辆信息一起显示。之后“订单状态”的订单可以加入到已经含有“配车状态”的订单的车辆中,也可以先添加新的车辆进来,然后再把订单添加进来,完成订单与车辆的配车功能,同时该订单有“订单状态”变成“配车状态”,当然也可以撤销车辆,那么该车中的所有订单都会重新变成“订订单状态”。出货信息管理界面,可以通过查询条件对已经配车的订单和车辆信息进行查询,查询结果会返回显示在界面上,可以对“配车状态”的订单和车辆信息进行“出货处理”操作,之后会显现详细的订单信息和车辆信息,检查无误后就可以确认发货,同时订单状态由“配车状态”变成“出货状态”。对“出货状态”的订单和车辆信息可以进行“出货取消”的操作,之后也会显示详细信息,确认要取消出货后,点单状态由“出货状态”变成“配车状态”。信息管理功能包含用户信息管理,出货地址管理,送货地址管理,商品信息管理和车辆信息管理。
主要工作先对系统进行了需求分析和概要设计。依据设计的仓库管理的系统特点,将系统分成四大模块:订单信息模块、配车管理模块、出货状态管理模块、信息管理模块。然后,在这个基础上,对这些模块进行细分,分成若干个子模块,接着子模块进行编码,最后将各个模块组合在一起形成一个完整并对整个系统的进行稳定性健壮性测试。
论文文共五节,为别为:
第1节介绍了仓库管理的开发背景和设计思想;通过现在社会发达的物联网时代,可以知道仓库管理系统高效便捷的重要性,所以简单的介绍了我想要的仓库管理系统的设计思想。
第2节是仓库管理系统的编程语言和开发环境以及所用的一些技术的介绍。
第3节是仓库管理系统的需求分析。这部分主要讲叙仓库管理系统的基本需求,以及系统的一些可行性分析问题,其中包括:经济可行性、社会可行性、技术可行性。
第4节是仓库管理的概要设计和数据库是设计,对系统进行模块的划分,对各个模块功能进行明确。对模块之间的接口实现进行分析,对数据库的设计以及数据库表与表之间的联系进行明确。
第5节是系统各个模块的具体实现,给出具体实现的界面截图以及在实现功能的过程中用到的一些技术的介绍。
Java语言是我们大学生在学校学习的编程语言,相对与c语言和c++语言来说,java语言有自己特有的优点:跨平台性,面向对象,安全性,多线程,简单易用。Java语言还有三大特性:继承、多态和封装。三大特性是我们在用java语言编程的时候更见简单和方便。
本系统的开发环境eclipse4.6.0 (Neon)64位版本,jdk1.8.0_40,Apache Tomcat v8.5。仓库管理系统是一个动态的web项目,前端页面都是用JSP。后台使用java实现的,本系统用的是struts2的框架,前台JSP页面中的请求通过struts.xml文件找到相应的action文件,在action层中得到前台的请求从而调用service层将请求传递到后台,同时将请求结果返回到前台页面。从而前端页面和后台进行数据交互。
JavaEE是对Eclipse应用进行了扩展,主要应用在JavaEE、Java和一些动态web项目的开发。JavaEE的功能是非常强大,对很多开源产品进行了较好的支持。JavaEE使我们可以在软件开发过程中极大的提高效率,在项目开发过程中,它可以简化我们许多工作量,并且具有很好的扩展性,可以很方便的使用一些框架,简单的几步配置然后就可以使用。
本系统数据库设计是用oracle 11.2.0.2.0版本进行操作的,采用B/S结构的工作模式。B/S结构是随着计算机网络技术的发展而出现的一种先进的计算模式。
之所以采用oracle数据库是因为oracle相对于mysql功能更加完善,数据库的移植性比较强,能够适应各种大小的系统。同时oracle使用起来以很方便,并且Oracle有:可用性强、可扩展性强、数据安全性强、稳定性强的优点。用oracle作为本系统的数据库开发是可行的。
Struts2是MVC设计模式中一个变通的Web应用框架,Struts2实质上相当于一个servlet,在MVC设计模式中,servlet是控制层,接收前端请求并传递给数据处理层,得到响应返回给视图层。而Struts2作为控制器(Controller)来进行模型和视图的数据交互。使用struts2框架的好处是前后台数据传递更加方便,不能像servlet中一样需要使用request和response的方法,同时在前端页面中不用镶嵌java代码来传递数据,struts2框架中在前台页面只用在标签中name属性和action中的私有成员变量对应起来,前端页面标签中的值会自动传递到action中,这样编程起来就变得更加的方便,同时也更加的容易理解。
Struts2的工作原理:首先要为整个项目导入struts2架包,并且在web.xml文件中配置好struts2的路径,然后在前端的jsp页面中要应用struts2的架包,然后前台页面就可以使用struts2标签了。当前端页面触发一个请求就会跳到struts.xml文件中找到相应的action,从而跳到action层java文件中,在action中获得页面请求并接收数据,然后调用service层,在service层会调用dao层,在dao层会对数据进行处理,并将结果返回到service层,然后service层将数据返回到action层,action层将结果返回到前端页面jsp中。这样整个前后台数据交互的功能就实现了。
系统应满足如下要求:
(1)用户可以在登录界面注册和登录,只有注册过并且登录成功才能进入系统。
(2)进入系统长时间不操作,系统会自动 关闭,即用户会退出登录,想要继续操作系统必须重新登录。
(3)用户可以查看自己的个人信息。
(4)有用户操作手册(即帮助文档)
表2-1:用户功能需求
功能 |
功能描述 |
登陆功能 |
用户通过输入账号密码进入系统,账号密码错误则不能进入系统。 |
订单管理功能 |
用户在订单管理界面可以对已有的订单通过查询条件进行查询,并可执行修改和删除的功能,还能添加新的订单。 |
配车管理功能 |
通过订单日期查找当天的订单并为其分配相应的车辆,已经不在当天出货的车辆将不能被分配。 |
出货状态管理功能 |
对已经分配订单的车辆信息进行查询和确认,如果信息无误则确定发货,如果信息有误则不能发货。 |
信息管理功能 |
对用户,出货地址,送货地址,商品信息,车辆信息进行管理。 |
可行性分析的目的是研究该项目是否符合市场需求,在一定人力物力财力的基础上开发出一个系统时候有意义,这样可以降低项目失败的风险,可以从经济可行性,技术可行性,社会可行性进行分析。
经济可行性:仓库管理系统是设计与实现是一个毕业设计的实现,就开发者而言是不需要投入财力的,整个项目不会因为资金不足问题导致项目不能进行下去,也不会因为需要购买相类似的产品进行研究分析,所以在经济可行性方面是完全可行的。
技术可行性:使用JavaEE编写的动态web项目的技术现在已经非常的成熟,采用struts2框架的技术也有实例,仓库管理系统的设计与实现这个项目中用到的分页技术,页面动态刷新技术,列表级联查询技术都很成熟,所以编写整个项目对我而言是完全可行的。
社会可行性:现在社会是一个物联网发达的时代,所以物流和仓库管理变得尤为重要,怎样使得仓库管理变得简单高效就变得有意义了。所以通过实现这个项目对仓库管理系统能够更好的了解,从而有自己的心得,为以后在工作中积累经验能够提供很好的帮助。所以社会可行性也是可行的。
由于该系统对数据的精确性要求较高,所以
1.字符型数据:精确到1位;
2.数值型数据:精确到0.01;
3.日期型数据:精确到日。
4. 响应时间:主要取决于计算机的配置和算法的复杂度;
5. 更新处理时间:0.1s-2s;
6. 数据转换与传输时间:一般在2秒以内,最差不超过6秒。
7.在操作方式上通过键盘和鼠标发送的请求系统应该能够完全响应;
能够支持Windows95、Windows98、Windows2000、Windows Me和Windows XP的运行环境;
8.留有和其他系统交互的接口。
9.输入的日期必须合法化(如2016-8-30),输入d时间必须合法化(如8:00)。
a.硬件:
处理器 :Intel486以上系列、AMD K6 以上系列 内存:1G(非最低配置)
网络 :带宽1M(非最低配置)
b.软件:
操作系统:Windows(2000、XP、Vista、7、8)
数据库 :Oracle
客户端 :Internet Explore 6.0及以上
主流浏览器(Firefox,Chrome, Opera等)
c.运行系统:
Windows(2000、XP、vista、7、8)
Internet Explore 6.0及以上或主流浏览器(firefox,chrome,opera等)3.3.3数据管理需求
由于仓库物流管理系统对订单,配车信息,用户信息进行操作,所以对数据的存储有一定的要求,因此应该添加数据的备份功能。
前期要管理的文卷和记录数较少,表的字段要求不超过20个。要求体统有稳定、完整的数据库支持,可以容纳大量的数据和各种资料。同时还具有灵活的数据管理能力,包括进行数据库的建立、数据库的重组、数据库的重构、数据库的安全管控、数据库的调优、报错问题的分析和汇总和处理、数据库数据的日常备份及增、删、改、查和统计等功能。增长不可预见;但要为处理大量数据做充分准备。
产生后果:数据丢失,出错等
处理要求:尽可能记录数据,用户操作,保存用户现场。故障解决后在登陆时恢复现场。
系统正常运行时不能出错,即使碰到了不能恢复的系统错误,也应该保证数据库不受影响,在测试过程中碰到的问题和解决方法:
1)启动项目提示“数据库未连接“提示信息阻止程序运行时应该查看一下tomcat是否启动。
2)有时候空记录会使程序无法运行以至于报错。所以在必要的地方加上判断条件,只有满足条件才会执行,这样就能避免空值报错了。
3)还有一些运行错误可以用 捕获异常的方式进行处理,在必要的地方添加try catch 语句。
如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。
稳定性需求
系统不会动不动就发生异常报错,并且能够在越来越多的人同时使用这个系统,该系统还能保持正常工作。
扩展性需求
系统应该支持功能扩展与支持环境的扩展。功能扩展就是在现有的功能模块的基础上可以添加信息的功能模
正确性需求
用户在界面上进行操作,和后台数据进行数据交互,用户发送什么请求,系统就应该响应什么请求,确保系统的正常运行,同时用户通过界面向数据库进行数据的增删改操作,要确保数据库信息的正确。
安全性需求
a. 数据安全:所有数据输入框均进行输入检测,屏蔽除ASCII大小写英文字符、数字字符、下划线、@之外的所有字符,一旦检测到有此输入不进入后续工作,直接跳转到输入有误界面。
b. 隐私安全:采用独立的密码表,使密码不与用户信息处于同一数据表中,防止sql注入。用户密码采用SHA1加密算法密文存储,明文存储在另一独立的数据表中,并不在前台运行中使用。密码验证时只验证密文。管理员密码与用户密码采用完全不同的加密方式密文存储,明文密码离线保存在独立的数据库中。
c. 系统安全:服务器采用现阶段主流防火墙,要求能够防御简单的DDoS攻击、渗透攻击。管理员定期审查和测试项目代码,如采用开源服务则还需测试开源服务,力求主动发现0day,并及时封堵漏洞。管理员应及时关注乌云、Freebuf等主流安全论坛,如爆出影响本系统使用的安全漏洞,应在1小时内响应并尽快解决。
d. 备份安全:采用RAID0+1模式的硬盘组,一旦因主硬盘故障启用镜像盘后,应在1小时内响应,进行更换硬盘等具体操作。数据每周设立一次还原点,清理日志并将日志文件按日存储在物理独立的存储介质中,实现离线备份,并由专人在指定地点保管。数据库数据每自然月进行一次物理隔离的备份,存储在物理独立的存储介质中并由专人在指定地点保管。所有物理隔离至少保存一年以上时间。
系统流程图:
为了方便表达仓库管理系统的各个功能模块的业务流程,下面给出仓库管理系统的系统流程图。不同模块有不同的功能,同时模块与模块之间存在一定的联系。
图4-1系统流程图
系统结构图:
用结构图来表示整个系统的结构,扼要说明系统中每个子模块的标识符和功能,非常层次的展示出各个模块之间的控制与被控制关系.
图4-2系统组织结构图
使用矩阵图说明系统中各个功能模块需求的实现和各个模块块程序之间分配关系:
表4-1:分配关系
|
用户登录模块 |
订单管理模块 |
配车管理模块 |
出货状态管理模块 |
用户登录 |
√ |
|
|
|
订单信息管理 |
|
√ |
|
|
为订单分配车辆 |
|
√ |
√ |
|
出货状态查询 |
|
|
|
√ |
用户通过正确的账号密码进入系统,对系统的各个功能进行操作,功能用例图如下:
图4-3用例图
本系统应提供Web浏览器的支持、以及数据库软件的支持。
a.注册管理员
【输入数据】
账号、密码
【输出数据】
注册是否成功的信息
【功能】
用户输入的账号密码传递到后台验证如果该用户已经存在,则不能注册,如果该用户不存在则判断该用户是否满足注册要求,满足就注册成功,不满足注册失败。
图4-4 注册时序图
b.登陆
【输入数据】
账号、密码。
【输出数据】
提示信息
【功能】
用户通过输入账号密码,系统进行验证,确定账号密码是否正确,如果账号密码正确则该用户可以进入系统,如果不正确则不能进入系统。
图4-5 登录时序图
c.添加新订单
【输入数据】
订单信息。
【输出数据】
将新的订单添加到数据库,并返回时候添加成功
【功能】
用户登陆后可以添加订单信息。
图4-6 添加新订单时序图
d.订单信息管理
【输入数据】
查询订单的条件
【输出数据】
查找出的订单
【功能】
用户根据查询条件查找出满足条件的订单,并进行修改或者删除操作,并提示修改或者删除是否成功。
图4-7订单信息管理时序图
e.配车管理
【输入数据】
订单发货日期
【输出数据】
当天发货的订单,并为其分配车辆,改变订单的状态
【功能】
用户通过日期查询出当天需要出货的订单,和闲置状态的车辆,并将订单和车辆进行匹配。
图4-8配车管理时序图
f.出货状态管理
【输入数据】
查询条件
【输出数据】
查询结果
【功能】
用户在出货状态管理界面,对已经配车的订单进行查询,并查看信息是否正确,如果信息正确则可以发货,如果信息不正确则不能发货。
图4-9出货管理时序图
表4-2:运行模块组合的关系表
输入 |
处理过程 |
输出 |
输入数据类型 |
账号,密码以及个人信息 |
注册 |
提示信息 |
字符文本,数字 |
账号,密码 |
登陆 |
提示信息,排课系统界面 |
字符文本,数字 |
新增订单 |
录入 |
提示信息 |
字符文本 |
订单查询 |
查询 |
提示信息,查找的订单 |
字符文本,数字 |
配车信息 |
订单配车 |
提示信息,配车后的信息 |
字符文本,数字 |
出货状态管理 |
状态管理 |
提示信息 |
字符文本,数字 |
运行控制
用户在登录界面通过输入正确的账号密码进入系统,否则不能进入系统,同时在进入系统后一段时间不操作,会自动退出系统,想要接着操作需要重新登录。
内部接口
abstract List
TransportationRequestDto transportationRequestDto, int start, int end) //按照查询条件查找订单。
List
abstract List
abstract boolean updateShouzhu(Connection conn, TransportationRequestDto transportationRequestDto)//更新订单
abstract boolean deleteShouzhu(Connection conn, TransportationRequestDto transportationRequestDto)//删除订单
abstract boolean addShouzhu(Connection conn, TransportationRequestDto transportationRequestDto)//添加订单
abstract boolean addShouzhuDeliveryPlace(Connection conn, TransportationRequestDto transportationRequestDto)//添加送货地址
abstract boolean addShouzhuItem(Connection conn, TransportationRequestDto transportationRequestDto)//添加商品信息。
系统的E_R图是各个实体之间的联系,反映了系统中各个对象实体间的联系以及各自的属性。
图5-1 仓库管理系统E_R图
静态数据
(1)用户:管理员ID、管理员名称、管理员密码
(2)用户:用户ID,用户姓名。
(2)出货地址:用户id,出货地址id,出货地址名称
(3)车辆:车辆编号、车辆名称、车辆的司机、最大容量、最大载量
(4)商品:商品编号、商品名称、商品的重量、商品的长宽高
(5)订单:订货日期、发货日期、订单编号、收件人、收货地址
(6)送货地址:用户id,送货地址id,送货地址名称,邮编,具体地址
动态数据
(1)注册新用户
(2)添加新的订单
(3)为新订单配车
(4)为用户的货主信息进行管理,进行增删改查货主信息
(5)为用户的出货地址进行管理,进行出货地址的增删改查操作
(6)为用户的送货地址进行管理,进行送货地址的增删改查操作
(7)为用户的商品信息进行管理,进行商品信息的增删改查操作
(8)为用户的车辆信息进行管理,进行车辆信息的增删改查操作
下图是数据库中表与表之间的联系,反映了各个表之间的业务逻辑。
图5-2数据库基本表结构
下图是用户表,存放用户账号密码等信息,用户通过登录才能进入系统,其表结构如下:
表5-1:用户表
用户表 |
|
||
USERID |
字符类型(4) |
主键 |
用户编号 |
PASSWORD |
字符类型(8) |
不能为空 |
密码 |
USERNAME |
字符类型(20) |
不能为空 |
用户名称 |
DEPTID |
字符类型(4) |
不能为空 |
部门编号 |
REGISTER_DAY |
字符类型(8) |
不能为空 |
注册日期 |
下图是货主表,保存用户信息,与商品表,送货地址表,出货地址表,订单表都有联系。
表5-2:货主表
货主表 |
|
||
SHIPPER_CODE |
字符类型(8) |
主键 |
货主编号 |
SHIPPER_NAME |
字符类型(20) |
不能为空 |
货主名称 |
UPDATE_DATE |
Date类型 |
不能为空 |
更新日期 |
下图是商品表,用来存放商品信息。表结构如图:
表5-3:商品表
商品表 |
|
||
SHIPPER_CODE |
字符类型(8) |
主键(FK) |
用户账号 |
ITEM_CODE |
字符类型(4) |
主键(FK) |
商品编号 |
ITEM_NAME |
字符类型(15) |
不能为空 |
商品名称 |
WEIGHT |
Double类型 |
不能为空 |
商品重量 |
WIDTH |
Double类型 |
不能为空 |
商品宽 |
HEIGHT |
Double类型 |
不能为空 |
高 |
LENGTH |
Double类型 |
不能为空 |
长 |
车辆表用来存放车辆信息,表结构如图:
表5-4:车辆表
车辆表 |
|
||
CAR_CODE |
字符类型(6) |
主键 |
车辆ID |
CAR_TYPE_NAME |
字符类型(5) |
不能为空 |
车辆类型 |
DRIVER_NAME |
字符类型(5) |
不能为空 |
司机 |
MAXIMUM_LOADING_MASS |
Double类型 |
不能为空 |
最大载量 |
MAXIMUM_LOADING_CAPACITY |
Double类型 |
不能为空 |
最大容量 |
出货地址表存放出货地址信息,和货主表相关联,其表结构如下:
表5-5:出货地址表
出货地址表 |
|
||
SHIPPER_CODE |
字符类型(8) |
主键(FK) |
货主编号 |
SHIPMENT_PLACE_CODE |
字符类型(8) |
主键(FK) |
送货地址的编号 |
SHIPMENT_PLACE_NAME |
字符类型(20) |
不能为空 |
送货地址名称 |
送货地址表存放送货地址信息,和货主表相关联,其表结构如下:
表5-6:送货地址表
送货地址表 |
|
||
SHIPPER_CODE |
字符类型(8) |
主键(FK) |
货主编号 |
DELIVERY_PLACE_CODE |
字符类型(8) |
主键(FK) |
送货地址的编号 |
DELIVERY_PLACE_NAME |
字符类型(20) |
不能为空 |
送货地址名称 |
TODOUFUKEN |
字符类型(5) |
不能为空 |
省份 |
SHIKUCHOSON |
字符类型(5) |
不能为空 |
市区 |
ZIPCODE |
字符类型(7) |
不能为空 |
邮编 |
SHOZAICHI1 |
字符类型(30) |
可以为空 |
所在地1 |
SHOZAICHI2 |
字符类型(30) |
可以为空 |
所在地2 |
配车订单表存放已经配车的订单和车辆组成的配车订单信息,其表结构如下:
表5-7:配车订单表
配车订单表 |
|
||
ALLOCATE_CAR_NUMBER |
字符类型(10) |
主键(FK) |
配车订单编号 |
SHIPMENT_DAY |
字符类型(8) |
不能为空 |
出货日期 |
CAR_CODE |
字符类型(6) |
外键 |
车辆编号 |
SHIPMENT_SITUATION |
字符类型(1) |
不能为空 |
出货状态 |
表5-7
订单表存放货主的订单信息,使用者可以对订单进行增删改查,表结构如下:
表5-8:订单表
订单表 |
|
||
ORDER_NUMBER |
字符类型(10) |
主键(FK) |
订单编号 |
SHIPPER_CODE |
字符类型(8) |
外键 |
货主编号 |
SHIPPER_ORDER_NUMBER |
字符类型(20) |
不能为空 |
货主命令编号 |
SHIPMENT_DAY |
字符类型(8) |
不能为空 |
出货日期 |
DELIVERY_DAY |
字符类型(8) |
不能为空 |
送货日期 |
DELIVERY_EARLY_TIME |
字符类型(4) |
可以为空 |
最早送货时间 |
DELIVERY_SLOW_TIME |
字符类型(4) |
可以为空 |
最迟送货时间 |
SHIPMENT_PLACE_CODE |
字符类型(8) |
外键 |
出货地址编号 |
SHIPMENT_PERSON |
字符类型(20) |
可以为空 |
出货人 |
DELIVERY_PLACE_CODE |
字符类型(8) |
外键 |
送货地址编号 |
DELIVERY_PLACE |
字符类型(25) |
可以为空 |
目的地 |
CONSIGNEE |
字符类型(20) |
可以为空 |
卸货人 |
ITEM_CODE |
字符类型(4) |
外键 |
商品编号 |
AMOUNT |
整形(3) |
不能为空 |
数量 |
SHIPMENT_SITUATION |
字符类型(1) |
不能为空 |
出货状态 |
ALLOCATE_CAR_NUMBER |
字符类型(10) |
可以为空 |
配车订单编号 |
系统的用户登录界面采用的是bootstrap模板,其背景是可变的,也就是
说,每次进入登录界面都可能欣赏到不同的风景,给系统添加了一个小亮点。当然用户登录界面账号密码错误会有提示不能进入,同时,设置了拦截器和过滤器,用户没有登录不能进入系统,同时,用户登录后如果长时间不操作,系统会自动注销用户,想要接着使用系统,需要重新登录。下图是用户登录的界面。
图5-1登录界面
用户通过账号密码登录成功进入系统的首页,然后用户可以进行系统的一些功能操作。如图5-2.
图5-2仓库管理系统首页
订单管理模块主要实现的功能是对订单的增删改查,首先可以在界面用户通过查询一定的查询条件对数据库里的订单进行查找,并在页面上显示出来,其中查询条件中,货主的那个选择列表的数据是后台数据库中获取的,也就是说从首页不是直接进入订单管理的界面,而是跳到一个action,获得货主信息,然后再跳到订单管理界面,同时查询条件中货主和送货地址是级联关系,都是从数据库中获得的数据,并且随着货主选择的改变,送货地址选择列表中的选项随着改变,这是用到当货主这个选择列表选择后会跳到一个action中,把该货主对应的送货地址查找出来同时显示在页面上,同时选择或填写的查询信息不丢失。其具体代码实现如下:
这个代码片是在进入订单管理界面跳到一个action,查出数据库中货主的信息并显示出来。
public String execute() throws Exception {
shipperDtoList = shouzhuService.selectShipper();
ActionContext.getContext().getSession().put("shipperDtoList", shipperDtoList);
TransportationRequestDto transportationRequestDto=new TransportationRequestDto();
session.setAttribute("transportationRequestDto", transportationRequestDto);
return SUCCESS;
}
下面这个代码片是选择货主信息后会跳到一个action中,将该货主出货地址等信息从后台查询出来并显示,同时将已经选择的货主信息也保存起来,显示在页面。
public String execute() throws Exception {
/* 从OrdersSelectShipperAction中获得shipperDtoList集合 */
String shipperCode = transportationRequestDto.getShipperDto().getShipperCode();
List
.get("shipperDtoList");
/* 将从后台查到的数据分别保存到list集合中,在前台显示 */
deliveryPlaceDtoList = shouzhuService.selectDeliveryPlace(transportationRequestDto);
ActionContext.getContext().getSession().put("deliveryPlaceDtoList", deliveryPlaceDtoList);
shipmentPlaceDtoList = shouzhuService.selectShipmentPlace(transportationRequestDto);
ActionContext.getContext().getSession().put("shipmentPlaceDtoList", shipmentPlaceDtoList);
itemDtoList = shouzhuService.selectItem(transportationRequestDto);
ActionContext.getContext().getSession().put("itemDtoList", itemDtoList);
/* 将页面中选中的荷主信息保存到shipperDto中*/
for (ShipperDto dto : shipperDtoList) {
if (dto.getShipperCode().equals(shipperCode)) {
shipperDto = dto;
}
}
transportationRequestDto.setShipperDto(shipperDto);
ActionContext.getContext().getSession().put("shipperDto", shipperDto);
session.setAttribute("transportationRequestDto", transportationRequestDto);
return SUCCESS;
}
图5-3订单管理界面
在web.xml中设置的每页显示4条数据,所以系统的分页功能实现是前台设置两个参数,当前页数pageNumber和lastPage,在action层如果pageNumber为空则设为1,同时传递pageNumber和pageRows(每页显示几条数据)给后台,所以在daoImpl层只查询要想要查询的数据,做到了每一页的数据都是直接从数据库中查询出来然后显示的,不是一下子把所有数据都查询出来,然后在前台实现翻页效果,这是从后台和前台配合起来实现翻页效果,这样做更加节省空间,同时更有效率的实现了页面的翻页效果。
分页效果service层的代码如下,有两个参数,一个当前页数(默认为1)另一个是每一页显示的数据数量。
public List
Connection conn = DbUtil.getConnection();
try {
// 计算出起始行与终止行
int pn = Integer.parseInt(pageNumber);
int pr = Integer.parseInt(pageRows);
int start = (pn - 1) * pr + 1;
int end = pn * pr;
return dao.selectByShouzhuMsg(conn, transportationRequestDto, start, end);
} finally {
conn.close();
}
}
在前端jsp页面的js代码中实现分页部分:
$("#firstPage").click(function() {
var $form = $("#form1");
var $pageNumber = $("#pageNumber");
$pageNumber.val(1);
$form.submit();
});
$("#lastPage").click(function() {
var $form = $("#form1");
var $lastPageNumber = $("#lastPageNumber");
var i = $lastPageNumber.val();
//点击尾页时,跳转到最后一页
var $pageNumber = $("#pageNumber");
$pageNumber.val(i);
//提交表单
$form.submit();
});
$("#prewPage").click(function() {
var $form = $("#form1");
var $pageNumber = $("#pageNumber");
//点击上一页时,页数减1
var i = $pageNumber.val();
$pageNumber.val(parseInt(i) - 1);
//提交表单
$form.submit();
});
$("#nextPage").click(function() {
var $form = $("#form1");
var $pageNumber = $("#pageNumber");
//点击下一页时,页数加1
var i = $pageNumber.val();
$pageNumber.val(parseInt(i) + 1);
//提交表单
$form.submit();
});
查询出的结果可以通过选择订单编号前的单选按钮进行操作,确认删除或修改该订单后会将该订单的操作结果返回到页面,同时上次的查询条件保留,并且根据这个参选条件重新查找的结果也显示在页面。
图5-3订单修改成功界面
订单管理页面还可以添加新的订单,通过新增订单按钮可以跳到添加订单页面。
图5-4新增订单界面
在新增订单页面中,货主信息和送货地址信息也都是从数据库中获取,并且二者是级联的。另外通过选择目的地和商品的选择列表会跳到相应的action中,把其详细信息查找出来显示在页面上,并且前面填写的内容依然存在,实现了不利用ajaxa实现局部刷新的效果,同时在js中写了判断,填写的数据必须符合数据库要求才能添加成功,最后所有订单的所有信息都填写好之后会跳到信息确认界面,当发现有地方信息错误时,可以点击返回按钮。则可以回到添加订单的页面,上次的添加信息依然存在,用户可以进行修改,当发现没有错误确认添加新订单后,添加订单的结果也会返回添加订单的页面,订单添加成功时,页面会显示订单添加成功,并且上次的添加信息全部清空,以便于再次添加订单,如果订单添加失败会显示订单添加失败,同时上次的添加信息保留,以便再次修改,这样设计更加人性化,挺高用户的体验程度。
图5-5新增订单确认界面
下面代码片是选择商品信息后,货主信息和目的地信息都会保留显示的实现代码:
public String execute() throws Exception {
String itemCode=transportationRequestDto.getItemDto().getItemCode();
List
(List
for(ItemDto dto:itemDtoList){
if(dto.getItemCode().equals(itemCode))
{
itemDto=dto;
}
}
transportationRequestDto.setItemDto(itemDto);
ShipperDto shipperDto=(ShipperDto) ActionContext.getContext().getSession().get("shipperDto");
DeliveryPlaceDto deliveryPlaceDto=(DeliveryPlaceDto) ActionContext.getContext().getSession().get("deliveryPlaceDto");
ShipmentPlaceDto shipmentPlaceDto=(ShipmentPlaceDto) ActionContext.getContext().getSession().get("shipmentPlaceDto");
transportationRequestDto.setShipperDto(shipperDto);
transportationRequestDto.setDeliveryPlaceDto(deliveryPlaceDto);
transportationRequestDto.setShipmentPlaceDto(shipmentPlaceDto);
ActionContext.getContext().getSession().put("itemCode", itemDto.getItemCode());
ActionContext.getContext().getSession().put("itemDto", itemDto);
session.setAttribute("transportationRequestDto", transportationRequestDto);
return SUCCESS;
}
订单的修改功能界面和添加新订单的页面基本相同,多了显示订单编号,同时订单修改成功后会在订单管理界面显示修改结果,并且查询条件和对应的查询结果都会显示,由于图片差不多,所以就不用图例了。
配车管理界面,通过输入出货日期然后点击检索按钮就可以查询出没有配车的当天出货的订单信息,同时也可以检索出已经配车的配车订单信息。显示在不同的table表中。这两个table表单有各自的分页,当点击一个表单的分也时,对应的表单会分页,同时分页效果也是前后台联系在一起实现的。
图5-6配车管理界面
可以点击添加车辆,然后会显示还没有调用的车辆,用户可以进行选择,选择好之后的车辆就会出现在“经派遣的车辆信息”的表格中,不过此时的该车辆的订单件数为0。
图5-7车辆信息选择界面
在“未配车的订单信息”中选择一个订单,然后在“已经派遣的车辆信息”中选择一辆车辆,让后点击配车按钮,就会把该订单添加到选择的车辆中,同时该订单的“出货状态”由“订单状态”变成“配车状态”,并且该车两的订单数量加1。另外“未配车的订单信息”的其他订单信息和“已经派遣的车辆信息”的其他车辆信息都会显示在页面上以方便用户接着操作。到此为止把一个订单分配给相应的车辆的工作就完成了。
当选择了一个配车订单后,点击“货物状况”按钮时,会显示已经配车订单啊信息和车辆信息让用户进行查看。发现有的订单信息在这辆车上不合适时可以进行货物撤销操作,选择对应的订单,然后点击“货物撤销”按钮可以把该订单从该车中撤销,同时该订单的“出货状态”由“配车状态”变成“订单状态”。该车辆的订单件数减1。
图5-8配车订单详细信息界面
下面代码片是根据配车订单查询车辆信息的daoImpl层的实现代码:
@Override
public Result2Dto selectByAllocateCarNumber(Connection conn, String CarNumber) throws SQLException {
// 连表查询,查出符合配车番号条件的配車济車輌情报
StringBuilder sql = new StringBuilder(
"SELECT R,ALLOCATE_CAR_NUMBER,SHIPMENT_SITUATION,MAXIMUM_LOADING_MASS,MAXIMUM_LOADING_CAPACITY,CAR_CODE,CAR_TYPE_NAME,DRIVER_NAME ");
sql.append("FROM( ");
sql.append(
"SELECT ROW_NUMBER() OVER(ORDER BY A.ALLOCATE_CAR_NUMBER ASC) AS R,A.SHIPMENT_SITUATION, A.ALLOCATE_CAR_NUMBER,C.MAXIMUM_LOADING_MASS,C.MAXIMUM_LOADING_CAPACITY,C.CAR_CODE,C.CAR_TYPE_NAME,C.DRIVER_NAME ");
sql.append("FROM CAR C ");
sql.append("LEFT JOIN ALLOCATE_CAR A ON C.CAR_CODE = A.CAR_CODE ");
sql.append("WHERE A.ALLOCATE_CAR_NUMBER = ");
// 带入配车番号查询条件
sql.append(CarNumber);
sql.append(") ");
// sql.append("WHERE R BETWEEN ? AND ? ");
// 创建数据库语句准备对象
PreparedStatement ps = conn.prepareStatement(sql.toString());
// 执行数据库语句
ResultSet rs = ps.executeQuery();
// 将查询的数据封装到结果的ResultDto的一个List中
Result2Dto result2 = null;
result2 = new Result2Dto();
if (rs.next()) {
result2.setAllocateCarNumber(rs.getString("ALLOCATE_CAR_NUMBER"));
result2.setMaximumLoadingMass(rs.getInt("MAXIMUM_LOADING_MASS"));
result2.setMaximumLoadingCapacity(rs.getInt("MAXIMUM_LOADING_CAPACITY"));
result2.setCarCode(rs.getString("CAR_CODE"));
result2.setShipmentSituation(rs.getString("SHIPMENT_SITUATION"));
result2.setCarTypeName(rs.getString("CAR_TYPE_NAME"));
result2.setDriverName(rs.getString("DRIVER_NAME"));
result2.setCount(selectCount(conn, CarNumber, rs.getString("CAR_CODE")));
DecimalFormat df = new DecimalFormat("0.00000");
result2.setLoadingMassPersent(df.format(selectMassPersent(conn, CarNumber, rs.getString("CAR_CODE"))));
result2.setLoadingCapacityPersent(
df.format(selectCapacityPersent(conn, CarNumber, rs.getString("CAR_CODE"))));
}
return result2;
}
当选择一个配车订单后,点击“撤销车辆”按钮,则该车辆会被撤销,从新变成没有发车的空闲状态,同时该车辆上的订单也会相应的进行撤销处理,从新回到没有配车的状态,同时这些订单的“出货状态”由“配车状态”变成“订单状态”。
在这个界面,用户可以根据根据查询条件对已经配车的订单和车辆信息进行查询,这里“司机”下拉列表的数据也是从后台获得的,已经分页用到的技术也和前面页面的分页原理相同。
图5-9出货管理界面
“出货状态”为“配车”状态的配车订单可以接受“出货处理”操作,但是不能进行“出货取消”操作,同样的“出货状态”为“出货”状态的配车订单可以接受“出货取消”操作,但是不能进行“出货处理”操作。
图5-10出货状态确认界面
当“配车”状态的配车订单进行“出货处理”操作时会显示相应的车辆信息和订单信息,当用户确认无误后点击确定按钮,则配车的“出货状态”由“配车”状态变成“出货”状态,这表明该车辆可以发车送货了。当发现信息有误之后,可以返回查询页面,配车订单的“出货状态”不会发生改变。同样的“出货”状态的配车订单进行“出货取消”操作时会显示相应的车辆信息和订单信息,点击确认按钮后配车订单的“出货状态”由“出货”状态变成“配车”状态,此时该车辆是不能发车的。
信息管理功能模块是对货主,出货地址,送货地址,商品信息,车辆信息的增删该查功能的实现,用到的分页技术都是前面页面用到的。
图5-11货主信息管理界面
这些页面功能和实现方法基本相同,所以就不全部显示出来,不过在送货地址的信息管理的界面有一个省市的二级联动,与前面的货主与送货的地址的二级联动不一样,这里的省市二级联动是在js中实现的,这些省市的信息存在js中,真正存入到数据库的数据库是具体的省市名。
图5-12送货地址信息管理界面
该仓库管理系统的成果基本满足需求规定要求,在一定的人力物力和财力的条件下开发出的项目,主要实现的功能是对仓库订单的增删改查,以及订单的配车操作,和已经配车的订单的出货状态确认操作,以及用户信息、出货地址信息、送货地址信息、商品信息、车辆信息的管理操作。是一个小型的仓库管理系统,但能够很好的反映现在社会仓库管理的基本流程,对以后开发很有帮助。
虽然现在这个系统不一定能满足市场需求,但是也可以进行仓库管理的基本功能,再完善一下就可以满足市场需求,投入市场进行使用了,这样就可以像其他网上仓库管理系统一样具有市场竞争力。
通过仓库管理系统的设计与实现,是我对JavaEE开发动态web项目更加熟悉,同时也是我掌握了struts2框架,对我以后工作有很大的帮助,使我在大学四年中学到的知识得到了一定的锻炼和运用,自己在这次毕业设计中提升了很多。