1. 程式人生 > >專案中應用Echarts

專案中應用Echarts

  首先介紹專案背景:

   把如下圖所示,把這個做成表格然後打印出來。

  

點選顯示圖表出現如圖以下的介面:


1、首先匯入echarts所需要的js檔案,css檔案。


將echarts所需要的東西考進來(圖上的js檔案並不是所有的都需要。)

2、引入以下檔案

<title>藥品統計</title>
<!--ico圖示-->
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> -->

<%@ include file="/common/common_css.jsp"%>
<%@ include file="/common/common_js.jsp"%>

<script src="${baseurl}/business/analyze/js/echarts.js"></script>
<!--載入主題-->
<script src="${baseurl}/business/analyze/js/zhuti/macarons.js"></script>
<script src="${baseurl}/business/analyze/js/codemirror.js"></script>

3、js程式碼:

<script type="text/javascript">
	function query(){
  
	// Step:3 conifg ECharts's path, link to echarts.js from current page.
	// Step:3 為模組載入器配置echarts的路徑,從當前頁面連結到echarts.js,定義所需圖表路徑
	require.config({
		paths: {
			echarts: '/business/analyze/js'
		}
	}); 
	// Step:4 require echarts and use it in the callback.
	// Step:4 動態載入echarts然後在回撥函式中開始使用,注意保持按需載入結構定義圖表路徑
	require(
		[
			'echarts',
			'echarts/chart/bar',
			'echarts/chart/line'
		],
		function(ec) {
			//--- 宣告一個折柱 ---
			myChart = ec.init(document.getElementById('main'), 'macarons');
			initData();//載入資料
			// --- 地圖 ---
			/* 讀取資料時載入效果 */
			myChart.showLoading();
			initData();//載入資料
			
		}
	);
}
	/* 載入資料ajax */
	function initData(){
		
		//表單引數序列化
		var params = $("#drugyzreaqueryForm").serializeJson();
		//重新整理datagride
		$("#drugyzrealist").datagrid('reload',params);
		
		$.ajax({
	         type : "post",
	         async : false,            //非同步請求(同步請求將會鎖住瀏覽器,使用者其他操作必須等待請求完成才可以執行)
	         url : "${baseurl}/analyze/ajaxDrugyzrea_bar.action",    //請求傳送到TestServlet處
	         data : params,
	         dataType : "json",        //返回資料形式為json
	         success : function(result) {
	             //請求成功時執行該函式內容,result即為伺服器返回的json物件 
	             //清空畫布,防止快取---------------------------------
	         	myChart.clear();
	             
	           // myChart.setOption({});//初始化資料
	            myChart.setOption(result);
	           
	            myChart.hideLoading();
	          //如果不清空,圖形資料將不會更改
	        },
	         error : function(errorMsg) {
	             //請求失敗時執行該函式
	         alert("圖表請求資料失敗!");
	         }
	    })
	}
	
</script>

4、表現層程式碼:

	/** 
	 * 該方法用於ajax獲取藥品統計資料的option
	 *  
	 * @throws IOException 
	 */
	public void ajaxDrugyzrea_bar() throws IOException {
		
		// 建立資料承載物件
		GsonOption option = new GsonOption();
		// 初始化
		List<Object> xAxisList = new ArrayList<>();
		List<Object> barList = new ArrayList<>();
		List<Object> barList2 = new ArrayList<>();

		// ****準備資料,寫死了二十條
		List<Yybusiness> ypxxList = yybusinessService.list_drugyzrea(yybusinessVo.getYybusinessQueryCustom(), 0, 20);

		if (ypxxList!=null) {
			
			for (Yybusiness yybusiness : ypxxList) {
				xAxisList.add(yybusiness.getYpxx().getMc());
				barList.add(yybusiness.getCgl());
				BigDecimal cgjeBig = new BigDecimal(yybusiness.getCgje());
				cgjeBig = cgjeBig.setScale(2, BigDecimal.ROUND_HALF_UP);
				barList2.add(cgjeBig.doubleValue());
			}
	
			// ******設定基本屬性*******start
			// 設定標題和子標題(子標題即主標題下的小文字說明)
			option.title().text("藥品採購資料統計").subtext("一組");
			// 設定滑鼠移入資料柱中提示框,可自行設定
			option.tooltip().trigger(Trigger.axis);
			// 新增圖示圖例,每個圖示僅可有一個圖例(就是統計圖上方的統計說明)
			option.legend("採購量", "採購金額");
	
			option.toolbox().show(true).feature(Tool.mark, Tool.dataView, new MagicType(Magic.line, Magic.bar).show(true),
					Tool.restore, Tool.saveAsImage);
			// 設定calculable值,該值是什麼?不知道
			option.calculable(true);
	
			option.xAxis(new CategoryAxis().data(xAxisList.toArray()));
			// yAxis:即y軸需要顯示的資料,簡單來說就是資料的數值,如果直接new ValueAxis()
			// 應該是根據資料的需求進行自動顯示
			option.yAxis(new ValueAxis());
	
			Bar bar = new Bar("採購量");
			// data:就是該bar的資料,需要和上面的城鎮名稱進行對應
	
			bar.data(barList.toArray());
			// 設定標註,markPoint是一個標註物件,支援鏈式程式設計,可以直接設定值,很多特效可以在這裡設定
			bar.markPoint().data(new PointData().type(MarkType.max).name("最大值"),
					new PointData().type(MarkType.min).name("最小值"));
			// 設定標線,也就是橫穿資料柱的一條線,代表的是平均值,詳情請看MarkType物件
			bar.markLine().data(new PointData().type(MarkType.average).name("平均值"));
	
			Bar bar2 = new Bar("採購金額");
			// data:就是該bar的資料,需要和上面的城鎮名稱進行對應
	
			bar2.data(barList2.toArray());
			// 設定標註,markPoint是一個標註物件,支援鏈式程式設計,可以直接設定值,很多特效可以在這裡設定
			bar2.markPoint().data(new PointData().type(MarkType.max).name("最大值"),
					new PointData().type(MarkType.min).name("最小值"));
			// 設定標線,也就是橫穿資料柱的一條線,代表的是平均值,詳情請看MarkType物件
			bar2.markLine().data(new PointData().type(MarkType.average).name("平均值"));
	
			option.series(bar, bar2);

		}else {
			option.setNoDataLoadingOption(new NoDataLoadingOption().text("無資料"));
		}
		getResponse().setContentType("text/html;charset=utf-8");
		getResponse().getWriter().write(option.toString());

	}

5、業務層程式碼:

@Override
	// 查詢所有藥品採購詳情統計
	public List<Yybusiness> list_drugyzrea(YybusinessQueryCustom yybusinessQueryCustom, Integer firstResult,
			Integer maxResults) {
		// 防止空指標異常
		if (yybusinessQueryCustom == null) {
			yybusinessQueryCustom = new YybusinessQueryCustom();
			yybusinessQueryCustom.setStartDate("");
			yybusinessQueryCustom.setEndDate("");
		}
		// 處理分頁
		// 在shiro中獲得使用者
		ActiveUser activeUser = (ActiveUser) SecurityUtils.getSubject().getPrincipal();

		// 獲取用的分組資訊 判斷是供應商還是衛生院還是,衛生室
		String groupid = activeUser.getGroupid();

		if (yybusinessQueryCustom != null && (groupid.equals("s0101") || groupid.equals("s0102"))) {

			// 通過id查詢到對應的單位資訊
			DwWsy dwWsy = dwWsyDao.findById(activeUser.getSysid());
			// 獲取到單位的資訊 ,然後通過單位資訊獲取到地區對應的id
			String sysWsyId = dwWsy.getId();
			yybusinessQueryCustom.getDwWsy().setId(sysWsyId);

		} else {
			ResultUtil.throwExcepionResult("對不起,你沒有訪問許可權");
		}
		// 此map是從資料庫查詢出來的值,在Service層轉換為物件後返回Action
		List<Map<String, Object>> reslutMap = yybusinessDao.list_drugyzrea(yybusinessQueryCustom, firstResult,
				maxResults);

		List<Yybusiness> reslutList = new ArrayList<>();
		for (Map<String, Object> map : reslutMap) {

			// 處理
			Yybusiness yybusiness = new Yybusiness();
			// 流水號
			Ypxx ypxx = new Ypxx();
			ypxx.setBm((String) map.get("BM"));
			// 藥品名稱
			ypxx.setMc((String) map.get("MC"));
			yybusiness.setYpxx(ypxx);
			// 採購量
			Number cgl = (Number) map.get("CGL");
			yybusiness.setCgl(cgl.intValue());
			// 採購金額
			Number cgje = (Number) map.get("CGJE");
			yybusiness.setCgje(cgje.floatValue());
			reslutList.add(yybusiness);
		}
		return reslutList;
	}

6、Dao層程式碼:

@Override
	// 查詢所有藥品採購資訊
	public List<Map<String, Object>> list_drugyzrea(YybusinessQuery yybusinessQuery, Integer firstResult,
			Integer maxResults) {

		Session session = this.getSessionFactory().getCurrentSession();
		StringBuilder sqlBuilder = new StringBuilder();

		sqlBuilder.append("select xx.BM,xx.MC,sum(xx.cgl) cgl,sum(xx.cgje) cgje   ");
		sqlBuilder.append("				from (select yy.*,yx.*  ");
		sqlBuilder.append("	from YYBUSINESS yy,YPXX yx,(select ws.id ");
		sqlBuilder.append(
				"from DW_WSS ws,(select * from DW_WSY wy   ");
		if (yybusinessQuery.getDwWsy() != null) {
			sqlBuilder.append("	where id = '"+ yybusinessQuery.getDwWsy().getId() + "'   ");
		}

		sqlBuilder.append("	) za  ");
		sqlBuilder.append("	where ws.dq like za.dq||'%') wss ");
		sqlBuilder.append("							where yy.WSS_ID in(wss.id)  ");
		sqlBuilder.append("							and YX.ID = YY.YPXX_ID  ");
		// 及訂單受理完成的---------------------------------------
		sqlBuilder.append(" and yy.cgzt = '01102' ");
		// ---------------------------------------------------------------------
		sqlBuilder.append("							) xx  ");
		sqlBuilder.append("   where 1=1  ");

		// 拼湊時間條件, 有四種情況 開始時間輸入,結束時間未輸入;開始時間未輸入,結束時間輸入 ;兩個都輸入;兩個都沒有輸入.
		if (yybusinessQuery != null) {
			if (yybusinessQuery.getStartDate() != null && !yybusinessQuery.getStartDate().equals("")) {
				// 如果兩個都輸入了
				if (!yybusinessQuery.getEndDate().equals("")) {
					sqlBuilder.append("  and to_char(tjsj,'yyyy-mm-dd') between '" + yybusinessQuery.getStartDate()
							+ "'  and   '" + yybusinessQuery.getEndDate() + "'   ");
				} else {// 說明沒有輸入結束時間
					sqlBuilder.append("  and to_char(tjsj,'yyyy-mm-dd') >= '" + yybusinessQuery.getStartDate() + "'");
				}
			} else {// 說明 沒有輸入開始時間
					// 如果輸入了結束時間
				if (yybusinessQuery.getEndDate() != null && !yybusinessQuery.getEndDate().equals("")) {
					sqlBuilder.append("  and to_char(tjsj,'yyyy-mm-dd') <= '" + yybusinessQuery.getEndDate() + "'");
				}

			}

		}
		sqlBuilder.append("    GROUP BY xx.bm,xx.MC order by cgje desc  ");

		List<Map<String, Object>> list = session.createSQLQuery(sqlBuilder.toString()).setFirstResult(firstResult)
				.setMaxResults(maxResults).setResultTransformer(Transformers.aliasToBean(HashMap.class)).list();

		DetachedCriteria dc = DetachedCriteria.forClass(Yybusiness.class);
		return list;
	}

小結:

     雖然業務很複雜,Echarts也是剛接觸的,但是最後還是研究通了。看看程式碼量就知道含量了。大笑