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

完整项目

一个简单的申请流程如下:
在这里插入图片描述

<?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变量:

        //流程定义KEY
		String  definitionKey = "usertask";
		//发起者
		String applyuserid = "123456789";
		String taskUserId = "987654321";
		//businesskey
		String businesskey = "businesskey";
		//模拟租户ID
		String 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张):

        select
		distinct 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_
		from
		ACT_RU_TASK RES
		left join ACT_RE_PROCDEF arp
		on RES.PROC_DEF_ID_ = arp.ID_
		left join ACT_HI_PROCINST ahp on
		RES.PROC_INST_ID_ = ahp.PROC_INST_ID_
		where
		RES.ID_  > 0
		and
		(

			(
			exists(
			select
			distinct LINK.USER_ID_
			from
			ACT_RU_IDENTITYLINK LINK
			where
			USER_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();
		}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Activiti是一个开源的业务流程管理(BPM)框架,版本5.22是其中的一个版本。要下载Activiti 5.22,可以按照以下步骤进行操作。 首先,打开Activiti官方网站(https://www.activiti.org/),在主页面找到下载区域。 然后,在下载区域中找到适合您操作系统的版本。Activiti支持Windows、Linux和Mac OS等多种操作系统。点击下载按钮将会开始下载安装文件。 当下载完成后,您可以在本地计算机上找到下载好的文件。Activiti 5.22版本通常是一个压缩文件(例如zip格式)。双击解压缩文件,将会得到一个包含Activiti的安装文件和相关文档的文件夹。 在解压缩文件夹中,可以找到一个安装向导或说明文档。按照向导的指引或文档中的说明,您可以轻松地安装Activiti 5.22版本。 安装完成后,您可以根据需要配置Activiti的运行环境。Activiti可以与多种数据库和应用服务器进行集成,例如MySQL、Oracle、Tomcat等。根据您的需求,在配置文件中修改相关配置。 完成配置后,您可以启动Activiti。根据指引,启动Activiti的方式可能会有所不同。通常情况下,您需要在终端或命令行中进入Activiti的安装文件夹,并执行相应的命令或脚本。 启动成功后,您就可以使用Activiti 5.22来设计、执行和管理各种业务流程Activiti提供了友好的图形界面和强大的功能,可以帮助您优化和自动化业务流程。 总之,下载Activiti 5.22只需几个简单的步骤。根据官方网站提供的下载链接,下载安装文件并按照安装向导或文档的指引进行操作。完成安装和配置后,您就可以开始使用Activiti 5.22了。 ### 回答2: 要下载Activiti 5.22,你可以按照以下步骤进行: 1. 打开Activiti官方网站。在浏览器中输入“activiti.org”。 2. 进入官方网站后,点击“下载”或类似的选项,以便找到Activiti的下载页面。 3. 在下载页面上,你将看到不同版本的Activiti。找到标有“Activiti 5.22”的版本,并单击下载链接。 4. 在点击下载链接后,可能会弹出一个保存文件的对话框。选择一个你想要保存文件的位置,并为其指定一个名称。 5. 点击“保存”按钮,下载将开始。这可能需要一段时间,具体取决于你的网络连接速度。 6. 下载完成后,你可以在指定的位置找到Activiti 5.22的安装文件。这可能是一个zip压缩文件或一个可执行文件。 7. 如果下载的是zip文件,你需要解压缩该文件。右键单击文件,选择“解压缩”或类似选项。解压缩后,你将获得Activiti的安装文件夹。 8. 如果下载的是可执行文件,双击运行它,按照安装向导的指示完成安装过程。 9. 安装完成后,你可以开始使用Activiti 5.22。使用你喜欢的开发工具(如Eclipse等)来创建和管理工作流程。 希望以上步骤能帮助你成功下载并使用Activiti 5.22!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值