工作流后加签实现

1、流程重新定义

动态改变流程指向,创建新的节点

2、后加签环节及后加签属性设置

流程持久化、克隆活动、独立CMD

3、原始流程操作及后加签环节操作

4、流程场景遍历

5、流程图元体现

 

BPM后加签V1.0版说明。

效果图示:

 

功能说明:

1、支持同一环节多次后加签

2、支持弃审撤回后加签任务

3、后加签活动支持操作:审批、改派、驳回、后加签、前加签

4、设计器扩展:可否前/后加签标示

 

5、API扩展:可否前/后加签标示

 

示例代码:

{

        //流程引擎
        ProcessEngineConfiguration processEngine=commandContext.getProcessEngineConfiguration();
        //流程服务
        RepositoryService repositoryService=processEngine.getRepositoryService();
        RuntimeService runtimeService=processEngine.getRuntimeService();
        //1、创建新流程定义
        Model model=null;
        model=processEngine.getRepositoryService().getModel(getProcessId(task.getProcessDefinitionId()));
        logger.debug("流程模型ID:{},流程部署ID:{}",model.getId(),model.getDeploymentId());

        //查询流程定义
        BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());//流程定义查流程模型
        FlowElement currentElement=bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());

        Execution execution=runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
        logger.debug("活动{}",execution.getId());

        //图元处理
        Map<String, GraphicInfo> graphInfos=bpmnModel.getLocationMap();
        GraphicInfo graphicInfo=graphInfos.get(currentElement.getId());
        Double x=0.0;
        Double y=0.0;
        x=graphInfos.get(currentElement.getId()).getX()+90;
        y=graphInfos.get(currentElement.getId()).getY()+15;

        //加一个节点
        ApproveUserTask approveUserTask = new ApproveUserTask();
        //加出来的活动权限跟前面的活动权限相同
        if(currentElement instanceof ApproveUserTask)
        {
            ApproveUserTask currentApprove=(ApproveUserTask) currentElement;
            //后加签出来的环节加签属性
            approveUserTask.setAddsignAble(currentApprove.getAddsignAble());
            //后加签出来的环节不允许指派
            approveUserTask.setAssignAble(false);
            //approveUserTask.setAssignAll(false);
            approveUserTask.setAssignSingle(false);
            approveUserTask.setRejectAble(currentApprove.getRejectAble());
            approveUserTask.setCanBeRejected(currentApprove.getCanBeRejected());
            approveUserTask.setDelegateAble(currentApprove.getDelegateAble());
            approveUserTask.setSamepostApprove(currentApprove.getSamepostApprove());
            approveUserTask.setSendRejectMesToEvery(currentApprove.getSendRejectMesToEvery());

            approveUserTask.setApproveType(currentApprove.getApproveType());
            approveUserTask.setAsynchronous(currentApprove.isAsynchronous());
            approveUserTask.setAttributes(currentApprove.getAttributes());

            approveUserTask.setCategory(currentApprove.getCategory());
            approveUserTask.setCopyToOrgManagers(currentApprove.getCopyToOrgManagers());
            approveUserTask.setCopyToUsers(currentApprove.getCopyToUsers());

            //approveUserTask.setDuedateStrategy(currentApprove.getDuedateStrategy());
            approveUserTask.setExecutionListeners(currentApprove.getExecutionListeners());
            approveUserTask.setExtensionElements(currentApprove.getExtensionElements());
            approveUserTask.setExtendAttributes(currentApprove.getExtendAttributes());
            approveUserTask.setForCompensation(currentApprove.isForCompensation());
            approveUserTask.setFormKey(currentApprove.getFormKey());
            approveUserTask.setFormProperties(currentApprove.getFormProperties());
            approveUserTask.setMultipleTypeoperations(currentApprove.getMultipleTypeoperations());
            approveUserTask.setNotExclusive(currentApprove.isNotExclusive());
            approveUserTask.setOperations(currentApprove.getOperations());
            approveUserTask.setOperationsUnselected(currentApprove.getOperationsUnselected());
            approveUserTask.setTaskListeners(currentApprove.getTaskListeners());

            //标志是后加签产生的
            approveUserTask.setApproveType("addsignBehind");
        }
        //后加签出来的环节不能再次后加签
        //approveUserTask.setAddsignBehindAble(false);
        //ID、名称设置
        String newApproveUserId="approveUserTask"+"_"+ this.getUUID().substring(0,10);
        approveUserTask.setId(newApproveUserId);
        approveUserTask.setName("后加签");
        //参与人设置
        List <ProcessParticipantItem> processParticipantItemList=new ArrayList<ProcessParticipantItem>();
        ProcessParticipantItem participantXmlNode=new ProcessParticipantItem();
        Collection<String> col=getCollection();

        ProcessParticipantDetail[] details=new ProcessParticipantDetail[col.size()];
        participantXmlNode.setType("USER");
        int k=0;
        for(String userId:col)
        {
            details[k]=new ProcessParticipantDetail();
            details[k].setId(userId);
            k++;
        }
        participantXmlNode.setDetails(details);
        processParticipantItemList.add(participantXmlNode);
        ProcessParticipant processParticipant=new ProcessParticipant();
        processParticipant.setProcessParticipantItems(processParticipantItemList.toArray(new ProcessParticipantItem[processParticipantItemList.size()]));
        String participantjson=processParticipant.toJSONStr().replaceAll("\"", "'");
        String allUser="${bpmBean.getUser(\""+participantjson+"\",execution)}";

        approveUserTask.setAssignee("${assignee}");
        //审批类型
        MultiInstanceLoopCharacteristics multiInstanceObject = new MultiInstanceLoopCharacteristics();
        String multiInstance=(String)getActivity().getProperty("multiInstance");

        //环节设置为多人会签
        multiInstanceObject.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances==1}");
        multiInstanceObject.setInputDataItem(allUser);
        multiInstanceObject.setElementVariable("assignee");
        approveUserTask.setLoopCharacteristics(multiInstanceObject);

        //图元位置及新活动设置
        graphicInfo = new GraphicInfo();

        graphicInfo.setX(x);
        graphicInfo.setY(y);

        graphicInfo.setWidth(65);
        graphicInfo.setHeight(35);

        bpmnModel.addGraphicInfo(newApproveUserId, graphicInfo);

//        getBpmnModelString(bpmnModel);
        // 修改当前节点的流出线为新节点的流出线
        List<SequenceFlow> currentOutgoingFlows=((ApproveUserTask) currentElement).getOutgoingFlows();
        for(int i=0;i<currentOutgoingFlows.size();i++)
        {
            currentOutgoingFlows.get(i).setSourceRef(newApproveUserId);
        }
        // 加一条线,从当前节点到新创建的节点
        SequenceFlow sequenceFlow = new SequenceFlow();
        JSONObject json = new JSONObject();
        json.put("type", "sequenceFlow");
        String sequenceFlowId="SequenceFlow"+"_"+ this.getUUID().substring(0,10);
        sequenceFlow.setId(sequenceFlowId);
        sequenceFlow.setSourceRef(currentElement.getId());
        sequenceFlow.setTargetRef(newApproveUserId);
        Process process=bpmnModel.getProcesses().get(0);
        process.addFlowElement(sequenceFlow);
        String addSignProcessId="process"+"_"+ this.getUUID().substring(0,10);
        process.setId(addSignProcessId);
        List<GraphicInfo> graphicInfoList = new ArrayList<GraphicInfo>();
        //修改当前节点的连出线
        if(currentElement instanceof ApproveUserTask)
        {
            List<SequenceFlow> outgoingFlows=new ArrayList<SequenceFlow>();
            outgoingFlows.add(sequenceFlow);
            ((ApproveUserTask)currentElement).setOutgoingFlows(outgoingFlows);
            graphicInfoList.add(createGraphicInfo(12, 12));
        }
        graphicInfoList.add(createGraphicInfo(12, 12));
        bpmnModel.addFlowGraphicInfoList(sequenceFlowId, graphicInfoList);
        // 设置新增活动的连入和连出线
        List<SequenceFlow> incomingFlows=new ArrayList<SequenceFlow>();
        incomingFlows.add(sequenceFlow);
        approveUserTask.setIncomingFlows(incomingFlows);
        approveUserTask.setOutgoingFlows(currentOutgoingFlows);
        bpmnModel.getProcesses().get(0).addFlowElement(approveUserTask);

        //2、部署新流程定义
        String deploymentId=publishProcess(model,bpmnModel,false);
        //3、异步启动新流程定义
        new BpmThread(processEngine,deploymentId,taskId).start();
        //5、源任务记录状态
        task.setVariableLocal(COUNTERSIGN_BEHIND_ING, Boolean.TRUE);
        //添加评论
        if(comments != null && !"".equals(comments))
            commandContext.getProcessEngineConfiguration().getTaskService().addComment(task.getId(), task.getProcessInstanceId(), comments);
    }

 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江晓曼*凡云基地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值