Merge remote-tracking branch 'refs/remotes/origin/master' into feature/REQ-3502
This commit is contained in:
commit
8b30f63cd3
6
pom.xml
6
pom.xml
@ -19,6 +19,7 @@
|
||||
<revision>1.5.2-SNAPSHOT</revision>
|
||||
<axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version>
|
||||
<axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version>
|
||||
<axzo-dependencies.org.version>1.0.0-SNAPSHOT</axzo-dependencies.org.version>
|
||||
<feign-httpclient.version>11.8</feign-httpclient.version>
|
||||
<lombok.version>1.18.22</lombok.version>
|
||||
<mapstruct.version>1.4.2.Final</mapstruct.version>
|
||||
@ -155,6 +156,11 @@
|
||||
<artifactId>riven-api</artifactId>
|
||||
<version>${axzo-dependencies.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.axzo.org</groupId>
|
||||
<artifactId>org-api</artifactId>
|
||||
<version>${axzo-dependencies.org.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
package cn.axzo.workflow.client.feign.bpmn;
|
||||
|
||||
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
|
||||
import cn.axzo.workflow.common.annotation.InvokeMode;
|
||||
import cn.axzo.workflow.common.annotation.Manageable;
|
||||
import cn.axzo.workflow.common.enums.RpcInvokeModeEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
|
||||
@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
|
||||
|
||||
/**
|
||||
* 流程活动的 API
|
||||
*
|
||||
@ -33,6 +37,7 @@ public interface ProcessActivityApi {
|
||||
*/
|
||||
@Deprecated
|
||||
@GetMapping("/api/process/activity/trigger")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
|
||||
|
||||
/**
|
||||
|
||||
@ -34,6 +34,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimite
|
||||
*/
|
||||
@Slf4j
|
||||
public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand<List<BpmnTaskDelegateAssigner>> implements Serializable {
|
||||
private static final long serialVersionUID = 2217101915677599319L;
|
||||
private final String processInstanceId;
|
||||
private final UserTask userTask;
|
||||
private final EngineExecutionStartListener engineExecutionStartListener;
|
||||
@ -62,10 +63,8 @@ public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand<List<Bpmn
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<BpmnTaskDelegateAssigner> forecastAssigners = new ArrayList<>();
|
||||
getApproverSpecify(userTask).ifPresent(specify -> {
|
||||
forecastAssigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), userTask,
|
||||
(DelegateExecution) list.get(0), false));
|
||||
});
|
||||
getApproverSpecify(userTask).ifPresent(specify -> forecastAssigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), userTask,
|
||||
(DelegateExecution) list.get(0), false)));
|
||||
|
||||
// 如果没找到审批人,加载管理员
|
||||
if (CollectionUtils.isEmpty(forecastAssigners)) {
|
||||
|
||||
@ -34,30 +34,12 @@ import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVAL_ASSIGNER_LIMIT_NUMBER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_ALLOW_SKIP_USER_TASK;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION_121;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_BUSINESS;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_TASK;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.*;
|
||||
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessServerVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.*;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
|
||||
|
||||
@ -204,14 +186,16 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
}
|
||||
|
||||
private void finalEmptyAssigneeHandle(List<BpmnTaskDelegateAssigner> assigners, UserTask userTask, DelegateExecution execution, String operationDesc) {
|
||||
if (CollectionUtils.isEmpty(assigners) && refreshProperties.getSendDingTalk()) {
|
||||
CooperationOrgDTO orgScopes = execution.getVariable(BIZ_ORG_RELATION, CooperationOrgDTO.class);
|
||||
DingTalkUtils.sendDingTalkForTransferToAdminError(profile, execution.getProcessInstanceId(), userTask.getId(), orgScopes);
|
||||
if (CollectionUtils.isEmpty(assigners)) {
|
||||
//发送钉钉消息
|
||||
if (Boolean.TRUE.equals(refreshProperties.getSendDingTalk())) {
|
||||
CooperationOrgDTO orgScopes = execution.getVariable(BIZ_ORG_RELATION, CooperationOrgDTO.class);
|
||||
DingTalkUtils.sendDingTalkForTransferToAdminError(profile, execution.getProcessInstanceId(), userTask.getId(), orgScopes);
|
||||
}
|
||||
BpmnProcessInstanceAbortDTO abortDTO = new BpmnProcessInstanceAbortDTO();
|
||||
abortDTO.setProcessInstanceId(execution.getProcessInstanceId());
|
||||
abortDTO.setReason("转交管理员失败,系统中止");
|
||||
CommandContextUtil.getProcessEngineConfiguration().getCommandExecutor()
|
||||
.execute(new CustomAbortProcessInstanceAsyncCmd(abortDTO));
|
||||
abortDTO.setReason(operationDesc);
|
||||
CommandContextUtil.getProcessEngineConfiguration().getCommandExecutor().execute(new CustomAbortProcessInstanceAsyncCmd(abortDTO));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ import cn.axzo.workflow.common.model.request.form.model.FormModelUpdateDTO;
|
||||
import cn.axzo.workflow.core.service.AggregateModelService;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessModelService;
|
||||
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
|
||||
import cn.axzo.workflow.core.service.FormModelService;
|
||||
import cn.axzo.workflow.form.service.FormModelService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.engine.RepositoryService;
|
||||
import org.flowable.engine.repository.Model;
|
||||
|
||||
@ -324,7 +324,6 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
ProcessInstanceBuilder instanceBuilder = runtimeService.createProcessInstanceBuilder()
|
||||
.processDefinitionId(definition.getId())
|
||||
.businessKey(dto.getBusinessKey())
|
||||
.variables(dto.getVariables())
|
||||
.name(name)
|
||||
.tenantId(definition.getTenantId())
|
||||
.overrideProcessDefinitionTenantId(dto.getTenantId());
|
||||
@ -352,8 +351,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
.outcome(dto.getOutcome());
|
||||
}
|
||||
dto.getVariables().put(CREATE_INSTANCE_PARAMS, JSONUtil.toJsonStr(dto));
|
||||
instanceBuilder.variables(dto.getVariables());
|
||||
ProcessInstance instance;
|
||||
if (dto.getAsync()) {
|
||||
if (Boolean.TRUE.equals(dto.getAsync())) {
|
||||
// 异步开始
|
||||
instance = instanceBuilder.startAsync();
|
||||
} else {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package cn.axzo.workflow.core.service;
|
||||
package cn.axzo.workflow.form.service;
|
||||
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO;
|
||||
|
||||
@ -8,7 +8,7 @@ import cn.axzo.workflow.common.model.request.form.model.FormModelCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.model.FormModelUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.form.model.FormModelBaseVO;
|
||||
import cn.axzo.workflow.core.service.FormModelService;
|
||||
import cn.axzo.workflow.form.service.FormModelService;
|
||||
import cn.axzo.workflow.form.service.converter.FormModelConverter;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@ -142,6 +142,10 @@
|
||||
<groupId>cn.axzo</groupId>
|
||||
<artifactId>riven-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.axzo.org</groupId>
|
||||
<artifactId>org-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@ -69,15 +69,15 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
if (flowElement instanceof UserTask) {
|
||||
assigners.addAll(BpmnMetaParserHelper.getApproverScope((UserTask) flowElement)
|
||||
.map(approverScopeEnum -> privateSelector(approverScopeEnum, flowElement, execution,
|
||||
throwException))
|
||||
.orElseGet(Collections::emptyList));
|
||||
.map(approverScopeEnum -> privateSelector(approverScopeEnum, flowElement, execution,
|
||||
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));
|
||||
execution, throwException));
|
||||
}
|
||||
} else if (flowElement instanceof NoticeFlowElement) {
|
||||
ApproverScopeEnum processor = ((NoticeFlowElement) flowElement).getProcessor();
|
||||
@ -89,23 +89,20 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
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(flowElement, execution);
|
||||
if (CollectionUtils.isEmpty(scopeDto.getOrgScopes())
|
||||
&& CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes())) {
|
||||
if (throwException) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, flowElement.getId(),
|
||||
processorType.getDesc());
|
||||
}
|
||||
&& CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes()) && Boolean.TRUE.equals(throwException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, flowElement.getId(), processorType.getDesc());
|
||||
}
|
||||
try {
|
||||
return populateNameAndAvatar(invokeService(flowElement, execution, scopeDto), flowSupportApi, refreshProperties, applicationContext);
|
||||
} catch (Throwable t) {
|
||||
if (throwException) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
log.warn("执行查询候选审批人时发现异常, 审批节点:{}, 异常信息:{}", flowElement.getId(), t.getMessage());
|
||||
if (!(t instanceof WorkflowEngineException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), t.getMessage());
|
||||
this.getType(), t.getMessage());
|
||||
}
|
||||
throw t;
|
||||
} else {
|
||||
@ -119,13 +116,44 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
protected final <T> T parseFoundationApiResult(Supplier<cn.axzo.foundation.result.ApiResult<T>> supplier, String operatorDesc,
|
||||
String extInfo, Object... param) {
|
||||
StopWatch stopWatch = new StopWatch(operatorDesc);
|
||||
log.info("{}-Param: {}", operatorDesc, JSONUtil.toJsonStr(param));
|
||||
stopWatch.start();
|
||||
cn.axzo.foundation.result.ApiResult<T> result = supplier.get();
|
||||
stopWatch.stop();
|
||||
log.info("{}-Cost:{}, Result: {}", operatorDesc,
|
||||
"API StopWatch '" + stopWatch.getId() + "': running time = " + stopWatch.getTotalTimeSeconds() + " 's",
|
||||
JSONUtil.toJsonStr(result));
|
||||
try {
|
||||
if (stopWatch.getTotalTimeSeconds() > refreshProperties.getApiTimeout() && Boolean.TRUE.equals(refreshProperties.getSendDingTalk())) {
|
||||
DingTalkUtils.sendDingTalkForSlowUrl(applicationContext.getEnvironment()
|
||||
.getProperty("spring.profiles.active"),
|
||||
stopWatch.getTotalTimeSeconds(),
|
||||
extInfo,
|
||||
param,
|
||||
result);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
}
|
||||
Assert.notNull(result, "服务调用异常");
|
||||
// 200自定义处理
|
||||
if (HttpStatus.HTTP_OK != result.getCode()) {
|
||||
throw new WorkflowEngineException(CALC_TASK_ASSIGNEE_ERROR, "[API:" + extInfo + "]" + result.getMsg());
|
||||
}
|
||||
return result.getData();
|
||||
}
|
||||
|
||||
|
||||
protected final <T> T parseApiResult(Supplier<ApiResult<T>> supplier, String operatorDesc,
|
||||
String extInfo, Object... param) {
|
||||
String extInfo, Object... param) {
|
||||
return parseApiResult(supplier, operatorDesc, extInfo, refreshProperties, applicationContext, param);
|
||||
}
|
||||
|
||||
public static <T> T parseApiResult(Supplier<ApiResult<T>> supplier, String operatorDesc,
|
||||
String extInfo, SupportRefreshProperties refreshProperties,
|
||||
String extInfo, SupportRefreshProperties refreshProperties,
|
||||
ApplicationContext context, Object... param) {
|
||||
StopWatch stopWatch = new StopWatch(operatorDesc);
|
||||
log.info("{}-Param: {}", operatorDesc, JSONUtil.toJsonStr(param));
|
||||
@ -133,16 +161,16 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
ApiResult<T> result = supplier.get();
|
||||
stopWatch.stop();
|
||||
log.info("{}-Cost:{}, Result: {}", operatorDesc,
|
||||
"API StopWatch '" + stopWatch.getId() + "': running time = " + stopWatch.getTotalTimeSeconds() + " 's",
|
||||
JSONUtil.toJsonStr(result));
|
||||
"API StopWatch '" + stopWatch.getId() + "': running time = " + stopWatch.getTotalTimeSeconds() + " 's",
|
||||
JSONUtil.toJsonStr(result));
|
||||
try {
|
||||
if (stopWatch.getTotalTimeSeconds() > refreshProperties.getApiTimeout() && refreshProperties.getSendDingTalk()) {
|
||||
DingTalkUtils.sendDingTalkForSlowUrl(context.getEnvironment()
|
||||
.getProperty("spring.profiles.active"),
|
||||
stopWatch.getTotalTimeSeconds(),
|
||||
extInfo,
|
||||
param,
|
||||
result);
|
||||
.getProperty("spring.profiles.active"),
|
||||
stopWatch.getTotalTimeSeconds(),
|
||||
extInfo,
|
||||
param,
|
||||
result);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// ignore
|
||||
@ -161,26 +189,26 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
try {
|
||||
if (flowElement instanceof UserTask) {
|
||||
return BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toList()))
|
||||
.orElse(Collections.emptyList());
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toList()))
|
||||
.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());
|
||||
.stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toList());
|
||||
} else if (flowElement instanceof NoticeFlowElement) {
|
||||
String customValues = ((NoticeFlowElement) flowElement).getCustomValues();
|
||||
if (StringUtils.hasText(customValues)) {
|
||||
return JSON.parseArray(customValues, String.class)
|
||||
.stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toList());
|
||||
.stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
return Collections.emptyList();
|
||||
} else {
|
||||
@ -188,7 +216,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new WorkflowEngineException(CONVERTOR_META_DATA_FORMAT_ERROR, "AbstractBpmnTaskAssigneeSelector" +
|
||||
"#getTypes", e.getMessage());
|
||||
"#getTypes", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -200,16 +228,16 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
return assigners;
|
||||
}
|
||||
List<Long> personIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(e-> Objects.nonNull(e) && StringUtils.hasText(e) && !Objects.equals("null", e))
|
||||
.map(Long::parseLong)
|
||||
.distinct().collect(Collectors.toList());
|
||||
if(CollectionUtils.isEmpty(personIds)) {
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(e -> Objects.nonNull(e) && StringUtils.hasText(e) && !Objects.equals("null", e))
|
||||
.map(Long::parseLong)
|
||||
.distinct().collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(personIds)) {
|
||||
return assigners;
|
||||
}
|
||||
Map<Long, PersonProfileResp> personProfileMap = parseApiResult(() -> flowSupportApi.listPersons(PersonProfileQueryReq.builder().personIds(personIds).build()),
|
||||
"根据 PersonId 查询自然人档案", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", refreshProperties, context, personIds)
|
||||
.stream().collect(Collectors.toMap(PersonProfileResp::getId, Function.identity(), (s, t) -> s));
|
||||
"根据 PersonId 查询自然人档案", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", refreshProperties, context, personIds)
|
||||
.stream().collect(Collectors.toMap(PersonProfileResp::getId, Function.identity(), (s, t) -> s));
|
||||
assigners.forEach(assigner -> {
|
||||
if (!StringUtils.hasText(assigner.getPersonId()) || Objects.equals("null", assigner.getPersonId())) {
|
||||
return;
|
||||
|
||||
@ -1,13 +1,15 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.maokai.api.client.OrganizationalNodeUserApi;
|
||||
import cn.axzo.maokai.api.vo.request.OrganizationalNodeUserSearchReq;
|
||||
import cn.axzo.maokai.api.vo.response.OrganizationalNodeUserVO;
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
@ -16,11 +18,7 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||
@ -34,7 +32,7 @@ import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TA
|
||||
@Component
|
||||
public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrganizationalNodeUserApi organizationalNodeUserApi;
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
@ -54,39 +52,49 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign
|
||||
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)));
|
||||
|
||||
Set<Long> workspaceIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getTenantId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toSet());
|
||||
.map(BpmnTaskDelegateAssigner::getTenantId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<Long> personIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
List<OrganizationalNodeUserVO> onlineUsers = new ArrayList<>();
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(personIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<OrgNodeUserDTO> onlineUsers = new ArrayList<>();
|
||||
try {
|
||||
OrganizationalNodeUserSearchReq searchReq = new OrganizationalNodeUserSearchReq();
|
||||
ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq();
|
||||
searchReq.setWorkspaceIds(workspaceIds);
|
||||
searchReq.setPersonIdList(personIds);
|
||||
onlineUsers = parseApiResult(() -> organizationalNodeUserApi.list(searchReq), "查询指定人员是否在职",
|
||||
"cn.axzo.maokai.api.client.OrganizationalNodeUserApi#list", searchReq);
|
||||
searchReq.setPersonIds(personIds);
|
||||
searchReq.setPage(1);
|
||||
searchReq.setPageSize(personIds.size());
|
||||
PageResp<OrgNodeUserDTO> pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq);
|
||||
if (pageResp != null) {
|
||||
onlineUsers = pageResp.getData();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (throwException) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), e.getMessage());
|
||||
this.getType(), e.getMessage());
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
// 只要有在职的人,不会走审批人为空
|
||||
if (ListUtils.emptyIfNull(onlineUsers).stream().filter(i -> Objects.equals(i.getIsDelete(), 0L))
|
||||
.anyMatch(u -> assigners.stream().anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId()))
|
||||
&& Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) {
|
||||
if (ListUtils.emptyIfNull(onlineUsers).stream()
|
||||
.filter(i -> Objects.equals(i.getIsDelete(), 0L))
|
||||
.anyMatch(u -> assigners.stream()
|
||||
.anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId()))
|
||||
&& Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) {
|
||||
return assigners;
|
||||
}
|
||||
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.maokai.api.client.OrganizationalNodeUserApi;
|
||||
import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq;
|
||||
import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq.IdentityPair;
|
||||
import cn.axzo.maokai.api.vo.response.FlowTaskAssigner;
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerReq;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.IdentityPair;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssigner;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO;
|
||||
@ -33,7 +33,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
|
||||
@Resource
|
||||
private OrganizationalNodeUserApi organizationalNodeUserApi;
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
@ -70,9 +70,9 @@ public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAs
|
||||
.build();
|
||||
req.setProcInstId(execution.getProcessInstanceId());
|
||||
List<FlowTaskAssigner> flowTaskAssigners =
|
||||
parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req),
|
||||
parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssigner(req),
|
||||
"审批节点: " + flowElement.getId() + ", 通过发起人主管查询审批人",
|
||||
"cn.axzo.maokai.api.client.OrganizationalNodeUserApi#listFlowTaskAssigner", req);
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssigner", req);
|
||||
|
||||
if (CollUtil.isEmpty(flowTaskAssigners)) {
|
||||
return super.invokeService(flowElement, execution, scopeDto);
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.maokai.api.client.OrganizationalNodeUserApi;
|
||||
import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq;
|
||||
import cn.axzo.maokai.api.vo.response.FlowTaskAssigner;
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerReq;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssigner;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO;
|
||||
@ -29,7 +29,7 @@ import java.util.stream.Collectors;
|
||||
public class BasedPositionTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
|
||||
@Autowired
|
||||
private OrganizationalNodeUserApi organizationalNodeUserApi;
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
@ -62,9 +62,9 @@ public class BasedPositionTaskAssigneeSelector extends AbstractBpmnTaskAssigneeS
|
||||
req.getOrgScopes().addAll(workerTeamScopes);
|
||||
req.setProcInstId(execution.getProcessInstanceId());
|
||||
List<FlowTaskAssigner> flowTaskAssigners =
|
||||
parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req),
|
||||
parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssigner(req),
|
||||
"审批节点: " + flowElement.getId() + ", 通过岗位查询审批人",
|
||||
"cn.axzo.maokai.api.client.OrganizationalNodeUserApi#listFlowTaskAssigner", req);
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssigner", req);
|
||||
|
||||
if (CollUtil.isEmpty(flowTaskAssigners)) {
|
||||
return super.invokeService(flowElement, execution, scopeDto);
|
||||
|
||||
@ -0,0 +1,101 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.apache.commons.lang3.math.NumberUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||
|
||||
/**
|
||||
* 转交指定人查询人
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class SpecifyAssigneeTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverEmptyHandleTypeEnum.specifyAssignee.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean support(String param) {
|
||||
return getType().equals(param);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
if (!(flowElement instanceof UserTask)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<BpmnTaskDelegateAssigner> emptyAssignees =
|
||||
BpmnMetaParserHelper.getEmptyApproverSpecify((UserTask) flowElement)
|
||||
.map(listStr -> JSON.parseArray(listStr, BpmnTaskDelegateAssigner.class))
|
||||
.orElse(Collections.emptyList());
|
||||
if (CollectionUtils.isEmpty(emptyAssignees)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
try {
|
||||
List<OrgNodeUserDTO> onlineUsers = new ArrayList<>();
|
||||
Set<Long> workspaceIds = emptyAssignees.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getTenantId)
|
||||
.filter(NumberUtils::isDigits)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<Long> personIds = emptyAssignees.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(NumberUtils::isDigits)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq();
|
||||
searchReq.setWorkspaceIds(workspaceIds);
|
||||
searchReq.setPersonIds(personIds);
|
||||
searchReq.setPage(1);
|
||||
searchReq.setPageSize(personIds.size());
|
||||
PageResp<OrgNodeUserDTO> pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "SpecifyAssigneeTaskAssigneeSelector#查询指定人员是否在职",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq);
|
||||
if (pageResp != null) {
|
||||
onlineUsers = pageResp.getData();
|
||||
}
|
||||
// 只要有在职的人,不会走审批人为空
|
||||
if (ListUtils.emptyIfNull(onlineUsers).stream()
|
||||
.filter(i -> Objects.equals(i.getIsDelete(), 0L))
|
||||
.anyMatch(u -> emptyAssignees.stream()
|
||||
.anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId()))
|
||||
&& Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) {
|
||||
return emptyAssignees;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
} catch (Exception e) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), e.getMessage());
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -70,7 +70,7 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
|
||||
protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
|
||||
ApproverScopeDTO scopeDto) {
|
||||
|
||||
if(supportRefreshProperties.getUseNewToAdminApi()) {
|
||||
if(Boolean.TRUE.equals(supportRefreshProperties.getUseNewToAdminApi())) {
|
||||
return invokeNewQuery(flowElement, execution, scopeDto);
|
||||
} else {
|
||||
return invokeOldQuery(flowElement, execution, scopeDto);
|
||||
|
||||
@ -5,7 +5,7 @@ import cn.axzo.workflow.common.model.request.form.model.FormModelCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.model.FormModelUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.form.model.FormModelBaseVO;
|
||||
import cn.axzo.workflow.core.service.FormModelService;
|
||||
import cn.axzo.workflow.form.service.FormModelService;
|
||||
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user