仿钉钉流程设计- 新增会签时通过只需一人,拒绝需要所有人的处理

This commit is contained in:
jason
2024-06-06 09:51:02 +08:00
parent c87bea5a72
commit 1ec94e5bbc
5 changed files with 46 additions and 8 deletions

View File

@@ -474,7 +474,7 @@ public class SimpleModelUtils {
if (bpmApproveMethodEnum == BpmApproveMethodEnum.ALL_APPROVE) {
multiInstanceCharacteristics.setCompletionCondition(ALL_APPROVE_COMPLETE_EXPRESSION);
multiInstanceCharacteristics.setSequential(false);
} else if (bpmApproveMethodEnum == BpmApproveMethodEnum.ANY_OF_APPROVE) {
} else if (bpmApproveMethodEnum == BpmApproveMethodEnum.ANY_APPROVE) {
multiInstanceCharacteristics.setCompletionCondition(ANY_OF_APPROVE_COMPLETE_EXPRESSION);
multiInstanceCharacteristics.setSequential(false);
userTask.setLoopCharacteristics(multiInstanceCharacteristics);
@@ -483,7 +483,12 @@ public class SimpleModelUtils {
multiInstanceCharacteristics.setSequential(true);
multiInstanceCharacteristics.setLoopCardinality("1");
userTask.setLoopCharacteristics(multiInstanceCharacteristics);
} else if (bpmApproveMethodEnum == BpmApproveMethodEnum.ANY_APPROVE_ALL_REJECT) {
// 这种情况。拒绝任务时候,不会终止或者完成任务 参见 BpmTaskService#rejectTask 方法
multiInstanceCharacteristics.setCompletionCondition(ANY_OF_APPROVE_COMPLETE_EXPRESSION);
multiInstanceCharacteristics.setSequential(false);
}
// TODO 会签(按比例投票 )
userTask.setLoopCharacteristics(multiInstanceCharacteristics);
}

View File

@@ -34,6 +34,7 @@ import org.flowable.engine.HistoryService;
import org.flowable.engine.ManagementService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.DelegationState;
import org.flowable.task.api.Task;
@@ -337,7 +338,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
BpmCommentTypeEnum.REJECT.formatComment(reqVO.getReason()));
// 3.1 解析用户任务的拒绝处理类型
BpmnModel bpmnModel = bpmModelService.getBpmnModelByDefinitionId(task.getProcessDefinitionId());
FlowElement flowElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
UserTask flowElement = (UserTask) BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
Integer rejectHandlerType = NumberUtils.parseInt(BpmnModelUtils.parseExtensionElement(flowElement, USER_TASK_REJECT_HANDLER_TYPE));
BpmUserTaskRejectHandlerType userTaskRejectHandlerType = BpmUserTaskRejectHandlerType.typeOf(rejectHandlerType);
// 3.2 类型为驳回到指定的任务节点
@@ -350,6 +351,30 @@ public class BpmTaskServiceImpl implements BpmTaskService {
.setReason(reqVO.getReason());
returnTask(userId, returnReq);
return;
} else if (userTaskRejectHandlerType == BpmUserTaskRejectHandlerType.FINISH_PROCESS_BY_REJECT_RATIO) {
// 3.3 按拒绝人数比例终止流程
if(!flowElement.hasMultiInstanceLoopCharacteristics()) {
throw exception(TASK_REJECT_HANDLER_TYPE_BY_REJECT_RATIO_ERROR);
}
Execution execution = runtimeService.createExecutionQuery().processInstanceId(task.getProcessInstanceId())
.executionId(task.getExecutionId()).singleResult();
// 获取并行任务总数
Integer nrOfInstances = runtimeService.getVariable(execution.getParentId(), "nrOfInstances", Integer.class);
// 获取未完成任务列表
List<Task> taskList = getAssignedTaskListByConditions(task.getProcessInstanceId(), null, task.getTaskDefinitionKey());
// 获取已经拒绝的任务数
int rejectNumber = 0;
for (Task item : taskList) {
if (Objects.equals(BpmTaskStatusEnum.REJECT.getStatus(), FlowableUtils.getTaskStatus(item))) {
rejectNumber ++;
}
}
// 拒绝任务后,任务分配人清空。但不能完成任务
taskService.setAssignee(task.getId(), "");
// 不是所有人拒绝返回。 TODO 后续需要做按拒绝人数比例来判断
if(!Objects.equals(nrOfInstances, rejectNumber)) {
return;
}
}
// 3.3 其他情况 终止流程。 TODO 后续可能会增加处理类型
processInstanceService.updateProcessInstanceReject(instance.getProcessInstanceId(), reqVO.getReason());
@@ -431,8 +456,10 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return;
}
ProcessInstance processInstance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId()));
messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task));
if (processInstance != null) {
AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId()));
messageService.sendMessageWhenTaskAssigned(BpmTaskConvert.INSTANCE.convert(processInstance, startUser, task));
}
}
});