activiti自定义流程之整合(六):获取我的申请任务

流程启动后,流程节点便进入到了任务相关的部分。可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据。实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置。

 

至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种。

 

而在任务相关的部分,我是把用户任务分成了两种,一种是我的申请,一种是我的任务。区别就是我发起的任务,和别人提交给我的或者反馈给我的任务。

 

那么流程一启动,第一个自然就是自己的申请了,这里便说明这个问题。

 

在这一篇中,需要注意的并不在于form表单,而是如何判断是不是初次申请,我一开始用的是流程节点来判断,这样就需要拿到流程节点并进行相关的遍历。

 

但是后来我回过头来再看时便发现其实远不止着一种方法,比如也可以通过任务来区分,如果整个流程实例只有一个任务,那么这个任务自然就是申请。当然了,前提是要限制任务是不能删除的。

 

还有就是,每一个任务都有启动时间,根据这个时间进行排序也应该可以进行判断,只是这个我还没有尝试,可行性究竟如何还有待确定。

 

那么下边就又到了上代码的时刻:

后台代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.      * @throwsXMLStreamException 
  3.      *             查询我申请未提交的任务 
  4.      * 
  5.      * @author:tuzongxun 
  6.      * @Title : findTask 
  7.      * @param @return  
  8.      * @return Object 
  9.      * @date Mar 17, 20162:44:11 PM 
  10.      * @throws 
  11.      */  
  12.     @RequestMapping(value = "/findFirstTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")  
  13.     @ResponseBody  
  14.     public Object findFirstTask(HttpServletRequest req)  
  15.            throws XMLStreamException {  
  16.        Map<String, Object> map = new HashMap<String, Object>();  
  17.        boolean isLogin = this.isLogin(req);  
  18.        if (isLogin) {  
  19.            List<TaskModel> taskList = new ArrayList<TaskModel>();  
  20.            HttpSession session = req.getSession();  
  21.            String assginee = (String) session.getAttribute("userName");  
  22.            List<Task> taskList1 = taskService.createTaskQuery()  
  23.                   .taskAssignee(assginee).list();  
  24.            if (taskList1 != null && taskList1.size() > 0) {  
  25.               for (Task task : taskList1) {  
  26.                   TaskModel taskModel = new TaskModel();  
  27.                   // 获取部署名  
  28.                   String processdefintionId = task.getProcessDefinitionId();  
  29.                   ProcessDefinition processDefinition = repositoryService  
  30.                          .createProcessDefinitionQuery()  
  31.                          .processDefinitionId(processdefintionId)  
  32.                          .singleResult();  
  33.    
  34.                   // 根据taskname和节点判断是否是第一个  
  35.                   String taskName = task.getName();  
  36.                   Iterator<FlowElement> iterator = this  
  37.                          .findFlow(processdefintionId);  
  38.                   String row0 = null;  
  39.                   String eleName0 = null;  
  40.                   while (iterator.hasNext()) {  
  41.                      FlowElement flowElement0 = iterator.next();  
  42.                      // 下一个节点  
  43.                      FlowElement flowElement = iterator.next();  
  44.                      String eleName = flowElement.getName();  
  45.                      if (taskName.equals(eleName)) {  
  46.                          row0 = flowElement0.getXmlRowNumber() + "";  
  47.                          eleName0 = flowElement0.getClass().getSimpleName();  
  48.                          break;  
  49.                      }  
  50.                   }  
  51.    
  52.                   // 提交申请时  
  53.                   if (eleName0.equals("StartEvent")) {  
  54.                      ///  
  55.                      // 获取流程变量  
  56.                      Map<String, Object> variables = runtimeService  
  57.                             .getVariables(task.getProcessInstanceId());  
  58.                      Set<String> keysSet = variables.keySet();  
  59.                      Iterator<String> keySet = keysSet.iterator();  
  60.                      Map<String, String> formData = new HashMap<String,String>();  
  61.                      taskModel.setLastForm(this  
  62.                             .getStartForm1((String) variables  
  63.                                    .get("deploymentId")));  
  64.    
  65.                      taskModel.setAssignee(task.getAssignee());  
  66.                      taskModel.setCreateTime(task.getCreateTime());  
  67.                      taskModel.setId(task.getId());  
  68.                      taskModel.setName(task.getName());  
  69.                      taskModel.setProcessInstanceId(task  
  70.                             .getProcessInstanceId());  
  71.                      taskModel  
  72.                             .setProcessDefId(task.getProcessDefinitionId());  
  73.                      taskModel.setFormKey(task.getFormKey());  
  74.                      String deploymentId = processDefinition  
  75.                             .getDeploymentId();  
  76.                      Deployment deployment = repositoryService  
  77.                             .createDeploymentQuery()  
  78.                             .deploymentId(deploymentId).singleResult();  
  79.                      String deploymentName = deployment.getName();  
  80.                      taskModel.setDeploymentName(deploymentName);  
  81.                      while (keySet.hasNext()) {  
  82.                          String key = keySet.next();  
  83.                          String value = (String) variables.get(key);  
  84.                          if (key.contains(row0)) {  
  85.                             formData.put(key, value);  
  86.                          }  
  87.                      }  
  88.                      taskModel.setFormData(formData);  
  89.                      taskList.add(taskModel);  
  90.                   }  
  91.    
  92.               }  
  93.            }  
  94.            map.put("isLogin""yes");  
  95.            map.put("userName",  
  96.                   (String) req.getSession().getAttribute("userName"));  
  97.            map.put("result""success");  
  98.            map.put("data", taskList);  
  99.        } else {  
  100.            map.put("isLogin""no");  
  101.        }  
  102.        return map;  
  103.     }  


注意上边的方法中有调用getStartForm1这个方法,可在上一篇中找到。另外一个调用查询流程节点的方法如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.      * @throwsXMLStreamException 
  3.      *             查询流程节点 
  4.      * 
  5.      * @author:tuzongxun 
  6.      * @Title: findFlow 
  7.      * @param@return 
  8.      * @return Iterator<FlowElement> 
  9.      * @date Mar 21, 20169:31:42 AM 
  10.      * @throws 
  11.      */  
  12.     public Iterator<FlowElement> findFlow(String processDefId)  
  13.            throws XMLStreamException {  
  14.        List<ProcessDefinition> lists = repositoryService  
  15.               .createProcessDefinitionQuery()  
  16.               .processDefinitionId(processDefId)  
  17.               .orderByProcessDefinitionVersion().desc().list();  
  18.        ProcessDefinition processDefinition = lists.get(0);  
  19.        processDefinition.getCategory();  
  20.        String resourceName = processDefinition.getResourceName();  
  21.        InputStream inputStream = repositoryService.getResourceAsStream(  
  22.               processDefinition.getDeploymentId(), resourceName);  
  23.        BpmnXMLConverter converter = new BpmnXMLConverter();  
  24.        XMLInputFactory factory = XMLInputFactory.newInstance();  
  25.        XMLStreamReader reader = factory.createXMLStreamReader(inputStream);  
  26.        BpmnModel bpmnModel = converter.convertToBpmnModel(reader);  
  27.        Process process = bpmnModel.getMainProcess();  
  28.        Collection<FlowElement> elements = process.getFlowElements();  
  29.        Iterator<FlowElement> iterator = elements.iterator();  
  30.        return iterator;  
  31.     }  


前台的代码,我想经过这么久的代码罗列,app.js和html中的写法应该没有必要再写了,业务逻辑如下:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. angular.module('activitiApp')   
  2. .controller('findFirstTaskCtr', ['$rootScope','$scope','$http','$location','$state'function($rootScope,$scope,$http,$location,$state){   
  3. $scope.init=function(){  
  4.         $http.post("./findFirstTask.do").success(function(result) {  
  5.         if(result.isLogin==="yes"){  
  6.         $rootScope.userName=result.userName;  
  7.         $scope.taskList=result.data;  
  8.         }else{  
  9.              $location.path("/login");  
  10.         }  
  11.         });  
  12. }     
  13.         //查看findDetail(task)  
  14.         $scope.findDetail=function(task){  
  15.         console.log(task);  
  16.         $('#findDetail').html('').dialog({  
  17.              title:'节点名称[' + task.name + ']',  
  18.             modal:true,  
  19.             width:$.common.window.getClientWidth() * 0.6,  
  20.             height:$.common.window.getClientHeight() * 0.9,  
  21.             open:function() {  
  22.                // 获取json格式的表单数据,就是流程定义中的所有field  
  23.             var dialog = this;  
  24.             // 读取启动时的表单  
  25.                 // 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来  
  26.                 $(dialog).append("<div class='formContent' />");  
  27.                 $('.formContent').html('').wrap("<form id='findDetailForm' class='formkey-form1'method='post' />");   
  28.                 var $form = $('.formkey-form1');  
  29.                 //设置部署的Id  
  30.                 $form.append("任务Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");  
  31.                 $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>");  
  32.                 //根据formData设置申请页面  
  33.                 //处理form字符串  
  34.                 var form=task.lastForm;  
  35.                 //console.log(form);  
  36.                 varindex0=form.lastIndexOf(">");  
  37.                    var p=form.split("<p>");  
  38.                    for(var i=1;i<p.length;i++){  
  39.                        var pName=p[i].substring(0,p[i].indexOf(":")+1);  
  40.                        var index1=p[i].indexOf('name="');  
  41.                        var p0=p[i].substring(index1,p[i].lastIndexOf(">"));  
  42.                        var index2=p0.indexOf('"');  
  43.                        var keyName=p[i].substring(index1+6,index2+index1+7);  
  44.                       var value=null;  
  45.                     for(var key in task.formData){  
  46. //                        var keyString=key+"";  
  47. //                        if(keyString===keyName){  
  48. //                        value=(task.formData)[key];  
  49.                       var keyString=key.substring(0,key.length-1);  
  50.                       if(keyString===keyName){  
  51.                       value=(task.formData)[key];  
  52.                       }  
  53.                    }  
  54.                      
  55.                     $form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='createTime'value='"+value+"'></br>");  
  56.                    }  
  57.                     
  58.                 // 初始化日期组件  
  59.                 $form.find('.datetime').datetimepicker({  
  60.                        stepMinute: 5  
  61.                  });  
  62.                 $form.find('.date').datepicker();  
  63.                  
  64.                 // 表单验证  
  65.                 $form.validate($.extend({},$.common.plugin.validator));  
  66.              
  67.             },  
  68.             buttons:[{  
  69.                text:'关闭',  
  70.                click:function() {  
  71.                    $("#findDetail").dialog("close");  
  72.                    //sendStartupRequest();  
  73.                }  
  74.             }]  
  75.         }).position({  
  76.                //my:"center",  
  77.                //at:"center",  
  78.             offset:'300 300',  
  79.                of: window,  
  80.                collision:"fit"  
  81.             });  
  82.         }  
  83.        
  84.         //完成任务  
  85.         $scope.completeTaskTo=function(task){  
  86.         console.log(task);  
  87.         $('#comTask').html('').dialog({  
  88.              title:'节点名称[' + task.name + ']',  
  89.             modal:true,  
  90.             width:$.common.window.getClientWidth() * 0.6,  
  91.             height:$.common.window.getClientHeight() * 0.9,  
  92.             open:function() {  
  93.                // 获取json格式的表单数据,就是流程定义中的所有field  
  94.             var dialog = this;  
  95.             // 读取启动时的表单  
  96.                 // 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来  
  97.                 $(dialog).append("<div class='formContent' />");  
  98.                 $('.formContent').html('').wrap("<form id='completeTask' class='formkey-form'method='post' />");       
  99.                 var $form = $('.formkey-form');  
  100.    
  101.                 // 设置表单action   getStartFormAndStartProcess  
  102.                 $form.attr('action''./completeTask');  
  103.                 //设置部署的Id  
  104.                 $form.append("任务Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");  
  105.                 $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>");  
  106.                 //根据formData设置申请页面  
  107.                 //处理form字符串  
  108.                 varform=task.lastForm;  
  109.                  //console.log(form);  
  110.                 varindex0=form.lastIndexOf(">");  
  111.                    var p=form.split("<p>");  
  112.                    for(var i=1;i<p.length;i++){  
  113.                        var pName=p[i].substring(0,p[i].indexOf(":")+1);  
  114.                        var index1=p[i].indexOf('name="');  
  115.                        varp0=p[i].substring(index1,p[i].lastIndexOf(">"));  
  116.                        var index2=p0.indexOf('"');  
  117.                        var keyName=p[i].substring(index1+6,index2+index1+7);  
  118.                       var value=null;  
  119.                     for(var key in task.formData){  
  120.                       var keyString=key.substring(0,key.length-1);  
  121.                       if(keyString===keyName){  
  122.                       value=(task.formData)[key];  
  123.                       }  
  124.                    }  
  125.                     $form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' value='"+value+"'></br>");  
  126.                    }    
  127.                         ///     
  128.                     $.post('./getTaskForm.do',task.formKey, function(result) {  
  129.                     //设置部署的Id  
  130.                     //$form.append("<inputtype='hidden' name='deploymentId' value="+deploymentId+">");  
  131.                     $form.append(result.form);            
  132.                     });     
  133.                       
  134.                 // 初始化日期组件  
  135.                 $form.find('.datetime').datetimepicker({  
  136.                        stepMinute: 5  
  137.                  });  
  138.                 $form.find('.date').datepicker();  
  139.                 // 表单验证  
  140.                 $form.validate($.extend({},$.common.plugin.validator));  
  141.              
  142.             },  
  143.             buttons:[{  
  144.                text:'提交',  
  145.                click:function() {  
  146.                    $("#comTask").dialog("close");  
  147.                    sendStartupRequest();  
  148.                }  
  149.             }]  
  150.         }).position({  
  151.                //my:"center",  
  152.                //at:"center",  
  153.             offset:'300 300',  
  154.                of: window,  
  155.                collision:"fit"  
  156.             });  
  157.         }  
  158.          
  159.         /** 
  160.      * 提交表单 
  161.      * @return {[type]} [description] 
  162.      */  
  163.     functionsendStartupRequest() {  
  164.         if ($(".formkey-form").valid()) {  
  165.             var url = './completeTask.do';  
  166.             var args = $('#completeTask').serialize();  
  167.             $.post(url,args, function(data){  
  168.                $("#comTask").dialog("close");  
  169.                //$location.path("/processList");  
  170.                window.location.href=("#/processList");  
  171.                setTimeout(function(){  
  172.                    //$location.path("/findFirstTask");  
  173.                    window.location.href =("#/findFirstTask");  
  174.                },1500);  
  175.             });  
  176.         }  
  177.     }  
  178.    
  179. }])    

转载于:https://my.oschina.net/u/2532228/blog/676329

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值