提交 63754b25 编写于 作者: Skyeye云's avatar Skyeye云

代码修改

上级 4561f525
......@@ -65,4 +65,12 @@ public interface ActivitiTaskService {
*/
ActivityImpl getCurrentActivityNode(String processInstanceId);
/**
* 根据任务节点id判断该节点是否为会签节点
*
* @param taskId 任务节点id
* @return true:是会签节点;false:不是会签节点
*/
boolean isMultiInstance(String taskId);
}
......@@ -32,6 +32,7 @@ import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
......@@ -136,6 +137,7 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
}
return null;
}, RedisConstants.TEN_DAY_SECONDS);
bean.put("isMultiInstance", this.isMultiInstance(task.getId()));
rows.add(bean);
}
outputObject.setBeans(rows);
......@@ -725,6 +727,7 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
}
}
@Override
public UserTask getCurrentUserTaskByTaskId(String taskId){
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
......@@ -734,6 +737,7 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
return currentUserTask;
}
@Override
public ActivityImpl getCurrentActivityNode(String processInstanceId){
// 获取流程发布Id信息
String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();
......@@ -754,4 +758,31 @@ public class ActivitiTaskServiceImpl implements ActivitiTaskService {
return null;
}
@Override
public boolean isMultiInstance(String taskId) {
UserTask currentTaskNode = this.getCurrentUserTaskByTaskId(taskId);
// 1.判断任务节点是否是用户手动转的会签节点
if (currentTaskNode.getLoopCharacteristics() != null) {
return true;
}
// 2.判断工作流模型中的这个节点是否是会签节点
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task != null) {
// 获取流程定义id
ProcessDefinitionEntity processDefinitionEntity =
(ProcessDefinitionEntity)repositoryService.getProcessDefinition(task.getProcessDefinitionId());
// 根据活动id获取活动实例
ActivityImpl activityImpl = processDefinitionEntity.findActivity(task.getTaskDefinitionKey());
if (activityImpl.getActivityBehavior() instanceof ParallelMultiInstanceBehavior) {
ParallelMultiInstanceBehavior behavior =
(ParallelMultiInstanceBehavior)activityImpl.getActivityBehavior();
if (behavior != null && behavior.getCollectionExpression() != null) {
return true;
}
}
}
return false;
}
}
......@@ -4,16 +4,22 @@
package com.skyeye.activiti.service.impl;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.skyeye.activiti.service.ActivitiModelService;
import com.skyeye.activiti.service.ActivitiTaskService;
import com.skyeye.activiti.service.CounterSignService;
import com.skyeye.annotation.transaction.ActivitiAndBaseTransaction;
import com.skyeye.common.constans.ActivitiConstants;
import com.skyeye.common.object.InputObject;
import com.skyeye.common.object.OutputObject;
import net.sf.json.JSONArray;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior;
import org.activiti.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
import org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
......@@ -24,14 +30,10 @@ import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.skyeye.activiti.listener.MultiInstanceloopListener;
import com.skyeye.activiti.service.ActivitiTaskService;
import com.skyeye.activiti.service.CounterSignService;
import com.skyeye.common.constans.ActivitiConstants;
import com.skyeye.common.object.InputObject;
import com.skyeye.common.object.OutputObject;
import net.sf.json.JSONArray;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName: CounterSignServiceImpl
......@@ -59,6 +61,9 @@ public class CounterSignServiceImpl implements CounterSignService {
@Autowired
private ActivitiTaskService activitiTaskService;
@Autowired
private ActivitiModelService activitiModelService;
/**
* 将 普通节点转换成为会签 任务
*
......@@ -67,12 +72,14 @@ public class CounterSignServiceImpl implements CounterSignService {
* @throws Exception
*/
@Override
@ActivitiAndBaseTransaction(value = {"activitiTransactionManager", "transactionManager"})
public void covertToMultiInstance(InputObject inputObject, OutputObject outputObject) throws Exception {
Map<String, Object> params = inputObject.getParams();
String taskId = params.get("taskId").toString();
boolean sequential = Boolean.parseBoolean(params.get("sequential").toString());
List<String> userIds = JSONArray.fromObject(params.get("userIds").toString());
this.covertToMultiInstance(taskId, sequential, userIds);
activitiModelService.queryProHighLighted(params.get("processInstanceId").toString());
}
/**
......@@ -93,7 +100,7 @@ public class CounterSignServiceImpl implements CounterSignService {
// 迭代集合
multiInstanceLoopCharacteristics.setElementVariable(assignee);
// 完成条件 已完成数等于实例数${nrOfActiveInstances == nrOfInstances}
multiInstanceLoopCharacteristics.setCompletionCondition("");
multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfActiveInstances == nrOfInstances}");
return multiInstanceLoopCharacteristics;
}
......@@ -194,8 +201,26 @@ public class CounterSignServiceImpl implements CounterSignService {
// 这里需要注意一下,当用户节点设置了多实例属性后,设置监听器时是设置executionListeners而不是taskListeners。
// 类要实现ExecutionListener或者JavaDelegate,普通用户节点实现TaskListener。
// 还有多实例属性中loopCardinality和inputDataItem两个必须设置一个,这个在部署流程似有校验
currentTaskNode.setExecutionListeners(Arrays.asList(new MultiInstanceloopListener()));
currentTaskNode.setExecutionListeners(this.getActivitiListener());
// 设置审批人
currentTaskNode.setCandidateUsers(userIds);
}
private List<ActivitiListener> getActivitiListener(){
List<ActivitiListener> activitiListener = new ArrayList<>();
Map<String, String> listeners = new HashMap<>();
// 完成时回调
listeners.put(ExecutionListener.EVENTNAME_TAKE, "com.skyeye.activiti.listener.MultiInstanceloopListener");
for (String key: listeners.keySet()) {
ActivitiListener listener = new ActivitiListener();
listener.setEvent(key);
// Spring配置以变量形式调用无法写入,只能通过继承TaskListener方法,
listener.setImplementationType("class");
listener.setImplementation(listeners.get(key));
activitiListener.add(listener);
}
return activitiListener;
}
}
......@@ -63,6 +63,12 @@
<url id="activitiProcess002" path="/post/ActivitiProcessController/nextPrcessApproverByProcessDefinitionKey" val="根据processDefinitionKey获取流程下一个用户节点的审批人" allUse="2" method="POST" groupName="工作流流程相关操作">
<property id="pageUrl" name="pageUrl" ref="required" var="流程实例的page_url参数"/>
</url>
<url id="activitiProcess003" path="/post/CounterSignController/covertToMultiInstance" val="将 普通节点转换成为会签 任务" allUse="2" method="POST" groupName="工作流流程相关操作">
<property id="processInstanceId" name="processInstanceId" ref="required" var="流程id"/>
<property id="taskId" name="taskId" ref="required" var="任务id"/>
<property id="sequential" name="sequential" ref="required" var="会签节点是否串行"/>
<property id="userIds" name="userIds" ref="required,json" var="会签人员id"/>
</url>
<!-- 工作流流程相关操作结束 -->
<!-- 工作流用户任务相关操作开始 -->
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册