Skip to content

Commit

Permalink
fix: 完善多实例任务下节点跳转的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
Yiuman committed Nov 27, 2022
1 parent ffa23cb commit 5263e04
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<bpmn2:incoming>Flow_0uau85x</bpmn2:incoming>
<bpmn2:outgoing>Flow_0nh7vyp</bpmn2:outgoing>
<bpmn2:multiInstanceLoopCharacteristics
activiti:collection="${assignments.resolve(execution,'[{&#34;dimension&#34;:&#34;user&#34;,&#34;values&#34;:[&#34;c8274ade69fd496f915a568d86aae687&#34;,&#34;YvuYEvtWSLYjsKb3VlTEcxgbtPQC3pAK9D&#34;,&#34;YvuYEvtWSLYjsKb3VlTEcxgbtPQC3pAK9C&#34;]}]')}"
activiti:collection="${assignments.resolve(execution,'[{&#34;1&#34;:&#34;user&#34;,&#34;values&#34;:[&#34;1&#34;,&#34;2&#34;]}]')}"
activiti:elementVariable="assignee" />
</bpmn2:userTask>
</bpmn2:process>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import com.github.yiuman.citrus.workflow.cmd.AddMultiInstanceCmd;
import com.github.yiuman.citrus.workflow.model.impl.StartProcessModelImpl;
import com.github.yiuman.citrus.workflow.service.impl.WorkflowServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.commons.collections4.map.HashedMap;
import org.junit.jupiter.api.Assertions;
Expand All @@ -20,6 +22,7 @@
*/
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Slf4j
public class MultiInstanceTest {

public MultiInstanceTest() {
Expand All @@ -30,15 +33,23 @@ public void startProcess() {
WorkflowServiceImpl workflowService = SpringUtils.getBean(WorkflowServiceImpl.class, true);
StartProcessModelImpl startProcessModel = StartProcessModelImpl.builder().processDefineKey("test_multiple_claimed")
.userId("1")
.variables(new HashedMap<String, Object>() {{
.variables(new HashedMap<>() {{
put("test", "1");
}}).build();
ProcessInstance processInstance = workflowService.starProcess(startProcessModel);

log.info("PROCESSINSTANCEID:{}", processInstance.getProcessInstanceId());
Assertions.assertNotNull(processInstance);

}

@Test
public void completeTask() {
String taskId = "8f5cdc68-6e06-11ed-86e9-acde48001122";
WorkflowServiceImpl workflowService = SpringUtils.getBean(WorkflowServiceImpl.class, true);
TaskService taskService = workflowService.getProcessEngine().getTaskService();
taskService.complete(taskId);
}

@Test
public void addMultiInstance() {
WorkflowServiceImpl workflowService = SpringUtils.getBean(WorkflowServiceImpl.class, true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.yiuman.citrus.workflow.cmd;

import cn.hutool.core.util.StrUtil;
import com.github.yiuman.citrus.workflow.exception.WorkflowException;
import lombok.Builder;
import org.activiti.bpmn.model.FlowElement;
Expand All @@ -8,6 +9,7 @@
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ExecutionEntityManager;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;

import java.util.Objects;
Expand All @@ -31,16 +33,28 @@ public class JumpTaskCmd implements Command<Void> {
*/
private final String targetTaskKey;

private String reason;

public JumpTaskCmd(String executionId, String targetTaskKey) {
this.executionId = executionId;
this.targetTaskKey = targetTaskKey;
}

public JumpTaskCmd(String executionId, String targetTaskKey, String reason) {
this.executionId = executionId;
this.targetTaskKey = targetTaskKey;
this.reason = reason;
}

@Override
public Void execute(CommandContext commandContext) {

//1.找到当前执行实例
ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(executionId);
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
ExecutionEntity executionEntity = executionEntityManager.findById(executionId);
String parentExecutionId = executionEntity.getParentId();
if (StrUtil.isNotBlank(parentExecutionId) && !Objects.equals(parentExecutionId, executionEntity.getParentProcessInstanceId())) {
executionEntity = executionEntityManager.findById(parentExecutionId);
}
//2.找到当前的流程
Process process = ProcessDefinitionUtil.getProcess(executionEntity.getProcessDefinitionId());
FlowElement targetFlowElement = process.getFlowElement(targetTaskKey);
Expand All @@ -49,13 +63,13 @@ public Void execute(CommandContext commandContext) {
}

//3.将当前的执行实例活动删除,删除原因为jump
commandContext.getHistoryManager().recordActivityEnd(executionEntity, "jump");
commandContext.getHistoryManager().recordActivityEnd(executionEntity, reason);
//4.将目标节点设置到当前的执行实例中
executionEntity.setCurrentFlowElement(targetFlowElement);

//5.删除当前执行中的任务
commandContext.getTaskEntityManager().findTasksByExecutionId(executionId)
.forEach(task -> commandContext.getTaskEntityManager().deleteTask(task, "jump", false, true));
.forEach(task -> commandContext.getTaskEntityManager().deleteTask(task, reason, false, true));

//6.触发实例流转
ActivitiEngineAgenda agenda = commandContext.getAgenda();
Expand Down
1 change: 0 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@
<hutool.version>5.7.22</hutool.version>
<mybatis.plus.version>3.5.1</mybatis.plus.version>


<citrus.version>0.15.0</citrus.version>
<alibaba.easyexcel.version>3.0.5</alibaba.easyexcel.version>
<jjwt.version>0.11.0</jjwt.version>
Expand Down

0 comments on commit 5263e04

Please sign in to comment.