网站首页 > java教程 正文
???流程图工具类ActivitiUtils
package com.mypro.activiti.utils;
import java.util.ArrayList;
import java.util.List;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
/**
<p>Activiti工作流工具类</p>
@author FRH
@time 2018年12月10日上午11:26:02
@version 1.0
*/
public class ActivitiUtils {
/**
<p>获取流程走过的线</p>
@param bpmnModel 流程对象模型
@param processDefinitionEntity 流程定义对象
@param historicActivityInstances 历史流程已经执行的节点,并已经按执行的先后顺序排序
@return List<String> 流程走过的线
@author FRH
@time 2018年12月10日上午11:26:19
@version 1.0
*/
public static List<String> getHighLightedFlows(BpmnModel bpmnModel, ProcessDefinitionEntity processDefinitionEntity, List<HistoricActivityInstance> historicActivityInstances) {
// 用以保存高亮的线flowId
List<String> highFlows = new ArrayList<String>();
if(historicActivityInstances == null || historicActivityInstances.size() == 0) return highFlows;
// 遍历历史节点
for (int i = 0; i < historicActivityInstances.size() - 1; i++) {
// 取出已执行的节点
HistoricActivityInstance activityImpl_ = historicActivityInstances.get(i);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 用以保存后续开始时间相同的节点</span></span></span></span>
List<FlowNode> sameStartTimeNodes = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> ArrayList<FlowNode>();
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取下一个节点(用于连线)</span></span></span></span>
FlowNode sameActivityImpl = getNextFlowNode(bpmnModel, historicActivityInstances, i, activityImpl_);
// FlowNode sameActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i + 1).getActivityId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 将后面第一个节点放在时间相同节点的集合里</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(sameActivityImpl != <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) sameStartTimeNodes.add(sameActivityImpl);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 循环后面节点,看是否有与此后继节点开始时间相同的节点,有则添加到后继节点集合</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> (<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> j = i + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; j < historicActivityInstances.size() - <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; j++) {
HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 后续第一个节点</span></span></span></span>
HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 后续第二个节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span> (activityImpl1.getStartTime().getTime() != activityImpl2.getStartTime().getTime()) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">break</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 如果第一个节点和第二个节点开始时间相同保存</span></span></span></span>
FlowNode sameActivityImpl2 = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 得到节点定义的详细信息</span></span></span></span>
FlowNode activityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i).getActivityId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 取出节点的所有出去的线,对所有的线进行遍历</span></span></span></span>
List<SequenceFlow> pvmTransitions = activityImpl.getOutgoingFlows();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> (SequenceFlow pvmTransition : pvmTransitions) {
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取节点</span></span></span></span>
FlowNode pvmActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(pvmTransition.getTargetRef());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 不是后继节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(!sameStartTimeNodes.contains(pvmActivityImpl)) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">continue</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示</span></span></span></span>
highFlows.add(pvmTransition.getId());
}
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//返回高亮的线</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> highFlows;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/**
* <p>获取下一个节点信息</p>
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> bpmnModel 流程模型
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> historicActivityInstances 历史节点
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> i 当前已经遍历到的历史节点索引(找下一个节点从此节点后)
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> activityImpl_ 当前遍历到的历史节点实例
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@return</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> FlowNode 下一个节点信息
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@author</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> FRH
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@time</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 2018年12月10日上午11:26:55
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@version</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 1.0
*/</span></span></span></span>
<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> FlowNode </span></span></span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getNextFlowNode</span></span></span></span></span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances, </span></span></span></span></span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword">int</span></span></span></span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"> i, HistoricActivityInstance activityImpl_)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span></span>{
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 保存后一个节点</span></span></span></span>
FlowNode sameActivityImpl = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 如果当前节点不是用户任务节点,则取排序的下一个节点为后续节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(!<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"userTask"</span></span></span></span>.equals(activityImpl_.getActivityType())) {
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 是最后一个节点,没有下一个节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(i == historicActivityInstances.size()) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> sameActivityImpl;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 不是最后一个节点,取下一个节点为后继节点</span></span></span></span>
sameActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>).getActivityId());<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 找到紧跟在后面的一个节点</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 返回</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> sameActivityImpl;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 遍历后续节点,获取当前节点后续节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> (<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> k = i + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; k <= historicActivityInstances.size() - <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; k++) {
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 后续节点</span></span></span></span>
HistoricActivityInstance activityImp2_ = historicActivityInstances.get(k);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 都是userTask,且主节点与后续节点的开始时间相同,说明不是真实的后继节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"userTask"</span></span></span></span>.equals(activityImp2_.getActivityType()) && activityImpl_.getStartTime().getTime() == activityImp2_.getStartTime().getTime()) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">continue</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 找到紧跟在后面的一个节点</span></span></span></span>
sameActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(k).getActivityId());
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">break</span></span></span></span>;
}
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> sameActivityImpl;
}
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 用以保存后续开始时间相同的节点</span></span></span></span>
List<FlowNode> sameStartTimeNodes = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> ArrayList<FlowNode>();
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取下一个节点(用于连线)</span></span></span></span>
FlowNode sameActivityImpl = getNextFlowNode(bpmnModel, historicActivityInstances, i, activityImpl_);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 将后面第一个节点放在时间相同节点的集合里</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(sameActivityImpl != <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) sameStartTimeNodes.add(sameActivityImpl);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 循环后面节点,看是否有与此后继节点开始时间相同的节点,有则添加到后继节点集合</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> (<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> j = i + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; j < historicActivityInstances.size() - <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; j++) {
HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 后续第一个节点</span></span></span></span>
HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 后续第二个节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span> (activityImpl1.getStartTime().getTime() != activityImpl2.getStartTime().getTime()) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">break</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 如果第一个节点和第二个节点开始时间相同保存</span></span></span></span>
FlowNode sameActivityImpl2 = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 得到节点定义的详细信息</span></span></span></span>
FlowNode activityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i).getActivityId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 取出节点的所有出去的线,对所有的线进行遍历</span></span></span></span>
List<SequenceFlow> pvmTransitions = activityImpl.getOutgoingFlows();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> (SequenceFlow pvmTransition : pvmTransitions) {
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取节点</span></span></span></span>
FlowNode pvmActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(pvmTransition.getTargetRef());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 不是后继节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(!sameStartTimeNodes.contains(pvmActivityImpl)) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">continue</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示</span></span></span></span>
highFlows.add(pvmTransition.getId());
}
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//返回高亮的线</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> highFlows;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/**
* <p>获取下一个节点信息</p>
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> bpmnModel 流程模型
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> historicActivityInstances 历史节点
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> i 当前已经遍历到的历史节点索引(找下一个节点从此节点后)
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@param</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> activityImpl_ 当前遍历到的历史节点实例
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@return</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> FlowNode 下一个节点信息
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@author</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> FRH
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@time</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 2018年12月10日上午11:26:55
* </span></span></span><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag"><span class="hljs-comment"><span class="hljs-doctag">@version</span></span></span></span></span></span></span><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"> 1.0
*/</span></span></span></span>
<span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">private</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> FlowNode </span></span></span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getNextFlowNode</span></span></span></span></span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances, </span></span></span></span></span></span><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-params"><span class="hljs-keyword">int</span></span></span></span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"> i, HistoricActivityInstance activityImpl_)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span></span>{
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 保存后一个节点</span></span></span></span>
FlowNode sameActivityImpl = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 如果当前节点不是用户任务节点,则取排序的下一个节点为后续节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(!<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"userTask"</span></span></span></span>.equals(activityImpl_.getActivityType())) {
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 是最后一个节点,没有下一个节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(i == historicActivityInstances.size()) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> sameActivityImpl;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 不是最后一个节点,取下一个节点为后继节点</span></span></span></span>
sameActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>).getActivityId());<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 找到紧跟在后面的一个节点</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 返回</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> sameActivityImpl;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 遍历后续节点,获取当前节点后续节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span> (<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">int</span></span></span></span> k = i + <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; k <= historicActivityInstances.size() - <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1</span></span></span></span>; k++) {
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 后续节点</span></span></span></span>
HistoricActivityInstance activityImp2_ = historicActivityInstances.get(k);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 都是userTask,且主节点与后续节点的开始时间相同,说明不是真实的后继节点</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"userTask"</span></span></span></span>.equals(activityImp2_.getActivityType()) && activityImpl_.getStartTime().getTime() == activityImp2_.getStartTime().getTime()) <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">continue</span></span></span></span>;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 找到紧跟在后面的一个节点</span></span></span></span>
sameActivityImpl = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(k).getActivityId());
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">break</span></span></span></span>;
}
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> sameActivityImpl;
}
6.4 附上DemoController完整代码
package com.mypro.activiti.controller;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mypro.activiti.utils.ActivitiUtils;
import com.mypro.activiti.utils.StreamUtils;
/**
<p>Activiti控制器</p>
@author FRH
@time 2018年12月10日上午9:30:18
@version 1.0
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 流程定义和部署相关的存储服务 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private RepositoryService repositoryService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 流程运行时相关的服务 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private RuntimeService runtimeService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 节点任务相关操作接口 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private TaskService taskService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 流程图生成器 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private ProcessDiagramGenerator processDiagramGenerator;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 历史记录相关服务接口 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private HistoryService historyService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>跳转到测试主页面</p>
* @return String 测试主页面
* @author FRH
* @time 2018年12月10日上午11:12:28
* @version 1.0
*/
@RequestMapping(value="/toIndex.html")
public String toTestPage() {
return "/index";
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>跳转到上级审核页面</p>
* @return String 上级审核页面
* @author FRH
* @time 2018年12月5日下午2:31:42
* @version 1.0
*/
@RequestMapping(value="/toLeave")
public String employeeLeave() {
return "/employeeLeave";
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>启动请假流程(流程key即xml中定义的ID为leaveProcess)</p>
* @return String 启动的流程ID
* @author FRH
* @time 2018年12月10日上午11:12:50
* @version 1.0
/
@RequestMapping(value="/start")
@ResponseBody
public String start() {
/
* xml中定义的ID
*/
String instanceKey = "leaveProcess";
logger.info("开启请假流程...");
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 设置流程参数,开启流程
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"jobNumber"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"A1001"</span></span></span></span>);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"busData"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"bus data"</span></span></span></span>);
ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, map);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动</span></span></span></span>
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"启动流程实例成功:{}"</span></span></span></span>, instance);
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}"</span></span></span></span>, instance.getId());
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程定义ID:{}"</span></span></span></span>, instance.getProcessDefinitionId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 验证是否启动成功
*/</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//通过查询正在运行的流程实例来判断</span></span></span></span>
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//根据流程实例ID来查询</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><ProcessInstance> runningList = processInstanceQuery.processInstanceId(instance.getProcessInstanceId()).list();
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"根据流程ID查询条数:{}"</span></span></span></span>, runningList.size());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 返回流程ID
*/</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> instance.getId();
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>查看当前流程图</p>
* @param instanceId 流程实例
* @param response void 响应
* @author FRH
* @time 2018年12月10日上午11:14:12
* @version 1.0
/
@ResponseBody
@RequestMapping(value="/showImg")
public void showImg(String instanceId, HttpServletResponse response) {
/
* 参数校验
*/
logger.info("查看完整流程图!流程实例ID:{}", instanceId);
if(StringUtils.isBlank(instanceId)) return;
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 获取流程实例
*/</span></span></span></span>
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(processInstance == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.error(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没查询到流程实例!"</span></span></span></span>, instanceId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 根据流程对象获取流程对象模型</span></span></span></span>
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查看已执行的节点集合
* 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序
*/</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 构造历史流程查询</span></span></span></span>
HistoricActivityInstanceQuery historyInstanceQuery = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 查询历史节点</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><HistoricActivityInstance> historicActivityInstanceList = historyInstanceQuery.orderByHistoricActivityInstanceStartTime().asc().list();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(historicActivityInstanceList == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span> || historicActivityInstanceList.size() == <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没有历史节点信息!"</span></span></span></span>, instanceId);
outputImg(response, bpmnModel, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 已执行的节点ID集合(将historicActivityInstanceList中元素的activityId字段取出封装到executedActivityIdList)</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>> executedActivityIdList = historicActivityInstanceList.stream().map(item -> item.getActivityId()).collect(Collectors.toList());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 获取流程走过的线
*/</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取流程定义</span></span></span></span>
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>> flowIds = ActivitiUtils.getHighLightedFlows(bpmnModel, processDefinition, historicActivityInstanceList);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 输出图像,并设置高亮
*/</span></span></span></span>
outputImg(response, bpmnModel, flowIds, executedActivityIdList);
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>员工提交申请</p>
* @param request 请求
* @return String 申请受理结果
* @author FRH
* @time 2018年12月10日上午11:15:09
* @version 1.0
/
@RequestMapping(value="/employeeApply")
@ResponseBody
public String employeeApply(HttpServletRequest request){
/
* 获取请求参数
*/
String taskId = request.getParameter("taskId"); // 任务ID
String jobNumber = request.getParameter("jobNumber"); // 工号
String leaveDays = request.getParameter("leaveDays"); // 请假天数
String leaveReason = request.getParameter("leaveReason"); // 请假原因
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查询任务
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"任务ID:{}查询到任务为空!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"fail"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 参数传递并提交申请
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"days"</span></span></span></span>, leaveDays);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"date"</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> Date());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"reason"</span></span></span></span>, leaveReason);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"jobNumber"</span></span></span></span>, jobNumber);
taskService.complete(task.getId(), map);
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"执行【员工申请】环节,流程推动到【上级审核】环节"</span></span></span></span>);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 返回成功
*/</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"success"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>跳转到上级审核页面</p>
* @return String 页面
* @author FRH
* @time 2018年12月5日下午2:31:42
* @version 1.0
/
@RequestMapping(value="/viewTask")
public String toHigherAudit(String taskId, HttpServletRequest request) {
/
* 获取参数
*/
logger.info("跳转到任务详情页面,任务ID:{}", taskId);
if(StringUtils.isBlank(taskId)) return "/higherAudit";
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查看任务详细信息
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"任务ID:{}不存在!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"/higherAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> paramMap = taskService.getVariables(taskId);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"task"</span></span></span></span>, task);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"paramMap"</span></span></span></span>, paramMap);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"higherAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>跳转到部门经理审核页面</p>
* @param taskId 任务ID
* @param request 请求
* @return String 响应页面
* @author FRH
* @time 2018年12月6日上午9:54:34
* @version 1.0
/
@RequestMapping(value="/viewTaskManager")
public String viewTaskManager(String taskId, HttpServletRequest request) {
/
* 获取参数
*/
logger.info("跳转到任务详情页面,任务ID:{}", taskId);
if(StringUtils.isBlank(taskId)) return "/manageAudit";
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查看任务详细信息
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"任务ID:{}不存在!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"/manageAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> paramMap = taskService.getVariables(taskId);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"task"</span></span></span></span>, task);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"paramMap"</span></span></span></span>, paramMap);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"manageAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>上级审核</p>
* @param request 请求
* @return String 受理结果
* @author FRH
* @time 2018年12月10日上午11:19:44
* @version 1.0
/
@ResponseBody
@RequestMapping(value="/higherLevelAudit")
public String higherLevelAudit(HttpServletRequest request) {
/
* 获取请求参数
*/
String taskId = request.getParameter("taskId");
String higherLevelOpinion = request.getParameter("sug");
String auditStr = request.getParameter("audit");
logger.info("上级审核任务ID:{}", taskId);
if(StringUtils.isBlank(taskId)) return "fail";
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查找任务
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"审核任务ID:{}查询到任务为空!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"fail"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 设置局部变量参数,完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"audit"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"1"</span></span></span></span>.equals(auditStr) ? <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span></span> : <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">true</span></span></span></span>);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"higherLevelOpinion"</span></span></span></span>, higherLevelOpinion);
taskService.complete(taskId, map);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"success"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>部门经理审核</p>
* @param request 请求
* @return String 受理结果
* @author FRH
* @time 2018年12月10日上午11:20:44
* @version 1.0
/
@ResponseBody
@RequestMapping(value="/divisionManagerAudit")
public String divisionManagerAudit(HttpServletRequest request) {
/
* 获取请求参数
*/
String taskId = request.getParameter("taskId");
String opinion = request.getParameter("sug");
String auditStr = request.getParameter("audit");
logger.info("上级审核任务ID:{}", taskId);
if(StringUtils.isBlank(taskId)) return "fail";
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查找任务
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"审核任务ID:{}查询到任务为空!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"fail"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 设置局部变量参数,完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"audit"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"1"</span></span></span></span>.equals(auditStr) ? <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span></span> : <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">true</span></span></span></span>);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"managerOpinion"</span></span></span></span>, opinion);
taskService.complete(taskId, map);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"success"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>查看任务</p>
* @param request 请求
* @return String 任务展示页面
* @author FRH
* @time 2018年12月10日上午11:21:33
* @version 1.0
/
@RequestMapping(value="/toShowTask")
public String toShowTask(HttpServletRequest request) {
/
* 获取请求参数
*/
List<Task> taskList = taskService.createTaskQuery().list();
if(taskList == null || taskList.size() == 0) {
logger.info("查询任务列表为空!");
return "/task";
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查询所有任务,并封装
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>>> resultList = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> ArrayList<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>>>();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span>(Task task : taskList) {
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"taskId"</span></span></span></span>, task.getId());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"name"</span></span></span></span>, task.getName());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"createTime"</span></span></span></span>, task.getCreateTime().toString());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"assignee"</span></span></span></span>, task.getAssignee());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"instanceId"</span></span></span></span>, task.getProcessInstanceId());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"executionId"</span></span></span></span>, task.getExecutionId());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"definitionId"</span></span></span></span>, task.getProcessDefinitionId());
resultList.add(map);
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 返回结果
*/</span></span></span></span>
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"返回集合:{}"</span></span></span></span>, resultList.toString());
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"resultList"</span></span></span></span>, resultList);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"/task"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>输出图像</p>
* @param response 响应实体
* @param bpmnModel 图像对象
* @param flowIds 已执行的线集合
* @param executedActivityIdList void 已执行的节点ID集合
* @author FRH
* @time 2018年12月10日上午11:23:01
* @version 1.0
*/
private void outputImg(HttpServletResponse response, BpmnModel bpmnModel, List<String> flowIds, List<String> executedActivityIdList) {
InputStream imageStream = null;
try {
imageStream = processDiagramGenerator.generateDiagram(bpmnModel, executedActivityIdList, flowIds, "宋体", "微软雅黑", "黑体", true, "png");
// 输出资源内容到相应对象
byte[] b = new byte[1024];
int len;
while ((len = imageStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
response.getOutputStream().flush();
}catch(Exception e) {
logger.error("流程图输出异常!", e);
} finally { // 流关闭
StreamUtils.closeInputStream(imageStream);
}
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
* <p>判断流程是否完成</p>
* @param processInstanceId 流程实例ID
* @return boolean 已完成-true,未完成-false
* @author FRH
* @time 2018年12月10日上午11:23:26
* @version 1.0
*/
public boolean isFinished(String processInstanceId) {
return historyService.createHistoricProcessInstanceQuery().finished().processInstanceId(processInstanceId).count() > 0;
}
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 流程定义和部署相关的存储服务 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private RepositoryService repositoryService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 流程运行时相关的服务 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private RuntimeService runtimeService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 节点任务相关操作接口 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private TaskService taskService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 流程图生成器 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private ProcessDiagramGenerator processDiagramGenerator;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis"><span class="hljs-comment"><span class="markdown"><span class="hljs-emphasis">** 历史记录相关服务接口 *</span></span></span></span></span></span></span></span></span></span><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/</span></span></span></span></span></span></span></span>
<span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Autowired</span></span></span></span>
private HistoryService historyService;
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 设置流程参数,开启流程
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>,<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"jobNumber"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"A1001"</span></span></span></span>);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"busData"</span></span></span></span>,<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"bus data"</span></span></span></span>);
ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, map);<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动</span></span></span></span>
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"启动流程实例成功:{}"</span></span></span></span>, instance);
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}"</span></span></span></span>, instance.getId());
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程定义ID:{}"</span></span></span></span>, instance.getProcessDefinitionId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 验证是否启动成功
*/</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//通过查询正在运行的流程实例来判断</span></span></span></span>
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">//根据流程实例ID来查询</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><ProcessInstance> runningList = processInstanceQuery.processInstanceId(instance.getProcessInstanceId()).list();
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"根据流程ID查询条数:{}"</span></span></span></span>, runningList.size());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 返回流程ID
*/</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> instance.getId();
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 获取流程实例
*/</span></span></span></span>
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(processInstance == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.error(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没查询到流程实例!"</span></span></span></span>, instanceId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 根据流程对象获取流程对象模型</span></span></span></span>
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查看已执行的节点集合
* 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序
*/</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 构造历史流程查询</span></span></span></span>
HistoricActivityInstanceQuery historyInstanceQuery = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 查询历史节点</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><HistoricActivityInstance> historicActivityInstanceList = historyInstanceQuery.orderByHistoricActivityInstanceStartTime().asc().list();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(historicActivityInstanceList == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span> || historicActivityInstanceList.size() == <span class="hljs-number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">0</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"流程实例ID:{}没有历史节点信息!"</span></span></span></span>, instanceId);
outputImg(response, bpmnModel, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 已执行的节点ID集合(将historicActivityInstanceList中元素的activityId字段取出封装到executedActivityIdList)</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>> executedActivityIdList = historicActivityInstanceList.stream().map(item -> item.getActivityId()).collect(Collectors.toList());
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 获取流程走过的线
*/</span></span></span></span>
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">// 获取流程定义</span></span></span></span>
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>> flowIds = ActivitiUtils.getHighLightedFlows(bpmnModel, processDefinition, historicActivityInstanceList);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 输出图像,并设置高亮
*/</span></span></span></span>
outputImg(response, bpmnModel, flowIds, executedActivityIdList);
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查询任务
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"任务ID:{}查询到任务为空!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"fail"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 参数传递并提交申请
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"days"</span></span></span></span>, leaveDays);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"date"</span></span></span></span>, <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> Date());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"reason"</span></span></span></span>, leaveReason);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"jobNumber"</span></span></span></span>, jobNumber);
taskService.complete(task.getId(), map);
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"执行【员工申请】环节,流程推动到【上级审核】环节"</span></span></span></span>);
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 返回成功
*/</span></span></span></span>
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"success"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查看任务详细信息
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"任务ID:{}不存在!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"/higherAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> paramMap = taskService.getVariables(taskId);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"task"</span></span></span></span>, task);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"paramMap"</span></span></span></span>, paramMap);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"higherAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查看任务详细信息
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"任务ID:{}不存在!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"/manageAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> paramMap = taskService.getVariables(taskId);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"task"</span></span></span></span>, task);
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"paramMap"</span></span></span></span>, paramMap);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"manageAudit"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查找任务
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"审核任务ID:{}查询到任务为空!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"fail"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 设置局部变量参数,完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"audit"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"1"</span></span></span></span>.equals(auditStr) ? <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span></span> : <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">true</span></span></span></span>);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"higherLevelOpinion"</span></span></span></span>, higherLevelOpinion);
taskService.complete(taskId, map);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"success"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查找任务
*/</span></span></span></span>
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">if</span></span></span></span>(task == <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">null</span></span></span></span>) {
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"审核任务ID:{}查询到任务为空!"</span></span></span></span>, taskId);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"fail"</span></span></span></span>;
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 设置局部变量参数,完成任务
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Object</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"audit"</span></span></span></span>, <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"1"</span></span></span></span>.equals(auditStr) ? <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">false</span></span></span></span> : <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">true</span></span></span></span>);
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"managerOpinion"</span></span></span></span>, opinion);
taskService.complete(taskId, map);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"success"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 查询所有任务,并封装
*/</span></span></span></span>
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">List</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>>> resultList = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> ArrayList<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>>>();
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">for</span></span></span></span>(Task task : taskList) {
<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">Map</span></span></span></span><<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>> map = <span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> HashMap<<span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>, <span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in"><span class="hljs-built_in">String</span></span></span></span>>();
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"taskId"</span></span></span></span>, task.getId());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"name"</span></span></span></span>, task.getName());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"createTime"</span></span></span></span>, task.getCreateTime().toString());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"assignee"</span></span></span></span>, task.getAssignee());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"instanceId"</span></span></span></span>, task.getProcessInstanceId());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"executionId"</span></span></span></span>, task.getExecutionId());
map.put(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"definitionId"</span></span></span></span>, task.getProcessDefinitionId());
resultList.add(map);
}
<span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment"><span class="hljs-comment">/*
* 返回结果
*/</span></span></span></span>
logger.info(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"返回集合:{}"</span></span></span></span>, resultList.toString());
request.setAttribute(<span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"resultList"</span></span></span></span>, resultList);
<span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">return</span></span></span></span> <span class="hljs-string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"/task"</span></span></span></span>;
}
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
<span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown"><span class="hljs-comment"><span class="markdown">/**
7. 效果
????看出Activiti默认使用Spring的security,添加配置,关闭安全认证,如下:
# 关闭activiti登录验证
security:
basic:
enabled: false
????重启后继续访问,可正常进入首页(如还是无法进入首页,请添加@EnableAutoConfiguration(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class}),或者从pom.xml中移除Security包):
????点击我要请假后,得到流程实例ID,再查看流程图,如下:
????附上首页/index.html代码,其它页面相比比较简单:
最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(666)领取,祝大家更上一层楼!!!
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
咱们下期见!学习更多JAVA知识与技巧(获取原文),关注与私信博主(666)
猜你喜欢
- 2024-10-27 30分钟学会:springboot+mysql+camunda开源工作流引擎
- 2024-10-27 详解JavaEE中级程序员路线图,其涉及课程资源已更新
- 2024-10-27 吐血推荐一款开源工作流引擎:camunda使用入门
- 2024-10-27 工作流引擎开发系列一基础知识(工作流引擎的好处)
- 2024-10-27 超轻量级工作流引擎,只要七张表就解决工作流ingens...
- 2024-10-27 Windmill:最快的自托管开源工作流引擎
- 2024-10-27 Springboot整合工作流引擎Activiti(二)
- 2024-10-27 流程智慧:低代码开发平台工作流引擎的技术原理解析
- 2024-10-27 工作流引擎的工作原理与功能(工作流引擎是什么意思)
- 2024-10-27 免费开源,一款快速开发模块化脚手架,含工作流引擎
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)