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

This commit is contained in:
wangli 2024-03-18 20:14:12 +08:00
parent dcdfe5f63d
commit d7e81bcfa5
25 changed files with 250 additions and 132 deletions

View File

@ -1,5 +1,8 @@
package cn.axzo.workflow.common.enums; package cn.axzo.workflow.common.enums;
import java.util.Arrays;
import java.util.Objects;
/** /**
* 审批人所在范围枚举 * 审批人所在范围枚举
* *
@ -37,4 +40,11 @@ public enum ApproverScopeEnum {
public boolean selectWorkspace() { public boolean selectWorkspace() {
return this == ApproverScopeEnum.projectWorkspace; return this == ApproverScopeEnum.projectWorkspace;
} }
public static ApproverScopeEnum valueOfProcessor(String processor) {
return Arrays.stream(ApproverScopeEnum.values())
.filter(i -> Objects.equals(i.getProcessor(), processor))
.findAny()
.orElse(null);
}
} }

View File

@ -11,30 +11,32 @@ import java.util.Objects;
*/ */
public enum CarbonCopyObjectType { public enum CarbonCopyObjectType {
ent_role("ent_role", "单位内指定角色", "entWorkspaceProcessor"), ent_role("ent_role", "role", "单位内指定角色", "entWorkspaceProcessor"),
ent_position("ent_position", "单位内指定岗位", "entWorkspaceProcessor"), ent_position("ent_position", "position", "单位内指定岗位", "entWorkspaceProcessor"),
ent_identity("ent_identity", "单位内指定身份", "entWorkspaceProcessor"), ent_identity("ent_identity", "identity", "单位内指定身份", "entWorkspaceProcessor"),
project_role("project_role", "项目部内指定角色", "projectWorkspaceProcessor"), project_role("project_role", "role", "项目部内指定角色", "projectWorkspaceProcessor"),
project_position("project_position", "项目部内指定岗位", "projectWorkspaceProcessor"), project_position("project_position", "position", "项目部内指定岗位", "projectWorkspaceProcessor"),
project_identity("project_identity", "项目部内指定身份", "projectWorkspaceProcessor"), project_identity("project_identity", "identity", "项目部内指定身份", "projectWorkspaceProcessor"),
specify_user("specify_user", "指定人员", "common"), specify_user("specify_user", "specify_user", "指定人员", "common"),
// initiator("initiator", "发起人"), approver_relation("approver_relation", "approver_relation", "审批相关人员", "common"),
// approver("approver", "审批人"), // 以下 4 个是 approver_relation 的选项值
// ent_initiator_leader("ent_initiator_leader", "单位内发起人主管"), initiator("initiator", "initiator", "发起人", "common"),
// project_initiator_leader("project_initiator_leader", "项目部内发起人主管"), approver("approver", "approver", "审批人", "common"),
ent_initiator_leader("ent_initiator_leader", "initiatorLeader", "单位内发起人主管", "entWorkspaceProcessor"),
approve_relation("approve_relation", "审批相关人员", "common"), project_initiator_leader("project_initiator_leader", "initiatorLeader", "项目部内发起人主管", "projectWorkspaceProcessor"),
; ;
private String type; private String type;
private String simpleType;
private String desc; private String desc;
private String processor; private String processor;
CarbonCopyObjectType(String type, String desc, String processor) { CarbonCopyObjectType(String type, String simpleType, String desc, String processor) {
this.type = type; this.type = type;
this.simpleType = simpleType;
this.desc = desc; this.desc = desc;
this.processor = processor; this.processor = processor;
} }
@ -47,6 +49,14 @@ public enum CarbonCopyObjectType {
this.type = type; this.type = type;
} }
public String getSimpleType() {
return simpleType;
}
public void setSimpleType(String simpleType) {
this.simpleType = simpleType;
}
public String getDesc() { public String getDesc() {
return desc; return desc;
} }
@ -69,4 +79,5 @@ public enum CarbonCopyObjectType {
.findAny() .findAny()
.orElse(null); .orElse(null);
} }
} }

View File

@ -30,7 +30,7 @@ public class BpmnCarbonCopyConf implements Serializable {
private CarbonCopyObjectType carbonCopyObjectType; private CarbonCopyObjectType carbonCopyObjectType;
/** /**
* 具体的对象值, JSON 格式的字符串: "[{}, {}]" * 具体的对象值, JSON 格式的字符串: "[{'name': '', value: ''},{},{},{}, {}]"
*/ */
private String specifyValue; private String specifyValue;

View File

@ -88,7 +88,7 @@ public class ProcessInstanceDTO implements Serializable {
/** /**
* 取消流程实例的特殊字段 * 取消流程实例的特殊字段
*/ */
private String cancelReason; private String reason;
/** /**
* 模型对应的通知模板配置信息 * 模型对应的通知模板配置信息

View File

@ -300,25 +300,25 @@ public final class BpmnMetaParserHelper {
return Optional.ofNullable(elements.get(0)); return Optional.ofNullable(elements.get(0));
} }
public static Optional<UserTask> getPreNode(FlowElement userTask, DelegateExecution execution, public static Optional<UserTask> getPreNode(FlowElement flowElement, DelegateExecution execution,
BpmnModel bpmnModel) { BpmnModel bpmnModel) {
if (Objects.isNull(bpmnModel)) { if (Objects.isNull(bpmnModel)) {
bpmnModel = ProcessDefinitionUtil.getBpmnModel(execution.getProcessDefinitionId()); bpmnModel = ProcessDefinitionUtil.getBpmnModel(execution.getProcessDefinitionId());
} }
if (userTask instanceof UserTask) { if (flowElement instanceof UserTask) {
UserTask task = (UserTask) userTask; UserTask task = (UserTask) flowElement;
if (CollectionUtils.isEmpty(task.getIncomingFlows())) { if (CollectionUtils.isEmpty(task.getIncomingFlows())) {
return Optional.empty(); return Optional.empty();
} }
//preNode //preNode
FlowElement flowElement = bpmnModel.getFlowElement(task.getIncomingFlows().get(0).getSourceRef()); FlowElement preFlowElement = bpmnModel.getFlowElement(task.getIncomingFlows().get(0).getSourceRef());
if (Objects.isNull(flowElement)) { if (Objects.isNull(preFlowElement)) {
return Optional.empty(); return Optional.empty();
} else if (!(flowElement instanceof UserTask)) { } else if (!(preFlowElement instanceof UserTask)) {
return getPreNode(flowElement, execution, bpmnModel); return getPreNode(preFlowElement, execution, bpmnModel);
} else { } else {
return Optional.of((UserTask) flowElement); return Optional.of((UserTask) preFlowElement);
} }
} }
return Optional.empty(); return Optional.empty();

View File

@ -1,7 +1,7 @@
package cn.axzo.workflow.core.deletage; package cn.axzo.workflow.core.deletage;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import java.util.Collections; import java.util.Collections;
@ -25,12 +25,12 @@ public interface BpmnTaskAssigneeSelector {
/** /**
* 查询具体审批人 * 查询具体审批人
*/ */
List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, Boolean throwException); List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException);
/** /**
* 审批人筛选项获取类型 * 审批人筛选项获取类型
*/ */
default List<String> getTypes(UserTask userTask) { default List<String> getTypes(FlowElement flowElement) {
return Collections.emptyList(); return Collections.emptyList();
} }
} }

View File

@ -2,7 +2,7 @@ package cn.axzo.workflow.core.deletage;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -45,12 +45,12 @@ public class MockTaskAssigneeSelector implements BpmnTaskAssigneeSelector {
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
List<BpmnTaskDelegateAssigner> users = new ArrayList<>(); List<BpmnTaskDelegateAssigner> users = new ArrayList<>();
// 优先读取 Nacos 配置 // 优先读取 Nacos 配置
firstParseNacos(userTask, execution, users); firstParseNacos(flowElement, execution, users);
if (!CollectionUtils.isEmpty(users)) { if (!CollectionUtils.isEmpty(users)) {
return users; return users;
} }
@ -67,11 +67,12 @@ public class MockTaskAssigneeSelector implements BpmnTaskAssigneeSelector {
return users; return users;
} }
private void firstParseNacos(UserTask userTask, DelegateExecution execution, List<BpmnTaskDelegateAssigner> users) { private void firstParseNacos(FlowElement flowElement, DelegateExecution execution,
List<BpmnTaskDelegateAssigner> users) {
if (global) { if (global) {
users.addAll(assigneeMap.getOrDefault(userTask.getId(), Collections.emptyList())); users.addAll(assigneeMap.getOrDefault(flowElement.getId(), Collections.emptyList()));
} else if (Objects.equals(category, execution.getProcessDefinitionId().split(":")[0])) { } else if (Objects.equals(category, execution.getProcessDefinitionId().split(":")[0])) {
users.addAll(assigneeMap.getOrDefault(userTask.getId(), Collections.emptyList())); users.addAll(assigneeMap.getOrDefault(flowElement.getId(), Collections.emptyList()));
} }
} }
} }

View File

@ -1,6 +1,6 @@
package cn.axzo.workflow.core.deletage.approverscope; package cn.axzo.workflow.core.deletage.approverscope;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
/** /**
@ -10,7 +10,7 @@ import org.flowable.engine.delegate.DelegateExecution;
*/ */
public interface ApproverScopeProcessor { public interface ApproverScopeProcessor {
default ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) { default ApproverScopeDTO build(FlowElement flowElement, DelegateExecution execution) {
return ApproverScopeDTO.builder().build(); return ApproverScopeDTO.builder().build();
} }
} }

View File

@ -4,7 +4,7 @@ import cn.axzo.workflow.common.enums.WorkspaceType;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO; import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO.OrgScope; import cn.axzo.workflow.common.model.dto.CooperationOrgDTO.OrgScope;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -26,7 +26,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
public class EntWorkspaceProcessor implements ApproverScopeProcessor { public class EntWorkspaceProcessor implements ApproverScopeProcessor {
@Override @Override
public ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) { public ApproverScopeDTO build(FlowElement flowElement, DelegateExecution execution) {
// 获取组织信息 // 获取组织信息
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION); CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
ApproverScopeDTO build = ApproverScopeDTO.builder().build(); ApproverScopeDTO build = ApproverScopeDTO.builder().build();

View File

@ -6,6 +6,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -26,8 +27,8 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_R
public class PreTaskUserProcessor implements ApproverScopeProcessor { public class PreTaskUserProcessor implements ApproverScopeProcessor {
@Override @Override
public ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) { public ApproverScopeDTO build(FlowElement flowElement, DelegateExecution execution) {
Optional<UserTask> preUserTaskOpt = BpmnMetaParserHelper.getPreNode(userTask, execution, null); Optional<UserTask> preUserTaskOpt = BpmnMetaParserHelper.getPreNode(flowElement, execution, null);
if (!preUserTaskOpt.isPresent()) { if (!preUserTaskOpt.isPresent()) {
log.info("the current node has no pre node, skip"); log.info("the current node has no pre node, skip");
return ApproverScopeDTO.builder().build(); return ApproverScopeDTO.builder().build();

View File

@ -4,7 +4,7 @@ import cn.axzo.workflow.common.enums.WorkspaceType;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO; import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO.OrgScope; import cn.axzo.workflow.common.model.dto.CooperationOrgDTO.OrgScope;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -24,7 +24,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
public class ProjectWorkspaceProcessor implements ApproverScopeProcessor { public class ProjectWorkspaceProcessor implements ApproverScopeProcessor {
@Override @Override
public ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) { public ApproverScopeDTO build(FlowElement flowElement, DelegateExecution execution) {
// 发起项目部 // 发起项目部
CooperationOrgDTO orgDTO =(CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION); CooperationOrgDTO orgDTO =(CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
if (Objects.isNull(orgDTO)) { if (Objects.isNull(orgDTO)) {

View File

@ -4,14 +4,26 @@ import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf; 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.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener; import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import org.flowable.bpmn.model.CustomProperty;
import org.flowable.bpmn.model.ServiceTask; import org.flowable.bpmn.model.ServiceTask;
import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.common.engine.impl.interceptor.CommandContext;
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.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
/** /**
* 抄送节点,计算全量被抄送人,并主动去重 * 抄送节点,计算全量被抄送人,并主动去重
@ -41,24 +53,70 @@ public class CustomCarbonCopyUserTaskAssigneeCmd implements Command<List<BpmnTas
if (CollectionUtils.isEmpty(carbons)) { if (CollectionUtils.isEmpty(carbons)) {
return Collections.emptyList(); return Collections.emptyList();
} }
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
List<Execution> list =
processEngineConfiguration.getRuntimeService().createExecutionQuery().processInstanceId(processInstanceId).list();
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
carbons.forEach(carbon -> { carbons.forEach(carbon -> {
CarbonCopyObjectType carbonCopyObjectType = carbon.getCarbonCopyObjectType(); CarbonCopyObjectType carbonCopyObjectType = carbon.getCarbonCopyObjectType();
switch (carbonCopyObjectType) { switch (carbonCopyObjectType) {
case ent_role: case ent_role:
case ent_identity: case ent_identity:
case ent_position: case ent_position:
break;
case project_role: case project_role:
case project_identity: case project_identity:
case project_position: case project_position:
CustomProperty property = new CustomProperty();
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));
break;
case approver_relation:
getApproverRelationUser(carbon, carbonCopyObjectType, assigners, list);
break; break;
case approve_relation:
case specify_user: case specify_user:
break; break;
default: default:
break; break;
} }
}); });
return Collections.emptyList(); return removeDuplicateByPersonId(assigners);
} }
private void getApproverRelationUser(BpmnCarbonCopyConf carbon,
CarbonCopyObjectType carbonCopyObjectType,
List<BpmnTaskDelegateAssigner> assigners,
List<Execution> list) {
List<String> values = JSON.parseArray(carbon.getSpecifyValue(), String.class)
.stream().map(JSON::parseObject)
.map(i -> i.getString("value"))
.collect(Collectors.toList());
values.forEach(value -> {
CarbonCopyObjectType approverRelationConf = CarbonCopyObjectType.valueOfType(value);
switch (approverRelationConf) {
case initiator:
break;
case approver:
// 历史真正有同意和驳回动作的人
break;
case ent_initiator_leader:
case project_initiator_leader:
CustomProperty property = new CustomProperty();
property.setName(approverRelationConf.getType());
JSONObject jsonObject = new JSONObject();
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));
default:
break;
}
});
}
} }

View File

@ -14,6 +14,7 @@ import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
@ -202,10 +203,11 @@ public class EngineExecutionStartListener implements ExecutionListener {
* 根据审批人指定类型查询审批人 * 根据审批人指定类型查询审批人
* *
* @param type "审批人指定"方式 {@link ApproverSpecifyEnum} * @param type "审批人指定"方式 {@link ApproverSpecifyEnum}
* @param userTask 当前节点, 这个对象会包含配置元数据, 可以在该方法中或者基于 BpmnTaskAssigneeSelector 建一个抽象类, 做解析元数据公共方法 * @param flowElement 当前节点, 这个对象会包含配置元数据, 可以在该方法中或者基于 BpmnTaskAssigneeSelector 建一个抽象类, 做解析元数据公共方法
* @return * @return
*/ */
public List<BpmnTaskDelegateAssigner> approverSelect(String type, UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> approverSelect(String type, FlowElement flowElement,
DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>(); List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
@ -236,13 +238,13 @@ public class EngineExecutionStartListener implements ExecutionListener {
log.debug("当前系统 Nacos 配置中开启了 mock: {}, 将使用 mock 方式查找审批人", mock); log.debug("当前系统 Nacos 配置中开启了 mock: {}, 将使用 mock 方式查找审批人", mock);
} }
assigners.addAll(new MockTaskAssigneeSelector(assigneeMap, global, category) assigners.addAll(new MockTaskAssigneeSelector(assigneeMap, global, category)
.select(userTask, execution, throwException)); .select(flowElement, execution, throwException));
} else { } else {
selectors.forEach(select -> { selectors.forEach(select -> {
if (select.support(type)) { if (select.support(type)) {
log.info("审批任务节点 Id:{}, Name: {}, 审批人指定枚举: {}", userTask.getId(), userTask.getName(), type); log.info("审批任务节点 Id:{}, Name: {}, 审批人指定枚举: {}", flowElement.getId(), flowElement.getName(), type);
List<BpmnTaskDelegateAssigner> selected = select.select(userTask, execution, throwException); List<BpmnTaskDelegateAssigner> selected = select.select(flowElement, execution, throwException);
log.info("审批任务节点 Id:{} 的审批人集合为: {}", userTask.getId(), JSON.toJSONString(selected)); log.info("审批任务节点 Id:{} 的审批人集合为: {}", flowElement.getId(), JSON.toJSONString(selected));
assigners.addAll(selected); assigners.addAll(selected);
} }
}); });

View File

@ -21,6 +21,7 @@ import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery; import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -110,6 +111,7 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void updateProcessDefinition(BpmnProcessDefinitionUpdateDTO dto) { public void updateProcessDefinition(BpmnProcessDefinitionUpdateDTO dto) {
Model model = repositoryService.getModel(dto.getProcessModelId()); Model model = repositoryService.getModel(dto.getProcessModelId());
if (Objects.isNull(model)) { if (Objects.isNull(model)) {

View File

@ -392,7 +392,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
baseQuerySql.append(")"); baseQuerySql.append(")");
} }
if (StringUtils.isNotBlank(dto.getBusinessStatus())) { if (StringUtils.isNotBlank(dto.getBusinessStatus())) {
baseQuerySql.append(" AND RES.BUSINESS_STATUS_ = #{businessStatus}'"); baseQuerySql.append(" AND RES.BUSINESS_STATUS_ = #{businessStatus}");
query.parameter("businessStatus", dto.getBusinessStatus()); query.parameter("businessStatus", dto.getBusinessStatus());
} }
if (Objects.nonNull(dto.getStartTime()) && Objects.nonNull(dto.getEndTime())) { if (Objects.nonNull(dto.getStartTime()) && Objects.nonNull(dto.getEndTime())) {

View File

@ -1,6 +1,8 @@
package cn.axzo.workflow.server.controller.delegate; package cn.axzo.workflow.server.controller.delegate;
import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
@ -14,6 +16,9 @@ import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.CustomProperty;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.ServiceTask;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
@ -23,9 +28,9 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StopWatch; import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -47,40 +52,50 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
private EngineExecutionStartListener executionStartListener; private EngineExecutionStartListener executionStartListener;
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
List<BpmnTaskDelegateAssigner> assigners = List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
(List<BpmnTaskDelegateAssigner>) BpmnMetaParserHelper.getApproverScope(userTask) if (flowElement instanceof UserTask) {
.map(approverScopeEnum -> { assigners.addAll(BpmnMetaParserHelper.getApproverScope((UserTask) flowElement)
if (Objects.isNull(approverScopeEnum.getProcessor())) { .map(approverScopeEnum -> privateSelector(approverScopeEnum, flowElement, execution,
return Collections.emptyList(); throwException))
.orElseGet(Collections::emptyList));
} else if (flowElement instanceof ServiceTask) {
List<CustomProperty> customProperties = ((ServiceTask) flowElement).getCustomProperties();
if (!CollectionUtils.isEmpty(customProperties)) {
String processor = CarbonCopyObjectType.valueOfType(customProperties.get(0).getName()).getProcessor();
assigners.addAll(privateSelector(ApproverScopeEnum.valueOfProcessor(processor), flowElement,
execution, throwException));
} }
ApproverScopeProcessor processor = }
applicationContext.getBean(approverScopeEnum.getProcessor(), return assigners.stream().filter(i -> StringUtils.hasText(i.getPersonId())).collect(Collectors.toList());
}
private List<BpmnTaskDelegateAssigner> privateSelector(ApproverScopeEnum processorType, FlowElement flowElement,
DelegateExecution execution, Boolean throwException) {
ApproverScopeProcessor processor = applicationContext.getBean(processorType.getProcessor(),
ApproverScopeProcessor.class); ApproverScopeProcessor.class);
ApproverScopeDTO scopeDto = processor.build(userTask, execution); ApproverScopeDTO scopeDto = processor.build(flowElement, execution);
if (CollectionUtils.isEmpty(scopeDto.getOrgScopes()) if (CollectionUtils.isEmpty(scopeDto.getOrgScopes())
&& CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes())) { && CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes())) {
if (throwException) { if (throwException) {
throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, userTask.getId(), throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, flowElement.getId(),
approverScopeEnum.getDesc()); processorType.getDesc());
} }
} }
try { try {
return invokeService(userTask, execution, scopeDto); return invokeService(flowElement, execution, scopeDto);
} catch (Throwable t) { } catch (Throwable t) {
if (throwException) { if (throwException) {
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, userTask.getId(), throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
this.getType(), t.getMessage()); this.getType(), t.getMessage());
} else { } else {
return Collections.emptyList(); return Collections.emptyList();
} }
} }
}).orElseGet(Collections::emptyList);
return assigners.stream().filter(i -> StringUtils.hasText(i.getPersonId())).collect(Collectors.toList());
} }
protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution, protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) { ApproverScopeDTO scopeDto) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -97,7 +112,8 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
JSONUtil.toJsonStr(result)); JSONUtil.toJsonStr(result));
try { try {
if (stopWatch.getTotalTimeSeconds() > executionStartListener.getApiTimeout()) { if (stopWatch.getTotalTimeSeconds() > executionStartListener.getApiTimeout()) {
DingTalkUtils.sendDingTalkForSlowUrl(applicationContext.getEnvironment().getProperty("spring.profiles.active"), DingTalkUtils.sendDingTalkForSlowUrl(applicationContext.getEnvironment()
.getProperty("spring.profiles.active"),
stopWatch.getTotalTimeSeconds(), stopWatch.getTotalTimeSeconds(),
extInfo, extInfo,
param, param,
@ -115,14 +131,27 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
} }
@Override @Override
public List<String> getTypes(UserTask userTask) { public List<String> getTypes(FlowElement flowElement) {
// 默认解析格式[{"name":"预算员", "value":"xxxx"}] // 默认解析格式[{"name":"预算员", "value":"xxxx"}]
try { try {
return BpmnMetaParserHelper.getApproverSpecifyValue(userTask) if (flowElement instanceof UserTask) {
return BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement)
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject) .map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
.map(i -> i.getString("value")) .map(i -> i.getString("value"))
.collect(Collectors.toList())) .collect(Collectors.toList()))
.orElse(Collections.emptyList()); .orElse(Collections.emptyList());
} else if (flowElement instanceof ServiceTask) {
List<CustomProperty> customProperties = ((ServiceTask) flowElement).getCustomProperties();
if (CollectionUtils.isEmpty(customProperties)) {
return Collections.emptyList();
}
return JSON.parseArray(customProperties.get(0).getSimpleValue(), String.class)
.stream().map(JSON::parseObject)
.map(i -> i.getString("value"))
.collect(Collectors.toList());
} else {
return Collections.emptyList();
}
} catch (Exception e) { } catch (Exception e) {
throw new WorkflowEngineException(CONVERTOR_META_DATA_FORMAT_ERROR, "AbstractBpmnTaskAssigneeSelector" + throw new WorkflowEngineException(CONVERTOR_META_DATA_FORMAT_ERROR, "AbstractBpmnTaskAssigneeSelector" +
"#getTypes", e.getMessage()); "#getTypes", e.getMessage());

View File

@ -4,6 +4,7 @@ import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -30,10 +31,13 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>(); List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
BpmnMetaParserHelper.getApproverSpecifyValue(userTask) if (!(flowElement instanceof UserTask)) {
return super.select(flowElement, execution, throwException);
}
BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement)
.ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class))); .ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class)));
return assigners; return assigners;
} }

View File

@ -10,7 +10,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -42,13 +42,13 @@ public class BasedIdentityTaskAssigneeSelector extends AbstractBpmnTaskAssigneeS
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
return super.select(userTask, execution, throwException); return super.select(flowElement, execution, throwException);
} }
@Override @Override
protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution, protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) { ApproverScopeDTO scopeDto) {
ListFlowTaskAssignerReq req = ListFlowTaskAssignerReq.builder() ListFlowTaskAssignerReq req = ListFlowTaskAssignerReq.builder()
.orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() .orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream()
@ -57,16 +57,16 @@ public class BasedIdentityTaskAssigneeSelector extends AbstractBpmnTaskAssigneeS
.workerTeamScopes(ListUtils.emptyIfNull(scopeDto.getWorkerTeamScopes()).stream() .workerTeamScopes(ListUtils.emptyIfNull(scopeDto.getWorkerTeamScopes()).stream()
.map(w -> BeanUtil.copyProperties(w, ListFlowTaskAssignerReq.OrgScope.class)) .map(w -> BeanUtil.copyProperties(w, ListFlowTaskAssignerReq.OrgScope.class))
.collect(Collectors.toList())) .collect(Collectors.toList()))
.identityCodes(super.getTypes(userTask)) .identityCodes(super.getTypes(flowElement))
.build(); .build();
List<FlowTaskAssignerResp> flowTaskAssigners = List<FlowTaskAssignerResp> flowTaskAssigners =
parseApiResult(() -> flowSupportApi.listTaskAssignerByIdentity(req), parseApiResult(() -> flowSupportApi.listTaskAssignerByIdentity(req),
"审批节点: " + userTask.getId() + ", 通过身份查询审批人", "审批节点: " + flowElement.getId() + ", 通过身份查询审批人",
"cn.axzo.karma.client.feign.FlowSupportApi.listTaskAssignerByIdentity", req); "cn.axzo.karma.client.feign.FlowSupportApi.listTaskAssignerByIdentity", req);
if (CollUtil.isEmpty(flowTaskAssigners)) { if (CollUtil.isEmpty(flowTaskAssigners)) {
return super.invokeService(userTask, execution, scopeDto); return super.invokeService(flowElement, execution, scopeDto);
} }
return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class); return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class);
} }

View File

@ -3,7 +3,7 @@ package cn.axzo.workflow.server.controller.delegate;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -32,7 +32,7 @@ public class BasedInitiatorLeaderRecursionTaskAssigneeSelector extends AbstractB
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
throw new WorkflowEngineException(ENGINE_USER_TASK_TYPE_NOT_SUPPORT); throw new WorkflowEngineException(ENGINE_USER_TASK_TYPE_NOT_SUPPORT);
} }

View File

@ -11,7 +11,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -46,19 +46,19 @@ public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAs
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
return super.select(userTask, execution, throwException); return super.select(flowElement, execution, throwException);
} }
@Override @Override
protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution, protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) { ApproverScopeDTO scopeDto) {
// 获取发起人 // 获取发起人
BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner initiator =
(BpmnTaskDelegateAssigner) execution.getVariables().getOrDefault(INTERNAL_INITIATOR, null); (BpmnTaskDelegateAssigner) execution.getVariables().getOrDefault(INTERNAL_INITIATOR, null);
if (Objects.isNull(initiator)) { if (Objects.isNull(initiator)) {
return super.invokeService(userTask, execution, scopeDto); return super.invokeService(flowElement, execution, scopeDto);
} }
FlowTaskAssignerReq req = FlowTaskAssignerReq.builder() FlowTaskAssignerReq req = FlowTaskAssignerReq.builder()
.orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() .orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream()
@ -71,11 +71,11 @@ public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAs
List<FlowTaskAssigner> flowTaskAssigners = List<FlowTaskAssigner> flowTaskAssigners =
parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req), parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req),
"审批节点: " + userTask.getId() + ", 通过发起人主管查询审批人", "审批节点: " + flowElement.getId() + ", 通过发起人主管查询审批人",
"cn.axzo.maokai.api.client.OrganizationalNodeUserApi.listFlowTaskAssigner", req); "cn.axzo.maokai.api.client.OrganizationalNodeUserApi.listFlowTaskAssigner", req);
if (CollUtil.isEmpty(flowTaskAssigners)) { if (CollUtil.isEmpty(flowTaskAssigners)) {
return super.invokeService(userTask, execution, scopeDto); return super.invokeService(flowElement, execution, scopeDto);
} }
return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class); return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class);
} }

View File

@ -10,7 +10,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -42,28 +42,28 @@ public class BasedPositionTaskAssigneeSelector extends AbstractBpmnTaskAssigneeS
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
return super.select(userTask, execution, throwException); return super.select(flowElement, execution, throwException);
} }
@Override @Override
protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution, protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) { ApproverScopeDTO scopeDto) {
FlowTaskAssignerReq req = FlowTaskAssignerReq.builder() FlowTaskAssignerReq req = FlowTaskAssignerReq.builder()
.orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() .orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream()
.map(e -> BeanUtil.copyProperties(e, FlowTaskAssignerReq.OrgScope.class)) .map(e -> BeanUtil.copyProperties(e, FlowTaskAssignerReq.OrgScope.class))
.collect(Collectors.toList())) .collect(Collectors.toList()))
.jobCodes(super.getTypes(userTask)) .jobCodes(super.getTypes(flowElement))
.build(); .build();
List<FlowTaskAssigner> flowTaskAssigners = List<FlowTaskAssigner> flowTaskAssigners =
parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req), parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req),
"审批节点: " + userTask.getId() + ", 通过岗位查询审批人", "审批节点: " + flowElement.getId() + ", 通过岗位查询审批人",
"cn.axzo.maokai.api.client.OrganizationalNodeUserApi.listFlowTaskAssigner", req); "cn.axzo.maokai.api.client.OrganizationalNodeUserApi.listFlowTaskAssigner", req);
if (CollUtil.isEmpty(flowTaskAssigners)) { if (CollUtil.isEmpty(flowTaskAssigners)) {
return super.invokeService(userTask, execution, scopeDto); return super.invokeService(flowElement, execution, scopeDto);
} }
return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class); return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class);
} }

View File

@ -10,7 +10,7 @@ import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -43,13 +43,13 @@ public class BasedRoleTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelec
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
return super.select(userTask, execution, throwException); return super.select(flowElement, execution, throwException);
} }
@Override @Override
protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution, protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) { ApproverScopeDTO scopeDto) {
Set<Long> workspaceIdSet = ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() Set<Long> workspaceIdSet = ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream()
.map(OrgScope::getWorkspaceId) .map(OrgScope::getWorkspaceId)
@ -58,19 +58,19 @@ public class BasedRoleTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelec
// ouIdsworkspaceIds 只能传其中一个 然后代码过滤 // ouIdsworkspaceIds 只能传其中一个 然后代码过滤
RoleUserParam param = RoleUserParam.builder() RoleUserParam param = RoleUserParam.builder()
.roleIds(super.getTypes(userTask).stream().map(Long::valueOf).collect(Collectors.toSet())) .roleIds(super.getTypes(flowElement).stream().map(Long::valueOf).collect(Collectors.toSet()))
.ouIds(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() .ouIds(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream()
.map(OrgScope::getOuId) .map(OrgScope::getOuId)
.collect(Collectors.toList())) .collect(Collectors.toList()))
.build(); .build();
List<SaasRoleUserDTO> flowTaskAssigners = parseApiResult(() -> tyrSaasRoleUserApi.roleUserList(param), List<SaasRoleUserDTO> flowTaskAssigners = parseApiResult(() -> tyrSaasRoleUserApi.roleUserList(param),
"审批节点: " + userTask.getId() + ", 通过角色查询审批人", "审批节点: " + flowElement.getId() + ", 通过角色查询审批人",
"cn.axzo.tyr.client.feign.TyrSaasRoleUserApi.roleUserList", param) "cn.axzo.tyr.client.feign.TyrSaasRoleUserApi.roleUserList", param)
.stream().filter(f -> workspaceIdSet.contains(f.getWorkspaceId())) .stream().filter(f -> workspaceIdSet.contains(f.getWorkspaceId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (CollUtil.isEmpty(flowTaskAssigners)) { if (CollUtil.isEmpty(flowTaskAssigners)) {
return super.invokeService(userTask, execution, scopeDto); return super.invokeService(flowElement, execution, scopeDto);
} }
return flowTaskAssigners.stream().map(u -> BpmnTaskDelegateAssigner.builder() return flowTaskAssigners.stream().map(u -> BpmnTaskDelegateAssigner.builder()
.assignee(String.valueOf(u.getIdentityId())) .assignee(String.valueOf(u.getIdentityId()))

View File

@ -5,7 +5,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -38,7 +38,7 @@ public class PreNodeSpecifiedTaskAssigneeSelector extends AbstractBpmnTaskAssign
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
BpmnTaskDelegateAssigner assigner = runtimeService.getVariable(execution.getProcessInstanceId(), BpmnTaskDelegateAssigner assigner = runtimeService.getVariable(execution.getProcessInstanceId(),
INTERNAL_SPECIFY_NEXT_APPROVER, BpmnTaskDelegateAssigner.class); INTERNAL_SPECIFY_NEXT_APPROVER, BpmnTaskDelegateAssigner.class);

View File

@ -10,7 +10,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.UserTask; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -43,13 +43,13 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
} }
@Override @Override
public List<BpmnTaskDelegateAssigner> select(UserTask userTask, DelegateExecution execution, public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
Boolean throwException) { Boolean throwException) {
return super.select(userTask, execution, throwException); return super.select(flowElement, execution, throwException);
} }
@Override @Override
protected List<BpmnTaskDelegateAssigner> invokeService(UserTask userTask, DelegateExecution execution, protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) { ApproverScopeDTO scopeDto) {
ListFlowTaskAssignerReq.ListFlowTaskAssignerReqBuilder builder = ListFlowTaskAssignerReq.builder(); ListFlowTaskAssignerReq.ListFlowTaskAssignerReqBuilder builder = ListFlowTaskAssignerReq.builder();
if (!CollectionUtils.isEmpty(scopeDto.getOrgScopes())) { if (!CollectionUtils.isEmpty(scopeDto.getOrgScopes())) {
@ -65,11 +65,11 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
ListFlowTaskAssignerReq req = builder.build(); ListFlowTaskAssignerReq req = builder.build();
List<FlowTaskAssignerResp> flowTaskAssigners = List<FlowTaskAssignerResp> flowTaskAssigners =
parseApiResult(() -> flowSupportApi.listTaskAssignerAdmin(req), parseApiResult(() -> flowSupportApi.listTaskAssignerAdmin(req),
"审批节点: " + userTask.getId() + ", 通过管理员查询审批人", "审批节点: " + flowElement.getId() + ", 通过管理员查询审批人",
"cn.axzo.karma.client.feign.FlowSupportApi.listTaskAssignerAdmin", req); "cn.axzo.karma.client.feign.FlowSupportApi.listTaskAssignerAdmin", req);
if (CollUtil.isEmpty(flowTaskAssigners)) { if (CollUtil.isEmpty(flowTaskAssigners)) {
return super.invokeService(userTask, execution, scopeDto); return super.invokeService(flowElement, execution, scopeDto);
} }
return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class); return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class);
} }

View File

@ -150,7 +150,7 @@ public class RocketMqBpmnProcessEventListener implements BpmnProcessEventListene
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
.setCancelReason(String.valueOf(event.getCause())); .setReason(String.valueOf(event.getCause()));
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
String version = (String) runtimeService.getVariable(event.getProcessInstanceId(), WORKFLOW_ENGINE_VERSION); String version = (String) runtimeService.getVariable(event.getProcessInstanceId(), WORKFLOW_ENGINE_VERSION);
if (Objects.isNull(version)) { if (Objects.isNull(version)) {
@ -191,7 +191,7 @@ public class RocketMqBpmnProcessEventListener implements BpmnProcessEventListene
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
.setCancelReason(String.valueOf(event.getCause())); .setReason(String.valueOf(event.getCause()));
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
String version = (String) runtimeService.getVariable(event.getProcessInstanceId(), WORKFLOW_ENGINE_VERSION); String version = (String) runtimeService.getVariable(event.getProcessInstanceId(), WORKFLOW_ENGINE_VERSION);
if (Objects.isNull(version)) { if (Objects.isNull(version)) {
@ -227,7 +227,7 @@ public class RocketMqBpmnProcessEventListener implements BpmnProcessEventListene
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
.setCancelReason(String.valueOf(event.getCause())); .setReason(String.valueOf(event.getCause()));
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
String version = (String) runtimeService.getVariable(event.getProcessInstanceId(), WORKFLOW_ENGINE_VERSION); String version = (String) runtimeService.getVariable(event.getProcessInstanceId(), WORKFLOW_ENGINE_VERSION);
if (Objects.isNull(version)) { if (Objects.isNull(version)) {