• 工作流-普通节点转会签节点


    运行时,实现普通节点转会签节点。
    注意:该方法会改变原来的流程定义,导致下个实例发起错误。个人认为用处不大,仅仅作为技术实现探讨。

    /**
         * 普通节点转会签节点-相当于改变了流程定义,后面如果再次发起流程,会出现错误-待解
         * 认领模式不存在加签,普通节点加签时只有一个人;
         */
        public MvcResult<Boolean> toCountersign(String taskId, String addSignUserId) {
            // 根据任务ID获取当前任务对象.
            Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
            // 根据流程定义ID获取流程bpmnModel.
            BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
            // 获取当前流程对象.
            Process process = bpmnModel.getProcesses().get(0);
            // 根据当前节点ID获取对应任务节点对象.
            UserTask currentUserTask = (UserTask) process.getFlowElement(task.getTaskDefinitionKey());
            // 获取当前节点出线信息.
            SequenceFlow sequenceFlow = currentUserTask.getOutgoingFlows().get(0);
            // 根据当前节点出线信息获取下一节点元素.
            FlowElement flowElement = process.getFlowElement(sequenceFlow.getTargetRef());
            // 判断下一节点元素是否为任务节点.
            // 配置会签所需条件.
            MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
            // 配置节点人员办理顺序 串行:true 并行:false.
            multiInstanceLoopCharacteristics.setSequential(false);
            // 配置会签集合变量名称.
            multiInstanceLoopCharacteristics.setInputDataItem(task.getTaskDefinitionKey());
            // 配置会签集合遍历名称.
            multiInstanceLoopCharacteristics.setElementVariable("signAssignee");
            multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfInstances == nrOfCompletedInstances}");
            // 将下一节点元素转换为任务节点对象.
            //UserTask nextUserTask = (UserTask) flowElement;
            // 设置下一节点处理人表达式 引用会签条件activiti:elementVariable="assignee".
            currentUserTask.setAssignee("${signAssignee}");
            // 下一任务节点设置会签循环特征.
            currentUserTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
    
            // 获取流程引擎配置实现类.
            ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) ProcessEngines.getDefaultProcessEngine().getProcessEngineConfiguration();
            // 创建新的任务实例.
            UserTaskActivityBehavior userTaskActivityBehavior = processEngineConfiguration.getActivityBehaviorFactory().createUserTaskActivityBehavior(currentUserTask);
            // 创建BPMN 2.0规范中描述的多实例功能.
            ParallelMultiInstanceBehavior behavior = new ParallelMultiInstanceBehavior(currentUserTask, userTaskActivityBehavior);
            // 设置下一节点多实例行为.
            currentUserTask.setBehavior(behavior);
            // 设置多实例元素变量.
            behavior.setCollectionElementVariable("signAssignee");
            // 注入表达式.
            ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();
            // 设置多实例集合表达式.
            behavior.setCollectionExpression(expressionManager.createExpression(task.getTaskDefinitionKey()));
    
    
            if(addSignUserId.equals(task.getAssignee())){
                return MvcResult.failed(ErrorCode.E_10.code(), messageSource.getMessage("i18n85", null, "", LangThreadLocal.get()));
            }
            Set<String> signAssigneeList = new HashSet<>();
            signAssigneeList.add(task.getAssignee());
            signAssigneeList.add(addSignUserId);
            runtimeService.setVariable(task.getProcessInstanceId(), task.getTaskDefinitionKey(), signAssigneeList);
    
            Map<String, Object> executionVariables = new HashMap<>();
            executionVariables.put("signAssignee", addSignUserId);
            managementService.executeCommand(new CustomCommonToCounterSignCmd(task.getTaskDefinitionKey(), task.getProcessInstanceId(), executionVariables));
            //runtimeService.addMultiInstanceExecutionCmd(task.getTaskDefinitionKey(),task.getProcessInstanceId() , executionVariables);
            return MvcResult.of(true);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
  • 相关阅读:
    【29】CISC和RISC:为什么手机芯片都是ARM?
    基于gis三维可视化的智慧城市行业运用
    Python:实现bucket sort桶排序算法(附完整源码)
    HTML的学习 Day01
    STN:不规则文本矫正网络的探索
    一文解决:Swagger API 未授权访问漏洞问题
    什么是机器学习中的集成学习,列举几种常见的集成学习算法
    ESP8266-Arduino编程实例-MAG3110磁力计驱动
    Go语言入门【2】运算符
    stm32学习-芯片系列/选型/开发方式
  • 原文地址:https://blog.csdn.net/qq_38747892/article/details/128189671