Merge remote-tracking branch 'origin/master'

This commit is contained in:
zhouhao
2017-08-17 18:29:48 +08:00
7 changed files with 99 additions and 30 deletions

View File

@@ -1,10 +1,10 @@
<?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:xsd="http://www.w3.org/2001/XMLSchema" 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="http://www.activiti.org/test">
<process id="test" name="test" isExecutable="true">
<process id="testid" name="test" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="User Task" activiti:assignee="ww" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask2" name="User Task" activiti:assignee="lisi" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask3" name="User Task" activiti:assignee="zhangsan" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask1" name="部门立领导" activiti:assignee="ww" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask2" name="中心负责人" activiti:assignee="lisi" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask3" name="人事部" activiti:assignee="zhangsan" activiti:formKey="vacation-request"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask3"></sequenceFlow>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<sequenceFlow id="flow2" sourceRef="usertask3" targetRef="exclusivegateway1"></sequenceFlow>
@@ -17,7 +17,7 @@
<sequenceFlow id="flow7" sourceRef="exclusivegateway2" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_AProcess">
<bpmndi:BPMNPlane bpmnElement="test" id="BPMNPlane_AProcess">
<bpmndi:BPMNPlane bpmnElement="testid" id="BPMNPlane_AProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="50.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>

View File

@@ -30,6 +30,7 @@ public class FlowableAutoConfiguration {
return configuration -> {
configuration
.setAsyncExecutorActivate(false)
.setDatabaseSchemaUpdate("false")
.setJobExecutorActivate(false)
.setActivityFontName("宋体")
.setLabelFontName("宋体")

View File

@@ -1,6 +1,7 @@
package org.hswebframework.web.workflow.flowable.service;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
import java.util.List;
import java.util.Map;
@@ -58,9 +59,17 @@ public interface BpmActivityService {
*
* @param procDefId 流程定义ID
* @param activityId 图元ID
* @return List<ActivityImpl> 当前流程的所有节资源
* @return List<TaskDefinition> 当前流程的所有下一环节资源
*/
List<ActivityImpl> getNextActivitys(String procDefId, String activityId);
List<TaskDefinition> getNextActivitys(String procDefId, String activityId);
/**
* 根据图元获取办理环节数据
* @param activityImpl
* @param elString 根据连线条件conditionText获取输出节点主要用于网关分支预留
* @return
*/
List<TaskDefinition> getTaskDefinition(ActivityImpl activityImpl, String elString);
/**
* 获取下一环节办理人

View File

@@ -2,7 +2,9 @@ package org.hswebframework.web.workflow.flowable.service.imp;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmActivity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
@@ -94,35 +96,72 @@ public class BpmActivityServiceImp extends FlowableAbstract implements BpmActivi
}
@Override
public List<ActivityImpl> getNextActivitys(String procDefId, String activityId) {
public List<TaskDefinition> getNextActivitys(String procDefId, String activityId) {
ActivityImpl activity;
if(activityId!=null)
activity = getActivityById(procDefId, activityId);
else
activity = getStartEvent(procDefId);
List<PvmTransition> pvmTransitions = activity.getOutgoingTransitions();
List<ActivityImpl> activities = new ArrayList<>();
List<TaskDefinition> taskDefinitions = new ArrayList<>();
for(PvmTransition pvmTransition : pvmTransitions){
activities.add((ActivityImpl)pvmTransition.getDestination());
PvmActivity pvmActivity = pvmTransition.getDestination();
taskDefinitions.addAll(getTaskDefinition((ActivityImpl)pvmActivity,""));
}
return activities;
return taskDefinitions;
}
@Override
public List<TaskDefinition> getTaskDefinition(ActivityImpl activityImpl, String elString) {
List<TaskDefinition> taskDefinitionList = new ArrayList<>();
List<TaskDefinition> nextTaskDefinition;
if("userTask".equals(activityImpl.getProperty("type"))){
TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();
taskDefinitionList.add(taskDefinition);
}else{
List<PvmTransition> pvmTransitions = activityImpl.getOutgoingTransitions();
List<PvmTransition> outTransitionsTemp;
for(PvmTransition tr:pvmTransitions){
PvmActivity pvmActivity = tr.getDestination(); //获取线路的终点节点
if("exclusiveGateway".equals(pvmActivity.getProperty("type"))||"parallelGateway".equals(pvmActivity.getProperty("type"))){
outTransitionsTemp = pvmActivity.getOutgoingTransitions();
if(outTransitionsTemp.size() == 1){
nextTaskDefinition =getTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), elString);
taskDefinitionList.addAll(nextTaskDefinition);
}else if(outTransitionsTemp.size() > 1){
for(PvmTransition tr1 : outTransitionsTemp){
Object s = tr1.getProperty("conditionText");
if(elString.equals(s.toString().trim())){
nextTaskDefinition = getTaskDefinition((ActivityImpl)tr1.getDestination(), elString);
taskDefinitionList.addAll(nextTaskDefinition);
}
}
}
}else if("userTask".equals(pvmActivity.getProperty("type"))){
taskDefinitionList.add(((UserTaskActivityBehavior)((ActivityImpl)pvmActivity).getActivityBehavior()).getTaskDefinition());
}
}
}
return taskDefinitionList;
}
@Override
public Map<String, List<String>> getNextClaim(String procDefId, String activityId) {
List<ActivityImpl> activities = getNextActivitys(procDefId, activityId);
List<TaskDefinition> taskDefinitions = getNextActivitys(procDefId, activityId);
Map<String, List<String>> map = new HashMap<>();
for(ActivityImpl activity : activities){
for(TaskDefinition taskDefinition : taskDefinitions){
List<String> list = new ArrayList<>();
TaskDefinition taskDefinition = (TaskDefinition) activity.getProperty("taskDefinition");
if(taskDefinition.getAssigneeExpression()!=null)
if(taskDefinition!=null && taskDefinition.getAssigneeExpression()!=null)
list.add(taskDefinition.getAssigneeExpression().getExpressionText());
else if(taskDefinition.getCandidateUserIdExpressions()!=null){
else if(taskDefinition!=null && taskDefinition.getCandidateUserIdExpressions()!=null){
for(Expression expression : taskDefinition.getCandidateUserIdExpressions()){
list.add(expression.getExpressionText());
}
}
map.put(activity.getId(),list);
if(taskDefinition.getNameExpression()!=null)
map.put(taskDefinition.getNameExpression().getExpressionText(),list);
else
map.put(taskDefinition.getKey(),list);
}
return map;
}

View File

@@ -182,12 +182,15 @@ public class BpmTaskServiceImp extends FlowableAbstract implements BpmTaskServic
@Override
public ActivityImpl selectActivityImplByTask(String taskId) {
if(StringUtils.isNullOrEmpty(taskId)){
return new ActivityImpl(null,null);
}
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
ProcessDefinitionEntity entity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(task.getProcessDefinitionId());
List<ActivityImpl> activities = entity.getActivities();
ActivityImpl activity = null;
for(ActivityImpl activity1 : activities){
if(activity1.getProperty("name").equals(task.getName())){
if(activity1.getProperty("type").equals("userTask") && activity1.getProperty("name").equals(task.getName())){
activity = activity1;
}
}

View File

@@ -48,7 +48,10 @@ public class ControllerTest extends SimpleWebApplicationTests {
public ProcessInstance start() throws Exception {
Map<String, Object> map = new HashMap<>();
map.put("username", "admin");
return bpmProcessService.startProcessInstance("1", "test", null, null, "流程名", map);
map.put("leader", "zhangsan");
map.put("team", "lisi");
map.put("people", "wangwu");
return bpmProcessService.startProcessInstance("1", "testid", null, null, "流程名", map);
}
// 流程图元数据test
@@ -93,13 +96,20 @@ public class ControllerTest extends SimpleWebApplicationTests {
System.out.println(activity);
System.out.println("=========>>>");
System.out.println("=========流程流转下一步,下一步为并行网关。>>>");
for (Task task:tasks) {
bpmTaskService.complete(task.getId(), "zhangsan",null,null);
}
// for (Task task:tasks) {
// bpmTaskService.complete(task.getId(), "zhangsan",null,null);
// }
tasks = bpmTaskService.selectTaskByProcessId(processInstance.getId());
Assert.assertNotNull(tasks);
for (Task task:tasks) {
System.out.println("当前环节:"+task.getName()+"__办理人:"+task.getAssignee());
System.out.println("当前环节:"+task.getName()+"__id:"+task.getId()+"__办理人:"+task.getAssignee());
activity = bpmTaskService.selectActivityImplByTask(task.getId());
System.out.println("当前节点图元id:"+activity.getId());
System.out.println(activity);
System.out.println("=========>>>");
Map<String, List<String>> map = bpmActivityService.getNextClaim(task.getProcessDefinitionId(),activity.getId());
System.out.println("下一步执行json:"+JSON.toJSONString(map));
}
System.out.println("=========>>>");
activity = bpmActivityService.getActivityByProcInstId(processInstance.getProcessDefinitionId(), processInstance.getId());
@@ -109,10 +119,17 @@ public class ControllerTest extends SimpleWebApplicationTests {
}
@Autowired
RepositoryService repositoryService;
@Test
public void task(){
List<Task> task = bpmTaskService.selectTaskByProcessId("5");
System.out.println(task);
ActivityImpl activity = bpmTaskService.selectActivityImplByTask("");
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("testid").orderByProcessDefinitionVersion().desc().singleResult();
Map<String, List<String>> map = bpmActivityService.getNextClaim(processDefinition.getId(),activity.getId());
System.out.println("=========>>>");
System.out.println(JSON.toJSONString(map));
System.out.println("=========>>>");
}
@Configuration

View File

@@ -1,10 +1,10 @@
<?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:xsd="http://www.w3.org/2001/XMLSchema" 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="http://www.activiti.org/test">
<process id="test" name="test" isExecutable="true">
<process id="testid" name="test" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="User Task" activiti:assignee="ww" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask2" name="User Task" activiti:assignee="lisi" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask3" name="User Task" activiti:assignee="zhangsan" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask1" name="部门领导" activiti:assignee="ww" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask2" name="中心负责人" activiti:assignee="lisi" activiti:formKey="vacation-request"></userTask>
<userTask id="usertask3" name="人事部" activiti:assignee="zhangsan" activiti:formKey="vacation-request"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask3"></sequenceFlow>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<sequenceFlow id="flow2" sourceRef="usertask3" targetRef="exclusivegateway1"></sequenceFlow>
@@ -17,7 +17,7 @@
<sequenceFlow id="flow7" sourceRef="exclusivegateway2" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_AProcess">
<bpmndi:BPMNPlane bpmnElement="test" id="BPMNPlane_AProcess">
<bpmndi:BPMNPlane bpmnElement="testid" id="BPMNPlane_AProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="50.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>