Skip to main content

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)->回到打印配置(打印组字段关联)

  1. 需要配置打印组
  2. 打印组的TEMPLATE_FILTER字段,过滤器,REP_CODE查询获取RS_SQL,一般这条SQL直接关联CONF配置表的HANDLE
  3. CONF表能取到打印模板,打印参数PRNTP_PARAM
  4. 打印参数字段,REP_CODE查询,RS_SQL就是参数配置SQL,通过传参,拼接好的

详细

  1. 作业配置打印组CODE,通过MESEXT_PRINTTP_GROUPPRINTTP_GROUP_CODE字段查询
  2. MESEXT_PRINTTP_GROUP获取TEMPLATE_FILTER
  3. MESEXT_REP_CONFREP_CODE查询TEMPLATE_FILTER(条件)
  4. 取出RS_SQL,一般都是一条直接获取到MESEXT_PRINTTP_CONFHANDLE的SQL
  5. MESEXT_PRINTTP_CONF查询,取PRNTP_PARAMREP_CODE查询MESEXT_REP_CONF取出RS_SQL
  6. RS_SQL就是参数拼接的SQL,根据调用传入的参数即可完成拼接
  7. MESEXT_PRINTTP_CONFPRN_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