18.10 物资入库模块
18.10.1 物资入库模块总体架构
物资入库模块主要包括以下功能。
● 采购登记:用于进行采购登记。
● 审核入库:用于对采购单进行审核操作,审核合格的采购单将进行入库操作,审核不合格的采购单将作废。
● 借出归还:用于对已借出的物资进行归还登记。
18.10.2 创建物资入库模块的持久化类及映射文件
1.创建持久化类和映射文件
物资出库模块涉及到的数据表/视图的持久化类和映射文件如表18.16所示。持久化类及映射文件的具体实现方法请参见18.8.2节。
表18.16 物资入库模块涉及到的数据表/视图的持久化类和映射文件
数据表/视图名称
|
持久化类名称
|
映射文件名称
|
tb_stock_main
|
StockMainForm
|
StockMainForm.hbm.xml
|
tb_stock_detail
|
StockDetailForm
|
StockDetailForm.hbm.xml
|
续表
数据表/视图名称
|
持久化类名称
|
映射文件名称
|
tb_instorage
|
InStorageForm
|
InStorageForm.hbm.xml
|
tb_storage
|
StorageForm
|
StorageForm.hbm.xml
|
tb_provider
|
ProviderForm
|
ProviderForm.hbm.xml
|
tb_loan
|
LoanForm
|
LoanForm.hbm.xml
|
tb_goods
|
GoodsForm
|
GoodsForm.hbm.xml
|
tb_check
|
CheckForm
|
CheckForm.hbm.xml
|
v_stockMain
|
StockMainViewForm
|
StockMainViewForm.hbm.xml
|
说明:在Hibernate中创建视图的持久化类与映射文件同数据表类似,只需要在指定数据表名的位置指定视图名称,在指定数据表字段的位置指定视图的输出列即可。
2.映射关联关系
在物资入库模块中,涉及到4对关联关系,如表18.17所示。
表18.17 物资入库模块的表间关系
主 键 表
|
外 键 表
|
名 称
|
字 段 名
|
名 称
|
字 段 名
|
tb_stock_main
|
id
|
tb_stock_detail
|
Stockid
|
tb_provider
|
id
|
tb_stock_main
|
providerid
|
tb_goods
|
id
|
tb_stock_detail
|
goodsid
|
tb_goods
|
id
|
tb_loan
|
goodsid
|
下面以创建采购单主表(对应的持久化类为StockMainForm)和采购单明细表(对应的持久化类为StockDetailForm)之间的关联关系为例进行介绍。
(1)在采购单主表的持久化类StockMainForm中添加Set类型的属性stockDetail,并创建该属性的setXXX()和getXXX()方法,具体代码如下。
例程18-60:光盘\mr\18\MaterialManage\src\com\actionForm\StockMainForm.java
private Set stockDetail=new HashSet();
public Set getStockDetail() {
return stockDetail;
}
public void setStockDetail(Set stockDetail) {
this.stockDetail = stockDetail;
}
(2)在采购单明细表的持久化类StockDetailForm中添加StockMainForm类型的属性stockMain,并创建该属性的setXXX()和getXXX()方法,具体代码如下。
例程18-61:光盘\mr\18\MaterialManage\src\com\actionForm\StockDetailForm.java
private StockMainForm stockMain;
public StockMainForm getStockMain() {
return stockMain;
}
public void setStockMain(StockMainForm stockMain) {
this.stockMain = stockMain;
}
(3)修改采购单主表的映射文件StockMainForm.hbm.xml,在该文件中添加<set>元素来建立一对多的双向关联关系,具体代码如下。
例程18-62:光盘\mr\18\MaterialManage\src\com\actionForm\StockMainForm.hbm.xml
<set name="stockDetail" lazy="false" cascade="all" inverse="true">
<key column="stockid"/>
<one-to-many class="com.actionForm.StockDetailForm"/>
</set>
(4)修改采购单明细表的映射文件StockDetailForm.hbm.xml,在该文件中添加<many- to-one>元素来建立多对一的单向关联关系,具体代码如下。
例程18-63:光盘\mr\18\MaterialManage\src\com\actionForm\StockDetailForm.hbm.xml
<many-to-one name="stockMain" column="stockid" class="com.actionForm.StockMainForm" cascade="none" fetch="join" lazy="false"/>
3.修改Hibernate配置文件
在创建持久化类、映射文件和关联关系后,还需要在Hibernate配置文件hibernate. cfg.xml中指定持久化类映射文件,关键代码如下。
<mapping resource="com/actionForm/StockMainForm.hbm.xml"/>
<mapping resource="com/actionForm/StockDetailForm.hbm.xml"/>
<mapping resource="com/actionForm/StockMainViewForm.hbm.xml"/>
<mapping resource="com/actionForm/InStorageForm.hbm.xml"/>
<mapping resource="com/actionForm/StorageForm.hbm.xml"/>
<mapping resource="com/actionForm/LoanForm.hbm.xml"/>
说明:由于物资信息持久化类及映射文件已经在18.9.2节介绍了,所以此时不需要再配置了。
18.10.3 创建物资入库的Action实现类
物资入库模块涉及到3个Action实现类,分别是:实现物资入库操作的Instorage类、实现购物车操作的Cart类和实现物资借出操作的Loan类。由于物资借出归还操作是在物资借出基础上进行的,所以,笔者将进行物资借出操作的Action实现类Loan放在18.11.3节进行详细介绍,下面只介绍实现物资入库操作的Instorage类和实现购物车操作的Cart类的创建方法。
说明:由于在进行采购登记时,需要实现一张单据包含多种物资信息的功能,所以在实现时需要应用购物车的原理。
1.创建物资入库操作的Action实现类Instorage
在物资入库操作的Action实现类Instorage中首先需要在构造方法中实例化物资入库模块的InstorageDAO类(该类用于实现业务逻辑操作),然后通过Action实现类的主要方法execute()执行相应的业务逻辑操作。Action实现类的execute()方法会被自动执行,这个方法本身没有具体的事务,它是根据HttpServletRequest的getParameter()方法获取的action参数值执行相应方法的。
实现物资入库操作的Action实现类的关键代码如下。
例程18-64:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
public class Instorage extends Action {
InstorageDAO instorageDAO=null;
public Instorage(){
instorageDAO=new InstorageDAO();
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String action=request.getParameter("action");
System.out.println("Action:"+action);
if(action.equals("changeGoods")){ //选择物资信息时执行的操作
return changeGoods(mapping,form,request,response);
}else if(action.equals("stockadd")){ //添加采购单信息时执行的操作
return stockadd(mapping,form,request,response);
}else if(action.equals("eligible")){ //审核合格时执行的操作
return eligible(mapping,form,request,response);
}else if(action.equals("uneligible")){ //审核不合格时执行的操作
return uneligible(mapping,form,request,response);
}else{
request.setAttribute("err","您的操作有误!");
return mapping.findForward("error");
}
}
…… //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出
}
2.创建实现购物车的Action实现类Cart
在实现购物车的Action实现类Cart中,首先通过HttpServletRequest的getParameter()方法获取的action参数值,再根据获取的值执行相应方法的,实现购物车操作的Action实现类Cart的关键代码如下。
例程18-65:光盘\mr\18\MaterialManage\src\com\action\Cart .java
public class Cart extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String action = request.getParameter("action");
System.out.println("Action:" + action);
if (action.equals("add")) { //单击“采购”超级链接时执行的操作
return add(mapping, form, request, response);
} else if (action.equals("remove")) { //单击“移去”超级链接时执行的操作
return remove(mapping, form, request, response);
} else if(action.equals("clear")){ ////单击【重置】按钮时执行的操作
return clear(mapping, form, request, response);
}else {
request.setAttribute("err", "您的操作有误!");
return mapping.findForward("error");
}
}
…… //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出
}
18.10.4 采购登记设计
使用的数据表:tb_stock_main、tb_stock_detail、tb_goods、tb_provider
用户登录后,选择“物资入库”→“采购登记”命令,进入到采购登记页面。在该页面中“物资选择区”的“物资名称[规格]”下拉列表框中选择要采购的物资后,系统将自动检索出该物资的生产厂家、单价和计量单位;在“数量”文本中输入采购数量后,单击“采购”超级链接,在下方的“选择列表区”中将显示已经选择的物资信息列表,重复此操作可以选择多种物资;在“选择列表区”中单击指定信息右侧的“移去”超级链接可以将该物资从已经选择的列表中移去,选择物资后;在“供应商名称”下拉列表中选择供应商,在“负责人”文本框中输入负责人姓名,单击【保存】按钮,保存采购登记信息,运行结果如图18.18所示。
图18.18 采购登记页面运行结果
1.设计采购登记页面
采购登记页面包含两个表单,一个用于选择采购的物资信息,名称为form1;另一个用于填写供应商及负责人等采购概要信息,名称为form2。采购登记页面在Dreamweaver中的设计效果如图18.19所示。
图18.19 采购登记页面设计效果
从系统主菜单中选择“物资入库”→“采购登记”菜单项或是在采购登记页面中改变“物资名称[规格]”文本框的值时都会触发一个URL地址,这个URL地址是“instorage.do?action=changeGoods”,从这个URL地址中可以知道采购登记页面所涉及到的action的参数值为“changeGoods”,当action=changeGoods时,会调用查询指定物资信息的方法changeGoods(),具体代码如下。
例程18-66:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
if(action.equals("changeGoods")){ //选择物资信息时执行的操作
return changeGoods(mapping,form,request,response);
}
在查询指定物资信息的方法goodsModiQuery()中,首先需要获取从页面中传递的参数id的值并赋值给int型变量id,然后调用GoodsDAO类中的query()方法,并将变量id作为该方法的参数,查询出指定物资信息,再将返回的查询结果保存到HttpServletRequest的对象goodsForm中。查询指定物资信息的方法goodsModiQuery()的具体代码如下。
例程18-67:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
public ActionForward changeGoods(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
GoodsDAO goodsDAO=new GoodsDAO();
int goodsid=1;
if(request.getParameter("id")!=null){
goodsid=Integer.parseInt(request.getParameter("id"));
}
request.setAttribute("selGoods",goodsDAO.query(goodsid)); //获取选择的物资信息
return mapping.findForward("stock");
}
从上面的代码中可以知道查询指定物资信息使用的GoodsDAO类的方法是query(),该方法只有一个int型参数id(用于指定用户id)。在query()方法中将利用Session的get()方法查询出指定用户,然后将查询结果保存到GoodsForm中,并返回GoodsForm,query()方法的具体代码请参见例程18-52。
在struts-config.xml文件中配置查询指定物资信息所涉及的<forward>元素,代码如下。
<forward name="stock" path="/stockAdd.jsp" />
接下来的工作是将changeGoods()方法返回的查询结果显示在采购登记页面stockAdd.jsp中。在stockAdd.jsp中首先通过request.getAttribute()方法获取查询结果并将其显示在相应的位置或表单元素中。
2.保存采购物资到购物车
在采购登记页面中选择要采购的物资并填写采购数量后,单击“采购”超级链接,form1表单将会被提交,同时触发一个URL,这个URL是“cart.do?action=add”,从该URL地址中可以知道保存采购物资到购物车涉及到的action的参数值为“add”,也就是当action=add时,会调用保存采购物资到购物车的方法add(),具体代码如下。
例程18-68:光盘\mr\18\MaterialManage\src\com\action\Cart.java
if (action.equals("add")) { //单击“采购”超级链接时执行的操作
return add(mapping, form, request, response);
}
在保存采购物资到购物车的方法add()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用InstorageDAO类中的cart_add()方法将采购物资信息添加到购物车中,保存采购物资到购物车的方法add()的具体代码如下。
例程18-69:光盘\mr\18\MaterialManage\src\com\action\Cart.java
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
InstorageDAO instorageDAO = new InstorageDAO();
StockGoodsForm stockGoodsForm = (StockGoodsForm) form;
instorageDAO.cart_add(stockGoodsForm, request);
return mapping.findForward("add");
}
从上面的代码中可以知道保存采购物资到购物车时使用的InstorageDAO类的方法是cart_add()。在cart_add()方法中首先判断购物车是否为空,如果为空,则直接将采购的物资信息添加到购物车中(也就是保存到HttpSession“stockgoods”中);否则判断购物车内是否存在所添加的物资信息,如果存在,则直接累加数量,否则在购物车中添加新的物资信息,cart_add方法的具体代码如下。
例程18-70:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public void cart_add(StockGoodsForm goodsForm, HttpServletRequest request) {
HttpSession httpsession = request.getSession();
if (httpsession.getAttribute("stockgoods") != null &&
!httpsession.getAttribute("stockgoods").equals("")) {
List list = (List) httpsession.getAttribute("stockgoods");
boolean flag = true;
for (int i = 0; i < list.size(); i++) { //判断是否已经添加了该记录
StockGoodsForm goodsF = (StockGoodsForm) list.get(i);
if (goodsF.getId() == goodsForm.getId()) { //已经添加
goodsF.setNumber(goodsF.getNumber() + goodsForm.getNumber()); //累加数量
list.set(i, goodsF); //重新设定指定位置i处的元素
flag = false;
break; //退出循环
}
}
if (flag) {
list.add(goodsForm);
}
httpsession.setAttribute("stockgoods", list);
} else {
List list = new LinkedList();
list.add(goodsForm);
httpsession.setAttribute("stockgoods", list);
}
}
3.从购物车中移去指定物资信息
在采购登记页面中选择采购的物资后,单击“移去”超级链接,系统会访问一个URL,这个URL是“cart.do?action=remove”,从该URL地址中可以知道从购物车中移去指定物资信息涉及到的action的参数值为“remove”,也就是当action=remove时,会调用从购物车中移去指定物资信息的方法remove(),具体代码如下。
例程18-71:光盘\mr\18\MaterialManage\src\com\action\Cart.java
if (action.equals("remove")) {
return remove(mapping, form, request, response);
}
在从购物车中移去指定物资信息的方法remove()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用InstorageDAO类中的cart_remove()方法将指定的物资信息从购物车中移去,具体代码如下。
例程18-72:光盘\mr\18\MaterialManage\src\com\action\Cart.java
public ActionForward remove(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
InstorageDAO instorageDAO = new InstorageDAO();
int id=Integer.parseInt(request.getParameter("removeid"));
instorageDAO.cart_remove(id, request);
return mapping.findForward("add");
}
从上面的代码中可以知道从购物车移去指定物资信息时使用的InstorageDAO类的方法是cart_remove()。在cart_remove()方法中首先判断购物车内物资的种数,如果只有一种物资信息,则清空HttpSession“stockgoods”,否则移去指定物资信息,cart_remove()方法的具体代码如下。
例程18-73:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public void cart_remove(int id, HttpServletRequest request) {
HttpSession httpsession = request.getSession();
List list = (List) httpsession.getAttribute("stockgoods");
if (list.size() > 1) {
list.remove(id); //移去指定的物资信息
httpsession.setAttribute("stockgoods", list);
} else {
httpsession.removeAttribute("stockgoods");
}
}
4.清空购物车
在采购登记页面中选择采购的物资后,单击【重置】按钮,系统会访问一个URL,这个URL是“cart.do?action=clear”,从该URL地址中可以知道清空购物车涉及到的action的参数值为“clear”,也就是当action=clear时,会调用清空购物车的方法clear(),具体代码如下。
例程18-74:光盘\mr\18\MaterialManage\src\com\action\Cart.java
if(action.equals("clear")){
return clear(mapping, form, request, response);
}
在清空购物车的方法clear()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用InstorageDAO类中的cart_clear()方法将购物车内的全部物资信息移去,具体代码如下。
例程18-75:光盘\mr\18\MaterialManage\src\com\action\Cart.java
public ActionForward clear(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
InstorageDAO instorageDAO = new InstorageDAO();
instorageDAO.cart_clear(request);
return mapping.findForward("add");
}
从上面的代码中可以知道清空购物车时使用的InstorageDAO类的方法是cart_clear()。在cart_clear()方法中只需要调用HttpSession的removeAttribute()方法即可将HttpSession“stockgoods”移去,cart_clear()方法的具体代码如下。
例程18-76:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public void cart_clear(HttpServletRequest request) {
HttpSession httpsession = request.getSession();
httpsession.removeAttribute("stockgoods");
}
5.保存采购登记信息
在采购登记页面中录入采购登记信息后,单击【保存】按钮,form2表单将会被提交,同时触发一个URL,这个URL是“instorage.do?action=stockadd”。从该URL地址中可以知道保存采购登记涉及到的action的参数值为“stockadd”,也就是当action=stockadd时,会调用保存采购登记信息的方法stockadd(),具体代码如下。
例程18-77:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
if(action.equals("stockadd")){
return stockadd(mapping,form,request,response);
}
在保存采购登记信息的方法stockadd()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用InstorageDAO类中的stockadd()方法保存采购信息到相应的数据表中,并将返回值保存到变量rtn中,如果返回值为1,表示信息修改成功,将页面重定向到采购登记页面,否则将错误提示信息“采购单信息保存失败!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面,保存采购登记信息的方法stockadd()的关键代码如下。
例程18-78:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
public ActionForward stockadd(ActionMapping mapping, ActionForm form,HttpServletRequest request,
HttpServletResponse response){
StockMainForm stockMainForm=(StockMainForm)form;
int rtn=instorageDAO.stockadd(stockMainForm,request);
…… //此处省略了根据返回值重定向页面的代码
}
6.编写保存采购信息的InstorageDAO类的方法
从上面的代码中可以知道保存采购信息时使用的InstorageDAO类的方法是stockadd()。实现stockadd()方法主要分为以下4个步骤。
(1)通过for循环语句和级联添加操作将采购单信息保存到采购主表和明细表中。
(2)获取采购主表中最大的自动编号,与字符“CG”和系统日期组合成“CGYYYY- MM-DDnnnnn”格式的采购单号。
(3)将生成的采购单号插入到采购单主表中,并清空HttpSession“stockgoods”的值。
(4)如果在执行过程中不抛出异常,则将标志变量赋值为1,否则将标志变量赋值为0,最后返回该标志变量。
stockadd()方法的具体代码如下。
例程18-79:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public int stockadd(StockMainForm stockMainForm, HttpServletRequest request) {
int rtn = 1;
HttpSession httpsession = request.getSession();
List list = (List) httpsession.getAttribute("stockgoods");
Transaction tx = null;
if (list.size() <= 0) {
rtn = 0;
} else {
session = MySession.openSession(); //打开Session
try {
tx = session.beginTransaction();
for (int i = 0; i < list.size(); i++) {
StockDetailForm stockDetailForm = new StockDetailForm();
StockGoodsForm stockGoods = (StockGoodsForm) list.get(i);
stockMainForm.setCreateTime(new Date());
int goodsid = stockGoods.getId();
GoodsForm goodsForm = (GoodsForm) session.get(GoodsForm.class,goodsid);
stockDetailForm.setGoods(goodsForm);
stockDetailForm.setNumber(stockGoods.getNumber());
stockDetailForm.setPrice(stockGoods.getPrice());
stockMainForm.getStockDetail().add(stockDetailForm);
stockDetailForm.setStockMain(stockMainForm);
}
session.save(stockMainForm);
NumberFormat formater = NumberFormat.getNumberInstance();
int id = stockMainForm.getId();
formater.setMinimumIntegerDigits(5);
java.util.Date createTime = stockMainForm.getCreateTime();
java.sql.Date date = new java.sql.Date(createTime.getTime());
String sNo ="CG" + date +formater.format(id).toString().replace(",", ""); //组合采购单号
//插入采购单号
StockMainForm stockmaniF = (StockMainForm) session.get(
StockMainForm.class, id);
stockmaniF.setSno(sNo);
session.update(stockmaniF);
tx.commit();
httpsession.removeAttribute("stockgoods");
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
MySession.closeSession(session); //关闭Session
}
}
return rtn;
}
7.struts-config.xml文件配置
在struts-config.xml文件中配置保存采购信息所涉及的<forward>元素,代码如下:
<forward name="stockaddok" path="/transfer.jsp" />
18.10.5 审核入库设计
使用的数据表:tb_stock_main、tb_stock_detail、tb_goods、tb_storage、tb_instorage、tb_check
用户登录后,选择“物资入库”→“审核入库”命令,进入到审核入库页面,在该页面中将显示全部未审核的采购单列表,单击合格图标,即可执行审核合格操作,单击不合格图标,将进行不合格处理。审核入库页面的运行结果如图18.20所示。
审核入库页面主要实现对审核合格的采购单进行入库操作和对审核不合格的采购单进行不合格处理两个功能,下面分别进行介绍。
1.实现审核合格操作
在“审核入库”页面中可以找到合格图标的超级链接代码,如下所示。
图18.20 审核入库页面运行结果
例程18-80:光盘\mr\18\MaterialManage\defaultroot\inStockQuery.jsp
<a href="instorage.do?action=eligible&id=<%=id%>">
<img src="images/enforce.gif" width="16" height="16" border="0"></a>
从上面的URL地址中可以知道实现审核合格操作所涉及到的action的参数值为“eligible”,当action=eligible时,会调用实现审核合格操作的方法eligible(),具体代码如下。
例程18-81:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
if(action.equals("eligible")){
return eligible(mapping,form,request,response);
}
在实现审核合格操作的方法eligible()中,首先需要判断用户是否登录,如果没登录则跳转到登录页面强制其登录,这样可以提高系统的安全性,然后获取从页面中传递的参数id,并将id的值赋给int型变量id,赋值后将该变量作为InstorageDAO类中eligibleAdd()方法的参数,最后调用eligibleAdd()方法实现审核合格操作,并根据执行结果转到相应的页面。eligible()方法的具体代码如下。
例程18-82:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
public ActionForward eligible(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
HttpSession httpsession = request.getSession();
if(httpsession.getAttribute("username")==null){
request.setAttribute("error","请先登录!");
return mapping.findForward("error");
}
int id=Integer.valueOf(request.getParameter("id"));
int rtn=instorageDAO.eligibleAdd(id,request);
if(rtn==1){
return mapping.findForward("eligibleAddok");
}else{
request.setAttribute("error","审核入库操作失败!");
return mapping.findForward("error");
}
}
从上面代码中可以知道实现审核合格操作使用的InstorageDAO类的方法是eligibleAdd(),实现eligibleAdd()方法主要分为以下5个步骤。
(1)将审核合格入库信息保存到入库表tb_instorage中。
(2)获取入库表中最大的自动编号,与字符“RK”和系统日期组合成“RKYYYY-MM- DDnnnnn”格式的入库单号,并插入到入库表中。
(3)将采购单主表的state列的值修改为1(表示已入库)。
(4)修改库存信息表。
(5)如果在执行过程中不抛出异常,则将标志变量赋值为1,否则将标志变量赋值为0,最后返回该标志变量。
eligibleAdd()方法的具体代码如下。
例程18-83:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public int eligibleAdd(int id, HttpServletRequest request) {
int rtn = 1;
session = MySession.openSession(); //打开session
Transaction tx = null;
try {
tx = session.beginTransaction();
InStorageForm inStorageForm = new InStorageForm();
inStorageForm.setStockid(id);
inStorageForm.setCreateTime(new Date());
HttpSession httpsession = request.getSession();
inStorageForm.setUsername((String) httpsession.getAttribute(
"username")); //设置操作员
session.save(inStorageForm); //保存审核入库信息
NumberFormat formater = NumberFormat.getNumberInstance();
int iid = inStorageForm.getId();
formater.setMinimumIntegerDigits(5);
java.util.Date inTime = inStorageForm.getCreateTime();
java.sql.Date date = new java.sql.Date(inTime.getTime());
String ino = "RK" + date +formater.format(iid).toString().replace(",", ""); //组合入库单号
//插入入库单号
InStorageForm inStorageF = (InStorageForm) session.get(
InStorageForm.class, iid);
inStorageF.setIno(ino);
session.update(inStorageF);
StockMainForm stockMainForm = (StockMainForm) session.get(
StockMainForm.class, id);
stockMainForm.setState(1);
session.update(stockMainForm);
//修改库存信息表
String hql = "FROM StockDetailForm WHERE stockid=" + id + "";
List list = null;
Query query = session.createQuery(hql);
list = query.list();
int goodsid = 0;
int goodsnumber = 0;
String sql = "";
for (int i = 0; i < list.size(); i++) {
StockDetailForm stockdetailF = (StockDetailForm) list.get(i);
goodsid = stockdetailF.getGoods().getId(); //商品ID
goodsnumber = stockdetailF.getNumber(); //采购数量
//判断是否已经存在要入库的商品
String hql_goods = "FROM StorageForm WHERE goodsid=" + goodsid +
"";
List list_goods = session.createQuery(hql_goods).list();
if (list_goods.size() > 0) {
String hql_up = "UPDATE StorageForm set number=number+" +
goodsnumber + " WHERE goodsid=" + goodsid +
"";
session.createQuery(hql_up).executeUpdate();
} else { //不存在时
StorageForm storageF = new StorageForm();
storageF.setGoodsid(goodsid);
storageF.setNumber(goodsnumber);
session.save(storageF);
}
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
rtn = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
return rtn;
}
在struts-config.xml文件中配置实现审核合格操作所涉及的<forward>元素,代码如下:
<forward name="eligibleAddok" path="/ifDeal.do?action=inStockQuery" />
2.实现审核不合格处理
在“审核入库”页面中可以找到合格图标的超级链接代码,如下所示。
例程18-84:光盘\mr\18\MaterialManage\defaultroot\inStockQuery.jsp
<a href="instorage.do?action=uneligible&id=<%=id%>">
<img src="images/noel.gif" width="16" height="16" border="0"></a>
从上面的URL地址中可以知道实现审核不合格处理所涉及到的action的参数值为“uneligible”,当action=uneligible时,会调用实现审核不合格处理的方法uneligible(),具体代码如下。
例程18-85:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
if(action.equals("eligible")){
return eligible(mapping,form,request,response);
}
在实现审核合格操作的方法uneligible()中,首先需要判断用户是否登录,如果没有登记,则跳转到登录页面强制其登录,这样可以提高系统的安全性,然后获取从页面中传递的参数id,并将id的值赋给int型变量id,赋值后将该变量作为InstorageDAO类中uneligibleAdd()方法的参数,最后调用uneligibleAdd()方法实现审核不合格处理,并根据执行结果转到相应的页面。uneligibleAdd()方法的具体代码如下。
例程18-86:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
public ActionForward uneligible(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
HttpSession httpsession = request.getSession();
…… //此处省略了判断用户是否登录的代码
int id=Integer.valueOf(request.getParameter("id"));
int rtn=instorageDAO.uneligibleAdd(id,request);
if(rtn==1){
return mapping.findForward("eligibleAddok");
}else{
request.setAttribute("error","审核不合格操作失败!");
return mapping.findForward("error");
}
}
从上面代码中可以知道实现审核合格操作使用的InstorageDAO类的方法是uneligibleAdd()。在uneligibleAdd()方法中首先将审核不合格信息保存到审核入库表tb_check中,然后将采购单主表的state列的值修改为2(表示不合格)。uneligibleAdd()方法的具体代码如下。
例程18-87:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public int uneligibleAdd(int id, HttpServletRequest request) {
int rtn = 1;
session = MySession.openSession(); //打开session
Transaction tx = null;
try {
tx = session.beginTransaction();
CheckForm checkForm = new CheckForm();
checkForm.setStockid(id);
checkForm.setCheckTime(new Date());
HttpSession httpsession = request.getSession();
checkForm.setChecker((String) httpsession.getAttribute("username")); //设置操作员
session.save(checkForm); //保存审核不合格信息
StockMainForm stockMainForm = (StockMainForm) session.get(
StockMainForm.class, id);
stockMainForm.setState(2);
session.update(stockMainForm);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
rtn = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
return rtn;
}
18.10.6 借出归还设计
使用的数据表:tb_loan、tb_goods、tb_storage 主要技术:通过Hibernate API操作数据库
用户登录后,选择“物资入库”→“借出归还”命令,进入到借出归还页面,在该页面中将显示全部已审核,但未归还的借出单列表,单击归还图标,即可完成借出归还操作。借出归还页面的运行结果如图18.21所示。
图18.21 借出归还页面运行结果
说明:借出归还操作是在物资借出基础上进行的,物资借出模块将在18.11.节进行介绍。
在“借出归还”页面中可以找到归还图标的超级链接代码,如下所示:
例程18-88:光盘\mr\18\MaterialManage\defaultroot\loanBackQuery.jsp
<a href="loan.do?action=backloan&id=<%=id%>">
<img src="images/enforce.gif" width="16" height="16" border="0"></a>
从上面的URL地址中可以知道实现借出归还操作所涉及到的action的参数值为“backloan”,当action=backloan时,会调用实现借出归还操作的方法backloan(),具体代码如下。
例程18-89:光盘\mr\18\MaterialManage\src\com\action\Loan.java
if(action.equals("backloan")){
return backloan(mapping, form, request, response);
}
在实现借出归还操作的方法backloan()中,首先需要判断用户是否登录,如果没登录则跳转到登录页面强制其登录,这样可以提高系统的安全性,然后获取从页面中传递的参数id,并将id的值赋给int型变量id,赋值后将该变量作为InstorageDAO类中backloan()方法的参数,最后调用backloan()方法实现借出归还操作,并根据执行结果转到相应的页面。backloan()方法的具体代码如下。
例程18-90:光盘\mr\18\MaterialManage\src\com\action\Instorage.java
public ActionForward backloan(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
HttpSession httpsession = request.getSession();
…… //此处省略了判断用户是否登录的代码
InstorageDAO inStorageDAO = new InstorageDAO();
int id = Integer.valueOf(request.getParameter("id"));
int rtn = inStorageDAO.backloan(id, request);
if (rtn == 1) {
return mapping.findForward("loanbackAddok");
} else {
request.setAttribute("error", "借出归还操作失败!");
return mapping.findForward("error");
}
}
从上面代码中可以知道实现借出归还操作使用的InstorageDAO类的方法是backloan()。在backloan()方法中首先将借出归还信息保存到物资借出信息表tb_loan中,然后修改相应物资的库存数量,backloan()方法的具体代码如下。
例程18-91:光盘\mr\18\MaterialManage\src\com\dao\InstorageDAO.java
public int backloan(int id, HttpServletRequest request) {
int rtn = 1;
session = MySession.openSession(); //打开session
Transaction tx = null;
try {
tx = session.beginTransaction();
LoanForm loanForm = (LoanForm) session.get(LoanForm.class, id);
loanForm.setBacktime(new Date());
HttpSession httpsession = request.getSession();
loanForm.setBackperson((String) httpsession.getAttribute("username")); //设置归还人
loanForm.setState(new Short("2")); //修改借出单状态为已归还
session.update(loanForm); //保存借出归还信息
//修改库存信息表
GoodsForm goodsF = loanForm.getGoods();
int goodsid = goodsF.getId();
int goodsnumber = loanForm.getNumber();
String hql_goods = "FROM StorageForm WHERE goodsid=" + goodsid + "";
List list_goods = session.createQuery(hql_goods).list();
if (list_goods.size() > 0) {
String hql_up = "UPDATE StorageForm set number=number+" +
goodsnumber + " WHERE goodsid=" + goodsid +
"";
session.createQuery(hql_up).executeUpdate();
} else {
rtn = 0;
}
if (rtn == 1) {
tx.commit(); //提交事务
} else {
if (tx != null) {
tx.rollback(); // 回滚事务
}
}
} catch (Exception e) {
…… //此处省略了事务回滚和输出错误信息的代码
rtn = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
return rtn;
}
在struts-config.xml文件中配置实现借出归还操作所涉及的<forward>元素,代码如下:
<forward name="loanbackAddok" path="/loanAddok_ok.jsp?para=3" />