亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

工作流學習——Activiti流程變量五步曲

2019-11-08 00:24:45
字體:
來源:轉載
供稿:網友

一、前言

 

    上一篇文章我們將流程實例的啟動與查詢,任務的辦理查詢都進行了介紹,我們這篇文章來介紹activiti中的流程變量。

 

二、正文

 

    流程變量與我們平常理解的變量是一樣的,只不過是用在了我們activiti中,所以稱為流程變量,流程變量在整個工作流扮演著很重要的角色。

 

    例如,請假流程中有請假天數、請假原因等一些參數都是流程變量使用的范圍,流程變量的作用域范圍是只對應一個流程實例。也就是說各個流程實例的流程變量是不互相影響的。流程實例結束完成以后流程變量還保存在數據庫中(存放在流程變量的歷史表中)。

 

如圖:

 

 

    關于流程實例的例子,我們先來看下流程圖的PRocessVariables.bpmn的配置文件:

 

[html] view plain copy<?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="http://www.activiti.org/test">    <process id="processVariables" name="processVariables【流程請假】" isExecutable="true">      <startEvent id="startevent1" name="Start"></startEvent>      <endEvent id="endevent1" name="End"></endEvent>      <userTask id="usertask1" name="提交申請"></userTask>      <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>      <userTask id="usertask2" name="審批【總經理】" activiti:assignee="王二"></userTask>      <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>      <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>    </process>    <bpmndi:BPMNDiagram id="BPMNDiagram_processVariables">      <bpmndi:BPMNPlane bpmnElement="processVariables" id="BPMNPlane_processVariables">        <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">          <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="90.0"></omgdc:Bounds>        </bpmndi:BPMNShape>        <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">          <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="420.0"></omgdc:Bounds>        </bpmndi:BPMNShape>        <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">          <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="190.0"></omgdc:Bounds>        </bpmndi:BPMNShape>        <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">          <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="300.0"></omgdc:Bounds>        </bpmndi:BPMNShape>        <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">          <omgdi:waypoint x="367.0" y="125.0"></omgdi:waypoint>          <omgdi:waypoint x="367.0" y="190.0"></omgdi:waypoint>        </bpmndi:BPMNEdge>        <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">          <omgdi:waypoint x="367.0" y="245.0"></omgdi:waypoint>          <omgdi:waypoint x="367.0" y="300.0"></omgdi:waypoint>        </bpmndi:BPMNEdge>        <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">          <omgdi:waypoint x="367.0" y="355.0"></omgdi:waypoint>          <omgdi:waypoint x="367.0" y="420.0"></omgdi:waypoint>        </bpmndi:BPMNEdge>      </bpmndi:BPMNPlane>    </bpmndi:BPMNDiagram>  </definitions>      一個很簡單的流程圖processVariables.png:

 

 

部署流程定義:

[java] view plain copy/**  * 部署流程定義(從inputStream)  */  @Test  public void deploymentProcessDefinition_inputStream() {      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();        InputStream inputStreamBpmn = this.getClass().getResourceAsStream(              "/diagrams/processVariables.bpmn");      InputStream inputStreamPng = this.getClass().getResourceAsStream(              "/diagrams/processVariables.png");      Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的Service              .createDeployment()// 創建一個部署對象              .name("流程定義")// 添加部署名稱              .addInputStream("processVariables.bpmn", inputStreamBpmn)// 使用資源文件的名稱(要求:與資源文件的名稱要一致),和輸入流完成部署              .addInputStream("processVariables.png", inputStreamPng)// 使用資源文件的名稱(要求:與資源文件的名稱要一致),和輸入流完成部署              .deploy();// 完成部署      System.out.println("部署ID:" + deployment.getId());      System.out.println("部署名稱:" + deployment.getName());  }  運行結果:

 

    部署ID:701

    部署名稱:流程定義

 

 

啟動流程實例:

[java] view plain copy    /**      * 啟動流程實例      */      @Test      public void startProcessInstance() {          // 流程定義的key          String processDefinitionKey = "processVariables";          ProcessInstance pi = processEngine.getRuntimeService()// 與正在執行的流程實例和執行對象相關的service                  .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應processVariables文件中的id的屬性值,使用key值啟動,默認是按照最新版本進行啟動            System.out.println("流程實例ID:" + pi.getId());          System.out.println("流程定義ID:" + pi.getProcessDefinitionId());          System.out.println("流程實例ID" + pi.getProcessInstanceId());    }  運行結果:

 

    流程實例ID:801

    流程定義ID:processVariables:1:704

    流程實例ID801

 

查詢任務

[java] view plain copy/**  * 查詢任務通過流程實例id  */  @Test  public void findTask(){      String processInstanceId="801";      List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的service              .createHistoricTaskInstanceQuery()//創建歷史任務實例查詢              .processInstanceId(processInstanceId)              .list();      if(list!=null && list.size()>0){          for(HistoricTaskInstance hti:list){              System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());              System.out.println("################################");          }      }     }  運行結果:

 

    804    提交申請   801   Fri Jun 26 10:55:02 CST2015   null   null

    ################################

 

 

    關于部署流程定義、啟動流程實例和查詢正在辦理的任務我們前面的文章已經介紹過了,所以我們不再詳細介紹,下面開始我們的設置流程變量,設置流程變量我們這里提供了兩種方式,分別是使用基本數據類型和使用javabean的方法,同意獲取流程變量也是不一樣的:

 

使用基本數據類型:

 

設置流程變量

[java] view plain copy/**  * 設置流程變量  */  @Test  public void setVariables() {      // 與任務相關的service,正在執行的service      TaskService taskService = processEngine.getTaskService();        // 任務ID      String taskId = "804";        // 1.設置流程變量,使用基本數據類型      taskService.setVariable(taskId, "請假天數", 7);// 與任務ID邦德      taskService.setVariable(taskId, "請假日期", new Date());      taskService.setVariableLocal(taskId, "請假原因", "回去探親,一起吃個飯123");            System.out.println("設置流程變量成功!");    }  

運行結果:

 

    設置流程變量成功!

 

獲取流程變量

[java] view plain copy/**  * 獲取流程變量  */  @Test  public void getVariables() {      // 與任務(正在執行的service)      TaskService taskService = processEngine.getTaskService();      // 任務Id      String taskId = "804";      // 1.獲取流程變量,使用基本數據類型      Integer days = (Integer) taskService.getVariable(taskId, "請假天數");      Date date = (Date) taskService.getVariable(taskId, "請假日期");      String reason = (String) taskService.getVariable(taskId, "請假原因");        System.out.println("請假天數:" + days);      System.out.println("請假日期:" + date);      System.out.println("請假原因:" + reason);    }  運行結果:

 

    請假天數:7

    請假日期:Fri Jun 2611:07:28 CST 2015

    請假原因:回去探親,一起吃個飯123

 

 

使用javabean

 

JavaBean的Person類

[java] view plain copypackage com.tgb;    import java.io.Serializable;  import java.util.Date;    public class Person implements Serializable {        private static final long serialVersionUID = 361866001729020143L;      //請假天數      private int id;      //請假人      private String name;      //請假原因      private String note;      //請假時間      private Date date;      public Date getDate() {          return date;      }      public void setDate() {          this.date = new Date();      }      public String getNote() {          return note;      }      public void setNote(String note) {          this.note = note;      }      public int getId() {          return id;      }      public void setId(int id) {          this.id = id;      }      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }  }  

 

設置流程變量

[java] view plain copy/**  * 設置流程變量  */  @Test  public void setVariables() {      // 與任務相關的service,正在執行的service      TaskService taskService = processEngine.getTaskService();        // 任務ID      String taskId = "804";        // 設置流程變量,使用javaBean方法      /**      * 當一個javaBean(實現序列號)放置到流程變量中,要求javabean的屬性不能在發生變化 如果發生變化,再獲取時,拋出異常      *       * 解決方案:在person對象中添加: private static final long      * serialVersionUID="6757393795687480331L"; 同時實現序列號接口      *       */      Person p = new Person();      p.setName("翠花");      p.setId(20);      p.setDate();;      p.setNote("回去探親,一起吃個飯123");      taskService.setVariable(taskId, "人員信息(添加固定版本)", p);            System.out.println("設置流程變量成功!");    }  運行結果:

 

    設置流程變量成功!

 

獲取流程變量

[java] view plain copy/**  * 獲取流程變量  */  @Test  public void getVariables() {      // 與任務(正在執行的service)      TaskService taskService = processEngine.getTaskService();      // 任務Id      String taskId = "804";        // 2.獲取流程變量,使用javaBean類型      Person p = (Person)taskService.getVariable(taskId, "人員信息(添加固定版本)");      System.out.println(" 請假人:  "+p.getName()+"  請假天數:  "+p.getId()+"   請假時間:"+ p.getDate()+ "   請假原因: "+p.getNote());    }  運行結果:

 

    請假人: 翠花  請假天數:  20  請假時間:Fri Jun 26 11:13:44 CST 2015  請假原因: 回去探親,一起吃個飯123

 

 

查詢歷史流程變量

 

    可以根據變量名稱查詢該變量的所有歷史信息

[java] view plain copy可以根據變量名稱查詢該變量的所有歷史信息  /**  * 查詢流程變量的歷史表  */  @Test  public void findHistoryProcessVariables(){      List<HistoricVariableInstance> list = processEngine.getHistoryService()              .createHistoricVariableInstanceQuery()//創建一個歷史的流程變量查詢對象              .variableName("請假原因")              .list();      if (list!=null &&list.size()>0) {          for (HistoricVariableInstance hvi : list) {              System.out.println(hvi.getId()+"     "+hvi.getProcessInstanceId()+"   "+hvi.getVariableName()                      +"   "+hvi.getVariableTypeName()+"    "+hvi.getValue());              System.out.println("########################################");          }      }    }   

流程變量支持的數據類型:

 

    流程變量支持的數據類型包括:TypeName、string、integer、short、long、double、boolean、data、binary、serializable,我們可以看出流程變量支持的包括了大部分封裝類型和Date、String和實現了Serializable接口的類的類型。

 

三、總結

 

    我們這篇文章將流程變量的相關知識進行了介紹,除了介紹流程變量的相關定義外還通過具體代碼例子介紹了通過不同方式來設置和獲取流程變量以及流程變量支持的數據類型。

http://blog.csdn.net/zwk626542417/article/details/46648139


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情小视频| 国产人妖伪娘一区91| 伊人久久久久久久久久久久久| 亚洲精品免费av| 日韩欧美亚洲成人| 国产一区深夜福利| 不卡av电影在线观看| 国产精品91在线| 国产美女扒开尿口久久久| 中文字幕不卡在线视频极品| 中文字幕亚洲欧美日韩在线不卡| 夜夜嗨av一区二区三区四区| 亚洲精品永久免费精品| 欧美大尺度电影在线观看| 黄色精品一区二区| 国产激情综合五月久久| 69影院欧美专区视频| 成人做爽爽免费视频| 亚洲丁香婷深爱综合| 国产日本欧美一区| 欧美日韩国产中文精品字幕自在自线| 亚洲欧美激情另类校园| 日韩精品在线观看网站| 亚洲电影第1页| 亚洲性无码av在线| 亚洲欧美激情在线视频| 日本午夜人人精品| 国产999在线| 国产欧美日韩丝袜精品一区| 欧美大片欧美激情性色a∨久久| 亚洲男人天堂古典| 高跟丝袜欧美一区| 国产日韩欧美中文在线播放| 精品久久久久久电影| 国产精品一二三视频| 欧美性生交xxxxxdddd| 欧美精品免费看| 久久99国产精品久久久久久久久| 欧美成人精品三级在线观看| www.亚洲一区| 欧美专区在线视频| 欧美性xxxx极品高清hd直播| 国产精品免费视频xxxx| www.国产精品一二区| 欧美裸体男粗大视频在线观看| 欧美日韩国产成人在线观看| 久久91精品国产| 亚洲国产一区二区三区四区| 日韩激情第一页| 亚洲国产精品久久91精品| 日韩免费视频在线观看| 日韩视频免费大全中文字幕| 亚洲一区二区三区视频| 91精品国产色综合久久不卡98口| 亚洲国产精品电影在线观看| 91在线观看免费| 久久视频在线观看免费| 日日骚av一区| 欧美成年人视频网站| 久久精品国产亚洲一区二区| 亚洲a级在线观看| 久久久久久久国产精品| 欧美成年人视频网站| 国产一区二区三区久久精品| 中文字幕久热精品在线视频| 91经典在线视频| 日本一区二区三区四区视频| 欧美老女人xx| 国产精品视频一| 欧美激情第1页| 欧洲一区二区视频| 日本久久91av| 亚洲理论在线a中文字幕| 欧美激情精品久久久久久| 欧洲中文字幕国产精品| 91夜夜未满十八勿入爽爽影院| 91av中文字幕| 亚洲人成网站777色婷婷| 日本久久中文字幕| 国产精品稀缺呦系列在线| 日韩美女视频在线观看| 国产丝袜一区二区三区| 欧美重口另类videos人妖| 欧美性猛交xxxx免费看漫画| 成人免费在线视频网址| 久久九九精品99国产精品| 精品久久久久久久久中文字幕| 国产精品自产拍高潮在线观看| 91精品国产综合久久香蕉922| 一区二区三区四区在线观看视频| 国产精品麻豆va在线播放| 日韩av一区在线观看| 成人免费视频97| 国产精品综合不卡av| 久久免费视频网站| 欧美重口另类videos人妖| 欧美日韩国产限制| 久久深夜福利免费观看| 色综合天天狠天天透天天伊人| 国产亚洲日本欧美韩国| 97人人做人人爱| 国产精品高清网站| 91亚洲精品视频| 神马久久桃色视频| 国产91色在线| 91久久精品久久国产性色也91| 久久网福利资源网站| 国产精品一区电影| 亚洲香蕉在线观看| 亚洲精品一区av在线播放| 国产一区二区久久精品| 国产精品va在线播放| 中文字幕成人精品久久不卡| 亚洲成人999| 亚洲福利视频在线| 成人黄色免费网站在线观看| 欧美韩日一区二区| 亚洲欧美中文日韩v在线观看| 高清欧美一区二区三区| 青青草精品毛片| 日韩电影中文字幕av| 国产精品网站大全| 国产自产女人91一区在线观看| 福利微拍一区二区| 成人午夜高潮视频| 亚洲大尺度美女在线| 丝袜情趣国产精品| 欧美成人亚洲成人日韩成人| 97精品在线观看| 国产精品视频大全| 81精品国产乱码久久久久久| 国产精品国产福利国产秒拍| 精品久久久久久中文字幕| 日韩免费av一区二区| 亚洲欧洲第一视频| 日韩在线播放一区| 国产精品久久久久久久久久久不卡| 亚洲毛片一区二区| 日韩欧美国产高清91| 国产丝袜一区二区| 国产精品免费一区豆花| 色噜噜狠狠狠综合曰曰曰88av| 亚洲欧美成人网| 国产福利视频一区| 日韩av网站导航| 中文字幕日韩综合av| 欧美成人剧情片在线观看| 国产成人精品一区二区| 亚洲综合中文字幕68页| 2019中文字幕在线免费观看| 亚洲第一网中文字幕| 精品国偷自产在线视频99| 国产一区二区日韩| 久久99精品视频一区97| 国产精品久久久久久久久久| 精品日本美女福利在线观看| 日韩欧美精品免费在线| 欧美一区二区三区免费视| 成人做爰www免费看视频网站| 姬川优奈aav一区二区| 中文字幕成人精品久久不卡| 国产精品免费看久久久香蕉| 欧美成人剧情片在线观看| xxx成人少妇69|