前面的模板設計相對簡單一點,第三個模板比較複雜,這裏也記錄下來。
因爲小票下方會出現不同的值,就會導致這張小票的長度有所變化,如圖所示:
對比上面兩張圖,紅色框裏的值是可變的,因此小票的長度就會變化。這裏就設計到了子報表。(當然也可以不用子報表設計)。
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
至此,就搞定了,如有不當之處,歡迎道友指正!