完整项目

一个简单的申请流程如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="usertask"><process id="usertask" name="usertask" isExecutable="true"><startEvent id="startevent1" name="Start" activiti:initiator="${applyuserid}"></startEvent><userTask id="usertask1" name="领导审批" activiti:assignee="${taskUserId}"><extensionElements><activiti:taskListener event="all" class="listener.MyExecutionListener"></activiti:taskListener></extensionElements></userTask><sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow><exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow2" sourceRef="usertask1" targetRef="exclusivegateway1"></sequenceFlow><sequenceFlow id="flow3" name="同意" sourceRef="exclusivegateway1" targetRef="endevent1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve=='true'}]]></conditionExpression></sequenceFlow><userTask id="modifyapply" name="调整申请" activiti:assignee="${applyuserid}"></userTask><sequenceFlow id="flow4" name="不同意" sourceRef="exclusivegateway1" targetRef="modifyapply"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve=='false'}]]></conditionExpression></sequenceFlow><exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway><sequenceFlow id="flow5" sourceRef="modifyapply" targetRef="exclusivegateway2"></sequenceFlow><sequenceFlow id="flow6" name="放弃申请" sourceRef="exclusivegateway2" targetRef="endevent1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${reapply=='false'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow7" name="重新申请" sourceRef="exclusivegateway2" targetRef="usertask1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${reapply=='true'}]]></conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_usertask"><bpmndi:BPMNPlane bpmnElement="usertask" id="BPMNPlane_usertask"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="121.0" y="100.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55.0" width="105.0" x="300.0" y="90.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"><omgdc:Bounds height="40.0" width="40.0" x="530.0" y="97.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="760.0" y="100.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="modifyapply" id="BPMNShape_modifyapply"><omgdc:Bounds height="55.0" width="105.0" x="498.0" y="290.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2"><omgdc:Bounds height="40.0" width="40.0" x="530.0" y="410.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="156.0" y="117.0"></omgdi:waypoint><omgdi:waypoint x="300.0" y="117.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="405.0" y="117.0"></omgdi:waypoint><omgdi:waypoint x="530.0" y="117.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"><omgdi:waypoint x="570.0" y="117.0"></omgdi:waypoint><omgdi:waypoint x="760.0" y="117.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="570.0" y="117.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"><omgdi:waypoint x="550.0" y="137.0"></omgdi:waypoint><omgdi:waypoint x="550.0" y="290.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="550.0" y="137.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"><omgdi:waypoint x="550.0" y="345.0"></omgdi:waypoint><omgdi:waypoint x="550.0" y="410.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"><omgdi:waypoint x="570.0" y="430.0"></omgdi:waypoint><omgdi:waypoint x="777.0" y="429.0"></omgdi:waypoint><omgdi:waypoint x="777.0" y="135.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="601.0" y="430.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"><omgdi:waypoint x="530.0" y="430.0"></omgdi:waypoint><omgdi:waypoint x="352.0" y="429.0"></omgdi:waypoint><omgdi:waypoint x="352.0" y="145.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="411.0" y="430.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

动态指定审批人,bpmn文件不能写死,需要指定成变量方式,流程启动时候以流程变量方式传入。
start节点:

领导审批节点:

调整申请节点:

发起流程时候,获取bpmn文件的全部usertask节点变量并动态设置值(一般用户UI选择的值),然后以流程变量方式发起流程:
获取bpmn文件的usertask节点的Assignee变量:

        //流程定义KEYString  definitionKey = "usertask";//发起者String applyuserid = "123456789";String taskUserId = "987654321";//businesskeyString businesskey = "businesskey";//模拟租户IDString tenantId = "1311197133446770699";//解析bpmn文件,获取usertask节点信息List<ProcessDefinition> processDefinitionList = rep.createProcessDefinitionQuery().processDefinitionKey(definitionKey).orderByProcessDefinitionVersion().desc().list();BpmnModel bpmnModel = rep.getBpmnModel(processDefinitionList.get(0).getId());//简单流程获取Process//复杂的多个执行exceute分支,使用:bpmnModel.getProcesses()org.activiti.bpmn.model.Process process = bpmnModel.getMainProcess();List<UserTask> userTaskList = process.findFlowElementsOfType(UserTask.class);Iterator<UserTask> it = userTaskList.iterator();while (it.hasNext()) {UserTask ut = (UserTask) it.next();String assignee = ut.getAssignee();String id = ut.getId();String name = ut.getName();System.out.println(String.format("assignee=%s,id=%s,name=%s", assignee,id,name));}


解析获取assignee变量:taskUserId、applyuserid作为key并赋值value(一般用户UI选择的值),最后启动流程实例:

     Map<String,Object> variables=new HashMap<String, Object>();    //流程启动人的信息variables.put("applyuserid", "123456789");    variables.put("taskUserId", "987654321");//设置发起人    identityservice.setAuthenticatedUserId(applyuserid);ProcessInstance instance = runservice.startProcessInstanceByKeyAndTenantId(definitionKey,businesskey,variables,tenantId);ProcessDefinition processDefinition = rep.createProcessDefinitionQuery().processDefinitionId(instance.getProcessDefinitionId()).singleResult();runservice.setProcessInstanceName(instance.getProcessInstanceId(),processDefinition.getName());System.out.println("processInstanceId:" + instance.getProcessInstanceId());

用户获取自己可以审批的任务,放弃API,自己写SQL实现(涉及流程实例历史表ACT_HI_PROCINST 、流程任务运行时表ACT_RU_TASK 、流程定义表ACT_RE_PROCDEF ,3张):

        selectdistinct RES.*,arp.NAME_ AS DEF_NAME_,arp.KEY_ AS DEF_KEY_,arp.CATEGORY_  AS DEF_CATEGORY_,arp.VERSION_,arp.SUSPENSION_STATE_ ,ahp.START_TIME_,ahp.END_TIME_,ahp.START_USER_ID_,ahp.PROC_INST_ID_fromACT_RU_TASK RESleft join ACT_RE_PROCDEF arpon RES.PROC_DEF_ID_ = arp.ID_left join ACT_HI_PROCINST ahp onRES.PROC_INST_ID_ = ahp.PROC_INST_ID_whereRES.ID_  > 0and((exists(selectdistinct LINK.USER_ID_fromACT_RU_IDENTITYLINK LINKwhereUSER_ID_ = '987654321'and LINK.TASK_ID_ = RES.ID_)or RES.ASSIGNEE_ = '987654321'or RES.OWNER_ = '987654321'))

下面是一些完成任务的操作:

        //领导审批(完成任务)String taskId = "122505";String processInstanceId= "117522";Map<String,Object> variablesComplete=new HashMap<String,Object>();//完成任务variablesComplete.put("approve", "true");//添加审批评论taskservice.addComment(taskId, processInstanceId, "同意了,继续加油");//多个人处理的时候,拾取任务//taskId查询Task对象Task task=taskservice.createTaskQuery().taskId(taskId).singleResult();//拾取任务try{//已经指定就不要拾取任务if(StringUtils.isBlank(task.getAssignee())){taskservice.claim(taskId,taskUserId);}//完成任务taskservice.complete(taskId, variablesComplete);}catch(Exception e){e.printStackTrace();}

如果被领导驳回,重新发起申请:

       //驳回,重新审批String taskId = "120005";String processInstanceId= "117522";Map<String,Object> variablesComplete=new HashMap<String,Object>();variablesComplete.put("reapply", "true");taskservice.addComment(taskId, processInstanceId, "发起人重新申请");//多个人处理的时候,拾取任务//taskId查询Task对象Task task=taskservice.createTaskQuery().taskId(taskId).singleResult();//拾取任务try{if(StringUtils.isBlank(task.getAssignee())){taskservice.claim(taskId,taskUserId);}//完成任务taskservice.complete(taskId, variablesComplete);}catch(Exception e){e.printStackTrace();}

类钉钉,activiti5.22发起流程时候动态指定审批人相关推荐

  1. activiti5.22 springboot 流程引擎 实战全过程

    https://blog.csdn.net/ssyujay/article/details/83896809

  2. 宜搭和钉钉审批流的比较

    一.宜搭 版本介绍 使用场景 在宜搭的应用中,通过以下几类页面来配合完成完整的业务场景需求的解决: 表单:存储或收集数据,通过权限配置实现不同角色人员能够拥有不同的数据增删改查.导入.导出等权限: 流 ...

  3. 5分钟接入钉钉工作流之模板配置、钉钉接口流程发起

    一.前言 自从上次 水了一篇 写了一篇5分钟快速接入钉钉实现考勤后过了1个多月的时间,我福乐里又和大家见面了,今天我来聊聊工作流的那些事. 想必各位攻城狮都做过或者接触过OA系统,说到OA系统肯定离不 ...

  4. 请教!C# 做钉钉回调接口,怎么个流程或处理?感谢 !

    C# 做钉钉回调接口,怎么个流程或处理?感谢 事件回调 回调是开发者在钉钉开放平台注册一个HTTP接口,并订阅相关的事件,当事件发生时,钉钉会主动调用开发者注册的HTTP接口,推送对应的事件信息.比如 ...

  5. python小项目实例流程-公司内项目对接钉钉审批流程(python)

    1 importrequests2 importjson3 importtime4 from dingtalk.crypto importDingTalkCrypto5 6 from django.c ...

  6. Activiti6:模拟钉钉上面的请假流程(使用web画图并导出xml然后使用java执行流程)

    1.声明 当前内容主要为本人学习和测试Activiti6这个工作流的基本操作,模拟钉钉上面的请假流程(简单版) 当前内容主要有: 使用官方的web-app方式画图 将当前流程图导出为xml配置 将xm ...

  7. 互联网快讯:华虹虹芯基金正式发起成立;极米高性能投影产品获用户青睐;中国电信联手钉钉研发“天翼钉”

    国内要闻 新华三与中国工业互联网研究院达成战略合作,为工业互联网发展按下加速键: 中国海洋石油:中国证监会受理公司A股发行股份申请材料: 3.华润创业与冯氏投资签订合作备忘录,3亿美元共拓新消费领域创 ...

  8. 钉钉OA流程审批,Jenkins自动授权通知用户密码

    目录 一.目的: 二.钉钉表单设计: 三.Jenkins设置(插件Role-based ): 四.服务器部署: 五.Python3定时检测脚本: 一.目的: 公司目前的软件版本发布是通过Jenkins ...

  9. 钉钉工作流报错:50001流程处理异常:审批系统错误,原因为【{0}】

    目录 完整报错如下 操作过程如下 猜测原因 咨询官方原因 完整报错如下 {"code": 50001,"msg": "流程处理异常:审批系统错误,原因 ...

最新文章

  1. python 工业自动化 人工智能_Python人工智能之路 - 第三篇 : PyAudio 实现录音 自动化交互实现问答...
  2. python 监控windows磁盘空间和备份大小
  3. MVC中,视图的Layout使用
  4. Activity Stack
  5. seaborn系列 (12) | 增强箱图boxenplot()
  6. android studio下载插件时出现的read time out问题
  7. Apache Shiro 使用手册---转载
  8. js获取php页面session的值,在html页面中取得session中的值的方法
  9. 叶明哲 | 数据中心空调文章集锦
  10. 不同的寻址方式的应用——将每行单词的前X个字母改为大写
  11. c语言程序检测进程pid,C语言实现由PID获取进程名由进程名获取PID
  12. 解决vue打包后静态资源路径错误的问题
  13. .NET 中的泛型 101
  14. weblogic 文件服务器,weblogic配置文件服务器
  15. 多重搜索算法_Android多重搜寻,例如传送,搜寻联络人
  16. sitck-breaking折棍法理解
  17. JavaMail简单接收邮件
  18. 基于C#和SQL SERVER的汉字词典的设计与实现
  19. 百度AI输入法发布全感官输入2.0版本,语音技术取得世界级突破
  20. 【技术美术图形部分】2.1 色彩空间

热门文章

  1. step函数在MATLAB通信工具箱comm.ErrorRate中的用法
  2. 安卓手机开不了机_苹果6黑屏开不了机怎么办
  3. ps实例二:使用高斯滤镜制作图片阴影效果?
  4. lisp工具箱for中望_中望CAD绘制地面排版图
  5. ubuntu英文环境下使用中文输入法
  6. 用“生物进化论”来阐述“恶意代码进化论”
  7. 2023 仿闪照微信小程序源码 附外卖功能
  8. 门限的限意思是什么_门限是什么意思_门限的翻译_音标_读音_用法_例句_爱词霸在线词典...
  9. 基于UDP的网络群聊聊天室
  10. 单位矩阵在乘法运算中相当于1