18.12 物资处理模块
18.12.1 物资处理模块总体架构
物资处理模块主要包括以下功能。
● 库存盘点:用于分页打印库存盘点表;
● 部门报损:用于对部门报损信息进行登记。
18.12.2 创建物资处理模块的持久化类及映射文件
1.创建持久化类和映射文件
物资处理模块涉及到的数据表的持久化类和映射文件如表18.20所示。持久化类及映射文件的具体实现方法请参见18.8.2节。
表18.20 物资处理模块涉及到的数据表的持久化类和映射文件
数据表名称
|
持久化类名称
|
映射文件名称
|
tb_damage
|
DamageForm
|
DamageForm.hbm.xml
|
tb_branch
|
BranchForm
|
BranchForm.hbm.xml
|
tb_goods
|
GoodsForm
|
GoodsForm.hbm.xml
|
tb_storage
|
StorageForm
|
StorageForm.hbm.xml
|
2.映射关联关系
在物资出库模块中,涉及到两对关联关系,如表18.21所示。
表18.21 物资出库模块的表间关系
主 键 表
|
外 键 表
|
名 称
|
字 段 名
|
名 称
|
字 段 名
|
tb_goods
|
id
|
tb_damage
|
goodsid
|
tb_branch
|
id
|
tb_damage
|
branchid
|
说明:在Hibernate中映射关联关系的具体方法请参见18.10.2节。
3.修改Hibernate配置文件
在创建持久化类、映射文件和关联关系后,还需要在Hibernate配置文件hibernate.cfg.xml中指定持久化类映射文件,关键代码如下:
<mapping resource="com/actionForm/DamageForm.hbm.xml"/>
说明:由于物资信息表、部门信息表和物资借出信息表的持久化类及映射文件在前面的章节中已经配置了,所以此时不需要再进行配置。
18.12.3 创建物资处理模块的Action实现类
物资处理模块的Action实现类继承了Action类,在该类中首先需要在构造方法中实例化物资管理模块的OutStorageDAO类(该类用于实现业务逻辑操作),然后通过Action实现类的主要方法execute()执行相应的业务逻辑操作。Action实现类的execute()方法会被自动执行,这个方法本身没有具体的事务,它是根据HttpServletRequest的getParameter()方法获取的action参数值执行相应方法的。
物资处理模块的Action实现类的关键代码如下。
例程18-108:光盘\mr\18\MaterialManage\src\com\action\Damage.java
public class Damage extends Action {
…… //此处省略了在构造方法中实例化OutStorageDAO类的方法
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
String action = request.getParameter("action");
if (action.equals("") || action == null) {
request.setAttribute("error", "您的操作有误!");
return mapping.findForward("error");
} else if (action.equals("damageaddquery")) { //查询部门领用物资信息
return damageadd_request(mapping, form, request, response);
} else if (action.equals("damageadd")) { //添加部门报损信息
return damageadd(mapping, form, request, response);
}else{
request.setAttribute("error", "您的操作有误!");
return mapping.findForward("error");
}
}
…… //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出
}
18.12.4 库存盘点设计
使用的数据表:tb_goods、tb_storage 主要技术:通过Hibernate 的本地SQL查询查询多表数据
用户登录后,选择“物资处理”→“库存盘点”菜单项,进入到库存盘点页面,在该页面中将显示库存信息列表及库存总金额,单击“打印盘点报表”超级链接可以分页打印库存盘点表。库存盘点页面运行结果如图18.25所示,打印预览效果如图18.26所示。
图18.25 库存盘点页面运行结果
图18.26 库存盘点页面打印预览效果
在库存盘点页面中调用OutStorageDAO类中的storage_query()方法查询库存中的物资信息,关键代码如下。
例程18-109:光盘\mr\18\MaterialManage\defaultroot\storageCheck.jsp
<%
List listgoods = null;
OutStorageDAO outStorageDAO = new OutStorageDAO();
listgoods = outStorageDAO.storage_query(); //查询库存中的物资信息
java.util.Date date=new java.util.Date();
%>
说明:OutStorageDAO类中storage_query()方法的详细代码请参见例程18-96。
在库存盘点页面中添加用于显示库存盘点报表内容的表格,并设置好表头、表尾及打印分页。需要注意的是:由于盘点数量需要手工填写,所以在打印时需要留出相应的位置,关键代码如下。
例程18-110:光盘\mr\18\MaterialManage\defaultroot\storageCheck.jsp
<table width="90%" border="1" cellpadding="0" cellspacing="0" bgcolor="#000000" id="pay"
bordercolor="#00000" bordercolordark="#000000" bordercolorlight="#FFFFFF" >
<thead style="display:table-header-group;">
<tr>
<td width="7%" align="center" bgcolor="#FFFFFF">编号</td>
…… //此处省略了部分HTML代码
<td width="9%" align="center" bgcolor="#FFFFFF">盘点数量</td>
</tr>
</thead>
<%if (listgoods.size() <= 0) {%>
<tr> <td colspan="7" align="center" bgcolor="#FFFFFF"> 暂无库存信息!</td></tr>
<%}else {
String Producer=""; //生产厂家
String Unit=""; //单位
float Price=0.0f; //单价
float amount=0.0f; //总金额
int storagenumber=0; //库存数量
String goodsname=""; //物资名称
int goodsId=0; //物资ID
String spec=""; //规格
for(int i=0;i<listgoods.size();i++){
Object obj[]=(Object[])listgoods.get(i);
GoodsForm goodsF=(GoodsForm)obj[0];
StorageForm storageF=(StorageForm)obj[1];
goodsId=goodsF.getId();
goodsname=goodsF.getName();
spec=goodsF.getSpec();
Producer=goodsF.getProducer();
Unit=goodsF.getUnit();
Price=goodsF.getPrice();
storagenumber=storageF.getNumber();
amount=amount+Price*storagenumber;
%>
<tr<%if((i+1)%18==0){%> style="page-break-after:always;"<%}%>>
<td align="center" bgcolor="#FFFFFF"> <%=i+1%></td>
…… //此处省略了部分HTML代码
<td bgcolor="#FFFFFF"> </td>
</tr>
<%}%>
<tfoot style="display:table-footer-group;"><tr><td class="tableBorder_B1"></td></tr></tfoot>
</table>
…… //此处省略了部分HTML代码
<%}%>
</table>
控制页面背景、系统导航信息、版权信息及“打印”超级链接,在打印时不显示,关键代码如下。
例程18-111:光盘\mr\18\MaterialManage\defaultroot\storageCheck.jsp
<style>
@media print{
div{display:none}
.bgnoprint{
background:display:none;
}
.noprint{
display:none
}
}
</style>
<body onLoad="clockon(bgclock)" class="bgnoprint">
<table width="757" height="174" border="0" align="center"cellpadding="0" cellspacing="0">
<tr class="noprint">
<td height="133" align="center" valign="top"><%@include file="top.jsp"%>
</td>
</tr>
…… //此处省略了部分HTML代码
<div>库存总金额:<%=amount%>
<a href="#" onClick="window.print();">打印盘点报表</a></div>
…… //此处省略了部分HTML代码
<tr class="noprint">
<td height="55" valign="top" background="images/bottom.jpg"><%@include file="copyright.jsp"%>
</td>
</tr>
18.12.5 部门报损设计
使用的数据表:tb_damage、tb_branch、tb_goods 主要技术:通过Hibernate API操作数据库
用户登录后,选择“物资处理”→“部门报损”菜单项,进入到部门报损页面。在部门报损页面中,首先从“物资名称”下拉列表框中选择要报损的物资(系统将自动检索出该物资的生产厂家、单价和计量单位等信息),然后选择部门名称并输入报损数量、负责人名称及报损原因,单击【保存】按钮,保存部门报损信息,运行结果如图18.27所示。
1.设计部门报损页面
从系统主菜单中选择“物资处理”→“部门报损”菜单项或是在部门报损页面中改变“物资名称”下拉列表框的值时都会触发一个URL地址,这个URL地址是“damage.do?action=damageaddquery”。从这个URL地址中可以知道部门报损页面所涉及到的action的参数值为“damageaddquery”,当action=damageaddquery时,会调用查询已领用物资信息的方法damageadd_request(),具体代码如下。
例程18-112:光盘\mr\18\MaterialManage\src\com\action\Damage.java
if (action.equals("damageaddquery")) {
return damageadd_request(mapping, form, request, response);
}
在查询已领用物资信息的方法damageadd_request()中,首先需要获取从页面中传递的参数id的值并保存到HttpServletRequest的对象id中,然后调用OutStorageDAO类中的getuseGoods_query()方法查询出已领用物资信息,再将返回的查询结果保存到HttpServletRequest的对象getuse中。查询已领用物资信息的方法damageadd_request()的具体代码如下。
图18.27 部门报损页面运行结果
例程18-113:光盘\mr\18\MaterialManage\src\com\action\Damage.java
public ActionForward damageadd_request(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
int goodsid = 0;
if (request.getParameter("id") != null) {
goodsid = Integer.parseInt(request.getParameter("id"));
}
request.setAttribute("id", goodsid);
request.setAttribute("getuse", outStorageDAO.getuseGoods_query()); //获取部门已领用物资信息
return mapping.findForward("selGetuseGoods");
}
从上面的代码中可以知道查询已领用物资信息使用的OutStorageDAO类的方法是getuseGoods_query(),在该方法中首先需要利用Hibernate的本地SQL查询获取已领用物资的详细信息,然后将查询结果保存到List集合list中,并返回list。getuseGoods_query()方法的具体代码如下。
例程18-114:光盘\mr\18\MaterialManage\src\com\action\OutStorageDAO.java
public List getuseGoods_query() {
session = MySession.openSession();
List list = null;
String sql = "select * from tb_goods where id in (select goodsid from tb_getuse group by goodsid)";
try {
SQLQuery query = session.createSQLQuery(sql);
query.addEntity("goods", GoodsForm.class); //将数据表与持久化类关联在一起
list = query.list();
} catch (Exception e) {
System.out.println("查询时的错误信息:" + e.getMessage());
}
return list;
}
在struts-config.xml文件中配置查询已领用物资信息所涉及的<forward>元素,代码如下:
<forward name="selGetuseGoods" path="/damageAdd.jsp" />
接下来的工作是将getuseGoods_query()方法返回的查询结果显示在部门报损页面damageAdd.jsp中。在damageAdd.jsp中首先通过request.getAttribute()方法获取查询结果并将其显示在相应的位置或表单元素中。
2.保存部门报损信息
在部门报损页面中录入部门报损信息后,单击【保存】按钮,系统会访问一个URL,这个URL是“damage.do?action=damageadd”。从该URL地址中可以知道保存部门报损信息涉及到的action的参数值为“damageadd”,也就是当action=damageadd时,会调用保存部门报损信息的方法damageadd(),具体代码如下。
例程18-115:光盘\mr\18\MaterialManage\src\com\action\Damage.java
if (action.equals("damageadd")) {
return damageadd(mapping, form, request, response);
}
在保存部门报损信息的方法damageadd()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用OutStorageDAO类中的damageAdd()方法保存部门报损信息到相应的数据表中,并将返回值保存到变量rtn中。如果返回值为1,表示信息修改成功,将页面重定向到部门报损页面,否则将错误提示信息“部门报损信息添加失败!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面。保存部门报损信息的方法getuseadd()的关键代码如下。
例程18-116:光盘\mr\18\MaterialManage\src\com\action\Damage.java
public ActionForward damageadd(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
DamageForm getUseForm = (DamageForm) form;
int rtn = outStorageDAO.damageAdd(getUseForm);
…… //此处省略了根据返回值重定向页面的代码
}
3.编写保存部门报损信息的OutStorageDAO类的方法
从上面的代码中可以知道保存部门报损信息时使用的OutStorageDAO类的方法是damageAdd(),在该方法中首先需要建立“GoodsForm和DamageForm的关联关系”以及“BranchForm和DamageForm的关联关系”,再保存部门报损信息。damageAdd()方法的具体代码如下。
例程18-117:光盘\mr\18\MaterialManage\src\com\dao\OutStorageDAO.java
public int damageAdd(DamageForm damageForm) {
session = MySession.openSession(); //打开Session
Transaction tx = null;
int rtn = 0;
try {
//保存物资借出信息
tx = session.beginTransaction();
int goodsid = damageForm.getGoodsid();
GoodsForm goodsForm = (GoodsForm) session.get(GoodsForm.class,goodsid);
damageForm.setGoods(goodsForm);
int branchid = damageForm.getBranchid();
BranchForm branchForm = (BranchForm) session.get(BranchForm.class,branchid);
damageForm.setBranch(branchForm);
damageForm.setCreatetime(new Date());
session.save(damageForm);
tx.commit();
rtn = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
System.out.println("添加部门报损信息时的错误信息:" + e.getMessage());
rtn = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
return rtn;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置保存部门报损信息所涉及的<forward>元素,代码如下:
<forward name="damageAddok" path="/damageAddok_ok.jsp?para=1" />