mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	fix:【bpm 工作流】已办任务的审批状态过滤不正确
This commit is contained in:
		@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageParam;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.framework.common.validation.InEnum;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
 | 
				
			||||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
					import io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
import org.springframework.format.annotation.DateTimeFormat;
 | 
					import org.springframework.format.annotation.DateTimeFormat;
 | 
				
			||||||
@ -21,6 +23,10 @@ public class BpmTaskPageReqVO extends PageParam {
 | 
				
			|||||||
    @Schema(description = "流程定义的标识", example = "2048")
 | 
					    @Schema(description = "流程定义的标识", example = "2048")
 | 
				
			||||||
    private String processDefinitionKey; // 精准匹配
 | 
					    private String processDefinitionKey; // 精准匹配
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Schema(description = "审批状态", example = "1")
 | 
				
			||||||
 | 
					    @InEnum(BpmTaskStatusEnum.class)
 | 
				
			||||||
 | 
					    private Integer status; // 仅【已办】使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "创建时间")
 | 
					    @Schema(description = "创建时间")
 | 
				
			||||||
    @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
 | 
					    @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
 | 
				
			||||||
    private LocalDateTime[] createTime;
 | 
					    private LocalDateTime[] createTime;
 | 
				
			||||||
 | 
				
			|||||||
@ -2,10 +2,13 @@ package cn.iocoder.yudao.module.bpm.enums.task;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.util.ArrayUtil;
 | 
					import cn.hutool.core.util.ArrayUtil;
 | 
				
			||||||
import cn.hutool.core.util.ObjUtil;
 | 
					import cn.hutool.core.util.ObjUtil;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.framework.common.core.ArrayValuable;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 | 
				
			||||||
import lombok.AllArgsConstructor;
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
import lombok.Getter;
 | 
					import lombok.Getter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 流程任务 Task 的状态枚举
 | 
					 * 流程任务 Task 的状态枚举
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@ -13,7 +16,7 @@ import lombok.Getter;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Getter
 | 
					@Getter
 | 
				
			||||||
@AllArgsConstructor
 | 
					@AllArgsConstructor
 | 
				
			||||||
public enum BpmTaskStatusEnum {
 | 
					public enum BpmTaskStatusEnum implements ArrayValuable<Integer> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SKIP(-2, "跳过"),
 | 
					    SKIP(-2, "跳过"),
 | 
				
			||||||
    NOT_START(-1, "未开始"),
 | 
					    NOT_START(-1, "未开始"),
 | 
				
			||||||
@ -36,6 +39,8 @@ public enum BpmTaskStatusEnum {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    WAIT(0, "待审批");
 | 
					    WAIT(0, "待审批");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final Integer[] ARRAYS = Arrays.stream(values()).map(BpmTaskStatusEnum::getStatus).toArray(Integer[]::new);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 状态
 | 
					     * 状态
 | 
				
			||||||
     * <p>
 | 
					     * <p>
 | 
				
			||||||
@ -47,6 +52,11 @@ public enum BpmTaskStatusEnum {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private final String name;
 | 
					    private final String name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Integer[] array() {
 | 
				
			||||||
 | 
					        return ARRAYS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static boolean isRejectStatus(Integer status) {
 | 
					    public static boolean isRejectStatus(Integer status) {
 | 
				
			||||||
        return REJECT.getStatus().equals(status);
 | 
					        return REJECT.getStatus().equals(status);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -70,7 +70,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
 | 
				
			|||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
 | 
					import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
 | 
					import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.START_USER_NODE_ID;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.*;
 | 
					//import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.*;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*;
 | 
					import static cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -231,6 +231,9 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 | 
				
			|||||||
        if (StrUtil.isNotBlank(pageVO.getName())) {
 | 
					        if (StrUtil.isNotBlank(pageVO.getName())) {
 | 
				
			||||||
            taskQuery.taskNameLike("%" + pageVO.getName() + "%");
 | 
					            taskQuery.taskNameLike("%" + pageVO.getName() + "%");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (pageVO.getStatus() != null) {
 | 
				
			||||||
 | 
					            taskQuery.taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, pageVO.getStatus());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
//        if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
 | 
					//        if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) {
 | 
				
			||||||
//            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
 | 
					//            taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0]));
 | 
				
			||||||
//            taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1]));
 | 
					//            taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1]));
 | 
				
			||||||
@ -603,7 +606,9 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 | 
				
			|||||||
        runtimeService.setVariables(task.getProcessInstanceId(), variables);
 | 
					        runtimeService.setVariables(task.getProcessInstanceId(), variables);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 5. 移除辅助预测的流程变量,这些变量在回退操作中设置
 | 
					        // 5. 移除辅助预测的流程变量,这些变量在回退操作中设置
 | 
				
			||||||
        String simulateVariableName = StrUtil.concat(false, PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, task.getTaskDefinitionKey());
 | 
					        // todo @jason:可以直接 + 拼接哈
 | 
				
			||||||
 | 
					        String simulateVariableName = StrUtil.concat(false,
 | 
				
			||||||
 | 
					                BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, task.getTaskDefinitionKey());
 | 
				
			||||||
        runtimeService.removeVariable(task.getProcessInstanceId(), simulateVariableName);
 | 
					        runtimeService.removeVariable(task.getProcessInstanceId(), simulateVariableName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 6. 调用 BPM complete 去完成任务
 | 
					        // 6. 调用 BPM complete 去完成任务
 | 
				
			||||||
@ -936,7 +941,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 | 
				
			|||||||
        // TODO @jason:【驳回预测相关】是不是搞成一个变量,里面是 set 更简洁一点呀?
 | 
					        // TODO @jason:【驳回预测相关】是不是搞成一个变量,里面是 set 更简洁一点呀?
 | 
				
			||||||
        Set<String> taskDefinitionKeyList = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement);
 | 
					        Set<String> taskDefinitionKeyList = getNeedSimulateTaskDefinitionKeys(bpmnModel, currentTask, targetElement);
 | 
				
			||||||
        Map<String, Object> needSimulateVariables = convertMap(taskDefinitionKeyList,
 | 
					        Map<String, Object> needSimulateVariables = convertMap(taskDefinitionKeyList,
 | 
				
			||||||
                taskId -> StrUtil.concat(false, PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, taskId), item -> Boolean.TRUE);
 | 
					                taskId -> StrUtil.concat(false, BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_NEED_SIMULATE_PREFIX, taskId), item -> Boolean.TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 4. 执行驳回
 | 
					        // 4. 执行驳回
 | 
				
			||||||
        // 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId 原因:
 | 
					        // 使用 moveExecutionsToSingleActivityId 替换 moveActivityIdsToSingleActivityId 原因:
 | 
				
			||||||
@ -948,7 +953,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 | 
				
			|||||||
                .processVariables(needSimulateVariables)
 | 
					                .processVariables(needSimulateVariables)
 | 
				
			||||||
                 // 设置流程变量(local)节点退回标记, 用于退回到节点,不执行 BpmUserTaskAssignStartUserHandlerTypeEnum 策略,导致自动通过
 | 
					                 // 设置流程变量(local)节点退回标记, 用于退回到节点,不执行 BpmUserTaskAssignStartUserHandlerTypeEnum 策略,导致自动通过
 | 
				
			||||||
                .localVariable(reqVO.getTargetTaskDefinitionKey(),
 | 
					                .localVariable(reqVO.getTargetTaskDefinitionKey(),
 | 
				
			||||||
                        String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()), Boolean.TRUE)
 | 
					                        String.format(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, reqVO.getTargetTaskDefinitionKey()),
 | 
				
			||||||
 | 
					                        Boolean.TRUE)
 | 
				
			||||||
                .changeState();
 | 
					                .changeState();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1492,9 +1498,9 @@ public class BpmTaskServiceImpl implements BpmTaskService {
 | 
				
			|||||||
                FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
 | 
					                FlowElement userTaskElement = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
 | 
				
			||||||
                // 判断是否为退回或者驳回:如果是退回或者驳回不走这个策略(使用 local variable)
 | 
					                // 判断是否为退回或者驳回:如果是退回或者驳回不走这个策略(使用 local variable)
 | 
				
			||||||
                Boolean returnTaskFlag = runtimeService.getVariableLocal(task.getExecutionId(),
 | 
					                Boolean returnTaskFlag = runtimeService.getVariableLocal(task.getExecutionId(),
 | 
				
			||||||
                        String.format(PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, task.getTaskDefinitionKey()), Boolean.class);
 | 
					                        String.format(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG, task.getTaskDefinitionKey()), Boolean.class);
 | 
				
			||||||
                Boolean skipStartUserNodeFlag = Convert.toBool(runtimeService.getVariable(processInstance.getProcessInstanceId(),
 | 
					                Boolean skipStartUserNodeFlag = Convert.toBool(runtimeService.getVariable(processInstance.getProcessInstanceId(),
 | 
				
			||||||
                        PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class));
 | 
					                        BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_SKIP_START_USER_NODE, String.class));
 | 
				
			||||||
                if (userTaskElement.getId().equals(START_USER_NODE_ID)
 | 
					                if (userTaskElement.getId().equals(START_USER_NODE_ID)
 | 
				
			||||||
                        && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核
 | 
					                        && (skipStartUserNodeFlag == null // 目的:一般是“主流程”,发起人节点,自动通过审核
 | 
				
			||||||
                        || BooleanUtil.isTrue(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核
 | 
					                        || BooleanUtil.isTrue(skipStartUserNodeFlag)) // 目的:一般是“子流程”,发起人节点,按配置自动通过审核
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user