update - 抄送逻辑配置解析,在审批日志中对抄送节点执行抄送人查询

This commit is contained in:
wangli 2024-03-18 20:49:50 +08:00
parent d7e81bcfa5
commit eddf76c0a0
4 changed files with 90 additions and 21 deletions

View File

@ -3,7 +3,9 @@ package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener;
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
@ -11,18 +13,29 @@ import org.flowable.bpmn.model.CustomProperty;
import org.flowable.bpmn.model.ServiceTask;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.runtime.Execution;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springframework.util.CollectionUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO;
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
import static cn.axzo.workflow.common.constant.BpmnConstants.OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
/**
@ -38,14 +51,20 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
private final List<BpmnCarbonCopyConf> carbons;
private final ServiceTask serviceTask;
private final EngineExecutionStartListener engineExecutionStartListener;
private final BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter;
private final String serviceVersion;
public CustomCarbonCopyUserTaskAssigneeCmd(String processInstanceId, List<BpmnCarbonCopyConf> carbons,
ServiceTask serviceTask,
EngineExecutionStartListener engineExecutionStartListener) {
EngineExecutionStartListener engineExecutionStartListener,
BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter,
String serviceVersion) {
this.processInstanceId = processInstanceId;
this.carbons = carbons;
this.serviceTask = serviceTask;
this.engineExecutionStartListener = engineExecutionStartListener;
this.historicTaskInstanceConverter = historicTaskInstanceConverter;
this.serviceVersion = serviceVersion;
}
@Override
@ -55,8 +74,8 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
}
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
List<Execution> list =
processEngineConfiguration.getRuntimeService().createExecutionQuery().processInstanceId(processInstanceId).list();
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
List<Execution> list = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list();
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
carbons.forEach(carbon -> {
CarbonCopyObjectType carbonCopyObjectType = carbon.getCarbonCopyObjectType();
@ -71,13 +90,16 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
property.setName(carbonCopyObjectType.getType());
property.setSimpleValue(carbon.getSpecifyValue());
serviceTask.setCustomProperties(Lists.newArrayList(property));
assigners.addAll(engineExecutionStartListener.approverSelect(carbonCopyObjectType.getSimpleType()
, serviceTask, (DelegateExecution) list.get(0), false));
assigners.addAll(engineExecutionStartListener.approverSelect(carbonCopyObjectType.getSimpleType(),
serviceTask, (DelegateExecution) list.get(0), false));
break;
case approver_relation:
getApproverRelationUser(carbon, carbonCopyObjectType, assigners, list);
assigners.addAll(getApproverRelationUser(carbon, carbonCopyObjectType,
(DelegateExecution) list.get(0),
processEngineConfiguration.getHistoryService(), processInstanceId));
break;
case specify_user:
assigners.addAll(JSON.parseArray(carbon.getSpecifyValue(), BpmnTaskDelegateAssigner.class));
break;
default:
break;
@ -86,10 +108,12 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
return removeDuplicateByPersonId(assigners);
}
private void getApproverRelationUser(BpmnCarbonCopyConf carbon,
CarbonCopyObjectType carbonCopyObjectType,
List<BpmnTaskDelegateAssigner> assigners,
List<Execution> list) {
private List<BpmnTaskDelegateAssigner> getApproverRelationUser(BpmnCarbonCopyConf carbon,
CarbonCopyObjectType carbonCopyObjectType,
DelegateExecution execution,
HistoryService historyService,
String processInstanceId) {
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
List<String> values = JSON.parseArray(carbon.getSpecifyValue(), String.class)
.stream().map(JSON::parseObject)
.map(i -> i.getString("value"))
@ -98,8 +122,46 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
CarbonCopyObjectType approverRelationConf = CarbonCopyObjectType.valueOfType(value);
switch (approverRelationConf) {
case initiator:
HistoricVariableInstance historicVariableInstance =
historyService.createHistoricVariableInstanceQuery()
.processInstanceId(processInstanceId)
.variableName(INTERNAL_INITIATOR)
.singleResult();
assigners.add((BpmnTaskDelegateAssigner) historicVariableInstance.getValue());
break;
case approver:
List<HistoricTaskInstance> taskInstances = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
// .includeProcessVariables()
.orderByHistoricTaskInstanceStartTime()
.desc().list();
List<BpmnHistoricTaskInstanceVO> vos =
historicTaskInstanceConverter.toVosSkipSystemOperation(taskInstances,
serviceVersion);
Map<String, HistoricVariableInstance> variableInstanceMap =
// 不能使用框架提供的历史变量 API 查询, BUG
historyService.createNativeHistoricVariableInstanceQuery()
.sql("select * from ACT_HI_VARINST t where t.proc_inst_id_= #{processInstanceId}")
.parameter("processInstanceId", processInstanceId)
.list().stream()
.collect(Collectors.toMap(HistoricVariableInstance::getVariableName,
Function.identity(),
(s, t) -> s));
vos.forEach(vo -> {
HistoricVariableInstance assginerSnapshot =
variableInstanceMap.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + vo.getTaskId(),
null);
if (Objects.isNull(assginerSnapshot)) {
assginerSnapshot =
variableInstanceMap.getOrDefault(OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskId(), null);
}
BpmnTaskDelegateAssigner assigner = Objects.nonNull(assginerSnapshot) ?
(BpmnTaskDelegateAssigner) assginerSnapshot.getValue() : null;
if (Objects.nonNull(assigner) && !Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
assigners.add(assigner);
}
});
// 历史真正有同意和驳回动作的人
break;
case ent_initiator_leader:
@ -110,12 +172,13 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
jsonObject.put("value", value);
property.setSimpleValue(JSON.toJSONString(Lists.newArrayList(jsonObject)));
serviceTask.setCustomProperties(Lists.newArrayList(property));
assigners.addAll(engineExecutionStartListener.approverSelect(carbonCopyObjectType.getSimpleType()
, serviceTask, (DelegateExecution) list.get(0), false));
assigners.addAll(engineExecutionStartListener.approverSelect(carbonCopyObjectType.getSimpleType(),
serviceTask, execution, false));
default:
break;
}
});
return assigners;
}

View File

@ -3,11 +3,10 @@ package cn.axzo.workflow.core.service.converter;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntityImpl;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
@ -52,7 +51,8 @@ public interface BpmnHistoricTaskInstanceConverter extends EntityConverter<BpmnH
default List<BpmnHistoricTaskInstanceVO> toVosSkipSystemOperation(List<HistoricTaskInstance> entities,
HistoricVariableInstance instanceVersion) {
// HistoricVariableInstance instanceVersion,
String instanceVersion) {
if (CollectionUtils.isEmpty(entities)) {
return Collections.emptyList();
}
@ -64,9 +64,8 @@ public interface BpmnHistoricTaskInstanceConverter extends EntityConverter<BpmnH
if (Objects.isNull(instanceVersion)) {
compatibleVersion(taskInstanceStream).forEach(i -> vos.add(toVo(i)));
} else {
if (instanceVersion instanceof HistoricVariableInstanceEntityImpl) {
String textValue = ((HistoricVariableInstanceEntityImpl) instanceVersion).getTextValue();
DefaultArtifactVersion version = new DefaultArtifactVersion(textValue);
if (StringUtils.hasText(instanceVersion)) {
DefaultArtifactVersion version = new DefaultArtifactVersion(instanceVersion);
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_130);
if (version.compareTo(supportVersion) < 0) {
compatibleVersion(taskInstanceStream).forEach(i -> vos.add(toVo(i)));

View File

@ -31,6 +31,7 @@ import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.CategoryService;
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
import cn.axzo.workflow.core.service.converter.BpmnHistoricProcessInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstanceAdminPageItemConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstancePageItemConverter;
@ -152,6 +153,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
private ExtAxHiTaskInstService extAxHiTaskInstService;
@Resource
private CategoryService categoryService;
@Resource
private BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter;
@Resource
private String serviceVersion;
@Override
public HistoricProcessInstance getProcessInstanceByBusinessKey(String businessKey, @Nullable String tenantId,
@ -801,8 +806,8 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
getCarbonCopyConfigs(serviceTask).ifPresent(carbons ->
node.setForecastAssigners(springProcessEngineConfiguration.getCommandExecutor()
.execute(new CustomCarbonCopyUserTaskAssigneeCmd(processInstanceId, carbons,
serviceTask,
engineExecutionStartListener))));
serviceTask, engineExecutionStartListener,
historicTaskInstanceConverter, serviceVersion))));
}
resultList.add(node);
});

View File

@ -66,6 +66,7 @@ import org.flowable.task.service.history.NativeHistoricTaskInstanceQuery;
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.flowable.variable.api.persistence.entity.VariableInstance;
import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntityImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@ -330,7 +331,8 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
HistoricVariableInstance instanceVersion = variableInstanceMap.getOrDefault(WORKFLOW_ENGINE_VERSION, null);
// 过滤了多实例或签自动完成的任务
List<BpmnHistoricTaskInstanceVO> vos = historicTaskInstanceConverter.toVosSkipSystemOperation(taskInstances,
instanceVersion);
Objects.isNull(instanceVersion) ? null :
((HistoricVariableInstanceEntityImpl) instanceVersion).getTextValue());
Map<String, List<Comment>> commentByTaskIdMap =
taskService.getProcessInstanceComments(processInstanceId).stream()
.collect(Collectors.groupingBy(Comment::getTaskId));