工作流后加签实现

article/2025/10/7 11:12:19

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);}

 


http://chatgpt.dhexx.cn/article/c1PVYX7W.shtml

相关文章

前后端RSA互相加解密、加签验签、密钥对生成(Java)

目录 一、序言二、关于PKCS#1和PKCS#8格式密钥1、简介2、区别 二、关于JSEncrypt三、关于jsrsasign四、前端RSA加解密、加验签示例1、相关依赖2、cryptoUtils工具类封装3、测试用例 五、Java后端RSA加解密、加验签1、CryptoUtils工具类封装2、测试用例 六、前后端加解密、加验签…

国密:SM2公私钥加签验签

一、工具类 POM中增加hutool <dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.6.5</version></dependency> package cn.test.encrypt.utils.sm2; /*** SM2签名所计算的值 可以根据…

RSA加签解签方法

一、RSA签名的过程 &#xff08;1&#xff09;A生成一对密钥&#xff08;公钥和私钥&#xff09;&#xff0c;私钥不公开&#xff0c;A自己保留。公钥为公开的&#xff0c;任何人可以获取。 &#xff08;2&#xff09;A用自己的私钥对消息加签&#xff0c;形成签名&#xff0…

安全对外的接口--加签验签

前言 我们在求职面试中,经常会被问到,如何设计一个安全对外的接口呢? 其实可以回答这一点,加签和验签,这将让你的接口更加有安全。接下来,本文将和大家一起来学习加签和验签。从理论到实战,加油哦~ 密码学相关概念加签验签概念为什么需要加签、验签加密算法简介加签验签…

程序员必备基础:加签验签

来源&#xff1a;捡田螺的小男孩 我们在求职面试中&#xff0c;经常会被问到&#xff0c;如何设计一个安全对外的接口呢? 其实可以回答这一点&#xff0c;加签和验签&#xff0c;这将让你的接口更加有安全。接下来&#xff0c;本文将和大家一起来学习加签和验签。从理论到实战…

RSA公私钥加密加签顺序

RSA是一种非对称加密的机制&#xff0c;是一对密钥对&#xff08;公钥和私钥&#xff09;。 一、加密&#xff1a; 1.公钥加密&#xff0c;私钥解密。可以多人持有公钥进行数据加密&#xff0c;仅一人持有私钥进行数据解密&#xff1b; 2.可以确保数据传输的安全性。 二、加签…

【flowable】十一、flowable加签和转签

flowable加签和转签 加签 同时让多人处理任务&#xff0c;但是不同于网关操作。 1、向前加签 任务在A这里&#xff0c;A这个时候需要BCD核对一下&#xff0c;等BCD核对之后又回到A这里 2、向后加签 任务在A这里&#xff0c;A这个时候需要BCD处理这个事情&#xff0c;处理完毕…

加解密,加签、验签也就这肥事

前言&#xff1a; ps:上图有一处错误&#xff0c;右下角有一条线是N&#xff0c;指向的是不读取内容 上图省略了CA认证过程&#xff0c;直接提取到了密钥对&#xff0c;Base64的过程已省略(关于Base64的底层原理&#xff0c;可参考标题3)。全文1.6w字&#xff0c;如果想全部…

前后端分离技术之加签,验签,防篡改

上一篇讲解了加密解密&#xff0c;这次来个加签验签&#xff0c;实际项目里&#xff0c;我们采用的是react 和nodejs 来进行加签验签&#xff0c;用的jsrsasign库&#xff0c;下面贴点核心代码 react加签 nodejs验签 实际应用在nodejs层可以将时间戳和sign签名验证通过剔除掉&…

深入探究Camunda加签问题

开源项目介绍&#xff1a;点击直达 前言 这里我们先抛出两个大问题&#xff0c;整篇文章针对这两个大问题再详细解析。 首先我们在设计流程定义时&#xff0c;流程节点可能是或签也可能是会签 会签&#xff1a;指同一个审批节点设置多个人&#xff0c;如ABC三人&#xff0c…

activity多实例任务加签

前言 加签是减签的相反的操作,加签与减签的思路刚好相反,减签是删数据;加签则是添加数据。在一些特殊场景下,需要在某个多实例节点上面动态新增一个审批人员或任务时,就需使用到activity多实例任务加签的功能 加签思路1 根据一级流程实例查找二级流程执行实例判断二级执…

Activiti7工作流引擎:进阶篇(十二) 加签和转签

知识传送门 》》》》》》》》》》》》》》》》》》》 加签就是委派任务delegateTask&#xff0c;然后去解决任务resolveTask&#xff08;并不是去真正的去完成任务&#xff09;。转签完成后才能完成任务complete。 一&#xff1a;委派任务 A由于某些原因不能处理该任务可以把任…

必备基础:加签验签

必备基础&#xff1a;加签验签 1 密码学相关概念1.1 明文、密文、密钥、加密、解密1.2 对称加密、非对称加密1.3 什么是公钥私钥&#xff1f; 2 加签验签概念3 为什么需要加签验签4 常见加密相关算法简介4.1 消息摘要算法4.1.1 MD家族算法4.1.2 ShA家族算法4.1.3 MAC算法家族 4…

Flowable工作流之加签(委派)、转签(转办)

目录 1. 加签1.1. 向前加签1.2. 向后加签 2. 或签3. 委派和转办的区别2.1. 委派2.2. 转办 4. 向前加签4.1. 流程图4.2. 部署并启动4.3. 完成任务4.4. 向前加签实现4.4.1. 添加加签&#xff08;委派&#xff09;功能任务4.4.1. 加签&#xff08;委派&#xff09;任务的完成 5. 转…

加密、解密、加签、验签专题

首先明确几个名词&#xff1a; 加密&#xff1a;发送方利用接收方的公钥对要发送的明文进行加密。 解密&#xff1a;接受方利用自己的私钥进行解密。 公钥和私钥配对的&#xff0c;用公钥加密的文件&#xff0c;只有对应的私钥才能解密。当然也可以反过来&#xff0c;用私钥…

@ControllerAdvice 之 @InitBinder和@ModelAttribute

InitBinder 准备 InitBinder 在整个 HandlerAdapter 调用过程中所处的位置 收获&#x1f4a1; RequestMappingHandlerAdapter 初始化时会解析 ControllerAdvice 中的 InitBinder 方法&#xff08;可以定义个性化数据转化器&#xff09;RequestMappingHandlerAdapter 会以类…

SpringBoot @InitBinder注解实现Bean国际化校验

参考资料 参考&#xff1a; 妥当性チェックのエラーメッセージ出力方法 (需翻墙)springMVC之InitBinder的用法1springMVC之InitBinder的用法2springMVC之InitBinder 和 ValidatorSpring MVCにおけるフォームバリデーションの適用事例【後編】 目录 一. 前期准备1.1 自定义校验…

SpringMVC之@InitBinder注解(日期转换)

InitBinder注解的作用&#xff1a; springmvc并不是能对所有类型的参数进行绑定的&#xff0c;如果对日期Date类型参数进行绑定&#xff0c;就会报错IllegalStateException错误。所以需要注册一些类型绑定器用于对参数进行绑定。InitBinder注解就有这个作用。 程序代码示例&am…

initbinder对ajax不起作用,Spring MVC InitBinder验证方法

使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的&#xff0c;也即比较复杂的验证情况下才会使用。大部份简单的表单验证&#xff0c;使用annotation验证即可以解决。 这里需要注意的一点&#xff1a;InitBinder和Annotation两种验证只能二选…

SpringMvc @InitBinder

这篇博客记录InitBinder怎么起作用、起什么作用&#xff1f; 首先,该注解被解析的时机&#xff0c;是该匹配Controller的请求执行映射的方法之前; 同时 InitBinder标注的方法执行是多次的&#xff0c;一次请求来就执行一次。 当某个Controller上的第一次请求由SpringMvc前端控制…