diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java index de438ca73..9b03f9f9c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCountersignUserTaskCmd.java @@ -15,17 +15,21 @@ import org.flowable.engine.TaskService; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.task.api.Task; +import org.flowable.task.api.TaskInfo; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static cn.axzo.workflow.common.constant.BpmnConstants.COUNTERSIGN_ASSIGNER_SHOW_NUMBER; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; @@ -105,26 +109,36 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand implemen //查询重复任务 List duplicatePendingTasks = getDuplicatePendingTasks(commandContext, task, targetTaskAssigneeList); - - switch (countersignType) { - case FORWARD_COUNTERSIGN: - // TODO - break; - case BACK_COUNTERSIGN: - // TODO - break; - default: - // share_counterSign - shareCountSign(commandContext, task); - break; + List valuaTargetAssigneeList; + if (CollectionUtils.isEmpty(duplicatePendingTasks)) { + valuaTargetAssigneeList = targetTaskAssigneeList; + } else { + valuaTargetAssigneeList = new ArrayList<>(); + Set duplicateAssigneeSet = duplicatePendingTasks.stream().map(TaskInfo::getAssignee).collect(Collectors.toSet()); + for (BpmnTaskDelegateAssigner assigner : targetTaskAssigneeList) { + if (!duplicateAssigneeSet.contains(assigner.buildAssigneeId())) { + valuaTargetAssigneeList.add(assigner); + } + } + } + //需要加签的 + if (CollectionUtils.isEmpty(valuaTargetAssigneeList)) { + switch (countersignType) { + case FORWARD_COUNTERSIGN: + // TODO + break; + case BACK_COUNTERSIGN: + // TODO + break; + default: + // share_counterSign + shareCountSign(commandContext, task, valuaTargetAssigneeList); + break; + } } - if (duplicatePendingTasks == null) { - duplicatePendingTasks = new ArrayList<>(); - } - duplicatePendingTasks.add(task); // 结束被多余任务 - deleteMultiTasks(commandContext, duplicatePendingTasks); + deleteMultiTasks(commandContext, Collections.singletonList(task)); return null; } @@ -134,7 +148,7 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand implemen * @param commandContext * @param taskEntity */ - private void shareCountSign(CommandContext commandContext, TaskEntity taskEntity) { + private void shareCountSign(CommandContext commandContext, TaskEntity taskEntity, List valuTargetAssigneeList) { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); @@ -143,21 +157,11 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand implemen INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + taskEntity.getTaskDefinitionKey(); List taskDelegateAssigners = processEngineConfiguration.getRuntimeService().getVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, List.class); - taskDelegateAssigners.addAll(targetTaskAssigneeList); - List resultAssignerList = new ArrayList<>(); - Set existAssignerIds = new HashSet<>(); - //去除重复assigner - for (BpmnTaskDelegateAssigner assigner : taskDelegateAssigners) { - if (existAssignerIds.contains(assigner.buildAssigneeId())) { - continue; - } - resultAssignerList.add(assigner); - existAssignerIds.add(assigner.buildAssigneeId()); - } - runtimeService.setVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, resultAssignerList); - log.info("正在进行加签任务:{},待加签人合并列表:{}", taskEntity.getId(), JSONUtil.toJsonStr(resultAssignerList)); + taskDelegateAssigners.addAll(valuTargetAssigneeList); + runtimeService.setVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, taskDelegateAssigners); + log.info("正在进行加签任务:{},待加签人合并列表:{}", taskEntity.getId(), JSONUtil.toJsonStr(taskDelegateAssigners)); - targetTaskAssigneeList.forEach(assigner -> CustomTaskHelper.addMultiTask(commandContext, taskEntity, assigner)); + taskDelegateAssigners.forEach(assigner -> CustomTaskHelper.addMultiTask(commandContext, taskEntity, assigner)); } private void resolveOriginTask(CommandContext commandContext, ExtAxHiTaskInstService extAxHiTaskInstService, diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java index b71dca1ce..8bed312b1 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java @@ -15,14 +15,15 @@ import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; @@ -99,16 +100,13 @@ public class CustomTransferUserTaskCmd extends AbstractCommand implements originTaskAssignee); List duplicatePendingTasks = getDuplicatePendingTasks(commandContext, task, Lists.newArrayList(targetTaskAssignee)); - // 生成转交任务 - addMultiTask(commandContext, task, targetTaskAssignee); - task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + task.getId(), TRANSFER.getStatus()); - - if (duplicatePendingTasks == null) { - duplicatePendingTasks = new ArrayList<>(); + //转交目标人不存在任务,再生成转交任务 + if (CollectionUtils.isEmpty(duplicatePendingTasks)) { + addMultiTask(commandContext, task, targetTaskAssignee); } - duplicatePendingTasks.add(task); + task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + task.getId(), TRANSFER.getStatus()); // 结束被转交任务 - deleteMultiTasks(commandContext, duplicatePendingTasks); + deleteMultiTasks(commandContext, Collections.singletonList(task)); return null; } @@ -130,17 +128,18 @@ public class CustomTransferUserTaskCmd extends AbstractCommand implements RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); List originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(), INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class); - List duplicateAssignerIds = originAssingeeList.stream() - .map(BpmnTaskDelegateAssigner::buildAssigneeId) - .filter(a -> Objects.equals(a, targetTaskAssignee.buildAssigneeId())) - .collect(Collectors.toList()); - duplicateAssignerIds.add(originTaskAssignee.buildAssigneeId()); List resultList = new ArrayList<>(); - resultList.add(targetTaskAssignee); + boolean containsTargetAssignee = false; for (BpmnTaskDelegateAssigner assigner : originAssingeeList) { - if (!duplicateAssignerIds.contains(assigner.buildAssigneeId())) { + if (!Objects.equals(assigner.buildAssigneeId(), originTaskAssignee.buildAssigneeId())) { resultList.add(assigner); } + if (Objects.equals(assigner.buildAssigneeId(), targetTaskAssignee.buildAssigneeId())) { + containsTargetAssignee = true; + } + } + if (!containsTargetAssignee) { + resultList.add(targetTaskAssignee); } runtimeService.setVariable(task.getProcessInstanceId(), INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),