知识传送门 》》》》》》》》》》》》》》》》》
工作已经使用Activiti工作流有一段时间了,现对一些工作注意事项进行总结。
一:IDEA 工作流插件
Activiti中的IDEA actiBPM插件真的非常烂,要非常非常小心。
- 有的IDEA打卡.bpmn文件时不显示属性面板,这时候需要将IDEA的主题调成白色,关闭.bpmn文件重新打开就出来了。
- 使用IDEA打开.bpmn文件时很多时候你什么也没改,但是文件会发生变化,会被git识别出来,一般是鼠标点击了节点,可能节点的x,y坐标发生了一丁点的改变。
- 工作流插件在属性面板中设置了值,再打开查看时不显示,注意此时需要使用文本编辑器去打开.bpmn文件看值还在不在,如果在就不需要额外关注。
- .bmpn文件中的所有的ID值最好不要使用系统生成的数字,最好为每个节点都定义一个英文标识。
- 也可以在eclipse中使用插件actiBPM先绘制好,然后放到IDEA中。
- 可以尝试其它IDEA插件: activiti-bpmn-visualizer
二:关于代码
- 审批接口一定要让前端给你传参数processInstanceId和taskDefKey,后端根据流程实例id去查工作流的表校验当前任务的节点是否和前端穿的参数taskDefKey是否一致,如果不一致就不允许完成任务。
- 审批接口一定要校验当前审批人是否在ASSIGNEE_处理人列表中,如果不在就不允许完成任务。
- 审批完成后最好要添加审批意见act_hi_comment。
- 有的业务场景是根据节点名称获取下一节点的待办人列表的,此时.bpmn文件就不需要指定代办人,而是通过程序设置。
- 如何快速的修改当前任务的节点,首先修改act_ru_task中的TASK_DEF_KEY修改成想要的节点和NAME_ 修改节点的名字,然后修改act_ru_execution中的ACT_ID_修改为指定节点的id值,修改这两张表即可。
- 审批同意或者不同意变量一定要使用局部变量。
- 监听器是和审批方法是在同一个事务中的。
三:关于工作流发布
- 工作中一般是手动发布工作流,避免自动全量发布带来不确定的隐患。
四:待办和已办
使用工作流就避免不了待办列表和已办列表。待办和已办列表的实现可以有以下思路:
4.1 完全通过工作流的act表来实现
- 待办列表:可以以 act_ru_task 作为主表,去关联工作流中的其它act表。
- 易办列表:可以以 act_hi_taskinst 作为主表,去关联工作流中的其它act表。
4.2 完全通过自定义的待办表实现
当操作工作流时也要维护自己的的待办表。
4.3 工作流表 + 自定义待办表 结合实现
- 完全通过工作流的act表来实现:这种方式当工作流的类型比较多,又需要在同一个待办列表中展示,每种不同的待办又要展示不同的值时,SQL查询比较复杂。
- 完全通过自定义的待办表实现:这种方式查询简单,但是需要操作工作流时需要维护,这种维护复杂。
- 工作流表 + 自定义待办表 结合实现:这种根据实际情况根据自己的经验灵活处理。
使用自己的待办列表一方面所有待办需要搜索的字段都可以存储到自己的表,这样搜索条件只涉及到这一样表即可,
另一方面是自定义的待办表可以将自定义的待办放在幕前,真正的工作流表act_ru_task隐藏在幕后,这样玩比较灵活,可以做一些特殊的功能,比如 流程不结束,但此时就不想让用户看到,等到合适的时机再让用户看到审批等。
五:错误信息纠正
在实际工作中,有很多审批流程需要填大量的信息,而经常会遇到用户在某个审批过程中内容填写错误的情况,而此时可能当前审批节点已经往下走了好几个节点,此时用户想修正当时填写的内容,又不想退回之前的节点重新填写然后再走一遍流程,应该怎么办呢?
可以再开一个菜单,专门为了修改用户填写信息用的,这个修正的功能也要走工作流审批的,可以设置工作流审批节点简单点,比如只需要一个人审批就行了。
六:根据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;
}
知识传送门 》》》》》》》》》》》》》》》》》
轻阅读
>30-45岁这个年龄段非常重要,一般都会经历人生中最重要的转折点,这个转折对人的一生非常重要。 如果此时没有在各种考验和冲突中觉醒和开窍的话,那么人生下半场将会越来越艰难。 中年迷茫与年少时的迷茫不同,年少时的迷茫是面对多种选择不知道该怎么选才好,而中年转折时期迷茫,近乎绝望,是在已经走出一大半人生路上,在这个年纪,该经历的该遇见的多多少少都已经发生了,很多人只是背上了各种人性的习性和负担,现在的认知和过去的选择不断发生着冲突,很多事情可能明显知道以前选是错了,明显感觉到自己快要拖不动了,却又深陷舍不得、放不下或不能改变的各种矛盾之中。 如果此时再发生一点什么事,观念就变的一蹶不振,一个人一旦被卡在这个转折期,很可能他的下半生就再也走不出来了。 那么要怎么做才能够在这个重要的人生转折期顺利破局呢?在此提供一些见解
要学会直观,敢于取舍,人过中年,再不爱学习的人都要有意思的去通过读书或多接触一些拿到过结果的人来升级自己,要学会独立思考,走出原生家庭和旧圈子,旧观念,尝试着去听听和理解一些以前没听过甚至排斥的其他思想和观念,此时要停下来,一点点回顾自己的过去,哪些地方可以做加法,哪些地方即使再痛也必须要做减法,一定要想清楚自己未来到底要什么,然后斩立决,不余遗力的为自己想要的一切付诸行动。
加强信念,相信自己,大部分焦虑都是因为钱不够造成的。
学会孤独,享受孤独,所有的关系都会随着你的认知不断变化而变化,好的坏的都会过去,所有的人事都在变化,没有什么是一成不变的。