jaspersoft studio實踐 --實現網頁版打印小票——子報表(模板三)

前面的模板設計相對簡單一點,第三個模板比較複雜,這裏也記錄下來。
因爲小票下方會出現不同的值,就會導致這張小票的長度有所變化,如圖所示:
在這裏插入圖片描述
在這裏插入圖片描述
對比上面兩張圖,紅色框裏的值是可變的,因此小票的長度就會變化。這裏就設計到了子報表。(當然也可以不用子報表設計)。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

1.子報表

下面介紹下子報表的設計:
在這裏插入圖片描述
這是新建的子報表:在這裏插入圖片描述
當然要與子報表關聯起來,如下圖:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
並且也需要將放入到項目中去。
在這裏插入圖片描述
相關代碼也貼出來:在這裏插入圖片描述

/**
	 * 打印
	 * 模板三:網絡車小票。
	 * @return
	 */
	@Override
	public List<Map<String, Object>> query(String ids,String trans_doc_id,String net_weight) {
		//通過接口地址取值,urlOld:歷史數據,  urlNew:今日數據
		String urlOld = "http://api.yundasys.com:8089/shipments/queryPrintInfo?shipId="+trans_doc_id+"&type=zr";
		String urlNew = "http://api.yundasys.com:8089/shipments/queryPrintInfo?shipId="+trans_doc_id+"&type=jr";
		/*
		 * 獲得的歷史數據格式如下:
		   68800247191	紹興YD-杭州ZZ	 1
           68800247191	本車規定發車時間 2017-12-04 23:30	 2
           68800247191	 	3
           68800247191	A 昨天總重量89.96噸 裝載率104.31%= 	4
           68800247191	  重量  裝載率    車牌                     實際發車時間	5
           68800247191	 5.40噸  87.7% 滬D09688(  廂   0米/ 56立方) 03日20:17	6
           68800247191	 4.68噸  76.0% 滬BS3500(  廂   0米/ 56立方) 03日20:35	7
           …………
                        只需要中間的即可。
		 * */
		//去除前面的發車憑證,得到數組
		String[] history = getData(urlOld).split(trans_doc_id);
		String hData = "";
		String historyData = "";
		//循環遍歷
		for (String s : history) {
			//截取後面的數字。得到中間的字符串
			String h = "  " + s;
			hData = h.substring(0,h.length() - 2);
			//最後拼接,得到所有的歷史數據,並且換行
			historyData = historyData + hData.trim() + "\n";
		}
		/*
		 * 獲得的今日數據格式如下:
		   10月31日	B 你的車牌浙A7S282(合廂9.6米/56立方)	6160
                        最終要的格式:
            B 你的車牌浙A7S282(合廂9.6米/56立方)
            10月31日貨物總重量  噸 裝載率  %
		 * */
		//獲取今日數據,並切割,截取後取得中間的字符串
		String todayData = getData(urlNew).split("\\)")[0].substring(6)+")";
		//切割獲取日期
		String[] split = getData(urlNew).split("B");
		//獲取裝載重量
        //float s1 = Float.parseFloat(getData(urlNew).split("米")[0].split("廂")[1]);
		float s1 = Float.parseFloat(getData(urlNew).split("\\)")[1]);
        float p = 0;
        //當返回的【裝載重量】=0時,則【裝載率】=0;如果返回的【裝載重量】>0時,則【裝載率】=(頁面的【淨重KG】)/(返回數據的【裝載重量】)。
        if(s1 == 0){
            p = 0;
        }else{
            p = Float.parseFloat(net_weight)/s1;
        }
        //最終拼接成最後的格式
        String todayData1 = split[0].trim()+"貨物總重量 "+ s1/1000+" 噸 裝載率"+ new DecimalFormat("0.00").format(p)+"%";
		//System.out.println(historyData+"      *****"+todayData);
		//定義一個list,封裝結果集
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		// 將傳過來的id字符串轉成id數組
		String[] idArr = ids.split(",");
		for (String serial_no : idArr) {
			// 定義一個paraMap,封裝查詢參數
			Map<String, Object> paraMap = new HashMap<String, Object>();
			paraMap.put("serial_no", serial_no);
			// 定義一個data,封裝結果
			Map<String, Object> data = new HashMap<String, Object>();
			data.put("history", historyData);
			data.put("today", todayData.trim());
			data.put("today1", todayData1);
			// 查詢信息
			Map<String, Object> map = dataDao.query(paraMap);
			if (map != null) {
				Set<Entry<String, Object>> entrySet = map.entrySet();
				for (Entry<String, Object> entry : entrySet) {
					data.put(entry.getKey(), entry.getValue());
				}
			}
			//查詢是否已回皮
			String tare_status = dataDao.tareStatus(paraMap);
			data.put("tare_status", tare_status);
			list.add(data);
		}
		return list;
	}

	//日誌
	private static Logger logger=Logger.getLogger(WB_busi_gross_weightServiceImpl.class);
	
	
	/**
	 * 獲取接口數據並返回json格式字符串
	 * @param url 接口路徑
	 * @return
	 */
	public String getData(String url){

		 StringBuilder s = new StringBuilder();  
		    try {  
		        URL urlObject = new URL(url);  
		        URLConnection uc = urlObject.openConnection();  
		        BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(),"utf-8"));  
		        String inputLine = null;  
		        while ( (inputLine = in.readLine()) != null) {  
		            s.append(inputLine);  
		        }  
		        in.close();  
		    } catch (Exception e) {  
		    	logger.error(e);
		        //logger.error("網絡無法連接,取不到接口數據!"+ e.getMessage());
		        logger.error("網絡無法連接,取不到接口數據!");
		        //throw new CIPServiceException(CIPErrorCode.ERROR_RECORD_NOT_EXISTS);
		    }  
		    return s.toString();  
	}

這裏涉及到了調用接口獲取值。
報表的值應用list接收,如下:
在這裏插入圖片描述

	@Override
	public Map<String, Object> query(Map<String, Object> paraMap) {
		Map<String, Object> map = null;
		String sql = "SELECT case a.in_out_flag when 1 then '出站' when 2 then '進站' else '即裝即卸' end in_out_flag,b.com_name weight_site_name,DATE_FORMAT(a.weight_time,'%Y-%m-%d %H:%i:%s') weight_time,"
				     + " a.serial_no serial_no,b.com_name start_site_name,concat('(', a.start_site, ')') start_site,a.car_id car_id,a.trans_doc_id trans_doc_id,concat(a.gross_weight,'Kg') gross_weight,concat(ifnull(d.trailer_tare,0),'Kg') gc_pz,concat(a.net_weight,'Kg') net_weight,concat(a.weight_fee,'元') weight_fee,ifnull(a.tare_valid_date,0) tare_valid_date,"
				     + " ifnull(c.emp_name, a.operator) operator,SYSDATE(),count(t.car_id) tare_wgt_count FROM wb_busi_gross_weight a LEFT JOIN wb_base_com b ON a.weight_site = b.com_bm LEFT JOIN wb_base_emp c ON a.operator = c.emp_id RIGHT JOIN wb_busi_tare_weight t ON a.car_id = t.car_id LEFT JOIN wb_bd_doc d ON a.trans_doc_id = d.trans_doc_id WHERE a.serial_no = ? "
                     + " and t.car_id = (select car_id from wb_busi_gross_weight where serial_no = ? ) and t.op_site = (select weight_site from wb_busi_gross_weight where serial_no = ? )";
		//Object serial_no = paraMap.get("serial_no");
		try {
			map = jdbcTemplate.queryForMap(sql, paraMap.get("serial_no"),paraMap.get("serial_no"),paraMap.get("serial_no"));
			return map;
		} catch (DataAccessException e) {
			log.error(e);
			return map;
		}
	}

	/**
	 * 判斷邏輯:根據皮重表查詢是否該趟任務是否回皮。
	 *    需滿足車牌號,中轉站點,create_time從稱重時間到下一個9:30之間,以及皮重狀態爲有效(即valid_flag不等於1)
	 */
	@Override
	public String tareStatus(Map<String, Object> paraMap) {
		String result = "";
		String sql = "SELECT case when count(t.car_id) > 0 then '該趟已回皮' else '該趟未回皮' end tare_status FROM wb_busi_gross_weight a RIGHT JOIN wb_busi_tare_weight t ON a.car_id = t.car_id WHERE a.serial_no = ? "
                     + " and t.car_id = (select car_id from wb_busi_gross_weight where serial_no = ? ) and t.op_site = (select weight_site from wb_busi_gross_weight where serial_no = ? ) "
                     + " and t.create_time >= a.weight_time and t.create_time < if(DATE_FORMAT(a.weight_time,'%H:%i:%s') < '09:30:00',str_to_date(concat(DATE_FORMAT(a.weight_time,'%Y-%m-%d'),'09:30:00'),'%Y-%m-%d %H:%i:%s'),str_to_date(concat(date_add(DATE_FORMAT(a.weight_time,'%Y-%m-%d'),interval 1 day),'09:30:00'),'%Y-%m-%d %H:%i:%s')) and t.valid_flag <> 1";
		Object[] params = new Object[3];
		params[0] = paraMap.get("serial_no");
		params[1] = params[0];
		params[2] = params[0];
		try {
			result = jdbcTemplate.queryForObject(sql,String.class,params);
			return result;
		} catch (Exception e) {
			log.error(e);
			return result;
		}
	}

sql語句:

SELECT
  //case when count(t.car_id) > 0 then '該趟已回皮' else '該趟未回皮' end tare_status,
  case a.in_out_flag when 1 then '出站' when 2 then '進站' else '即裝即卸' end in_out_flag,
	b.com_name weight_site_name,
	DATE_FORMAT(
		a.weight_time,
		'%Y-%m-%d %H:%i:%s'
	) weight_time,
	a.serial_no serial_no,
	b.com_name start_site_name,
	concat('(', a.start_site, ')') start_site,
	a.car_id car_id,
	a.trans_doc_id trans_doc_id,
  concat(a.gross_weight,'Kg') gross_weight,
  concat(ifnull(d.trailer_tare,0),'Kg') gc_pz,
  concat(a.net_weight,'Kg') net_weight,
  concat(a.weight_fee,'元') weight_fee,
  ifnull(a.tare_valid_date,0) tare_valid_date,
	ifnull(c.emp_name, '') operator,
	SYSDATE(),
  count(t.car_id) tare_wgt_count
FROM
	wb_busi_gross_weight a
LEFT JOIN wb_base_com b ON a.weight_site = b.com_bm
LEFT JOIN wb_base_emp c ON a.operator = c.emp_id
RIGHT JOIN wb_busi_tare_weight t ON a.car_id = t.car_id
LEFT JOIN wb_bd_doc d ON a.trans_doc_id = d.trans_doc_id
WHERE
	a.serial_no = '51000117051603161543'
and t.car_id = (select car_id from wb_busi_gross_weight where serial_no = '51000117051603161543') 
and t.op_site = (select weight_site from wb_busi_gross_weight where serial_no = '51000117051603161543')

SELECT
  case when count(t.car_id) > 0 then '該趟已回皮' else '該趟未回皮' end tare_status
FROM
	wb_busi_gross_weight a
left JOIN wb_busi_tare_weight t ON a.car_id = t.car_id
WHERE
	a.serial_no = '51000117051603161543'
and t.car_id = (select car_id from wb_busi_gross_weight where serial_no = '51000117051603161543') 
and t.op_site = (select weight_site from wb_busi_gross_weight where serial_no = '51000117051603161543')
and t.create_time >= a.weight_time 
and t.create_time < if(DATE_FORMAT(a.weight_time,'%H:%i:%s') < '09:30:00',str_to_date(concat(DATE_FORMAT(a.weight_time,'%Y-%m-%d'),'09:30:00'),'%Y-%m-%d %H:%i:%s'),
str_to_date(concat(date_add(DATE_FORMAT(a.weight_time,'%Y-%m-%d'),interval 1 day),'09:30:00'),'%Y-%m-%d %H:%i:%s'))
and t.valid_flag <> 1

至此,就搞定了,如有不當之處,歡迎道友指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章