update - 抄送逻辑配置解析,在审批日志中对抄送节点执行抄送人查询
This commit is contained in:
parent
d7e81bcfa5
commit
eddf76c0a0
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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)));
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
@ -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));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user