适用场景: 流程图已存在,在已有的流程图基础上调整
1.给流程添加节点代码:
Process process = bpmnModel.getMainProcess();
//添加提交人节点 方便驳回
UserTask applytask = new UserTask();
applytask.setId("applytask");
applytask.setAssignee("${applyAccount}");
applytask.setName("提交人");
process.addFlowElement(applytask);
//获取开始节点 信息
StartEvent start = process.findFlowElementsOfType(StartEvent.class).get(0);
//修改连线信息 将 提交人节点 连到 下个节点
process.findFlowElementsOfType(SequenceFlow.class).forEach(sequenceFlow -> {
if (sequenceFlow.getSourceRef().equals(start.getId())) {
sequenceFlow.setSourceRef(applytask.getId()); }
});
//修改连线信息 将 开始节点 连到 提交人节点
SequenceFlow startToApplyFlow = new SequenceFlow(start.getId(), applytask.getId());
startToApplyFlow.setId(start.getId()+"To"+applytask.getId());
//添加连线信息
process.addFlowElement(startToApplyFlow);
但在添加完节点 以及连线信息 之后出现错误
"Error while generating process diagram, image will not be stored in repository"
在网上寻找许久,没有找见 flowable生成图片的方法, 只好自己动手了
2.添加节点及连线样式 并平移所有节点及连线
//设置提交人节点 样式
GraphicInfo applyGraphic = null;
Map<String, GraphicInfo> locationMap = bpmnModel.getLocationMap();
//平移X轴
int panX = 155;
for (String key : locationMap.keySet()) {
if (key.equals(start.getId())) {
GraphicInfo info = locationMap.get(key);
applyGraphic = new GraphicInfo(info.getX() + 80, info.getY() - 12, 55.0, 105.0);
}else {
locationMap.get(key).setX(locationMap.get(key).getX() + panX);
}
}
if (applyGraphic != null) {
//手动添加 提交人节点 样式
locationMap.put(applytask.getId(), applyGraphic);
//手动 重置连线信息样式
bpmnModel.getFlowLocationMap().forEach((key, flowLocations) -> flowLocations.forEach(graphicInfo -> graphicInfo.setX(graphicInfo.getX() + panX)));
//添加开始节点到提交人 连线信息 样式
List<GraphicInfo> graphicInfos = new ArrayList<>();
GraphicInfo sourceInfo = locationMap.get(startToApplyFlow.getSourceRef());
graphicInfos.add(new GraphicInfo(sourceInfo.getX() + sourceInfo.getWidth(), sourceInfo.getY() + (sourceInfo.getHeight() / 2)));
GraphicInfo targetInfo = locationMap.get(startToApplyFlow.getTargetRef());
graphicInfos.add(new GraphicInfo(targetInfo.getX() + targetInfo.getWidth(), targetInfo.getY() + (targetInfo.getHeight() / 2)));
bpmnModel.getFlowLocationMap().put(startToApplyFlow.getId(), graphicInfos);
}
以下代码 是项目中用到的, 在流程发布(部署)的时候 给所有流程 添加一个 提交人的节点 方便驳回
public void initProcessNode(BpmnModel bpmnModel, String formId) {
// formMap 为流程参数 不需要可以去掉
Map<String, List<FormProperty>> formMap = formDesignService.getFormProperties(formId);
Process process = bpmnModel.getMainProcess();
//修改所有审批节点的form
process.findFlowElementsOfType(UserTask.class).forEach(userTask -> {
userTask.setFormKey("approve.form");
// 添加 流程中 需要编辑的 节点参数
if (formMap.containsKey(userTask.getId())){
userTask.setFormProperties(formMap.get(userTask.getId()));
}
});
//添加提交人节点 方便驳回
UserTask applytask = new UserTask();
applytask.setId("applytask");
applytask.setFormKey("restart.form");
applytask.setAssignee("${applyAccount}");
applytask.setName("提交人");
applytask.setFormProperties(formMap.get("applyFormProper"));
//添加审批节点
process.addFlowElement(applytask);
//修改开始节点 信息
StartEvent start = process.findFlowElementsOfType(StartEvent.class).get(0);
start.setFormKey("request.form");
start.setFormProperties(formMap.get("startFormProper"));
//修改连线信息 将 提交人节点 连到 下个节点
process.findFlowElementsOfType(SequenceFlow.class).forEach(sequenceFlow -> {
if (sequenceFlow.getSourceRef().equals(start.getId())) {
sequenceFlow.setSourceRef(applytask.getId()); }
});
//修改连线信息 将 开始节点 连到 提交人节点
SequenceFlow startToApplyFlow = new SequenceFlow(start.getId(), applytask.getId());
startToApplyFlow.setId(start.getId()+"To"+applytask.getId());
process.addFlowElement(startToApplyFlow);
//设置提交人节点 样式
GraphicInfo applyGraphic = null;
Map<String, GraphicInfo> locationMap = bpmnModel.getLocationMap();
//平移X轴
int panX = 155;
for (String key : locationMap.keySet()) {
if (key.equals(start.getId())) {
GraphicInfo info = locationMap.get(key);
applyGraphic = new GraphicInfo(info.getX() + 80, info.getY() - 12, 55.0, 105.0);
}else {
locationMap.get(key).setX(locationMap.get(key).getX() + panX);
}
}
if (applyGraphic != null) {
//手动添加 提交人节点 样式
locationMap.put(applytask.getId(), applyGraphic);
//手动 重置连线信息样式
bpmnModel.getFlowLocationMap().forEach((key, flowLocations) -> flowLocations.forEach(graphicInfo -> graphicInfo.setX(graphicInfo.getX() + panX)));
//添加开始节点到提交人 连线信息 样式
List<GraphicInfo> graphicInfos = new ArrayList<>();
GraphicInfo sourceInfo = locationMap.get(startToApplyFlow.getSourceRef());
graphicInfos.add(new GraphicInfo(sourceInfo.getX() + sourceInfo.getWidth(), sourceInfo.getY() + (sourceInfo.getHeight() / 2)));
GraphicInfo targetInfo = locationMap.get(startToApplyFlow.getTargetRef());
graphicInfos.add(new GraphicInfo(targetInfo.getX() + targetInfo.getWidth(), targetInfo.getY() + (targetInfo.getHeight() / 2)));
bpmnModel.getFlowLocationMap().put(startToApplyFlow.getId(), graphicInfos);
}
}
3.成功显示图片信息
如果你的连线信息 不显示的话
在生成图片的时候 设置drawSequenceFlowNameWithNoLabelDI为true
//定义流程画布生成器
ProcessEngineConfiguration engConf = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator processDiagramGenerator = engConf.getProcessDiagramGenerator();
deploymentBuilder.addInputStream(model.getKey() + ".png", processDiagramGenerator.generatePngDiagram(bpmnModel,true));
flowable 连线及当前节点高亮
转载请标明出处