Activity7学习2

assignee值的UEL实现

在上一篇博客Activity学习1中,分配任务的个人是写死固定。

UEL其实就是用占位符方式,使得程序员可以通过java代码动态设置assignee的值,来动态分配个人任务。

 <userTask activiti:assignee="${assignee0}" id="ServiceTask_1" name="填写请假单" />
 <userTask activiti:assignee="${assignee1}" id="ServiceTask_2" name="部门经理审核" />
 <userTask activiti:assignee="${assignee2}" id="ServiceTask_3" name="总经理审核" />
/**
 * 流程启动时设置assignee的值,执行前先把holiday2流程部署上去
 */
public class AssigneeUEL {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //设置assignee的取值,用户可以界面选择节点的执行人
        Map<String,Object> map = new HashMap<>();
        map.put("assignee0","吴问号");
        map.put("assignee1","李皮皮");
        map.put("assignee2","刘小彤");
        //启动流程同时设置assignee的值
        runtimeService.startProcessInstanceByKey("holiday2",map);
        System.out.println(processEngine.getName());
    }
}

 流程变量

       流程变量就是Activity在管理工作流时需要用到的变量。例如:在请假流程中如果请假天数(holidayNum<=3)不需要总经理审核,holidayNum>3则需要总经理审核holidayNum就是一个流程变量。

注意:虽然流程变量中可以存储业务数据,但不建议这样使用,因为业务数据由查询业务系统负责,activity设置流程变量是为了流程执行而创建。

流程变量类型

string、Integer、short、long、double、boolean、date、binary、serializable。

注意:如果将pojo存储到流程变量中,必须实现序列化接口serializable,为了防止由于新增字段无法反序列化,需要生成serialVersionUID。

流程变量的使用方法

第一步:设置流程变量
第二步:通过UEL表达式使用流程变量
1>可以在assignee处设置UEL表达式,表达式的值为任务的负责人比如:S{assignee},assignee就是一个流程变量名称,Activiti获取UEL表达式的值,即流程变量assignee的值,将assignee的值作为任务的负责人进行任务分配。
2>可以在连线上设置UEL表达式,决定流程走向比如:S{price>=10000}和S{price<10000}:price就是一个流程变量名称,uel表达式结果类型为布尔类型如果UEL表达式是true,要决定流程执行走向。

实例启动时设置流程变量

 流程图

 holoday3.bpmn

<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
                   xmlns:activiti="http://activiti.org/bpmn"
                    id="sample-diagram" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
  <bpmn2:process id="Process_1" name="请假流程-测试流程变量" isExecutable="true">
    <bpmn2:startEvent id="StartEvent_1" name="开始">
      <bpmn2:outgoing>SequenceFlow_1ueycjs</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="Task_0y0it2n" name="填写请假申请" activiti:assignee="张三">
      <bpmn2:incoming>SequenceFlow_1ueycjs</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_0kn1h07</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:userTask id="Task_1liydlu" name="部门经理审批" activiti:assignee="李四">
      <bpmn2:incoming>SequenceFlow_0kn1h07</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_0riv3l0</bpmn2:outgoing>
      <bpmn2:outgoing>SequenceFlow_0b4q29q</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:userTask id="Task_0vhzrjq" name="总经理审批" activiti:assignee="王五">
      <bpmn2:incoming>SequenceFlow_0riv3l0</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_146fwye</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:userTask id="Task_1qmky03" name="人事存档" activiti:assignee="赵六">
      <bpmn2:incoming>SequenceFlow_0b4q29q</bpmn2:incoming>
      <bpmn2:incoming>SequenceFlow_146fwye</bpmn2:incoming>
      <bpmn2:outgoing>SequenceFlow_0cdkhtj</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:intermediateThrowEvent id="IntermediateThrowEvent_16sr9ms" name="结束">
      <bpmn2:incoming>SequenceFlow_0cdkhtj</bpmn2:incoming>
    </bpmn2:intermediateThrowEvent>
    <bpmn2:sequenceFlow id="SequenceFlow_1ueycjs" sourceRef="StartEvent_1" targetRef="Task_0y0it2n" />
    <bpmn2:sequenceFlow id="SequenceFlow_0kn1h07" sourceRef="Task_0y0it2n" targetRef="Task_1liydlu" />
    <bpmn2:sequenceFlow id="SequenceFlow_0riv3l0" sourceRef="Task_1liydlu" targetRef="Task_0vhzrjq">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${holiday.num&gt;3}</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="SequenceFlow_0b4q29q" sourceRef="Task_1liydlu" targetRef="Task_1qmky03">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${holiday.num&lt;=3}</bpmn2:conditionExpression>
    </bpmn2:sequenceFlow>
    <bpmn2:sequenceFlow id="SequenceFlow_0cdkhtj" sourceRef="Task_1qmky03" targetRef="IntermediateThrowEvent_16sr9ms" />
    <bpmn2:sequenceFlow id="SequenceFlow_146fwye" sourceRef="Task_0vhzrjq" targetRef="Task_1qmky03" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="156" y="103" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="164" y="146" width="22" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_0y0it2n_di" bpmnElement="Task_0y0it2n">
        <dc:Bounds x="284" y="81" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_1liydlu_di" bpmnElement="Task_1liydlu">
        <dc:Bounds x="444" y="81" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_0vhzrjq_di" bpmnElement="Task_0vhzrjq">
        <dc:Bounds x="444" y="233" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_1qmky03_di" bpmnElement="Task_1qmky03">
        <dc:Bounds x="625" y="143" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="IntermediateThrowEvent_16sr9ms_di" bpmnElement="IntermediateThrowEvent_16sr9ms">
        <dc:Bounds x="835" y="165" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="843" y="208" width="22" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1ueycjs_di" bpmnElement="SequenceFlow_1ueycjs">
        <di:waypoint x="192" y="121" />
        <di:waypoint x="284" y="121" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_0kn1h07_di" bpmnElement="SequenceFlow_0kn1h07">
        <di:waypoint x="384" y="121" />
        <di:waypoint x="444" y="121" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_0riv3l0_di" bpmnElement="SequenceFlow_0riv3l0">
        <di:waypoint x="494" y="161" />
        <di:waypoint x="494" y="233" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_0b4q29q_di" bpmnElement="SequenceFlow_0b4q29q">
        <di:waypoint x="544" y="121" />
        <di:waypoint x="585" y="121" />
        <di:waypoint x="585" y="183" />
        <di:waypoint x="625" y="183" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_0cdkhtj_di" bpmnElement="SequenceFlow_0cdkhtj">
        <di:waypoint x="725" y="183" />
        <di:waypoint x="835" y="183" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_146fwye_di" bpmnElement="SequenceFlow_146fwye">
        <di:waypoint x="544" y="273" />
        <di:waypoint x="585" y="273" />
        <di:waypoint x="585" y="183" />
        <di:waypoint x="625" y="183" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

重点关注

<bpmn2:sequenceFlow id="SequenceFlow_0riv3l0" sourceRef="Task_1liydlu" targetRef="Task_0vhzrjq">
      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${holiday.num&gt;3}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>

&gt是>的转义,&lt是<的转义 

pojo类

/**
 * 请假实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Holiday {
    private Integer id;
    private String proposerName;//申请人的名字
    private Date beginDate;//开始时间
    private Date endDate;//结束日期
    private Float num;//请假天数
    private String reason;//事由
    private String type;//请假类型

}

完成任务时设置变量

    @Test
    public void completeTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        HashMap<String, Object> map = new HashMap<>();
        Holiday holiday = new Holiday();
        holiday.setNum(5f);
        map.put("holiday",holiday);
        //处理任务,结合当前用户任务列表的查询操作,任务ID:25002
        taskService.complete("25002",map);
    }

 通过当前流程实例ID设置变量

    /**
     * 通过流程实例的id设置流程变量的值
     */
    @Test
    public void setGlobalVariableByExecutionId() {
        //当前流程实例执行id,通常设置为当前执行的流程实例
        String executionId="2601";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        Holiday holiday = new Holiday();
        holiday.setNum(3f);
        //通过流程实例id设置流程变量
        runtimeService.setVariable(executionId, "holiday", holiday);
        //一次设置多个值
//        runtimeService.setVariables(executionId, variables);
    }

 通过当前任务ID设置变量

    /**
     * 通过当前任务id设值变量
     */
    @Test
    public void setGlobalVariableByTaskId() {
        //当前待办任务id
        String taskId="1404";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Holiday holiday = new Holiday();
        holiday.setNum(3f);
        taskService.setVariable(taskId,"holiday",holiday);
    //设置只在当前任务节点起作用的局部变量
//        taskService.setVariableLocal(taskId,"holiday",holiday);
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activiti工作流接口的使用可以通过以下步骤来实现: 1. 首先,你需要在你的项目中添加Activiti的依赖。你可以通过Maven或Gradle等构建工具来添加依赖。可以参考中提供的教程来学习如何使用代码方式快速掌握Activiti的使用方法。 2. 一旦你已经添加了Activiti的依赖,你可以开始使用Activiti的API。你可以通过调用Activiti提供的各种接口来创建和管理工作流程。这些接口包括:TaskService、RuntimeService、HistoryService、IdentityService等。每个接口都有不同的功能,可以满足不同的需求。 3. TaskService接口用于管理任务,例如创建任务、完成任务、分配任务给特定用户等。通过调用TaskService的方法,你可以对任务进行各种操作。 4. RuntimeService接口用于管理和控制工作流程的执行。你可以使用该接口来启动工作流程实例、查询运行中的流程实例、发送信号等。 5. HistoryService接口用于访问和查询历史数据,例如查询已完成的任务、查询工作流程实例的历史记录等。 6. IdentityService接口用于管理用户和组。你可以使用该接口来创建用户、分配用户到特定的组、查询用户信息等。 7. 另外,在和的官方例子中,你可以找到更多关于Activiti的使用示例和实践。 综上所述,通过使用Activiti提供的各种接口,你可以轻松地创建、管理和执行工作流程,根据具体的需求进行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Activiti工作流教程](https://blog.csdn.net/YoungShuai1995/article/details/119087828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaEE:Activiti工作流使用](https://blog.csdn.net/a526001650a/article/details/107580267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值