activiti7驳回
时间: 2024-08-31 11:02:00 浏览: 85
ActiVity 7是一个轻量级、开源的业务流程管理平台,它基于Apache Camunda Engine构建,专注于简化企业的工作流和业务流程自动化。在ActiVity 7中,如果工作流程实例因为满足某些条件而无法完成,可能会遇到“驳回”(Rejection)的情况。
当用户在流程节点上触发一个操作(例如审批),如果审批失败或者不符合预设规则,流程会被系统自动驳回(通常会返回到先前的处理人或者特定状态)。这可能是由于提交的数据无效、权限不足或其他原因导致审批未能通过。开发者可以设置拒绝对策,比如记录拒绝原因、发送通知以及如何处理接下来的任务。在ActiVity Studio(流程设计器)中,你可以可视化地配置这些规则和驳回处理逻辑。
相关问题
activiti7 驳回 代码
您好,Activiti 7 中的驳回操作可以通过以下代码实现:
```java
public void rejectTask(String taskId) {
// 获取当前任务
Task task = taskService.createTaskQuery()
.taskId(taskId)
.singleResult();
if (task == null) {
throw new RuntimeException("任务不存在");
}
// 获取当前任务的流程实例
String processInstanceId = task.getProcessInstanceId();
// 获取当前任务的历史任务实例列表
List<HistoricTaskInstance> historicTaskList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceEndTime()
.asc()
.list();
// 获取需要驳回到的任务
HistoricTaskInstance targetTask = null;
for (int i = 0; i < historicTaskList.size(); i++) {
HistoricTaskInstance historicTask = historicTaskList.get(i);
if (historicTask.getId().equals(taskId)) {
if (i == 0) {
throw new RuntimeException("该任务已经是第一个任务,无法驳回");
}
targetTask = historicTaskList.get(i - 1);
break;
}
}
if (targetTask == null) {
throw new RuntimeException("未找到驳回目标任务");
}
// 驳回操作
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
Process process = bpmnModel.getProcesses().get(0);
FlowNode sourceNode = (FlowNode) process.getFlowElement(task.getTaskDefinitionKey());
FlowNode targetNode = (FlowNode) process.getFlowElement(targetTask.getTaskDefinitionKey());
List<Execution> executionList = runtimeService.createExecutionQuery()
.processInstanceId(processInstanceId)
.list();
for (Execution execution : executionList) {
if (execution instanceof ExecutionEntity) {
ExecutionEntity executionEntity = (ExecutionEntity) execution;
executionEntity.setCurrentFlowElement(sourceNode);
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(processInstanceId)
.moveExecutionToActivityId(executionEntity.getId(), targetNode.getId())
.changeState();
}
}
}
```
该代码实现了将当前任务驳回到上一步任务的操作,具体的实现过程请参考注释。需要注意的是,该代码中使用了 Activiti 7 中的一些 API,如 `BpmnModel`、`FlowNode` 等,如果您之前使用的是 Activiti 6,可能需要进行一些调整。
推荐好的activiti7驳回代码
以下是一个简单的activiti7驳回代码示例:
```java
public class RejectTaskCmd implements Command<Void> {
protected String taskId;
public RejectTaskCmd(String taskId) {
this.taskId = taskId;
}
@Override
public Void execute(CommandContext commandContext) {
TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
HistoricTaskInstanceEntityManager historicTaskInstanceEntityManager = commandContext.getHistoricTaskInstanceEntityManager();
Task task = taskEntityManager.findById(taskId);
if (task == null) {
throw new ActivitiObjectNotFoundException("Task not found with id " + taskId, Task.class);
}
// 获取上一步任务
String processInstanceId = task.getProcessInstanceId();
List<HistoricTaskInstance> historicTaskInstances = historicTaskInstanceEntityManager.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceEndTime()
.desc()
.list();
if (historicTaskInstances != null && historicTaskInstances.size() > 1) {
HistoricTaskInstance lastTask = historicTaskInstances.get(1);
if (lastTask != null) {
// 获取上一步任务的处理人
String assignee = lastTask.getAssignee();
if (StringUtils.isNotEmpty(assignee)) {
// 设置当前任务的处理人为上一步任务的处理人
task.setAssignee(assignee);
// 驳回任务到上一步任务的处理人
taskEntityManager.save(task);
// 记录任务的历史记录
CommentEntityManager commentEntityManager = commandContext.getCommentEntityManager();
CommentEntity comment = commentEntityManager.create();
comment.setUserId(Authentication.getAuthenticatedUserId());
comment.setType(CommentEntity.TYPE_EVENT);
comment.setTaskId(taskId);
comment.setAction("reject");
comment.setMessage("Task rejected to " + assignee);
commentEntityManager.insert(comment);
}
}
}
return null;
}
}
```
使用该代码,您可以获取上一步任务的处理人并将当前任务驳回到上一步任务的处理人。此外,该代码还记录了任务的历史记录。请注意,此代码仅供参考,并且可能需要根据您的具体业务需求进行调整。
阅读全文