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

简介: 流程启动后,流程节点便进入到了任务相关的部分。可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据。实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置。   至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种。   而在任务相关的部分,我

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

后台代码如下:

/**
     * @throwsXMLStreamException
     *             查询我申请未提交的任务
     *
     * @author:tuzongxun
     * @Title: findTask
     * @param@return
     * @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
     * @param@return
     * @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);
            });
        }
    }
 
}])  


目录
相关文章
|
4月前
Activiti 流程发布
Activiti 流程发布
22 0
|
7月前
|
存储 Java API
流程引擎Activiti流程实例讲解
流程引擎Activiti流程实例讲解
141 0
|
Java API 数据库
Activiti-流程操作
Activiti-流程操作
Activiti-流程操作
|
Java 数据库连接 API
Activiti-流程操作2
Activiti-流程操作2
Activiti-流程操作2
|
XML 网络协议 安全
Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期
本文详细说明了在工作流Activiti框架中的BPMN流程定义整个运行的生命周期。介绍了BPMN流程工作的运行环境,从定义流程开始,首先介绍了BPMN流程的几个组成部分,包括用例,流程图,以及流程图的XML内容。然后开始启动一个流程,生成任务列表,然后到领取任务,完成任务后结束流程。
615 0
Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期
activiti 根据 流程实例ID 获取发起人
activiti 根据 流程实例ID 获取发起人
497 0
Activiti原理分析(二)多实例,会或签与依次审批
Activiti 原理分析系列文章的第二篇。这里我们重点研究在 Activity 中如何实现会或签以及依次审批的功能,以及 BPMN 中的多实例规范。
3336 2
Activiti原理分析(二)多实例,会或签与依次审批
|
数据安全/隐私保护
Activiti流程行为类
课程地址:http://www.shareniu.com/list.htm行为类:链接:http://pan.baidu.com/s/1sljSTcD 密码:uw5a目录:第1课:行为类课程概览第2课:什么是行为类以及什么是行为工厂类和他们的作用第3课:活动行为工厂类初始化原理。
1000 0
Activiti新增的子流程
flowable和Activiti6新增了ad-hoc子流程(adHocSubProcess),即adHocSubProcess流程。该类型的子流程无需再子流程中为节点配置任何的出线: 操作方式如下: runtimeService.
2253 0

热门文章

最新文章