注:(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中的那条数据会增加结束时间。

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

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

  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. return null;
  79. }

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

  1. $stateProvider
  2. .state('completeTaskTo', {
  3. url: "/completeTaskTo",
  4. views: {
  5. 'view': {
  6. templateUrl: 'activi_views/completeTask.html',
  7. controller: 'completeTaskCtr'
  8. }
  9. }
  10. });

(2)逻辑相关代码:

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

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

    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. <p 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. <input style="font-size:22px;cursor:pointer" type="button" value="返回">
    36. </center>
    37. </div>

activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务的更多相关文章

  1. activiti自定义流程之Spring整合activiti-modeler5.16实例(九):历史任务查询

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

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

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

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

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

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

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

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

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  6. activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...

  7. activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 1.maven导包,这里就没有什么多的好说了,直接代码: <depe ...

  8. activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建

    项目中需要整合activiti-modeler自定义流程,找了很多资料后,终于成功的跳转到activiti-modeler流程设计界面,以下是记录: 一.整合基础:eclipse4.4.1.tomca ...

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

    注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建         (2)创建流程模型:activiti自己定义流程之Spr ...

随机推荐

  1. 行为识别笔记:improved dense trajectories算法(iDT算法)(转载)

    iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法 ...

  2. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...

  3. WebRTC录音(1)-实现通话双向录音

    最近公司的iPad项目中一个功能点涉及到了VOIP通讯中的录音,需要在已有的WebRTC引擎中增加录音功能,录制通话双方的声音参考了往上一位兄弟的博文(链接在此 http://blog.csdn.ne ...

  4. HDU-4276 The Ghost Blows Light (树形DP+背包)

    题目大意:在一个n个节点的树形迷宫中,1为起点,n为出口.每个节点上有一定价值的珠宝,在节点之间移动的时间已知,问在能走出迷宫的前提下并且不超过m的时间内能收集的最多珠宝是多少? 题目分析:在树上,从 ...

  5. 记录Cat类的个体数目

    B.记录Cat类的个体数目 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 22 (17 users) Total Accepted: ...

  6. Linux系统编程@进程管理(二)

    1.创建守护进程(Deamon) 守护进程的概念与作用 后台服务程序 – 系统服务,进程名字往往以’d’结尾,生存周期比较长(系统装入时启动,关闭时候终止.系统装入两种启动方式:1从启动脚本.etc/ ...

  7. 特征值分解与奇异值分解(SVD)

    1.使用QR分解获取特征值和特征向量 将矩阵A进行QR分解,得到正规正交矩阵Q与上三角形矩阵R.由上可知Ak为相似矩阵,当k增加时,Ak收敛到上三角矩阵,特征值为对角项. 2.奇异值分解(SVD) 其 ...

  8. lucene 索引合并策略

    在索引算法确定的情况下,最为影响Lucene索引速度有三个参数--IndexWriter中的 MergeFactor, MaxMergeDocs, RAMBufferSizeMB .这些参数无非是控制 ...

  9. jquery-easyui中表格的行编辑功能

    datagrid现在具有行编辑能力了,使用时只须在columns中为需要编辑的列添加一个editor属性,编辑保存时同时具有数据校验能力. 看一个例子效果图: 代码如下: $('#tt').datag ...

  10. jquery得到iframe src属性值的方法

    这篇文章主要介绍了jquery得到iframe src属性值的方法,很简单,很实用,需要的朋友可以参考下 取得iframe src属性的的值: Html代码 <!DOCTYPE HTML> ...