18.12 物資處理模塊
18.12.1 物資處理模塊總體架構(gòu)
物資處理模塊主要包括以下功能。
● 庫存盤點:用于分頁打印庫存盤點表;
● 部門報損:用于對部門報損信息進行登記。
18.12.2 創(chuàng)建物資處理模塊的持久化類及映射文件
1.創(chuàng)建持久化類和映射文件
物資處理模塊涉及到的數(shù)據(jù)表的持久化類和映射文件如表18.20所示。持久化類及映射文件的具體實現(xiàn)方法請參見18.8.2節(jié)。
表18.20 物資處理模塊涉及到的數(shù)據(jù)表的持久化類和映射文件
數(shù)據(jù)表名稱
|
持久化類名稱
|
映射文件名稱
|
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.映射關(guān)聯(lián)關(guān)系
在物資出庫模塊中,涉及到兩對關(guān)聯(lián)關(guān)系,如表18.21所示。
表18.21 物資出庫模塊的表間關(guān)系
主 鍵 表
|
外 鍵 表
|
名 稱
|
字 段 名
|
名 稱
|
字 段 名
|
tb_goods
|
id
|
tb_damage
|
goodsid
|
tb_branch
|
id
|
tb_damage
|
branchid
|
說明:在Hibernate中映射關(guān)聯(lián)關(guān)系的具體方法請參見18.10.2節(jié)。
3.修改Hibernate配置文件
在創(chuàng)建持久化類、映射文件和關(guān)聯(lián)關(guān)系后,還需要在Hibernate配置文件hibernate.cfg.xml中指定持久化類映射文件,關(guān)鍵代碼如下:
<mapping resource="com/actionForm/DamageForm.hbm.xml"/>
說明:由于物資信息表、部門信息表和物資借出信息表的持久化類及映射文件在前面的章節(jié)中已經(jīng)配置了,所以此時不需要再進行配置。
18.12.3 創(chuàng)建物資處理模塊的Action實現(xiàn)類
物資處理模塊的Action實現(xiàn)類繼承了Action類,在該類中首先需要在構(gòu)造方法中實例化物資管理模塊的OutStorageDAO類(該類用于實現(xiàn)業(yè)務(wù)邏輯操作),然后通過Action實現(xiàn)類的主要方法execute()執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作。Action實現(xiàn)類的execute()方法會被自動執(zhí)行,這個方法本身沒有具體的事務(wù),它是根據(jù)HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。
物資處理模塊的Action實現(xiàn)類的關(guān)鍵代碼如下。
例程18-108:光盤\mr\18\MaterialManage\src\com\action\Damage.java
public class Damage extends Action {
…… //此處省略了在構(gòu)造方法中實例化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")) { //查詢部門領(lǐng)用物資信息
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 庫存盤點設(shè)計
使用的數(shù)據(jù)表:tb_goods、tb_storage 主要技術(shù):通過Hibernate 的本地SQL查詢查詢多表數(shù)據(jù)
用戶登錄后,選擇“物資處理”→“庫存盤點”菜單項,進入到庫存盤點頁面,在該頁面中將顯示庫存信息列表及庫存總金額,單擊“打印盤點報表”超級鏈接可以分頁打印庫存盤點表。庫存盤點頁面運行結(jié)果如圖18.25所示,打印預(yù)覽效果如圖18.26所示。

圖18.25 庫存盤點頁面運行結(jié)果

圖18.26 庫存盤點頁面打印預(yù)覽效果
在庫存盤點頁面中調(diào)用OutStorageDAO類中的storage_query()方法查詢庫存中的物資信息,關(guān)鍵代碼如下。
例程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。
在庫存盤點頁面中添加用于顯示庫存盤點報表內(nèi)容的表格,并設(shè)置好表頭、表尾及打印分頁。需要注意的是:由于盤點數(shù)量需要手工填寫,所以在打印時需要留出相應(yīng)的位置,關(guān)鍵代碼如下。
例程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">盤點數(shù)量</td>
</tr>
</thead>
<%if (listgoods.size() <= 0) {%>
<tr> <td colspan="7" align="center" bgcolor="#FFFFFF"> 暫無庫存信息!</td></tr>
<%}else {
String Producer=""; //生產(chǎn)廠家
String Unit=""; //單位
float Price=0.0f; //單價
float amount=0.0f; //總金額
int storagenumber=0; //庫存數(shù)量
String goodsname=""; //物資名稱
int goodsId=0; //物資ID
String spec=""; //規(guī)格
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>
控制頁面背景、系統(tǒng)導(dǎo)航信息、版權(quán)信息及“打印”超級鏈接,在打印時不顯示,關(guān)鍵代碼如下。
例程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 部門報損設(shè)計
使用的數(shù)據(jù)表:tb_damage、tb_branch、tb_goods 主要技術(shù):通過Hibernate API操作數(shù)據(jù)庫
用戶登錄后,選擇“物資處理”→“部門報損”菜單項,進入到部門報損頁面。在部門報損頁面中,首先從“物資名稱”下拉列表框中選擇要報損的物資(系統(tǒng)將自動檢索出該物資的生產(chǎn)廠家、單價和計量單位等信息),然后選擇部門名稱并輸入報損數(shù)量、負責(zé)人名稱及報損原因,單擊【保存】按鈕,保存部門報損信息,運行結(jié)果如圖18.27所示。
1.設(shè)計部門報損頁面
從系統(tǒng)主菜單中選擇“物資處理”→“部門報損”菜單項或是在部門報損頁面中改變“物資名稱”下拉列表框的值時都會觸發(fā)一個URL地址,這個URL地址是“damage.do?action=damageaddquery”。從這個URL地址中可以知道部門報損頁面所涉及到的action的參數(shù)值為“damageaddquery”,當(dāng)action=damageaddquery時,會調(diào)用查詢已領(lǐng)用物資信息的方法damageadd_request(),具體代碼如下。
例程18-112:光盤\mr\18\MaterialManage\src\com\action\Damage.java
if (action.equals("damageaddquery")) {
return damageadd_request(mapping, form, request, response);
}
在查詢已領(lǐng)用物資信息的方法damageadd_request()中,首先需要獲取從頁面中傳遞的參數(shù)id的值并保存到HttpServletRequest的對象id中,然后調(diào)用OutStorageDAO類中的getuseGoods_query()方法查詢出已領(lǐng)用物資信息,再將返回的查詢結(jié)果保存到HttpServletRequest的對象getuse中。查詢已領(lǐng)用物資信息的方法damageadd_request()的具體代碼如下。

圖18.27 部門報損頁面運行結(jié)果
例程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()); //獲取部門已領(lǐng)用物資信息
return mapping.findForward("selGetuseGoods");
}
從上面的代碼中可以知道查詢已領(lǐng)用物資信息使用的OutStorageDAO類的方法是getuseGoods_query(),在該方法中首先需要利用Hibernate的本地SQL查詢獲取已領(lǐng)用物資的詳細信息,然后將查詢結(jié)果保存到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); //將數(shù)據(jù)表與持久化類關(guān)聯(lián)在一起
list = query.list();
} catch (Exception e) {
System.out.println("查詢時的錯誤信息:" + e.getMessage());
}
return list;
}
在struts-config.xml文件中配置查詢已領(lǐng)用物資信息所涉及的<forward>元素,代碼如下:
<forward name="selGetuseGoods" path="/damageAdd.jsp" />
接下來的工作是將getuseGoods_query()方法返回的查詢結(jié)果顯示在部門報損頁面damageAdd.jsp中。在damageAdd.jsp中首先通過request.getAttribute()方法獲取查詢結(jié)果并將其顯示在相應(yīng)的位置或表單元素中。
2.保存部門報損信息
在部門報損頁面中錄入部門報損信息后,單擊【保存】按鈕,系統(tǒng)會訪問一個URL,這個URL是“damage.do?action=damageadd”。從該URL地址中可以知道保存部門報損信息涉及到的action的參數(shù)值為“damageadd”,也就是當(dāng)action=damageadd時,會調(diào)用保存部門報損信息的方法damageadd(),具體代碼如下。
例程18-115:光盤\mr\18\MaterialManage\src\com\action\Damage.java
if (action.equals("damageadd")) {
return damageadd(mapping, form, request, response);
}
在保存部門報損信息的方法damageadd()中,首先需要將接收到的表單信息強制轉(zhuǎn)換成ActionForm類型,然后調(diào)用OutStorageDAO類中的damageAdd()方法保存部門報損信息到相應(yīng)的數(shù)據(jù)表中,并將返回值保存到變量rtn中。如果返回值為1,表示信息修改成功,將頁面重定向到部門報損頁面,否則將錯誤提示信息“部門報損信息添加失??!”保存到HttpServletRequest的對象error中,然后將頁面重定向到錯誤提示信息頁面。保存部門報損信息的方法getuseadd()的關(guān)鍵代碼如下。
例程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);
…… //此處省略了根據(jù)返回值重定向頁面的代碼
}
3.編寫保存部門報損信息的OutStorageDAO類的方法
從上面的代碼中可以知道保存部門報損信息時使用的OutStorageDAO類的方法是damageAdd(),在該方法中首先需要建立“GoodsForm和DamageForm的關(guān)聯(lián)關(guān)系”以及“BranchForm和DamageForm的關(guān)聯(lián)關(guān)系”,再保存部門報損信息。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); //關(guān)閉Session
}
return rtn;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置保存部門報損信息所涉及的<forward>元素,代碼如下:
<forward name="damageAddok" path="/damageAddok_ok.jsp?para=1" />