Merge branch 'feature/REQ-3023' into 'master'

Feature/req 3023

See merge request universal/infrastructure/backend/workflow-engine!15
This commit is contained in:
金海洋 2024-12-25 02:07:39 +00:00
commit 41ff7bca68
8 changed files with 44 additions and 42 deletions

View File

@ -8,6 +8,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/** /**
* 推动业务节点继续执行 * 推动业务节点继续执行
@ -20,7 +21,9 @@ import javax.validation.constraints.NotBlank;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Builder @Builder
public class BpmnActivityTriggerDTO { public class BpmnActivityTriggerDTO implements Serializable {
private static final long serialVersionUID = 1759998765977414031L;
/** /**
* 业务节点的触发 ID * 业务节点的触发 ID
@ -34,4 +37,9 @@ public class BpmnActivityTriggerDTO {
*/ */
@ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据") @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
private Boolean async = true; private Boolean async = true;
/**
* 流程定义节点id
*/
private String activityId;
} }

View File

@ -75,6 +75,9 @@ public class CustomReceiveTaskActivityBehavior extends ReceiveTaskActivityBehavi
eventDispatcher.dispatchEvent(new ExtTaskInstUpdateEvent(execution.getProcessInstanceId(), eventDispatcher.dispatchEvent(new ExtTaskInstUpdateEvent(execution.getProcessInstanceId(),
receiveTask.getId(), task.getId(), APPROVED), receiveTask.getId(), task.getId(), APPROVED),
processEngineConfiguration.getEngineCfgKey()); processEngineConfiguration.getEngineCfgKey());
// 解决两个业务节点相邻时无法正确的往下流转的问题
TaskHelper.deleteTask(task, null, true, true, true);
} else { } else {
log.warn("ReceiveTask is null, executionId: {}, activityId: {}", execution.getId(), log.warn("ReceiveTask is null, executionId: {}, activityId: {}", execution.getId(),
execution.getCurrentActivityId()); execution.getCurrentActivityId());

View File

@ -5,6 +5,7 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.core.engine.job.AsyncActivityTriggerJobHandler; import cn.axzo.workflow.core.engine.job.AsyncActivityTriggerJobHandler;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService; import org.flowable.engine.TaskService;
@ -30,6 +31,7 @@ import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT
*/ */
public class CustomActivityTriggerAsyncCmd extends AbstractCommand<String> implements Serializable { public class CustomActivityTriggerAsyncCmd extends AbstractCommand<String> implements Serializable {
private static final long serialVersionUID = 4037000685442842145L;
private static final Logger log = LoggerFactory.getLogger(CustomActivityTriggerAsyncCmd.class); private static final Logger log = LoggerFactory.getLogger(CustomActivityTriggerAsyncCmd.class);
private final BpmnActivityTriggerDTO dto; private final BpmnActivityTriggerDTO dto;
@ -46,9 +48,11 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand<String> imple
public String execute(CommandContext commandContext) { public String execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration = ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext); CommandContextUtil.getProcessEngineConfiguration(commandContext);
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); TaskEntity task = (TaskEntity) processEngineConfiguration.getTaskService().createTaskQuery()
Execution execution = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).singleResult(); .executionId(dto.getTriggerId())
if (Objects.isNull(execution)) { .taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId())
.singleResult();
if (Objects.isNull(task)) {
throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId());
} }
@ -59,7 +63,10 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand<String> imple
ProcessEngineConfigurationImpl processEngineConfiguration = ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext); CommandContextUtil.getProcessEngineConfiguration(commandContext);
TaskService taskService = processEngineConfiguration.getTaskService(); TaskService taskService = processEngineConfiguration.getTaskService();
TaskEntity task = (TaskEntity) taskService.createTaskQuery().executionId(dto.getTriggerId()).singleResult(); TaskEntity task = (TaskEntity) taskService.createTaskQuery()
.executionId(dto.getTriggerId())
.taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId())
.singleResult();
JobService jobService = processEngineConfiguration.getJobServiceConfiguration().getJobService(); JobService jobService = processEngineConfiguration.getJobServiceConfiguration().getJobService();
JobEntity job = jobService.createJob(); JobEntity job = jobService.createJob();

View File

@ -1,8 +1,9 @@
package cn.axzo.workflow.core.engine.cmd; package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
@ -14,8 +15,8 @@ import org.slf4j.LoggerFactory;
import java.io.Serializable; import java.io.Serializable;
import java.util.Objects; import java.util.Objects;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
/** /**
@ -26,6 +27,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addCommen
*/ */
public class CustomActivityTriggerCmd extends AbstractCommand<Void> implements Serializable { public class CustomActivityTriggerCmd extends AbstractCommand<Void> implements Serializable {
private static final long serialVersionUID = 5806130509691903321L;
private static final Logger log = LoggerFactory.getLogger(CustomActivityTriggerCmd.class); private static final Logger log = LoggerFactory.getLogger(CustomActivityTriggerCmd.class);
private final BpmnActivityTriggerDTO dto; private final BpmnActivityTriggerDTO dto;
@ -41,10 +43,12 @@ public class CustomActivityTriggerCmd extends AbstractCommand<Void> implements S
@Override @Override
public Void execute(CommandContext commandContext) { public Void execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration = ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext); CommandContextUtil.getProcessEngineConfiguration(commandContext);
TaskEntity task = (TaskEntity) processEngineConfiguration.getTaskService() TaskEntity task = (TaskEntity) processEngineConfiguration.getTaskService().createTaskQuery()
.createTaskQuery().executionId(dto.getTriggerId()).singleResult(); .executionId(dto.getTriggerId())
.taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId())
.singleResult();
if (Objects.isNull(task)) { if (Objects.isNull(task)) {
throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId());
} }

View File

@ -3,7 +3,6 @@ package cn.axzo.workflow.core.engine.cmd;
import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo; import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import cn.axzo.workflow.common.util.ExpressionUtil;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.common.utils.FormHelper; import cn.axzo.workflow.core.common.utils.FormHelper;
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation; import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
@ -22,29 +21,18 @@ import org.flowable.form.api.FormDefinition;
import org.flowable.form.api.FormEngineConfigurationApi; import org.flowable.form.api.FormEngineConfigurationApi;
import org.flowable.form.api.FormInstanceInfo; import org.flowable.form.api.FormInstanceInfo;
import org.flowable.form.api.FormRepositoryService; import org.flowable.form.api.FormRepositoryService;
import org.flowable.form.api.FormService;
import org.flowable.form.model.FormField;
import org.flowable.form.model.SimpleFormModel; import org.flowable.form.model.SimpleFormModel;
import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS; import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_NOT_EXISTS; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_NOT_EXISTS;
import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_PARAM_ERROR; import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_PARAM_ERROR;
import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_DEFAULT_VALUE;
import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_EDITABLE;
import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_HIDDEN;
import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_READONLY;
import static cn.axzo.workflow.common.constant.FormConstants.FIELD_PROPERTY_REQUIRED;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
@ -201,7 +189,9 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
Map<String, List<BpmnTaskDelegateAssigner>> assignerMap = new HashMap<>(); Map<String, List<BpmnTaskDelegateAssigner>> assignerMap = new HashMap<>();
logs.forEach(e -> { logs.forEach(e -> {
if (assignerMap.containsKey(e.getActivityId())) { if (assignerMap.containsKey(e.getActivityId())) {
assignerMap.get(e.getActivityId()).addAll(e.getAssigneeFull()); if (!CollectionUtils.isEmpty(e.getAssigneeFull())) {
assignerMap.get(e.getActivityId()).addAll(e.getAssigneeFull());
}
} else { } else {
assignerMap.put(e.getActivityId(), new ArrayList<>(ListUtils.emptyIfNull(e.getAssigneeFull()))); assignerMap.put(e.getActivityId(), new ArrayList<>(ListUtils.emptyIfNull(e.getAssigneeFull())));
} }
@ -238,7 +228,7 @@ public class GetFormInstanceAndPermissionCmd implements Command<FormInstanceInfo
FormDefinition formDefinition = formRepositoryService.createFormDefinitionQuery().deploymentId(relation.getFormDeploymentId()).singleResult(); FormDefinition formDefinition = formRepositoryService.createFormDefinitionQuery().deploymentId(relation.getFormDeploymentId()).singleResult();
// 获取表单定义+字段内容 // 获取表单定义+字段内容
return commandContext.getCommandExecutor().execute(new CustomGetFormInstanceModelCmd(null, null, formDefinition.getId(), taskId, processInstanceId, instance.getTenantId() ,null, false )); return commandContext.getCommandExecutor().execute(new CustomGetFormInstanceModelCmd(null, null, formDefinition.getId(), taskId, processInstanceId, instance.getTenantId(), null, false));
} }
private void preCheckParam() { private void preCheckParam() {

View File

@ -71,7 +71,7 @@ public class AsyncTermNodeAlterJobHandler extends AbstractJobHandler implements
alterDTO.setTaskId(task.getId()); alterDTO.setTaskId(task.getId());
alterDTO.setStartTime(task.getCreateTime()); alterDTO.setStartTime(task.getCreateTime());
alterDTO.setPrettyStartTime(DateUtil.formatDateTime(task.getCreateTime())); alterDTO.setPrettyStartTime(DateUtil.formatDateTime(task.getCreateTime()));
if (refreshProperties.getSendDingTalk()) { if (Boolean.TRUE.equals(refreshProperties.getSendDingTalk())) {
alter.invoke(alterDTO); alter.invoke(alterDTO);
} }
} }

View File

@ -11,6 +11,7 @@ import com.google.common.collect.Lists;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.Process;
@ -29,22 +30,11 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION; import static cn.axzo.workflow.common.constant.BpmnConstants.*;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
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.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.nobody; import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.nobody;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.AND; import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.*;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.GENERAL;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.OR;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.*;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
import static cn.axzo.workflow.core.common.enums.BpmnProcessTaskResultEnum.PENDING; import static cn.axzo.workflow.core.common.enums.BpmnProcessTaskResultEnum.PENDING;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
@ -147,7 +137,7 @@ public class TaskEntityEventHandle implements EntityEventHandle<TaskEntity> {
BpmnTaskDelegateAssigner assignee = BpmnTaskDelegateAssigner.toObjectCompatible(taskEntity.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + taskEntity.getId())); BpmnTaskDelegateAssigner assignee = BpmnTaskDelegateAssigner.toObjectCompatible(taskEntity.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO + taskEntity.getId()));
if (Objects.nonNull(assignee) && !Objects.equals(NO_ASSIGNEE, assignee.buildAssigneeId())) { if (Objects.nonNull(assignee) && !Objects.equals(NO_ASSIGNEE, assignee.buildAssigneeId())) {
update.setAssigneeFull(Lists.newArrayList(assignee)); update.setAssigneeFull(Lists.newArrayList(assignee));
update.setAssigneeId(Long.valueOf(assignee.getPersonId())); update.setAssigneeId(NumberUtils.isDigits(assignee.getPersonId()) ? Long.valueOf(assignee.getPersonId()) : null);
update.setAssigneeTenantId(assignee.getTenantId()); update.setAssigneeTenantId(assignee.getTenantId());
update.setAssigneeName(assignee.getAssignerName()); update.setAssigneeName(assignee.getAssignerName());
update.setAssigneeOuId(assignee.getOuId()); update.setAssigneeOuId(assignee.getOuId());

View File

@ -62,7 +62,7 @@ public class BpmnProcessActivityController extends BasicPopulateAvatarController
@Deprecated @Deprecated
public CommonResponse<Boolean> trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId) { public CommonResponse<Boolean> trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId) {
log.info("业务节点唤醒 trigger2 ===>>>参数:{}", triggerId); log.info("业务节点唤醒 trigger2 ===>>>参数:{}", triggerId);
return trigger(new BpmnActivityTriggerDTO(triggerId, true)); return trigger(new BpmnActivityTriggerDTO(triggerId, true, null));
} }
/** /**