add - 转交和加签时,限制添加已在审批列表中的人

This commit is contained in:
wangli 2023-12-13 22:56:50 +08:00
parent aff7c15852
commit a8e40a6928
2 changed files with 31 additions and 7 deletions

View File

@ -59,6 +59,7 @@ public enum BpmnErrorCode implements IProjectRespCode {
TASK_REMIND_ERROR_NOT_EXISTS("06004", "当前审批节点没有待审批任务, 不能催办"),
ACTIVITY_TRIGGER_NOT_EXISTS("06005", "触发 ID:【{}】不存在"),
CALC_TASK_ASSIGNEE_ERROR("06006", "执行计算审批候选人出现异常: {}"),
ASSIGNEE_HAS_BEEN_EXISTS("06007", "你选择的人员已是审批人,请检查后提交"),
// ========== form Model 07-001 ==========
FORM_MODEL_NOT_EXISTS("07001", "表单模型不存在"),

View File

@ -82,6 +82,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -110,6 +111,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCES
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.TRANSFER;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.valueOfStatus;
import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.ASSIGNEE_HAS_BEEN_EXISTS;
import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.TASK_APOSTILLE_NOT_SUPPORT;
@ -428,13 +430,10 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
}
}
private void createSignSubTasksV2(BpmnTaskCountersignDTO countersignDTO, TaskEntity taskEntity) {
private void createSignSubTasksV2(BpmnTaskCountersignDTO countersignDTO, TaskEntity taskEntity, List<BpmnTaskDelegateAssigner> taskAssignerListSnapshot) {
// 这个节点下所有审批人快照
String activityListSnapshot =
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + taskEntity.getTaskDefinitionKey();
List<BpmnTaskDelegateAssigner> taskAssignerListSnapshot =
runtimeService.getVariable(taskEntity.getProcessInstanceId(),
activityListSnapshot, List.class);
taskAssignerListSnapshot.addAll(countersignDTO.getTargetAssignerList());
runtimeService.setVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, taskAssignerListSnapshot);
log.info("正在进行加签任务:{},待加签人合并列表:{}", taskEntity.getId(), JSONUtil.toJsonStr(taskAssignerListSnapshot));
@ -767,6 +766,13 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
public void transferTask(BpmnTaskAssigneeDTO dto) {
Task task = checkTask(dto.getOriginAssigner().buildAssigneeId(), dto.getTaskId());
List<BpmnTaskDelegateAssigner> originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
Optional<BpmnTaskDelegateAssigner> exists = originAssingeeList.stream().filter(i -> Objects.equals(i.buildAssigneeId(), dto.getTargetAssigner().buildAssigneeId())).findAny();
if (exists.isPresent()) {
throw new WorkflowEngineException(ASSIGNEE_HAS_BEEN_EXISTS);
}
task.setAssignee(TASK_ASSIGNEE_SKIP_FLAT);
((TaskEntity) task).setScopeType("TRANSFER");
taskService.saveTask(task);
@ -779,8 +785,6 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
}
Authentication.setAuthenticatedUserId(null);
List<BpmnTaskDelegateAssigner> originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
for (BpmnTaskDelegateAssigner assigner : originAssingeeList) {
if (Objects.equals(assigner.buildAssigneeId(), dto.getOriginAssigner().buildAssigneeId())) {
originAssingeeList.remove(assigner);
@ -823,6 +827,25 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
@Transactional(rollbackFor = Exception.class)
public void countersignTask(BpmnTaskCountersignDTO dto) {
Task task = checkTask(dto.getOriginAssigner().buildAssigneeId(), dto.getTaskId());
// 这个节点下所有审批人快照
String activityListSnapshot =
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey();
List<BpmnTaskDelegateAssigner> taskAssignerListSnapshot =
runtimeService.getVariable(task.getProcessInstanceId(),
activityListSnapshot, List.class);
AtomicInteger existsCount = new AtomicInteger();
taskAssignerListSnapshot.forEach(i -> {
dto.getTargetAssignerList().forEach(j -> {
if (Objects.equals(i.buildAssigneeId(), j.buildAssigneeId())) {
existsCount.getAndIncrement();
}
});
});
if (existsCount.intValue() > 0) {
throw new WorkflowEngineException(ASSIGNEE_HAS_BEEN_EXISTS);
}
if (BpmnCountersignType.isValidAppType(dto.getCountersignType()) != null) {
//加签不能改变BPMN2.0原流程定义因为下一个流程实例不需要加签
String parentTaskId = task.getParentTaskId();
@ -856,7 +879,7 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
//该父任务加签时会创建子任务用于分配给其他人加签
//目前多个子任务时会按照加签人的顺序依次进行加签操作
//例如 加签按顺序依次分配给ABC三人,需A任务进行完成后进行B任务再进行C任务
this.createSignSubTasksV2(dto, (TaskEntity) task);
this.createSignSubTasksV2(dto, (TaskEntity) task, taskAssignerListSnapshot);
} else {
throw new WorkflowEngineException(TASK_APOSTILLE_NOT_SUPPORT);
}