13-打印配置
tip
🧑💻 打印功能是MES系统中十分重要的模块,各种条码标贴都离不开打印,做过几次打印的功能,每次都有点头昏,需要写个note来捋顺下打印的各个表,及其配置怎么设置,怎么关联起来的。
1.业务逻辑
1.1 打印资源
MES系统中借助浏览器来调用打印,所以jsp页面初始化的时候就需要加载好打印资源
<script>
$(function() {
startFlow();
});
function startFlow() {
// 获取打印序列号
var ser = printUtil.getSerial();
..........业务逻辑...........
// 打印
printUtil.print(data);
// POD回调
// POD.CALLBACK.next();
}
</script>
1.2 表关系
MESEXT_PRINTER = 打印机
MESEXT_PRINTER_TEMPLATE = 打印模板
MESEXT_PRINTTP_CONF = 打印配置
MESEXT_PRINTTP_GROUP = 打印组
MESEXT_REP_CONF = REP_CODE维护
关系:
打印组->过滤器->配置过滤(REP_CODE)->获取到参数(REP_CODE)->回到打印配置(打印组字段关联)
- 需要配置打印组
- 打印组的TEMPLATE_FILTER字段,过滤器,REP_CODE查询获取RS_SQL,一般这条SQL直接关联CONF配置表的HANDLE
- CONF表能取到打印模板,打印参数PRNTP_PARAM
- 打印参数字段,REP_CODE查询,RS_SQL就是参数配置SQL,通过传参,拼接好的
详细
- 作业配置打印组
CODE,通过MESEXT_PRINTTP_GROUP的PRINTTP_GROUP_CODE字段查询 MESEXT_PRINTTP_GROUP获取TEMPLATE_FILTERMESEXT_REP_CONF的REP_CODE查询TEMPLATE_FILTER(条件)- 取出
RS_SQL,一般都是一条直接获取到MESEXT_PRINTTP_CONF表HANDLE的SQL MESEXT_PRINTTP_CONF查询,取PRNTP_PARAM作REP_CODE查询MESEXT_REP_CONF取出RS_SQLRS_SQL就是参数拼接的SQL,根据调用传入的参数即可完成拼接MESEXT_PRINTTP_CONF的PRN_TEMPLATE字段就是打印模板(业务配置)
流程
┌───────────────────┐
│ print_group_code │
└────────┬──────────┘
│
v
┌───────────────────────────────┐
│ MESEXT_PRINTTP_GROUP │
│ (get TEMPLATE_FILTER) │
└────────┬──────────────────────┘
│
v
┌───────────────────────────────────────────┐
│ MESEXT_REP_CONF │
│ (use REP_CODE = TEMPLATE_FILTER) │
│ -> get RS_SQL │
└────────┬──────────────────────────────────┘
│
v
┌────────────────────────────────────────────┐
│ Execute RS_SQL (inject runtime params) │
└────────┬───────────────────────────────────┘
│
v
┌──────────────────────────┐
│MESEXT_PRINTTP_CONF HANDLE│
└───────┬──────────────────┘
│Yes
│
v
┌──────────────────────────┐
│ MESEXT_PRINTTP_CONF │
│ (get PRN_TEMPLATE, │
│ PRNTP_PARAM) │
└────────┬─────────────────┘
│
v
┌────── ────────────────────┐
│ MESEXT_PRINTER │
│ (REP_CODE get PARMAS) │
└────────┬─────────────────┘
│
└─────────> Print Engine (模板+参数+资源)
-> print result (PSN)
2.打印调用
2.1 打印方 式一
MES内部的PrintRequest实现的打印方式,封装好,传入即可,返回需要打印的字符串,供printUtil打印
导包
<%@page import="com.tb.service.dto.PrintResponse"%>
<%@page import="com.tb.service.dto.PrintRequest"%>
<%@page import="com.tb.service.PrintServiceInterface"%>
调用
private static final PrintServiceInterface ps = Services.getService("com.tb.service", "PrintService");
// 参数
List<Map<String, String>> barcodeList = new ArrayList<Map<String, String>>();
Map p = new HashMap();
p.put("SFC", extendSfc);
p.put("OPERATION", operation);
p.put(ps.RESOURCE_BO, "ResourceBO:" + site + ","+ resource);
p.put(ps.SITE, site);
barcodeList.add(p);
// 构建打印请求
PrintRequest req = new PrintRequest();
req.setResourceRef("ResourceBO:" + site + "," + printResource);
req.setPrinterPosition(ser);
req.setPrintTemplateGroupCode(printTemplateGroup);
req.setParam(barcodeList);
PrintResponse rep = ps.print(req);
String psn = StringUtils.trim(rep.getPrintString());
if(StringUtils.isNotBlank(psn)){
o.put("psn", psn);
}
2.2 打印方式二
做过一个分页打印,A4纸打印,是通过http的请求方式去请求接口进行打印的
JSONArray jdata = new JSONArray();
jdata.add(pageObj);
PrintRequest req = new PrintRequest();
req.setParam(jdata);
req.setPrinterPosition(ser);
req.setPrintTemplateGroupCode(printTemplateGroupCode);
req.setResourceRef(resourceRef);
// 获取打印参数并执行打印
paramMap = getPrintParam(req.getPrinterPosition(), "", req);
String printResult = executePrint(paramMap, reqIp);
public String executePrint(JSONObject paramMap, String reqIp) throws ExtBusinessException {
String reqUrl = "http://"+reqIp + ":9091/remotePrint";
InputStream is = null;
BufferedReader br = null;
String result = null;
HttpClient httpClient = new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
PostMethod postMethod = new PostMethod(reqUrl);
postMethod.getParams().setParameter(org.apache.commons.httpclient.params.HttpMethodParams.SO_TIMEOUT, 10000);
try {
RequestEntity se = new StringRequestEntity(paramMap.toString() ,"application/json" ,"UTF-8");
postMethod.setRequestEntity(se);
postMethod.setRequestHeader("Content-Type","application/json; charset=utf-8");
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode != HttpStatus.SC_OK) {
throw new ExtBusinessException("调用打印服务失败,请检查是否开启打印软件:"+paramMap);
}
is = postMethod.getResponseBodyAsStream();
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String temp = null;
while ((temp = br.readLine()) != null) {
sbf.append(temp).append("\r\n");
}
result = sbf.toString();
return result;
} catch (Exception ex) {
throw new ExtBusinessException("打印失败:" + ex.getMessage());
} finally {
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
postMethod.releaseConnection();
}
}
附上打印参数获取的两个函数
// 获取打印参数
public JSONObject getPrintParam(String printerPosition, String printerType, PrintRequest request) throws BusinessException{
try{
ReportConfigurationServiceInterface repEjb = ServiceLocator.getService("com.tb.service", "ReportConfigurationService");
PrintServiceInterface ps = Services.getService("com.tb.service", "PrintService");
List<Map> printParam = new ArrayList();
Map printTemplate = new HashMap();
for(Map pr : request.getParam()){
pr.put("PRINTTP_GROUP_BO", "PrintTemplateGroup:"+request.getPrintTemplateGroupCode());
pr.put(ps.PRINTER_TYPE, printerType);
pr.put(ps.PRINTER_POSITION, printerPosition);
//获取打印模版
printTemplate = this.getPrintTemplate(request.getPrintTemplateGroupCode(),pr);
printParam = repEjb.getResult((String)printTemplate.get("PRNTP_PARAM"), pr);
if(printParam.size() == 0) throw new ExtBusinessException("打印参数为空!\n"+pr);
}
JSONObject paramMap = new JSONObject();
paramMap.put("FILE_NAME", printTemplate.get("PRN_TEMPLATE") + "");
paramMap.put("QTY_BATCH", printTemplate.get("PRN_PCS")+"");
paramMap.put("PRINT_PARAM", printParam.get(0));
return paramMap;
}catch(Exception ex){
throw new ExtBusinessException(ex.getMessage());
}
}
public Map getPrintTemplate(String templateGroupCode, Map queryParam) throws ExtBusinessException{
try{
String SQL_QUERY_PRINTTM_GROUP = "SELECT * FROM MESEXT_PRINTTP_GROUP where printtp_group_code = :PRINTTP_GROUP_CODE";
String SQL_QUERY_PRINTTM_CONF = "SELECT * FROM MESEXT_PRINTTP_CONF WHERE HANDLE = :PRINTTP_CONF_BO";
ReportConfigurationServiceInterface repEjb = ServiceLocator.getService("com.tb.service", "ReportConfigurationService");
queryParam.put("PRINTTP_GROUP_CODE", templateGroupCode);
List<Map> rs = repEjb.getResultBySQL(SQL_QUERY_PRINTTM_GROUP, queryParam);
if(rs.size() == 0) throw new RuntimeException("模板组'"+templateGroupCode+"'未定义");
Map pt = rs.get(0);
String tf = (String)pt.get("TEMPLATE_FILTER");
rs = repEjb.getResult(tf,queryParam);
if(rs.size() == 0) throw new ExtBusinessException("未找到对应的打印模板\n"+queryParam);
if(StringUtils.isBlank((String)rs.get(0).get("PRINTTP_CONF_BO"))) throw new ExtBusinessException("报表编号'"+tf+"'RS_SQL字段中的SQL返回的数据集中必须包涵'PRINTTP_CONF_BO'字段.当前的结果集"+rs);
rs = repEjb.getResultBySQL(SQL_QUERY_PRINTTM_CONF,rs.get(0));
return rs.get(0);
}catch(Exception ex){
throw new ExtBusinessException(ex.getMessage());
}
}
参考: stihl_print.jsp,stihl_printEjb.jsp
tb\activity\barcode\stihl_printEjb.jsp 参考: podAssyBindAndPrintEjb_2.jsp,podAssyBindAndPrint_2.jsp tb\activity\pod\print\podAssyBindAndPrintEjb_2.jsp