流程定义文件leave-formkey.bpmn20.xml:
[html]
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="OFFICE"> <process id="leave-formkey" name="病事假申请"> <documentation>请假流程演示</documentation> <startEvent id="startevent1" name="Start" activiti:initiator="applyUserId"></startEvent> <userTask id="deptLeaderAudit" name="部门领导审批" activiti:assignee="${applyUserId}" activiti:formKey="leaveHandle.form"></userTask> <exclusiveGateway id="exclusivegateway5" name="Exclusive Gateway"></exclusiveGateway> <userTask id="modifyApply" name="调整申请" activiti:assignee="${applyUserId}" activiti:formKey="leaveApplyAgain.form"></userTask> <userTask id="hrAudit" name="人事审批" activiti:assignee="${applyUserId}" activiti:formKey="leaveHandle.form"></userTask> <exclusiveGateway id="exclusivegateway6" name="Exclusive Gateway"></exclusiveGateway> <userTask id="reportBack" name="销假" activiti:assignee="${applyUserId}" activiti:formKey="leaveHandle.form"></userTask> <endEvent id="endevent1" name="End"></endEvent> <exclusiveGateway id="exclusivegateway7" name="Exclusive Gateway"></exclusiveGateway> <sequenceFlow id="flow2" name="" sourceRef="startevent1" targetRef="deptLeaderAudit"></sequenceFlow> <sequenceFlow id="flow3" name="" sourceRef="deptLeaderAudit" targetRef="exclusivegateway5"></sequenceFlow> <sequenceFlow id="flow4" name="不同意" sourceRef="exclusivegateway5" targetRef="modifyApply"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptLeaderPass == 'false'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow5" name="同意" sourceRef="exclusivegateway5" targetRef="hrAudit"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${deptLeaderPass == 'true'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow6" name="" sourceRef="hrAudit" targetRef="exclusivegateway6"></sequenceFlow> <sequenceFlow id="flow7" name="同意" sourceRef="exclusivegateway6" targetRef="reportBack"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrPass == 'true'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow8" name="" sourceRef="reportBack" targetRef="endevent1"></sequenceFlow> <sequenceFlow id="flow9" name="不同意" sourceRef="exclusivegateway6" targetRef="modifyApply"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${hrPass == 'false'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow10" name="重新申请" sourceRef="exclusivegateway7" targetRef="deptLeaderAudit"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${reApply == 'true'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow11" name="" sourceRef="modifyApply" targetRef="exclusivegateway7"></sequenceFlow> <sequenceFlow id="flow12" name="结束流程" sourceRef="exclusivegateway7" targetRef="endevent1"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${reApply == 'false'}]]></conditionExpression> </sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_leave-formkey"> <bpmndi:BPMNPlane bpmnElement="leave-formkey" id="BPMNPlane_leave-formkey"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35" width="35" x="10" y="90"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="deptLeaderAudit" id="BPMNShape_deptLeaderAudit"> <omgdc:Bounds height="55" width="105" x="90" y="80"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="exclusivegateway5" id="BPMNShape_exclusivegateway5"> <omgdc:Bounds height="40" width="40" x="250" y="87"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="modifyApply" id="BPMNShape_modifyApply"> <omgdc:Bounds height="55" width="105" x="218" y="190"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="hrAudit" id="BPMNShape_hrAudit"> <omgdc:Bounds height="55" width="105" x="358" y="80"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="exclusivegateway6" id="BPMNShape_exclusivegateway6"> <omgdc:Bounds height="40" width="40" x="495" y="87"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="reportBack" id="BPMNShape_reportBack"> <omgdc:Bounds height="55" width="105" x="590" y="80"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35" width="35" x="625" y="283"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="exclusivegateway7" id="BPMNShape_exclusivegateway7"> <omgdc:Bounds height="40" width="40" x="250" y="280"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="45" y="107"></omgdi:waypoint> <omgdi:waypoint x="90" y="107"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="195" y="107"></omgdi:waypoint> <omgdi:waypoint x="250" y="107"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> <omgdi:waypoint x="270" y="127"></omgdi:waypoint> <omgdi:waypoint x="270" y="190"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="11" width="100" x="10" y="0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"> <omgdi:waypoint x="290" y="107"></omgdi:waypoint> <omgdi:waypoint x="358" y="107"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="11" width="100" x="-24" y="-17"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"> <omgdi:waypoint x="463" y="107"></omgdi:waypoint> <omgdi:waypoint x="495" y="107"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"> <omgdi:waypoint x="535" y="107"></omgdi:waypoint> <omgdi:waypoint x="590" y="107"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="11" width="100" x="-22" y="-17"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8"> <omgdi:waypoint x="642" y="135"></omgdi:waypoint> <omgdi:waypoint x="642" y="283"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9"> <omgdi:waypoint x="515" y="127"></omgdi:waypoint> <omgdi:waypoint x="514" y="217"></omgdi:waypoint> <omgdi:waypoint x="323" y="217"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="11" width="100" x="10" y="0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10"> <omgdi:waypoint x="250" y="300"></omgdi:waypoint> <omgdi:waypoint x="142" y="299"></omgdi:waypoint> <omgdi:waypoint x="142" y="135"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="11" width="100" x="10" y="0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11"> <omgdi:waypoint x="270" y="245"></omgdi:waypoint> <omgdi:waypoint x="270" y="280"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow12" id="BPMNEdge_flow12"> <omgdi:waypoint x="290" y="300"></omgdi:waypoint> <omgdi:waypoint x="625" y="300"></omgdi:waypoint> <bpmndi:BPMNLabel> <omgdc:Bounds height="11" width="100" x="10" y="0"></omgdc:Bounds> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions> ============================================================================
5.流程启动前传入后续节点办理人;
//下面name2和name3是前台传过来的第二个和第三个节点的办理人
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("leaveId", leaveId); variables.put("name2", "XXX");//(前台传过来的第二个节点的办理人) variables.put("name3", "YYY");//(前台传过来的第三个节点的办理人) // 启动流程 pi = runtimeService.startProcessInstanceByKey("activitiemployeeProcess", variables);
在第一个节点指定第二个节点的监听
public class MyTaksListener2 implements TaskListener { public void notify(DelegateTask delegateTask) { Map<String, Object> variables=delegateTask.getVariables(); variables.get("name2");(前台传过来的第二个节点的办理人) //拆分variables List<String> assigneeList = new ArrayList<String>(); assigneeList.add("wangba"); delegateTask.setVariable("publicityList",assigneeList); }}

在第三个节点指定本节点的办理人监听
public class MyTaksListener3 implements TaskListener { public void notify(DelegateTask delegateTask) { Map<String, Object> variables=delegateTask.getVariables(); System.out.println(variables); variables.get("name3");// String result=(String) variables.get("name3");(前台传过来的第三个节点的办理人) String[] empLoyees = {"szx"}; delegateTask.addCandidateUsers(Arrays.asList(empLoyees)); }}

============================================================================
6、节点设置多个监听
在同一节点设置两个监听,一个是设置本节点的监听,指定办理人;另一个是设置下一个节点的监听,指定会签人。

设置本节点的监听,指定办理人
public class MyTaksListener3 implements TaskListener { public void notify(DelegateTask delegateTask) { Map<String, Object> variables=delegateTask.getVariables(); System.out.println(variables); String result=(String) variables.get("name3"); String[] empLoyees = {"szx"}; delegateTask.addCandidateUsers(Arrays.asList(empLoyees)); }}
设置下一个节点的监听,指定会签人
public class MyTaksListener4 implements TaskListener { public void notify(DelegateTask delegateTask) { Map<String, Object> variables=delegateTask.getVariables(); String result=(String)variables.get("name2"); List<String> assigneeList = new ArrayList<String>(); assigneeList.add("ss"); delegateTask.setVariable("publicityList",assigneeList); }}
至此,项目中遇到的各(奇)种(葩)问题迎刃而解。“中国式”工作流有时确实很让人头疼,但也体现了中国程序猿的强大。希望看到这里的你也能从中得到启发,尽早解决您在项目当中遇到的问题。