码迷,mamicode.com
首页 > 编程语言 > 详细

activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务

时间:2016-04-13 11:15:50      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:

注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建
        (2)创建流程模型:activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型 
        (3)流程模型列表展示:activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示
        (4)部署流程定义:activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

        (5)流程定义列表:activiti自定义流程之Spring整合activiti-modeler5.16实例(五):流程定义列表

        (6)启动流程:activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程

        (7)任务列表展示:activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示




1.完成个人任务依旧是使用taskService操作,调用complete方法,需要传入任务id,同时还可以传入流程变量。


2.后台业务代码,
  (1)自定义的任务实体类(使用之前自定义的taskModel)

  (2)业务逻辑:
完成任务使用taskService调用complete方法来完成,一旦正确调用了这个方法,当前任务就会结束,进入到下一个任务,如果当前任务已经是最后一个任务,则整个流程结束。
对于已经结束的任务,act_ru_task中所存在的那条对应数据会被删除,取而代之的是,对应的act_hi_taskinst中的那条数据会增加结束时间。

上边所说的正确调用是指,如果当前任务的下一个任务设有个人任务变量或者组任务变量,那么提交的时候必须有对应的变量数据,否则会抛出异常,完成任务失败。(但是,如果下一个任务没有设置这些,提交时依旧填了流程变量是不会出错的)

下边的例子中,之所以还查询了流程节点的信息,并做了相关的处理,是为了实现针对任意数量任务的流程都能正常运行,否则不需要这么麻烦。

[java] view plain copy
 
 技术分享技术分享
  1. /** 
  2.      * @throws XMLStreamException 
  3.      *             完成个人任务 
  4.      *  
  5.      * @author:tuzongxun 
  6.      * @Title: completeTask 
  7.      * @param @return 
  8.      * @return Object 
  9.      * @date Mar 17, 2016 4:55:31 PM 
  10.      * @throws 
  11.      */  
  12.     @RequestMapping(value = "/completeTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")  
  13.     @ResponseBody  
  14.     public Object completeTask(@RequestBody TaskModel taskModel,  
  15.             HttpServletRequest req) throws XMLStreamException {  
  16.         boolean isLogin = this.isLogin(req);  
  17.         if (isLogin) {  
  18.             String taskId = taskModel.getId();  
  19.             // 1、查task  
  20.             Task task = taskService.createTaskQuery().taskId(taskId)  
  21.                     .singleResult();  
  22.             // 2、查variables  
  23.             Map<String, Object> variables = runtimeService.getVariables(task  
  24.                     .getProcessInstanceId());  
  25.             Set<String> keysSet = variables.keySet();  
  26.             Iterator<String> keySet = keysSet.iterator();  
  27.             Map<String, Object> variables1 = new HashMap<String, Object>();  
  28.             String assignee = task.getAssignee();  
  29.             // 判断之后是否还有任务  
  30.             // ////////////////  
  31.             while (keySet.hasNext()) {  
  32.                 String key = keySet.next();  
  33.                 if (key.equals("cause") || key.equals("content")  
  34.                         || key.equals("taskType")) {  
  35.                     continue;  
  36.                 } else if (!(assignee.equals(variables.get(key)))) {  
  37.                     // 3、查flowElement  
  38.                     Iterator<FlowElement> iterator = this.findFlow(task  
  39.                             .getProcessDefinitionId());  
  40.                     while (iterator.hasNext()) {  
  41.                         FlowElement flowElement = iterator.next();  
  42.                         String classNames = flowElement.getClass()  
  43.                                 .getSimpleName();  
  44.                         if (classNames.equals("UserTask")) {  
  45.                             UserTask userTask = (UserTask) flowElement;  
  46.                             String assginee11 = userTask.getAssignee();  
  47.                             String assginee12 = assginee11.substring(  
  48.                                     assginee11.indexOf("{") + 1,  
  49.                                     assginee11.indexOf("}"));  
  50.                             String assignee13 = (String) variables  
  51.                                     .get(assginee12);  
  52.                             if (assignee.equals(assignee13)) {  
  53.                                 // 看下下一个节点是什么  
  54.                                 iterator.next();  
  55.                                 FlowElement flowElement2 = iterator.next();  
  56.                                 String classNames1 = flowElement2.getClass()  
  57.                                         .getSimpleName();  
  58.                                 // 设置下一个任务人  
  59.                                 if (!(classNames1.equals("EndEvent"))) {  
  60.                                     UserTask userTask2 = (UserTask) flowElement2;  
  61.                                     String assginee21 = userTask2.getAssignee();  
  62.                                     String assginee22 = assginee21.substring(  
  63.                                             assginee21.indexOf("{") + 1,  
  64.                                             assginee21.indexOf("}"));  
  65.                                     // String assignee23 = (String) variables  
  66.                                     // .get(assginee22);  
  67.                                     String assignee23 = taskModel  
  68.                                             .getNextPerson();  
  69.                                     variables1.put(assginee22, assignee23);  
  70.                                 }  
  71.                             }  
  72.                         }  
  73.                     }  
  74.                 }  
  75.             }  
  76.             taskService.complete(taskId, variables1);  
  77.   
  78.   
  79.         }  
  80.         return null;  
  81.     }  





3.angular js前台代码(前台只是做简单的展示,不多讲):
  (1)app.js中配置路由:
 

[javascript] view plain copy
 
 技术分享技术分享
  1. $stateProvider    
  2.  .state(‘completeTaskTo‘, {    
  3.  url: "/completeTaskTo",    
  4.  views: {    
  5.     ‘view‘: {    
  6.      templateUrl: ‘activi_views/completeTask.html‘,    
  7.      controller: ‘completeTaskCtr‘    
  8.     }    
  9.  }    
  10. });    
  11.    



  (2)逻辑相关代码:


   

[javascript] view plain copy
 
 技术分享技术分享
  1. angular.module(‘activitiApp‘)    
  2. .controller(‘completeTaskCtr‘, [‘$rootScope‘,‘$scope‘,‘$http‘,‘$location‘,‘$state‘, function($rootScope,$scope,$http,$location,$state){    
  3.   
  4.   
  5.     $http.post("createFlush.do").success(function(result){  
  6.         if(result.isLogin==="yes"){  
  7.             $rootScope.userName=result.userName;  
  8.             if($rootScope.task==null||$rootScope.task.id==null){  
  9.                 $location.path("/taskList");  
  10.             }else{  
  11.                 $scope.task=$rootScope.task;  
  12.             }  
  13.         }else{  
  14.             $location.path("/login");  
  15.         }  
  16.     });  
  17.   
  18.   
  19.         $scope.completeTask=function(task){  
  20.             console.log(task);  
  21.             $rootScope.task=task;  
  22.             $http.post("./completeTask.do",task).success(function(taskResult){  
  23.                 $location.path("/taskList");  
  24.             });  
  25.         }  
  26.         
  27.     
  28. }])    





4.对应的填写相关信息的页面:


[html] view plain copy
 
 技术分享技术分享
    1. <div style="margin-top:20px;margin-left:200px;background-color:#ccf;height:550px;width:50%;font-size:18px;position:relative;float:left;">    
    2.    <center>   
    3.    <style="font-size:24px;margin-top:10px">处理当前任务</p>  
    4.                类      型:<input ng-model="task.taskType" readonly="readonly" style="background-color:#9cf"></input>  
    5.       </br>    
    6.       </br>  
    7.       NAME      :<input ng-model="task.name" readonly="readonly" style="background-color:#9cf"></input>  
    8.       </br>    
    9.       </br>  
    10.                任  务  ID :<input ng-model="task.id" readonly="readonly" style="background-color:#9cf"></input>  
    11.       </br>    
    12.       </br>    
    13.       ProcessIntanceId:<input ng-model="task.processInstanceId" readonly="readonly" style="background-color:#9cf"></input>  
    14.       </br>    
    15.       </br>  
    16.       ProcessDefId   :<input ng-model="task.processDefId" readonly="readonly" style="background-color:#9cf"></input>  
    17.       </br>    
    18.       </br>  
    19.                创 建 时 间 :<input ng-model="task.createTime" readonly="readonly" style="background-color:#9cf"></input>  
    20.       </br>    
    21.       </br>  
    22.                申  请  人 :<input ng-model="task.assignee" readonly="readonly" style="background-color:#9cf"></input>  
    23.       </br>    
    24.       </br>  
    25.                受  理  人 :<input ng-model="task.nextPerson"></input>  
    26.       </br>    
    27.       </br>  
    28.                申 请 原 因 :<input ng-model="task.cause"></input>  
    29.       </br>    
    30.       </br>  
    31.                申 请 内 容 :<input ng-model="task.content"></input>  
    32.       </br>    
    33.       </br>  
    34.       <input style="font-size:22px;cursor:pointer" type="button" value="处理任务" ng-click="completeTask(task);">    
    35.              
    36.       <input style="font-size:22px;cursor:pointer" type="button" value="返回">   
    37.    </center>   
    38. </div>    
    39.    

activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务

标签:

原文地址:http://www.cnblogs.com/tuzongxun/p/5386189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!