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

至此,就搞定了,如有不当之处,欢迎道友指正!

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