activiti&flowable节点驳回操作

2 篇文章 0 订阅
1 篇文章 0 订阅

上一篇写到关于获取驳回节点信息:activiti&flowable任意驳回-获取可驳回节点信息

从而进行实现任意节点的驳回,正常的业务场景中可能不只是单纯的使用api驳回就可以了,下面就提供部分业务中常用的业务逻辑操作:

flowable版本:6.6.0

public boolean reject(RejectTaskDto rejectTaskDto) {
        TaskEntity taskEntity = (TaskEntity) taskService.createTaskQuery().taskId(rejectTaskDto.getTaskId()).singleResult();
        //1.把当前的节点设置为空
        if (taskEntity != null) {
            //2.设置审批人
            taskEntity.setAssignee(rejectTaskDto.getUserId());
            taskService.saveTask(taskEntity);
            //3.添加驳回意见
            taskService.addComment(rejectTaskDto.getTaskId(),        
             rejectTaskDto.getProcessInstanceId(), rejectTaskDto.getMessage());
            //4.处理提交人节点
            FlowNode distActivity = findFlowNodeByActivityId(taskEntity.getProcessDefinitionId(), rejectTaskDto.getNodeId());
            if (distActivity != null) {
                if (FlowableConstants.FLOW_SUBMITTER.equals(distActivity.getName())) {
                    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskEntity.getProcessInstanceId()).singleResult();
                    runtimeService.setVariable(rejectTaskDto.getProcessInstanceId(), FlowableConstants.FLOW_SUBMITTER_VAR, processInstance.getStartUserId());
                }
            }
           
            List<String> executionIds = new ArrayList<>();
            //5.判断节点是不是子流程内部的节点
            if (checkActivitySubprocessByActivityId(taskEntity.getProcessDefinitionId(), rejectTaskDto.getNodeId())) {
                //5.1 子流程内部驳回
                Execution executionTask = runtimeService.createExecutionQuery().executionId(taskEntity.getExecutionId()).singleResult();
                String parentId = executionTask.getParentId();
                List<Execution> executions = runtimeService.createExecutionQuery().parentId(parentId).list();
                executions.forEach(execution -> executionIds.add(execution.getId()));
            } else {
                //5.2 普通驳回
                List<Execution> executions = runtimeService.createExecutionQuery().parentId(taskEntity.getProcessInstanceId()).list();
                executions.forEach(execution -> executionIds.add(execution.getId()));
            }
            moveExecutionsToSingleActivityId(executionIds, rejectTaskDto.getNodeId());
            //6.删除节点-保证流程图输出
            deleteActivity(rejectTaskDto.getNodeId(), taskEntity.getProcessInstanceId());
            return true;
        }
        return false;
    }



/**
     * 子流程判断
     */
 private boolean checkActivitySubprocessByActivityId(String processDefId, String activityId) {
        return CollectionUtils.isNotEmpty(findFlowNodesByActivityId(processDefId, activityId));
    }

    public List<FlowNode> findFlowNodesByActivityId(String processDefId, String activityId) {
        List<FlowNode> activities = new ArrayList<>();
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
        List<Process> processes = bpmnModel.getProcesses();
        for (Process process : processes) {
            FlowElement flowElement = process.getFlowElement(activityId);
            if (flowElement != null) {
                FlowNode flowNode = (FlowNode) flowElement;
                activities.add(flowNode);
            }
        }
        return activities;
    }


/**
     * 执行驳回跳转
     */
    private void moveExecutionsToSingleActivityId(List<String> executionIds, String activityId) {
        runtimeService.createChangeActivityStateBuilder()
                .moveExecutionsToSingleActivityId(executionIds, activityId)
                .changeState();
    }

/**
     * 删除跳转的历史节点信息
     *
     * @param disActivityId     跳转的节点id
     * @param processInstanceId 流程实例id
     */
    protected void deleteActivity(String disActivityId, String processInstanceId) {
        String tableName = managementService.getTableName(ActivityInstanceEntity.class);
        String sql = "select t.* from " + tableName + " t where t.PROC_INST_ID_=#{processInstanceId} and t.ACT_ID_ = #{disActivityId} " +
                " order by t.END_TIME_ ASC";
        List<ActivityInstance> disActivities = runtimeService.createNativeActivityInstanceQuery().sql(sql)
                .parameter("processInstanceId", processInstanceId)
                .parameter("disActivityId", disActivityId).list();
        //删除运行时和历史节点信息
        for (ActivityInstance activityInstance : disActivities) {
            sql = "select t.* from " + tableName + " t where t.PROC_INST_ID_=#{processInstanceId} and (t.END_TIME_ >= #{endTime} or t.END_TIME_ is null)";
            List<ActivityInstance> datas = runtimeService.createNativeActivityInstanceQuery().sql(sql).parameter("processInstanceId", processInstanceId)
                    .parameter("endTime", activityInstance.getEndTime()).list();

            //排除目标节点
            datas = datas.stream().filter(data -> !data.getActivityId().equals(disActivityId)).collect(Collectors.toList());
            String deleteRuActSql = "delete from ACT_RU_ACTINST where ID_=#{id} ";
            if (CollectionUtils.isNotEmpty(datas)) {
                datas.forEach(ai ->
                        runtimeService.createNativeActivityInstanceQuery().sql(deleteRuActSql).parameter("id", ai.getId())
                );
                datas.forEach(ai ->
                        historyService.createHistoricActivityInstanceQuery().activityId(ai.getActivityId()).delete()
                );
            }
        }
    }

constants:

 /**
     * 提交人节点名称
     */
   String FLOW_SUBMITTER = "提交人";
    /**
     * 提交人的变量名称
     */
    String FLOW_SUBMITTER_VAR = "initiator";

以上,如有疑问欢迎提出交流

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值