1. 程式人生 > >activiti自定義流程之整合(六):獲取我的申請任務

activiti自定義流程之整合(六):獲取我的申請任務

流程啟動後,流程節點便進入到了任務相關的部分。可以看到我之前的做法是在啟動節點就綁定了form表單,啟動時就填寫相關的資料。實際上在之前我的做法是不對開始節點做任何操作,知道任務節點的時候再填寫相關的資料進行設定。

至於這兩種方式的優劣,我暫時還不太確定,單獨從功能上來說都是可以實現的,因此大家可以都試一試,然後視不同的情況而定,按自己究竟要用哪種。

而在任務相關的部分,我是把使用者任務分成了兩種,一種是我的申請,一種是我的任務。區別就是我發起的任務,和別人提交給我的或者反饋給我的任務。

那麼流程一啟動,第一個自然就是自己的申請了,這裡便說明這個問題。

在這一篇中,需要注意的並不在於form表單,而是如何判斷是不是初次申請,我一開始用的是流程節點來判斷,這樣就需要拿到流程節點並進行相關的遍歷。

但是後來我回過頭來再看時便發現其實遠不止著一種方法,比如也可以通過任務來區分,如果整個流程例項只有一個任務,那麼這個任務自然就是申請。當然了,前提是要限制任務是不能刪除的。

還有就是,每一個任務都有啟動時間,根據這個時間進行排序也應該可以進行判斷,只是這個我還沒有嘗試,可行性究竟如何還有待確定。

那麼下邊就又到了上程式碼的時刻:

後臺程式碼如下:

/**
     * @throwsXMLStreamException
     *             查詢我申請未提交的任務
     *
     * @author:tuzongxun
     * @Title: findTask
     * @
[email protected]
* @return Object * @date Mar 17, 20162:44:11 PM * @throws */ @RequestMapping(value = "/findFirstTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8") @ResponseBody public Object findFirstTask(HttpServletRequest req) throws XMLStreamException { Map<String, Object> map = new HashMap<String, Object>(); boolean isLogin = this.isLogin(req); if (isLogin) { List<TaskModel> taskList = new ArrayList<TaskModel>(); HttpSession session = req.getSession(); String assginee = (String) session.getAttribute("userName"); List<Task> taskList1 = taskService.createTaskQuery() .taskAssignee(assginee).list(); if (taskList1 != null && taskList1.size() > 0) { for (Task task : taskList1) { TaskModel taskModel = new TaskModel(); // 獲取部署名 String processdefintionId = task.getProcessDefinitionId(); ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() .processDefinitionId(processdefintionId) .singleResult(); // 根據taskname和節點判斷是否是第一個 String taskName = task.getName(); Iterator<FlowElement> iterator = this .findFlow(processdefintionId); String row0 = null; String eleName0 = null; while (iterator.hasNext()) { FlowElement flowElement0 = iterator.next(); // 下一個節點 FlowElement flowElement = iterator.next(); String eleName = flowElement.getName(); if (taskName.equals(eleName)) { row0 = flowElement0.getXmlRowNumber() + ""; eleName0 = flowElement0.getClass().getSimpleName(); break; } } // 提交申請時 if (eleName0.equals("StartEvent")) { /////////////////////////// // 獲取流程變數 Map<String, Object> variables = runtimeService .getVariables(task.getProcessInstanceId()); Set<String> keysSet = variables.keySet(); Iterator<String> keySet = keysSet.iterator(); Map<String, String> formData = new HashMap<String,String>(); taskModel.setLastForm(this .getStartForm1((String) variables .get("deploymentId"))); taskModel.setAssignee(task.getAssignee()); taskModel.setCreateTime(task.getCreateTime()); taskModel.setId(task.getId()); taskModel.setName(task.getName()); taskModel.setProcessInstanceId(task .getProcessInstanceId()); taskModel .setProcessDefId(task.getProcessDefinitionId()); taskModel.setFormKey(task.getFormKey()); String deploymentId = processDefinition .getDeploymentId(); Deployment deployment = repositoryService .createDeploymentQuery() .deploymentId(deploymentId).singleResult(); String deploymentName = deployment.getName(); taskModel.setDeploymentName(deploymentName); while (keySet.hasNext()) { String key = keySet.next(); String value = (String) variables.get(key); if (key.contains(row0)) { formData.put(key, value); } } taskModel.setFormData(formData); taskList.add(taskModel); } } } map.put("isLogin", "yes"); map.put("userName", (String) req.getSession().getAttribute("userName")); map.put("result", "success"); map.put("data", taskList); } else { map.put("isLogin", "no"); } return map; }


注意上邊的方法中有呼叫getStartForm1這個方法,可在上一篇中找到。另外一個呼叫查詢流程節點的方法如下:

/**
     * @throwsXMLStreamException
     *             查詢流程節點
     *
     * @author:tuzongxun
     * @Title: findFlow
     * @[email protected]
     * @return Iterator<FlowElement>
     * @date Mar 21, 20169:31:42 AM
     * @throws
     */
    public Iterator<FlowElement> findFlow(String processDefId)
           throws XMLStreamException {
       List<ProcessDefinition> lists = repositoryService
              .createProcessDefinitionQuery()
              .processDefinitionId(processDefId)
              .orderByProcessDefinitionVersion().desc().list();
       ProcessDefinition processDefinition = lists.get(0);
       processDefinition.getCategory();
       String resourceName = processDefinition.getResourceName();
       InputStream inputStream = repositoryService.getResourceAsStream(
              processDefinition.getDeploymentId(), resourceName);
       BpmnXMLConverter converter = new BpmnXMLConverter();
       XMLInputFactory factory = XMLInputFactory.newInstance();
       XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
       BpmnModel bpmnModel = converter.convertToBpmnModel(reader);
       Process process = bpmnModel.getMainProcess();
       Collection<FlowElement> elements = process.getFlowElements();
       Iterator<FlowElement> iterator = elements.iterator();
       return iterator;
    }


前臺的程式碼,我想經過這麼久的程式碼羅列,app.js和html中的寫法應該沒有必要再寫了,業務邏輯如下:

angular.module('activitiApp') 
.controller('findFirstTaskCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){ 
$scope.init=function(){
        $http.post("./findFirstTask.do").success(function(result) {
        if(result.isLogin==="yes"){
        $rootScope.userName=result.userName;
        $scope.taskList=result.data;
        }else{
             $location.path("/login");
        }
        });
}   
        //檢視findDetail(task)
        $scope.findDetail=function(task){
        console.log(task);
        $('#findDetail').html('').dialog({
             title:'節點名稱[' + task.name + ']',
            modal:true,
            width:$.common.window.getClientWidth() * 0.6,
            height:$.common.window.getClientHeight() * 0.9,
            open:function() {
               // 獲取json格式的表單資料,就是流程定義中的所有field
            var dialog = this;
            // 讀取啟動時的表單
                // 獲取的form是字元行,html格式直接顯示在對話方塊內就可以了,然後用form包裹起來
                $(dialog).append("<div class='formContent' />");
                $('.formContent').html('').wrap("<form id='findDetailForm' class='formkey-form1'method='post' />"); 
                var $form = $('.formkey-form1');
                //設定部署的Id
                $form.append("任務Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");
                $form.append("申請時間:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='createTime' value="+new Date(task.createTime).format('yyyy-MM-dd hh:mm:ss')+"></br>");
                //根據formData設定申請頁面
                //處理form字串
                var form=task.lastForm;
                //console.log(form);
                varindex0=form.lastIndexOf(">");
                   var p=form.split("<p>");
                   for(var i=1;i<p.length;i++){
                       var pName=p[i].substring(0,p[i].indexOf(":")+1);
                       var index1=p[i].indexOf('name="');
                       var p0=p[i].substring(index1,p[i].lastIndexOf(">"));
                       var index2=p0.indexOf('"');
                       var keyName=p[i].substring(index1+6,index2+index1+7);
                      var value=null;
                    for(var key in task.formData){
//                        var keyString=key+"";
//                        if(keyString===keyName){
//                        value=(task.formData)[key];
                      var keyString=key.substring(0,key.length-1);
                      if(keyString===keyName){
                      value=(task.formData)[key];
                      }
                   }
                   
                    $form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='createTime'value='"+value+"'></br>");
                   }
                  
                // 初始化日期元件
                $form.find('.datetime').datetimepicker({
                       stepMinute: 5
                 });
                $form.find('.date').datepicker();
               
                // 表單驗證
                $form.validate($.extend({},$.common.plugin.validator));
           
            },
            buttons:[{
               text:'關閉',
               click:function() {
                   $("#findDetail").dialog("close");
                   //sendStartupRequest();
               }
            }]
        }).position({
               //my:"center",
               //at:"center",
            offset:'300 300',
               of: window,
               collision:"fit"
            });
        }
     
        //完成任務
        $scope.completeTaskTo=function(task){
        console.log(task);
        $('#comTask').html('').dialog({
             title:'節點名稱[' + task.name + ']',
            modal:true,
            width:$.common.window.getClientWidth() * 0.6,
            height:$.common.window.getClientHeight() * 0.9,
            open:function() {
               // 獲取json格式的表單資料,就是流程定義中的所有field
            var dialog = this;
            // 讀取啟動時的表單
                // 獲取的form是字元行,html格式直接顯示在對話方塊內就可以了,然後用form包裹起來
                $(dialog).append("<div class='formContent' />");
                $('.formContent').html('').wrap("<form id='completeTask' class='formkey-form'method='post' />");     
                var $form = $('.formkey-form');
 
                // 設定表單action   getStartFormAndStartProcess
                $form.attr('action', './completeTask');
                //設定部署的Id
                $form.append("任務Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");
                $form.append("申請時間:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' value="+new Date(task.createTime).format('yyyy-MM-dd hh:mm:ss')+"></br>");
                //根據formData設定申請頁面
                //處理form字串
                varform=task.lastForm;
                 //console.log(form);
                varindex0=form.lastIndexOf(">");
                   var p=form.split("<p>");
                   for(var i=1;i<p.length;i++){
                       var pName=p[i].substring(0,p[i].indexOf(":")+1);
                       var index1=p[i].indexOf('name="');
                       varp0=p[i].substring(index1,p[i].lastIndexOf(">"));
                       var index2=p0.indexOf('"');
                       var keyName=p[i].substring(index1+6,index2+index1+7);
                      var value=null;
                    for(var key in task.formData){
                      var keyString=key.substring(0,key.length-1);
                      if(keyString===keyName){
                      value=(task.formData)[key];
                      }
                   }
                    $form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' value='"+value+"'></br>");
                   }  
                        ///////////////////////////////////////   
                    $.post('./getTaskForm.do',task.formKey, function(result) {
                    //設定部署的Id
                    //$form.append("<inputtype='hidden' name='deploymentId' value="+deploymentId+">");
                    $form.append(result.form);          
                    });   
                    ////////////////////////////////////////
                // 初始化日期元件
                $form.find('.datetime').datetimepicker({
                       stepMinute: 5
                 });
                $form.find('.date').datepicker();
                // 表單驗證
                $form.validate($.extend({},$.common.plugin.validator));
           
            },
            buttons:[{
               text:'提交',
               click:function() {
                   $("#comTask").dialog("close");
                   sendStartupRequest();
               }
            }]
        }).position({
               //my:"center",
               //at:"center",
            offset:'300 300',
               of: window,
               collision:"fit"
            });
        }
       
        /**
     * 提交表單
     * @return {[type]} [description]
     */
    functionsendStartupRequest() {
        if ($(".formkey-form").valid()) {
            var url = './completeTask.do';
            var args = $('#completeTask').serialize();
            $.post(url,args, function(data){
               $("#comTask").dialog("close");
               //$location.path("/processList");
               window.location.href=("#/processList");
               setTimeout(function(){
                   //$location.path("/findFirstTask");
                   window.location.href =("#/findFirstTask");
               },1500);
            });
        }
    }
 
}])  


相關推薦

activiti定義流程整合獲取申請任務

流程啟動後,流程節點便進入到了任務相關的部分。可以看到我之前的做法是在啟動節點就綁定了form表單,啟動時就填寫相關的資料。實際上在之前我的做法是不對開始節點做任何操作,知道任務節點的時候再填寫相關的資料進行設定。 至於這兩種方式的優劣,我暫時還不太確定,單獨從功能上來說

activiti定義流程整合整合定義表單部署流程定義

綜合前幾篇博文內容,我想在整合這一部分中應該會有很多模組會跳過不講,就如自定義表單的表單列表那一塊,因為這些模組在整合的過程中都幾乎沒有什麼改動,再多講也是重複無用功。 正因為如此,在建立了流程模型之後,模型列表的展示也是和之前的沒有什麼區別,而且都是很簡單的後臺查詢以及前

activiti定義流程整合整合定義表單建立模型

本來在建立了表單之後應該是表單列表和預覽功能,但是我看了看整合的程式碼,和之前沒有用angularjs的基本沒有什麼變化,一些極小的變動也只是基於angularjs的語法,因此完全可以參考之前說些的表單列表展示相關的內容,這裡也就直接進入到下一個步驟,建立流程模型了。

activiti自己定義流程整合整合自己定義表單部署流程定義

borde row ont 創建 source als dst art select 綜合前幾篇博文內容。我想在整合這一部分中應該會有非常多模塊會跳過不講,就如自己定義表單的表單列表那一塊,由於這些模塊在整合的過程中都差點兒沒有什麽修改,再多講也是反復無用功。

activiti定義流程Spring整合activiti-modeler5.16例項啟動流程

1.啟動流程並分配任務是單個流程的正式開始,因此要使用到runtimeService介面,以及相關的啟動流程的方法。我習慣於用流程定義的key啟動,因為有多個版本的流程定義時,用key啟動預設會使用最新版本。同時,因為啟動中查詢了流程部署時xml檔案中流程節點的資訊,也用

activiti定義流程Spring整合activiti-modeler5.16例項建立流程模型

1.maven導包,這裡就沒有什麼多的好說了,直接程式碼: <dependencies> <dependency> <groupId>junit</groupId> <artifact

activiti定義流程Spring整合activiti-modeler5.16例項流程定義列表

1.流程定義依舊屬於流程資源,因此查詢流程定義也還是使用repositoryService進行操作 2.後臺業務程式碼,   (1)自定義的流程定義實體類:package model; pub

activiti定義流程Spring整合activiti-modeler5.16例項環境搭建

專案中需要整合activiti-modeler自定義流程,找了很多資料後,終於成功的跳轉到activiti-modeler流程設計介面,以下是記錄: 一、整合基礎:eclipse4.4.1、tomcat7、jdk1.7、mysql5.6.25、maven3.2.5、acti

OC中UITableView定義cell的使用2通過程式碼建立

在使用UITableView做開發時,常常會遇到 系統提供的樣式無法滿足專案需求的情況,這時就需要根據需求來自定義cell。 自定義cell有兩種方式:   · 通過xib自定義cell(適用於cell中子控制元件個數固定、cell樣式統一的結構,例如:商品的列表頁面)

OC中UITableView定義cell的使用1通過xib建立

在使用UITableView做開發時,常常會遇到 系統提供的樣式無法滿足專案需求的情況,這時就需要根據需求來自定義cell。 自定義cell有兩種方式:   · 通過xib自定義cell(適用於cell中子控制元件個數固定、cell樣式統一的結構,例如:商品的列表頁面)

定義ViewPaint畫筆的詳解

Android提供了2D圖形繪製的各種工具,如Canvas(畫布)、Point(點)、Paint(畫筆)、Rectangles(矩形)等,利用這些工具可以直接在介面上進行繪製。 在自定義View中,我們經常用到的Canvas(畫布)和Paint(畫筆),像我們

freemarker定義標籤報錯

freemarker自定義標籤 1、錯誤描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\"" at line 18, column 25 in myself.ftl. Was ex

Android定義視訊播放器

一、引言 現在已經差不多完成了一個自定義的視訊播放器,還有一個讓視訊全屏播放的按鈕事件沒有繫結,下面會介紹。此外還要一個非常重要的功能就是,已經寫好了自定義的播放器,那麼就應該能被其他應用調起,來播放視訊,下面來完善這兩個功能。 二、全屏按鈕事件

android定義view地圖

最近參加了一個比賽,要用到自己做一個自定義的小地圖,所以在網上查找了一些關於自定義view的有關資料,也瞭解了自定義控制元件的初步知識。 效果圖 第一階段我畫了一個自制的網格圖,點哪個網格就會哪個網格就會顯示。 工作環境圖 程式碼介紹

的C#跨平臺發布應用

版本 spa iis 服務器部署 ati spring 復制 發布應用 速度 由於此架構從一開始就將.NET Framework 的依賴降低到最低,且不依賴IIS,在ORM層面,完全實現代碼優先,即真正做到數據庫無關; Windows服務器部署: 在Window

的機器學習決策樹

family 分配 根據 drop chrom labels arch ntp -o 決策樹概念: 分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部節點和葉節點,內部節點表示一個特征或屬性,葉節點表示一個類。 分類的時候,從根

C++學習關於C++提供的強制類型轉換

code 記錄 是不是 通過 行修改 單元 c語言 enum 表達式 C語言中提供了舊式的強制類型轉換方法。比如: int a =1; char *p = (char *)&a; 上述將a的地址單元強制轉換為char類型的指針。這裏暫且不說上述轉換結果是否合理,但

胡八一Java表示式的幾個簡單的小陷阱

1、複合賦值運算子的陷阱 a=a+5與a +=5 是有區別的。a +=5等價於 a=(a的型別)(a+5);這就是複合運算子中包含的隱式型別轉換。 在什麼時候會遇到此型別的錯誤呢? short a =5; a = (a-2); 此句編譯不通過,把一個int

OpenCV探索邊緣檢測canny、sobel、laplacian

邊緣檢測的一般步驟: 濾波——消除噪聲 增強——使邊界輪廓更加明顯 檢測——選出邊緣點 Canny演算法 Canny邊緣檢測演算法被很多人推崇為當今最優秀的邊緣檢測演算法,所以我們第一個就介紹他。 opencv中提供了Canny函式。 #include<

Linux 學習bash指令碼編寫

bash指令碼程式設計:整數測試及特殊變數 exit:退出指令碼 exit # 如果指令碼沒有明確定義退出狀態碼,那麼,最後執行的一條命令的退出碼即為指令碼的退出狀態碼。 bash中常用的條件測試有三種: 測試方法: 命令測試法 [ expression ] 關