flowable修改流程添加节点并修改样式

适用场景: 流程图已存在,在已有的流程图基础上调整

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 连线及当前节点高亮

转载请标明出处

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li.siyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值