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

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

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

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

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

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

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

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

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

后台代码如下:

[java] view plain copy

  1. /**
  2. * @throwsXMLStreamException
  3. *             查询我申请未提交的任务
  4. *
  5. * @author:tuzongxun
  6. * @Title: findTask
  7. * @[email protected]
  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. // 根据taskname和节点判断是否是第一个
  34. String taskName = task.getName();
  35. Iterator<FlowElement> iterator = this
  36. .findFlow(processdefintionId);
  37. String row0 = null;
  38. String eleName0 = null;
  39. while (iterator.hasNext()) {
  40. FlowElement flowElement0 = iterator.next();
  41. // 下一个节点
  42. FlowElement flowElement = iterator.next();
  43. String eleName = flowElement.getName();
  44. if (taskName.equals(eleName)) {
  45. row0 = flowElement0.getXmlRowNumber() + "";
  46. eleName0 = flowElement0.getClass().getSimpleName();
  47. break;
  48. }
  49. }
  50. // 提交申请时
  51. if (eleName0.equals("StartEvent")) {
  52. ///////////////////////////
  53. // 获取流程变量
  54. Map<String, Object> variables = runtimeService
  55. .getVariables(task.getProcessInstanceId());
  56. Set<String> keysSet = variables.keySet();
  57. Iterator<String> keySet = keysSet.iterator();
  58. Map<String, String> formData = new HashMap<String,String>();
  59. taskModel.setLastForm(this
  60. .getStartForm1((String) variables
  61. .get("deploymentId")));
  62. taskModel.setAssignee(task.getAssignee());
  63. taskModel.setCreateTime(task.getCreateTime());
  64. taskModel.setId(task.getId());
  65. taskModel.setName(task.getName());
  66. taskModel.setProcessInstanceId(task
  67. .getProcessInstanceId());
  68. taskModel
  69. .setProcessDefId(task.getProcessDefinitionId());
  70. taskModel.setFormKey(task.getFormKey());
  71. String deploymentId = processDefinition
  72. .getDeploymentId();
  73. Deployment deployment = repositoryService
  74. .createDeploymentQuery()
  75. .deploymentId(deploymentId).singleResult();
  76. String deploymentName = deployment.getName();
  77. taskModel.setDeploymentName(deploymentName);
  78. while (keySet.hasNext()) {
  79. String key = keySet.next();
  80. String value = (String) variables.get(key);
  81. if (key.contains(row0)) {
  82. formData.put(key, value);
  83. }
  84. }
  85. taskModel.setFormData(formData);
  86. taskList.add(taskModel);
  87. }
  88. }
  89. }
  90. map.put("isLogin", "yes");
  91. map.put("userName",
  92. (String) req.getSession().getAttribute("userName"));
  93. map.put("result", "success");
  94. map.put("data", taskList);
  95. } else {
  96. map.put("isLogin", "no");
  97. }
  98. return map;
  99. }

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

[java] view plain copy

  1. /**
  2. * @throwsXMLStreamException
  3. *             查询流程节点
  4. *
  5. * @author:tuzongxun
  6. * @Title: findFlow
  7. * @[email protected]
  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

    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. $form.append(pName+"<input type=‘text‘ readonly=‘readonly‘style=‘background-color:#DEDCDC;margin-top:10px‘ name=‘createTime‘value=‘"+value+"‘></br>");
    55. }
    56. // 初始化日期组件
    57. $form.find(‘.datetime‘).datetimepicker({
    58. stepMinute: 5
    59. });
    60. $form.find(‘.date‘).datepicker();
    61. // 表单验证
    62. $form.validate($.extend({},$.common.plugin.validator));
    63. },
    64. buttons:[{
    65. text:‘关闭‘,
    66. click:function() {
    67. $("#findDetail").dialog("close");
    68. //sendStartupRequest();
    69. }
    70. }]
    71. }).position({
    72. //my:"center",
    73. //at:"center",
    74. offset:‘300 300‘,
    75. of: window,
    76. collision:"fit"
    77. });
    78. }
    79. //完成任务
    80. $scope.completeTaskTo=function(task){
    81. console.log(task);
    82. $(‘#comTask‘).html(‘‘).dialog({
    83. title:‘节点名称[‘ + task.name + ‘]‘,
    84. modal:true,
    85. width:$.common.window.getClientWidth() * 0.6,
    86. height:$.common.window.getClientHeight() * 0.9,
    87. open:function() {
    88. // 获取json格式的表单数据,就是流程定义中的所有field
    89. var dialog = this;
    90. // 读取启动时的表单
    91. // 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来
    92. $(dialog).append("<div class=‘formContent‘ />");
    93. $(‘.formContent‘).html(‘‘).wrap("<form id=‘completeTask‘ class=‘formkey-form‘method=‘post‘ />");
    94. var $form = $(‘.formkey-form‘);
    95. // 设置表单action   getStartFormAndStartProcess
    96. $form.attr(‘action‘, ‘./completeTask‘);
    97. //设置部署的Id
    98. $form.append("任务Id:<input type=‘text‘ readonly=‘readonly‘style=‘background-color:#DEDCDC;margin-top:10px‘ name=‘taskId‘ value="+task.id+"></br>");
    99. $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>");
    100. //根据formData设置申请页面
    101. //处理form字符串
    102. varform=task.lastForm;
    103. //console.log(form);
    104. varindex0=form.lastIndexOf(">");
    105. var p=form.split("<p>");
    106. for(var i=1;i<p.length;i++){
    107. var pName=p[i].substring(0,p[i].indexOf(":")+1);
    108. var index1=p[i].indexOf(‘name="‘);
    109. varp0=p[i].substring(index1,p[i].lastIndexOf(">"));
    110. var index2=p0.indexOf(‘"‘);
    111. var keyName=p[i].substring(index1+6,index2+index1+7);
    112. var value=null;
    113. for(var key in task.formData){
    114. var keyString=key.substring(0,key.length-1);
    115. if(keyString===keyName){
    116. value=(task.formData)[key];
    117. }
    118. }
    119. $form.append(pName+"<input type=‘text‘ readonly=‘readonly‘style=‘background-color:#DEDCDC;margin-top:10px‘ value=‘"+value+"‘></br>");
    120. }
    121. ///////////////////////////////////////
    122. $.post(‘./getTaskForm.do‘,task.formKey, function(result) {
    123. //设置部署的Id
    124. //$form.append("<inputtype=‘hidden‘ name=‘deploymentId‘ value="+deploymentId+">");
    125. $form.append(result.form);
    126. });
    127. ////////////////////////////////////////
    128. // 初始化日期组件
    129. $form.find(‘.datetime‘).datetimepicker({
    130. stepMinute: 5
    131. });
    132. $form.find(‘.date‘).datepicker();
    133. // 表单验证
    134. $form.validate($.extend({},$.common.plugin.validator));
    135. },
    136. buttons:[{
    137. text:‘提交‘,
    138. click:function() {
    139. $("#comTask").dialog("close");
    140. sendStartupRequest();
    141. }
    142. }]
    143. }).position({
    144. //my:"center",
    145. //at:"center",
    146. offset:‘300 300‘,
    147. of: window,
    148. collision:"fit"
    149. });
    150. }
    151. /**
    152. * 提交表单
    153. * @return {[type]} [description]
    154. */
    155. functionsendStartupRequest() {
    156. if ($(".formkey-form").valid()) {
    157. var url = ‘./completeTask.do‘;
    158. var args = $(‘#completeTask‘).serialize();
    159. $.post(url,args, function(data){
    160. $("#comTask").dialog("close");
    161. //$location.path("/processList");
    162. window.location.href=("#/processList");
    163. setTimeout(function(){
    164. //$location.path("/findFirstTask");
    165. window.location.href =("#/findFirstTask");
    166. },1500);
    167. });
    168. }
    169. }
    170. }])
时间: 2024-11-06 06:43:27

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

activiti自定义流程之整合(二):使用angular js整合ueditor创建表单

注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置 基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作. 抛开自定义的表单不谈,通过之前的了解,我们知道一个新的流程开始,是在启动流程实例(processIntence)的时候,而流程实例依赖于流程定义(processDefinition),流程定义又依赖于流程模型(model). 我们用到的自定义表单需要在创建模型,画模型图的时候就指定表单的名称formKey,需

activiti自定义流程之整合(三):整合自定义表单创建模型

本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单列表展示相关的内容,这里也就直接进入到下一个步骤,创建流程模型了. 在之前的创建流程模型一节里,我讲代码比较多,实际上在这里还有很重要的一个环节没有细说,那就是自定义流程图,画流程图的过程也是有不少需要注意的事项的,在这一节我会适当的以截图加解释进行说明. 而在创建流程模型的过程中,因为之前也是用j

activiti自定义流程之整合(五):启动流程时获取自定义表单

流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么区别,因此也不多说.我们先看看列表页面以及对应的代码,然后在一步步说明点击启动按钮时如何调用自定义的form表单. 流程定义列表页面如下: 对应的html代码: [html] view plain copy <div id="logdiv1" ng-init="init();"> <p style="font-size:24px;mar

activiti自定义流程之整合(四):整合自定义表单部署流程定义

综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之后,模型列表的展示也是和之前的没有什么区别,而且都是很简单的后台查询以及前台展示,这一部分也就不过多的讲了. 模型列表页面如下: 至于其中的修改和删除也没什么多讲的,删除很简单,而修改也是activiti-modeler实现的主要功能,我们只需要跳转过去就行. 重要的部分在于部署,因为点击部署到达后

activiti自定义流程之自定义表单(二):创建表单

注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进行修改. 由于自己的前端相关技术太渣,因此好多东西都不会用,导致修改实现的过程也是破费了一番功夫,头皮发麻了好几天. 既然是用别人的插件进行修改,那么我想如果只是单独的贴出我修改后的代码,可能没有前后进行对比好理解,因此这里就把原代码和修改后的同时对比着贴出,以便于朋友们能从对比中更快的得到启发.

activiti自定义流程之自定义表单(一):环境配置

先补充说一下自定义流程整个的思路,自定义流程的目的就是为了让一套代码解决多种业务流程,比如请假单.报销单.采购单.协作单等等,用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需求,流程节点不一样,流程中的任务多少不一样,因此后台就必须解决这个逻辑处理上的问题,要能同一套代码实现动态任务数量的处理. 二是不同的业务各种字段叫法也不一样,各个节点对应的页面也应该不一样,例如请假单就需要请假申请人.请假天数.请假原因等字段,而报销单可能就是报销申请人.报销金额.报销原因.报销凭证等

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

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

activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义

注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型        (3)流程模型列表展示:activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示 1.maven导包及spring的一些基本配置与之前的没有什么变化,依旧沿用就

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

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