SSH實現進銷存(ERP)專案之訂單管理模組解析(附原始碼地址)

阿木俠發表於2017-06-14

專案清單:

1,struts2、hibernate、spring

2,前後臺傳值使用json

3,資料庫使用了Oracle

4,對員工表及採購單表採用了後端分頁

5,使用了時間控制元件

專案結構,MVC模式,比較常見的專案結構:



程式碼較多,把關鍵的部分介紹一下,對於採購單,他的查詢及顯示流程。

這裡貼出BuyAction.java中的這部分程式碼:

/**
	 * @return
	 * 查詢顯示列表
	 */
	public String findAll() {  
        int count = this.services.findCountById(buyId,username); //根據訂單編號,採購員查詢採購單數量 
        List<Buy> list = this.services.findById(buyId,username, currentPage, pageSize);//查詢,列表顯示所有采購單資訊
        jsonA = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("count", count);//這裡json將訂單數量傳遞前臺
        jsonA.add(jsonObject);
        for (int i = 0; i < list.size(); i++) {
			Buy pojo = list.get(i);
			JSONObject jsonO = new JSONObject();
			jsonO.put("buyId", pojo.getBuyId());
			jsonO.put("userid",pojo.getUserinfo().getUserName());
			jsonO.put("buyDate",DataConverter.dataToString(pojo.getBuyDate(),"yyyy-MM-dd"));
			jsonA.add(jsonO);
		}
        return "succ";  
    }  

首先查詢採購單的數量,findCountById(),這步為分頁做準備。

接著開始查詢方法,傳入的引數有:

buyId-----用來根據id查詢

username------根據採購人查詢

currentPage, pageSize------分頁使用,當前頁和頁數

那麼findById()這個方法具體如何實現?

/* (non-Javadoc)
	 * @see org.erp.dao.BuyDAO#findById(Integer, int, int)
	 * 根據採購單編號查詢,輸入內容為空時查詢所有采購單列表顯示
	 * 有輸入編號時按編號查詢,也進行了分頁
	 */
	@Override
	public List<Buy> findById(Integer bId,String username, int currentPage, int pageSize) {
		List<Buy> list = null;
		String hql = null;
		if(bId==null||bId==0){
			hql = "from Buy b where isDelete=1 and b.userinfo.userName like '%" + username + "%'";
		}
		else{
			hql = "from Buy b where b.buyId='"+bId+"' and isDelete=1 and b.userinfo.userName like '%" + username + "%'";  
		}
			try {  
				Query query = this.sessionFactoy.getCurrentSession().createQuery(  
						hql);  
				query.setFirstResult((currentPage - 1) * pageSize);  
				query.setMaxResults(pageSize);  
				list = query.list();  
			} catch (Exception e) {  
				e.printStackTrace();  
			} 
        return list;  
	}

使用hql語句前進行了判斷,首先看使用者是否輸入了編號和名字,輸入就按編號,名字或者編號和名字一起查詢,如果沒有,就按編號全部查出來,用於展示。

後臺資料通過action傳送到前臺,那麼jsp如何接收和顯示?

<%@page contentType="text/html; charset=utf-8" %>
<%
	String path = request.getContextPath();
 %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<script type="text/javascript" src="<%=path %>/js/jquery-1.7.2.js"></script>
	<link type="text/css" href="<%=path %>/css/css.css" rel="stylesheet"/>
    <link rel="stylesheet" href="<%=path %>/css/pintuer.css">
	<link rel="stylesheet" href="<%=path %>/css/admin.css">
</head>
<body>
<span>採購管理</span>
	<center>
		<form action="" method="post" name="form1">
			編號:<input type="text" name="bid" id="bid" class="input" style="width:250px; line-height:17px;display:inline-block" placeholder="請輸入搜尋關鍵字">
			採購員:<input type="text" name="username" id="username" class="input" style="width:250px; line-height:17px;display:inline-block" placeholder="請輸入搜尋關鍵字">
			<input type="button" value="查詢" onclick="query(1)" class="button border-main icon-search">
			<a class="button border-main icon-plus-square-o" onclick="goIns()">新增</a>
		</form>
	
	<hr/>
	<div class="table_con"><div id="showTable"></div></div>
	<hr/>
	<span id="page_message"></span>
	<input class='button border-main' type="button" value="首頁" id="first" onclick="query(5)">
	<input class='button border-main' type="button" value="上一頁" id="up"  onclick="query(2)">
	<input class='button border-main' type="button" value="下一頁" id="end"  onclick="query(3)">
	<input class='button border-main' type="button" value="尾頁" id="down"  onclick="query(4)">
	</center>

</body>
<script type="text/javascript">
var bid = "";//查詢條件
var username = "";//查詢條件
var count = 0;//總共有多少筆資料
var page_count = 0;//總共多少頁
var pagesize = 5;//一頁顯示多少比
var pagecur = 1;//當前第幾頁
query(1);

/*
	查詢
*/
function query(a) {
	bid = form1.bid.value;
	username = form1.username.value;
	if(a==1){
		pagecur = 1;
	}else if(a==2){//查詢上一頁
		pagecur = pagecur-1;
	}else if(a==3){//查詢下一頁
		pagecur = pagecur+1;
	}else if(a==4){//最後一頁
		pagecur = page_count;
	}else if(a==5){//首頁
		pagecur = 1;
	}
	$(document).ready(function (){
		$.post("<%=path%>/buy_findAll",{buyId:bid,username:username,currentPage:pagecur,pageSize:pagesize},
			function(data){//Servlet執行完之後執行方法,data表示的servlet返回資料內容
	 				var object = eval(data);//將字串轉換成json型別
	 				var showT = "<table class='table table-hover text-center'>  <tr> <th width='15%'>採購單編號</th> <th width='15%'>採購員</th> <th width='30%'>採購時間</th> <th width='40%'>操作</th> </tr>";
	 				for(var i = 1;i<object.length;i++){
	 					var item = object[i];
	 					showT = showT+"<tr class='table table-hover text-center'><td width='10%'>"+item.buyId+"</td><td width='10%'>"+item.userid+"</td><td width='30%'>"+item.buyDate+
	 					"</td><td width='50%'><input class='button border-main' type='button' value='修改' onclick='goUpd(" + item.buyId + ")'><input class='button border-red' type='button' value='刪除' onclick='goDel("
					+ item.buyId + ")'><input class='button border-main' type='button' value='檢視採購明細' onclick='showDetail(" + item.buyId + ")'></td></tr>";
	 				}
	 				showT = showT + "</table>";
	 				$("#showTable").html(showT);
	 				count=object[0].count;
	 				calc();//計算總頁數,控制按鈕是否可用
	 			});
			
		});
}
/*
	按鈕控制
*/
function calc(){
	if(count%pagesize==0){
		page_count = count/pagesize;
	}else{
		var v = count%pagesize;
		page_count = (count-v)/pagesize + 1;
	}
	if(pagecur == 1&&page_count!=1){
		document.getElementById("first").disabled = true;//按鈕不可用
		document.getElementById("up").disabled = true;
		document.getElementById("end").disabled = false;
		document.getElementById("down").disabled = false;
	}else if(pagecur == page_count&&page_count!=1){
		document.getElementById("first").disabled = false;
		document.getElementById("up").disabled = false;
		document.getElementById("end").disabled = true;
		document.getElementById("down").disabled = true;
	}else if(page_count==1){
		document.getElementById("first").disabled = true;
		document.getElementById("up").disabled = true;
		document.getElementById("end").disabled = true;
		document.getElementById("down").disabled = true;
	}else if(pagecur<page_count&&pagecur>1){
		document.getElementById("first").disabled = false;
		document.getElementById("up").disabled = false;
		document.getElementById("end").disabled = false;
		document.getElementById("down").disabled = false;
	}
	document.getElementById("page_message").innerHTML="<font color='blue'>當前第"+pagecur+"頁  總共"+count+"筆,共"+page_count+"頁</font>";
}
/*
	新增
*/
function goIns(){
	var width = window.screen.width ;
	var height = window.screen.height ;
	window.open("add.jsp","新增採購單",'height=400,width=600,top='+(height-450)/2+',left='+(width-300)/2+',toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no');
}
/*
	修改
*/
function goUpd(id_key){
	var width = window.screen.width ;
	var height = window.screen.height ;
	window.open("<%=path%>/buy_findById?bid="+id_key,"修改採購單",'height=400,width=600,top='+(height-450)/2+',left='+(width-300)/2+',toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no');
}
/* 顯示採購明細 */
function showDetail(id_key){
var width = window.screen.width ;
	var height = window.screen.height ;
	window.open("<%=path%>/jsp/buydetail/query.jsp?buyId="+id_key,"採購單明細",'height=400,width=600,top='+(height-450)/2+',left='+(width-300)/2+',toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no');
}
/*
	刪除
*/
function goDel(id_key){
	if(confirm("確認刪除?")){
		$(document).ready(function (){
		$.post("<%=path%>/buy_doDel",{bid:id_key},function(data){
			if(data.indexOf("true")!=-1){
				alert("刪除成功");
				query(0);
			}else{
				alert("刪除失敗");
			}
		});
		
	});
	}
	
}	

</script>
</html>

這個就是基本的流程了,實現的效果圖:




其他大體相同,只是對於銷售明細,我們涉及到了職工表,商品表,商品明細表,以及需要自動計算出採購商品的價格,這個如何實現呢?

方法有很多,但使用檢視對映過來,操作檢視貌似簡單一些

建立檢視程式碼:

--檢視:採購明細單資訊
create or replace view detail_buy_view as
select bd.buy_detail_id,--明細單id
bd.buy_id,--訂單id
pro.pro_id,--商品id
pro.pro_name,--商品名
bd.buy_num,--購買數量
bd.buy_price,--購買單價
b.total_price,--該商品總價
bd.is_delete--是否刪除了 
from buy_detail bd,pro,
  (select buy_detail_id,sum(buy_num*buy_price) total_price  --這裡計算商品總價
  from buy_detail group by buy_detail_id) b
  where 
  bd.buy_detail_id=b.buy_detail_id and bd.pro_id=pro.pro_id and bd.is_delete=1 and pro.is_delete=1;

建立檢視後,逆向對映到工程中,會有一個XML對映檔案,兩個POJO類(因為檢視沒有主鍵),對映之後,對檢視的操作基本和表類似,檢視僅用來展示資料。


時間選擇器使用了datePicker,效果如下:


實現方法,匯入時間選擇器控制元件所需的js檔案,程式碼中這樣寫:

採購日期:
			<input type="text" name="buyDate" class="input" onclick="javascript:WdatePicker()"/>

最後附上專案地址:

https://github.com/guodalin8/SSHERP




相關文章