物流系统开发.docx
《物流系统开发.docx》由会员分享,可在线阅读,更多相关《物流系统开发.docx(53页珍藏版)》请在冰点文库上搜索。
![物流系统开发.docx](https://file1.bingdoc.com/fileroot1/2023-6/5/5eaff70a-d871-4e40-a9ed-a88d725bc334/5eaff70a-d871-4e40-a9ed-a88d725bc3341.gif)
物流系统开发
作者:
尤帅
物流系统开发文档
1.概述
本报告对一个物流系统的分析、设计及编码实现进行了介绍。
该报告说明了物流系统的需求,软件设计以及编码实现。
本系统采用J2EE进行实现,采用MVC模式设计结构,采用Struts2+Hibernate框架+MSQL数据库系统。
2.系统分析与总体设计
2.1系统分析
2.1.1需求描述
物流系统是用于物流公司处理物流与配送的业务,这个系统主要具有以下功能:
1)仓库管理员揽货点节后用户的货物、称重、打包、填单、收费,用于系统管理员将信息输入计算机中,要求将送货单号扫描入数据库。
2)送货员到各个网点接送货物,将货物集中到物流仓库。
3)仓库管理员每天将集中的货物根据送达目的地不同而分拣成不同区域。
有送货员分别送到不同的地方或收货人手中。
4)各个阶段均由系统管理员通过扫描进入数据库。
5)客户可以根据送货单号查询到货物状态
6)财务部分根据送货单的信息处理收货以及各相关人的结算。
2.1.2用例分析
用例图是用来显示外部参与者与系统的交互吗,能够更直观的描述系统的功能。
从角色来看,物流系统主要分为5个角色,分别是:
系统管理员、客户、送货员、仓库管理员、签收人。
下图为物流系统的用例图。
2.2总体设计
2.2.1系统软件结构设计
2.2.2功能模块设计
子系统
模块名
子功能
描述
后台
订单管理模块
订单信息输入
管理员输入订单信息
订单查询
管理员查询订单信息
订单信息更新
管理员更新订单信息
送货员信息管理模块
送货员信息输入
管理员输入送货员信息
送货员信息更新
管理员更新送货员信息
送货员信息查询
管理员查询送货员信息
工资结算
管理员结算查询送货员的工资
送货管理模块
送货明细
管理员查询送货明细信息
订单签收
送货员送货,让客户签收
订单支付
客户付款
送货员工资结算
管理员结算送货员的工资
仓库管理模块
货物信息输入
管理员输入货物信息
货物分拣
管理员进行货物分拣处理
货物发送
管理员把货物让送货员发送
货物信息更新
管理员更新货物信息
2.2.3数据库设计
货物单
(t_send_foods)货物
编号
字段名
是否为空
长度
描述
1
id
not
int
主键
2
Consignor_name
not
Varchar(64)
发货员名字
3
Consignor_address
not
Varchar(64)
发货地址
4
Consignor_tel
not
Varchar(64)
发货人电话号码
5
Recess_name
not
Varchar(32)
收货人名字
6
Recess_tel
not
Varchar(32)
收货人电话号码
7
Recess_address
not
Varchar(32)
收货人地址
8
Charge_method
not
Varchar(64)
收费方法
9
cost
not
float
费用
10
Goods_weight
not
Varchar(32)
货物重量
11
Goods_volume
not
Varchar(32)
货物体积
12
Is_sign
not
Int(3)
是否签收
13
Is_cost
not
Int(3)
是否收费
14
acceptor
not
Varchar(3)
受理人
送货员
(t_delivery)送货员
编号
字段名
是否为空
长度
描述
1
id
not
int
主键
2
Worker_nub
not
Varchar(64)
职工号
3
Delivery_address
not
Varchar(64)
送货员家庭地址
4
Delivery_tel
not
Varchar(64)
送货员电话号码
5
Delivery_name
not
Varchar(32)
送货员名字
6
sex
not
Varchar(32)
性别
7
age
not
Varchar(32)
年龄
8
Id_car
not
Varchar(64)
身份证号
9
Delivery_area
not
float
送货范围
入库明细表
(t_warehousing_detail)入库明细表
编号
字段名
是否为空
长度
描述
1
id
not
int
主键
2
Warehousing_date
not
Varchar(64)
入库时间
3
Send_id
not
int
送货单号
4
Warehouse_manager
not
Varchar(64)
仓库管理员
5
Warehousing_area
not
Varchar(32)
入库存放区
分拣明细表
(t_manage_detail)入库明细表
编号
字段名
是否为空
长度
描述
1
id
not
int
主键
2
manage_date
not
Varchar(64)
分拣时间
3
Send_id
not
int
送货单号
4
Manage_name
not
Varchar(64)
分拣员
5
area
not
Varchar(32)
目的地区域
送货明细表
(t_detail)送货明细表
编号
字段名
是否为空
长度
描述
1
id
not
int
主键
2
Send_date
not
time
送货时间
3
Send_id
not
int
送货单号
4
Charge__method
not
Varchar(64)
收费方法
5
Consignor_name
not
Varchar(32)
发货员名字
6
Delivery_name
not
Varchar(32)
送货员名字
7
Real_cost
not
Varchar(32)
实收费用
8
Send_status
not
Varchar(64)
送货状态
9
Sign_name
Varchar(64)
签收人姓名
10
Is_sign
Varchar(64)
是否签收
费用结算表
(t_settlement)送货明细表
编号
字段名
是否为空
长度
描述
1
id
not
int
主键
2
settlement_date
not
time
结算时间
3
Send_id
not
int
送货职工号
4
Send_nub
not
Varchar(64)
送货数量
5
Lose_debits
not
Varchar(32)
损耗扣款
6
Real_money
not
Varchar(32)
实发总数
7
Total_commission
not
Varchar(32)
提成总数
8
salary
not
Varchar(64)
底薪
物流系统数据库表及其关系
2.2.4系统结构设计
系统采用分层结构,整体上分为4层:
视图层、控制层、业务逻辑层和数据访问层
项目名称为logisticsSys。
数据访问层与业务逻辑层采用SH框架的Struts2+Hibernate技术实现。
视图层和控制层采用JSP技术实现。
包名
说明
org.logistic.action
控制类包
org.logistic.dao
数据访问层接口包
org.logistic.dao.impl
数据访问层实现类包
org.logistic.entity
数据模型类包,实体包
org.logistic.service
业务逻辑层接口包
org.logistic.service.impl
业务逻辑层实现类
org.logistic.util
配置文件包
logisticsSys包的划分
WebRoot文件的划分
2.2.5界面设计样式
该部分为界面设计的公共部分,给界面提供样式。
2.2.6通用组件配置文件
3.功能模块的详细设计与实现
3.1接单管理模块
3.1.1接单管理总体结构
3.1.2订单信息MVC模式的设计
层次
功能
所在的包/位置
程序
M
接单信息管理相关实体接口类
org.logistic.dao
SendFoodsDao.java
接单信息管理相关实体接口实现类
org.logistic.dao.impl
SendFoodsDao,impl.java
接单信息管理相关实体类
org.logistic.entity
SendFoods.java
接单信息管理相关实体类的配置
org.logistic.entity
SendFoods.hbm.xml
V
接单信息管理逻辑类
org.logistic.service
SendFoodsService.java
接单信息管理的逻辑实现类
org.logistic.service.impl
SendFoodsService,impl.java
接单信息管理相关实体类
org.logistic.action
SendFoodsAction.java
C
接单输入页面
logisticsSys\jsp
Send_foods_Add.jsp
接单信息列表页面
logisticsSys\jsp
Send_foods_list.jsp
接单信息编辑页面
logisticsSys\jsp
Send_foods_update.jsp
接单入库页面
logisticsSys\jsp
warehourse.jsp
3.1.3接单信息实体类的实现
SendFoods.java
publicclassSendFoods{
privateintid;
privateStringconsignorName;
privateStringconsignorAddress;
privateStringconsignorTel;
privateStringrecessName;
privateStringrecessTel;
privateStringchargeMethod;
privatefloatcost;
privateStringgoodsWeight;
privateStringgoodsVolume;
privatebooleanisSign;
privatebooleanisCost;
privateStringacceptor;
privateStringrecessAddress;
}
SendFoods.hbm.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
3.1.4接单信息实体接口类
SendFoodDao.java
publicinterfaceSendFoodsDaoextendsIBaseDao{
publicbooleanwarehouse(WarehousingDetailwarehousingDetail);
publicStringgetHQL(SendFoodssendFoods);
}
3.1.5接单信息实体接口的实现类
SendFoodDaoImpl.java
publicclassSendFoodsDaoImplextendsHibernateSessionimplementsSendFoodsDao{
publicbooleandelete(intid){
returnsuper.deleteEntityBean(SendFoods.class,id);
}
@SuppressWarnings("unchecked")
publicListfindAll(StringsendFoods){
returnsuper.getQueryList("from"+sendFoods);
}
publicbooleansave(SendFoodssendFoods){
returnsuper.insertEntityBean(sendFoods);
}
publicbooleanupdate(SendFoodssendFoods){
returnsuper.updateEntityBean(sendFoods);
}
@SuppressWarnings("unchecked")
publicListfindById(intid){
Stringsql="fromSendFoodswhereid="+id;
returnsuper.getQueryList(sql);
}
/**
*分页查询
*@paramhql查询的条件
*@paramoffset开始记录
*@paramlength一次查询几条记录
*@return
*/
@SuppressWarnings("unchecked")
publicListfindBySQLForPage(Stringhql,intoffset,intlength){
returnsuper.getQueryList(hql,offset,length);
}
/**
*查询所有记录数
*@return总记录数
*/
publicintgetAllRowCount(Stringhql){
returnsuper.getQueryList(hql).size();
}
publicbooleanwarehouse(WarehousingDetailwarehousingDetail){
Stringhql1="fromWarehousingDetailwwherew.sendId='"+warehousingDetail.getSendId()+"'";
WarehousingDetailw=(WarehousingDetail)super.getEntityBean(hql1);
//如果查询有结果,则入库失败
if(w==null){
warehousingDetail.setWarehousingDate(newDate());
returnsuper.insertEntityBean(warehousingDetail);
}
returnfalse;
}
publicStringgetHQL(SendFoodssendFoods){
Stringhql="fromSendFoodss";//查询语句
if(sendFoods!
=null){
if(sendFoods.getConsignorName()!
=null){
hql+="wheres.consignorName='"+sendFoods.getConsignorName()+"'";
}
elseif(sendFoods.getConsignorTel()!
=null){
hql+="wheres.consignorTel='"+sendFoods.getConsignorTel()+"'";
}
elseif(sendFoods.getAcceptor()!
=null){
hql+="wheres.acceptor='"+sendFoods.getAcceptor()+"'";
}
elseif(sendFoods.getRecessTel()!
=null){
hql+="wheres.recessTel='"+sendFoods.getRecessTel()+"'";
}
else{
if(sendFoods.getIsSign()){
hql+="wheres.isSign=1";
}
else{
hql+="wheres.isSign=0";
}
}
}
returnhql;
}
}
3.1.6接单信息业务逻辑类
SendFoodsService.java
publicinterfaceSendFoodsService{
publicbooleandelete(intid);
publicListfindAll(Stringtable);
publicListfindById(intid);
publicbooleansave(SendFoodssendFoods);
publicbooleanupdate(SendFoodssendFoods);
publicPageBeanqueryForPage(intpageSize,intcurrentPage,SendFoodssendFoods);
publicintgetAllRowCount(Stringhql);
publicbooleanwarehouse(WarehousingDetailwarehousingDetail);
}
3.1.7接单信息业务逻辑类的实现类
SendFoodsServiceImpl.java
publicclassSendFoodsServiceImplimplementsSendFoodsService{
privateSendFoodsDaosendFoodsDao=newSendFoodsDaoImpl();
publicbooleandelete(intid){
returnsendFoodsDao.delete(id);
}
publicListfindAll(Stringtable){
returnsendFoodsDao.findAll(table);
}
publicListfindById(intid){
returnsendFoodsDao.findById(id);
}
publicbooleansave(SendFoodssendFoods){
returnsendFoodsDao.save(sendFoods);
}
publicbooleanupdate(SendFoodssendFoods){
sendFoodsDao.findById(sendFoods.getId());
returnsendFoodsDao.update(sendFoods);
}
publicSendFoodsDaogetSendFoodsDao(){
returnsendFoodsDao;
}
publicvoidsetSendFoodsDao(SendFoodsDaosendFoodsDao){
this.sendFoodsDao=sen