最近遇到流程图追踪的一些问题,记录如下:
(1).前端用ajax请求,后端以流的方式传送一直无法展示出带轨迹的流程图
(2).项目部署到linux上后,带中文字体的带轨迹的流程图无法展示出汉字。
1.流程轨迹追踪的关键代码如下
BASE64传值方式public String getTracePicture(String processInstanceId,HttpServletResponse response) {
// 获取历史流程实例
HistoricProcessInstance processInstance = factory.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId( processInstanceId ).singleResult();
// 获取流程图
BpmnModel bpmnModel = factory.getRepositoryService().getBpmnModel( processInstance.getProcessDefinitionId() );
processEngineConfiguration = processEngine.getProcessEngineConfiguration();
Context.setProcessEngineConfiguration( (ProcessEngineConfigurationImpl)processEngineConfiguration );
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
ProcessDefinitionEntity definitionEntity = ( ProcessDefinitionEntity )factory.getRepositoryService().getProcessDefinition( processInstance.getProcessDefinitionId() );
List highLightedActivitList = factory.getHistoryService().createHistoricActivityInstanceQuery().processInstanceId( processInstanceId ).orderByTenantId().desc()
.list();
// 高亮环节id集合
List highLightedActivitis = new ArrayList();
// 高亮线路id集合
List highLightedFlows = getHighLightedFlows( definitionEntity, highLightedActivitList );
//获取当前节点高亮
if(highLightedActivitList != null && highLightedActivitList.size() > 0 ){
String activityId = highLightedActivitList.get(highLightedActivitList.size()-1).getActivityId();
highLightedActivitis.add( activityId );
}
// 中文显示的是口口口,设置字体就好了
InputStream imageStream = diagramGenerator.generateDiagram( bpmnModel, "png", highLightedActivitis, highLightedFlows, "宋体", "宋体", null, 1.0 );
byte[] data = null;
//读取图片字节数组
try{
data = new byte[imageStream.available()];
imageStream.read(data);
imageStream.close();
}
catch (IOException e){
e.printStackTrace();
}
//对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
上面是后端获取带轨迹流程图的核心方法,前端ajax请求,后端必须用Base64转码一次,然后将结果当做字符串发送给前端,才可以展示出来
前端请求方式如下:
流方式传输public String getTracePicture(String processInstanceId,HttpServletResponse response) {
// 获取历史流程实例
HistoricProcessInstance processInstance = factory.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId( processInstanceId ).singleResult();
// 获取流程图
BpmnModel bpmnModel = factory.getRepositoryService().getBpmnModel( processInstance.getProcessDefinitionId() );
processEngineConfiguration = processEngine.getProcessEngineConfiguration();
Context.setProcessEngineConfiguration( (ProcessEngineConfigurationImpl)processEngineConfiguration );
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
ProcessDefinitionEntity definitionEntity = ( ProcessDefinitionEntity )factory.getRepositoryService().getProcessDefinition( processInstance.getProcessDefinitionId() );
List highLightedActivitList = factory.getHistoryService().createHistoricActivityInstanceQuery().processInstanceId( processInstanceId ).orderByTenantId().desc()
.list();
// 高亮环节id集合
List highLightedActivitis = new ArrayList();
// 高亮线路id集合
List highLightedFlows = getHighLightedFlows( definitionEntity, highLightedActivitList );
//获取所有节点高亮
/*for( HistoricActivityInstance tempActivity : highLightedActivitList ) {
String activityId = highLightedActivitList.get(highLightedActivitList.size()-1).getActivityId(); tempActivity.getActivityId();
highLightedActivitis.add( activityId );
}*/
//获取当前节点高亮
if(highLightedActivitList != null && highLightedActivitList.size() > 0 ){
String activityId = highLightedActivitList.get(highLightedActivitList.size()-1).getActivityId();
highLightedActivitis.add( activityId );
}
// 中文显示的是口口口,设置字体就好了
InputStream imageStream = diagramGenerator.generateDiagram( bpmnModel, "png", highLightedActivitis, highLightedFlows, "宋体", "宋体", null, 1.0 );
byte[] b = new byte[1024];
int len;
try{
while( (len = imageStream.read(b,0,1024))!=-1){
response.getOutputStream().write(b,0,len);
}
}catch (IOException e){
e.printStackTrace();
}
return "success";
}
前端请求方式:
2.流程追踪在linux服务器部署不展示中文字体
(1)将windows上的simsun.ttc字体拷贝一份
(2)进入linux系统的jre目录下的lib/fonts
(3)创建fallback目录:mkdir fallback
(4)将simsun.ttc字体拷贝到fallback目录下:cp simsun.ttc fallback/
(5)进入到fallback目录:cd fallback
(6)执行命令:mkfontscale
(7)执行命令:mkfontdir
(8)重启你的应用