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" />