Activiti7工作实战笔记总结

知识传送门 》》》》》》》》》》》》》》》》》

工作已经使用Activiti工作流有一段时间了,现对一些工作注意事项进行总结。

一:IDEA 工作流插件

Activiti中的IDEA actiBPM插件真的非常烂,要非常非常小心。

  1. 有的IDEA打卡.bpmn文件时不显示属性面板,这时候需要将IDEA的主题调成白色,关闭.bpmn文件重新打开就出来了。
  2. 使用IDEA打开.bpmn文件时很多时候你什么也没改,但是文件会发生变化,会被git识别出来,一般是鼠标点击了节点,可能节点的x,y坐标发生了一丁点的改变。
  3. 工作流插件在属性面板中设置了值,再打开查看时不显示,注意此时需要使用文本编辑器去打开.bpmn文件看值还在不在,如果在就不需要额外关注。
  4. .bmpn文件中的所有的ID值最好不要使用系统生成的数字,最好为每个节点都定义一个英文标识。
  5. 也可以在eclipse中使用插件actiBPM先绘制好,然后放到IDEA中。
  6. 可以尝试其它IDEA插件: activiti-bpmn-visualizer

二:关于代码

  1. 审批接口一定要让前端给你传参数processInstanceId和taskDefKey,后端根据流程实例id去查工作流的表校验当前任务的节点是否和前端穿的参数taskDefKey是否一致,如果不一致就不允许完成任务。
  2. 审批接口一定要校验当前审批人是否在ASSIGNEE_处理人列表中,如果不在就不允许完成任务。
  3. 审批完成后最好要添加审批意见act_hi_comment。
  4. 有的业务场景是根据节点名称获取下一节点的待办人列表的,此时.bpmn文件就不需要指定代办人,而是通过程序设置。
  5. 如何快速的修改当前任务的节点,首先修改act_ru_task中的TASK_DEF_KEY修改成想要的节点和NAME_ 修改节点的名字,然后修改act_ru_execution中的ACT_ID_修改为指定节点的id值,修改这两张表即可。

三:关于工作流发布

  1. 工作中一般是手动发布工作流,避免自动全量发布带来不确定的隐患。

四:待办和已办

使用工作流就避免不了待办列表和已办列表。待办和已办列表的实现可以有以下思路:

4.1 完全通过工作流的act表来实现

  • 待办列表:可以以 act_ru_task 作为主表,去关联工作流中的其它act表。
  • 易办列表:可以以 act_hi_taskinst 作为主表,去关联工作流中的其它act表。

4.2 完全通过自定义的待办表实现

当操作工作流时也要维护自己的的待办表。

4.3 工作流表 + 自定义待办表 结合实现

  • 完全通过工作流的act表来实现:这种方式当工作流的类型比较多,又需要在同一个待办列表中展示,每种不同的待办又要展示不同的值时,SQL查询比较复杂。
  • 完全通过自定义的待办表实现:这种方式查询简单,但是需要操作工作流时需要维护,这种维护复杂。
  • 工作流表 + 自定义待办表 结合实现:这种根据实际情况根据自己的经验灵活处理。

五:错误信息纠正

在实际工作中,有很多审批流程需要填大量的信息,而经常会遇到用户在某个审批过程中内容填写错误的情况,而此时可能当前审批节点已经往下走了好几个节点,此时用户想修正当时填写的内容,又不想退回之前的节点重新填写然后再走一遍流程,应该怎么办呢?

可以再开一个菜单,专门为了修改用户填写信息用的,这个修正的功能也要走工作流审批的,可以设置工作流审批节点简单点,比如只需要一个人审批就行了。

六:根据bpmn文件获取指定节点的下一个节点

通过OutgoingFlows获取下一个节点,通过IncomingFlows获取上一个节点。

/**
* 获取指定节点的下一个节点列表
*/
@RequestMapping("/getNodeList")
public List<String> getNodeList(String processDefinitionId, String taskDefKey) {
    List<String> nodeList = new ArrayList<>();

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
    UserTask userTask = (UserTask)bpmnModel.getFlowElement(taskDefKey);
    // OutgoingFlows: 出线 sourceRef:源,targetRef:目标
    List<SequenceFlow> nextFlowList = userTask.getOutgoingFlows();
    // incomingFlows: 入线
    List<SequenceFlow> incomingFlows = userTask.getIncomingFlows();

    for (SequenceFlow sequenceFlow : nextFlowList) {
        FlowElement flowElement = bpmnModel.getFlowElement(sequenceFlow.getTargetRef());
        if (flowElement instanceof ExclusiveGateway) {
            ExclusiveGateway exclusiveGateway = (ExclusiveGateway) flowElement;
            List<SequenceFlow> gatewayOutgoingFlows = exclusiveGateway.getOutgoingFlows();
            for (SequenceFlow gatewayOutgoingFlow : gatewayOutgoingFlows) {
                FlowElement flowElement1 = bpmnModel.getFlowElement(gatewayOutgoingFlow.getTargetRef());
                nodeList.add(flowElement1.getId() + ":" + flowElement1.getName());
            }
        } else {
            nodeList.add(flowElement.getId() + ":" + flowElement.getName());
        }
    }

    return nodeList;
}

知识传送门 》》》》》》》》》》》》》》》》》

你可能感兴趣的:(intellij-idea,java,intellij,idea)