update - 切换记录任务关联的审批人的实现方式, 采用字符串直接存 act_hi_varinst 表.

This commit is contained in:
wangli 2024-04-08 17:14:04 +08:00
parent 21260d382b
commit d0c996bc56
8 changed files with 41 additions and 34 deletions

View File

@ -168,8 +168,31 @@ public class BpmnTaskDelegateAssigner implements Serializable {
.setTenantId(tenantId);
}
@Override
public String toString() {
public String toJson() {
return JSON.toJSONString(this);
}
/**
* 兼容版本间的不同类型转换成审批人模型
*
* @param request 目前存在两种类型,一种为 BpmnTaskDelegateAssigner 实例对象, 另一种为 String 类型的 JSON 数据
* @return
*/
public static BpmnTaskDelegateAssigner toObjectCompatible(Object request) {
if (Objects.isNull(request)) {
return null;
}
if (request instanceof BpmnTaskDelegateAssigner) {
return (BpmnTaskDelegateAssigner) request;
} else if (request instanceof String) {
return toObject((String) request);
} else {
return null;
}
}
public static BpmnTaskDelegateAssigner toObject(String jsonStr) {
return JSON.parseObject(jsonStr, BpmnTaskDelegateAssigner.class);
}
}

View File

@ -181,8 +181,7 @@ public class CustomCarbonCopyUserSelectorCmd implements Command<List<BpmnTaskDel
assginerSnapshot =
variableInstanceMap.getOrDefault(OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskId(), null);
}
BpmnTaskDelegateAssigner assigner = Objects.nonNull(assginerSnapshot) ?
(BpmnTaskDelegateAssigner) assginerSnapshot.getValue() : null;
BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(assginerSnapshot.getValue());
if (Objects.nonNull(assigner) && !Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
assigners.add(assigner);
}

View File

@ -20,7 +20,7 @@ import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEnt
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.variable.service.HistoricVariableService;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity;
import org.flowable.variable.service.impl.types.SerializableType;
import org.flowable.variable.service.impl.types.StringType;
import org.springframework.util.StringUtils;
import java.io.ByteArrayOutputStream;
@ -129,10 +129,9 @@ public class CustomCommentTaskCmd implements Command<Void>, Serializable {
historicVariableInstance.setExecutionId(task.getExecutionId());
historicVariableInstance.setProcessInstanceId(processInstance.getId());
historicVariableInstance.setName(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getId());
SerializableType variableType =
new SerializableType(processEngineConfiguration.isSerializableVariableTypeTrackDeserializedObjects());
StringType variableType = new StringType(processEngineConfiguration.getMaxLengthString());
historicVariableInstance.setVariableType(variableType);
historicVariableInstance.setBytes(objectToByteArray(operator));
historicVariableInstance.setTextValue(operator.toJson());
historicVariableInstance.setCreateTime(new Date());
historicVariableInstance.setLastUpdatedTime(new Date());
historicVariableService.insertHistoricVariableInstance(historicVariableInstance);

View File

@ -302,7 +302,7 @@ public class CustomTaskHelper {
task.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + task.getId(), extTaskInstStatus);
// 设置快照信息
task.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getId(), assigner);
task.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getId(), assigner.toJson());
// 完成临时节点
taskService.complete(task.getId());

View File

@ -386,8 +386,10 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
variableInstanceMap.getOrDefault(OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskId(), null);
}
BpmnTaskDelegateAssigner assigner = Objects.nonNull(assginerSnapshot) ?
(BpmnTaskDelegateAssigner) assginerSnapshot.getValue() : null;
BpmnTaskDelegateAssigner assigner = null;
if (Objects.nonNull(assginerSnapshot)) {
assigner = BpmnTaskDelegateAssigner.toObjectCompatible(assginerSnapshot.getValue());
}
if (Objects.nonNull(assigner) && !Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
vo.setAssigneeSnapshot(assigner);
}
@ -462,7 +464,7 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
vos.stream().map(i -> INTERNAL_TASK_RELATION_ASSIGNEE_INFO + i.getTaskId()).collect(Collectors.toList());
Map<String, VariableInstance> instanceMap = runtimeService.getVariableInstances(processInstanceId,
snapshotTaskIds);
vos.forEach(i -> i.setAssigner((BpmnTaskDelegateAssigner) instanceMap.get(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + i.getTaskId()).getValue()));
vos.forEach(i -> i.setAssigner(BpmnTaskDelegateAssigner.toObjectCompatible(instanceMap.get(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + i.getTaskId()).getValue())));
return vos;
}

View File

@ -82,7 +82,7 @@ public class AutoOperatorEvent_103_Listener implements BpmnTaskEventListener, Or
BpmnTaskDelegateAssigner initiator = delegateTask.getVariable(INTERNAL_INITIATOR,
BpmnTaskDelegateAssigner.class);
delegateTask.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId(),
initiator);
initiator.toJson());
delegateTask.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + delegateTask.getId(),
APPROVED.getStatus());
// 直接完成
@ -257,25 +257,9 @@ public class AutoOperatorEvent_103_Listener implements BpmnTaskEventListener, Or
private void autoPass(DelegateTask delegateTask) {
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
BpmnTaskDelegateAssigner assigner =
delegateTask.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId(),
BpmnTaskDelegateAssigner.class);
BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(
delegateTask.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId()));
commandExecutor.execute(new CustomApproveTaskCmd(delegateTask.getId(), null, "自动通过",
Collections.emptyList(), assigner, null));
// if (log.isDebugEnabled()) {
// log.debug("AutoOperatorEventListener#autoPass...{}", delegateTask.getTaskDefinitionKey());
// }
// taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(),
// COMMENT_TYPE_OPERATION_DESC,
// "自动通过");
// delegateTask.setTransientVariable(TASK_COMPLETE_OPERATION_TYPE + delegateTask.getId(), APPROVED
// .getStatus());
// taskService.complete(delegateTask.getId(), runtimeService.getVariables(delegateTask.getExecutionId
// ()));
// if (log.isDebugEnabled()) {
// log.debug("AutoOperatorEventListener#autoPass...end: {}", delegateTask.getTaskDefinitionKey());
// }
}
}

View File

@ -123,8 +123,8 @@ public class RocketMqBpmnTaskEvent_101_Listener implements BpmnTaskEventListener
.setCurrentElementName(delegateTask.getName())
.setProcessDefinitionId(delegateTask.getProcessDefinitionId())
.setInitiator(delegateTask.getVariable(INTERNAL_INITIATOR, BpmnTaskDelegateAssigner.class))
.setApprover(delegateTask.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId(),
BpmnTaskDelegateAssigner.class))
.setApprover(BpmnTaskDelegateAssigner.toObjectCompatible(
delegateTask.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId())))
.setVariables(delegateTask.getVariables())
.setStartTime(delegateTask.getCreateTime())
.setTenantId(delegateTask.getTenantId());

View File

@ -53,7 +53,7 @@ public class SnapshotBpmnTaskTaskEvent_100_Listener implements BpmnTaskEventList
.findFirst()
.ifPresent(i -> {
// 保存每个 taskId 的审批人
delegateTask.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId(), i);
delegateTask.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId(), i.toJson());
// 业务指定审批人时, 添加 operationDesc
if (Objects.equals(DUMMY_ASSIGNEE_ID, i.buildAssigneeId_1_2_1())) {
taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(),