注:(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实例(六):启动流程

1.通过上一节的操作,可以知道流程启动以后会同时生成一个流程实例和用户任务,这个用户任务保存在act_ru_task和act_hi_task表中,从表明可以看出ru是runtime,hi是history。但是需要注意的是,和操作流程使用的service不同,操作正在发生任务不是使用runtimeService,而是专门的taskService。
2.后台业务代码,
  (1)自定义的任务实体类

  1. package model;
  2. import <a href="http://lib.csdn.net/base/17" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">java</a>.util.Date;
  3. public class TaskModel {
  4. private String id;
  5. private String name;
  6. private String processInstanceId;
  7. private String assignee;
  8. private Date createTime;
  9. private String nextPerson;
  10. private String cause;
  11. private String content;
  12. private String taskType;
  13. private String processKey;
  14. private String processDefId;
  15. public String getTaskType() {
  16. return taskType;
  17. }
  18. public void setTaskType(String taskType) {
  19. this.taskType = taskType;
  20. }
  21. public String getId() {
  22. return id;
  23. }
  24. public void setId(String id) {
  25. this.id = id;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public String getProcessInstanceId() {
  34. return processInstanceId;
  35. }
  36. public void setProcessInstanceId(String processInstanceId) {
  37. this.processInstanceId = processInstanceId;
  38. }
  39. public String getAssignee() {
  40. return assignee;
  41. }
  42. public void setAssignee(String assignee) {
  43. this.assignee = assignee;
  44. }
  45. public Date getCreateTime() {
  46. return createTime;
  47. }
  48. public void setCreateTime(Date createTime) {
  49. this.createTime = createTime;
  50. }
  51. public String getNextPerson() {
  52. return nextPerson;
  53. }
  54. public void setNextPerson(String nextPerson) {
  55. this.nextPerson = nextPerson;
  56. }
  57. public String getCause() {
  58. return cause;
  59. }
  60. public void setCause(String cause) {
  61. this.cause = cause;
  62. }
  63. public String getContent() {
  64. return content;
  65. }
  66. public void setContent(String content) {
  67. this.content = content;
  68. }
  69. public String getProcessKey() {
  70. return processKey;
  71. }
  72. public void setProcessKey(String processKey) {
  73. this.processKey = processKey;
  74. }
  75. public String getProcessDefId() {
  76. return processDefId;
  77. }
  78. public void setProcessDefId(String processDefId) {
  79. this.processDefId = processDefId;
  80. }
  81. @Override
  82. public String toString() {
  83. return "TaskModel [id=" + id + ", name=" + name
  84. + ", processInstanceId=" + processInstanceId + ", assignee="
  85. + assignee + ", createTime=" + createTime + ", nextPerson="
  86. + nextPerson + ", cause=" + cause + ", content=" + content
  87. + ", taskType=" + taskType + ", processKey=" + processKey
  88. + ", processDefId=" + processDefId + "]";
  89. }
  90. }

(2)业务逻辑:查询任务使用taskService调用相关的方法来完成,可以根据特定的条件,也可以不加条件查询所有。可以返回task为元素的list,也可以返回单独的task对象,但是需要注意的是,如果要返回单独的task对象,则必须确定返回值是唯一的对象,否则就会抛出异常。下边的例子中,我是根据当前登陆的用户名来查询出对应的所有task:

  1. /**
  2. * @throws XMLStreamException
  3. *             查询个人任务
  4. *
  5. * @author:tuzongxun
  6. * @Title: findTask
  7. * @param @return
  8. * @return Object
  9. * @date Mar 17, 2016 2:44:11 PM
  10. * @throws
  11. */
  12. @RequestMapping(value = "/findTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
  13. @ResponseBody
  14. public Object findTask(HttpServletRequest req) throws XMLStreamException {
  15. Map<String, Object> map = new HashMap<String, Object>();
  16. boolean isLogin = this.isLogin(req);
  17. if (isLogin) {
  18. List<TaskModel> taskList = new ArrayList<TaskModel>();
  19. HttpSession session = req.getSession();
  20. String assginee = (String) session.getAttribute("userName");
  21. List<Task> taskList1 = taskService.createTaskQuery()
  22. .taskAssignee(assginee).list();
  23. if (taskList1 != null && taskList1.size() > 0) {
  24. for (Task task : taskList1) {
  25. TaskModel taskModel = new TaskModel();
  26. taskModel.setAssignee(task.getAssignee());
  27. taskModel.setCreateTime(task.getCreateTime());
  28. taskModel.setId(task.getId());
  29. taskModel.setName(task.getName());
  30. taskModel.setProcessInstanceId(task.getProcessInstanceId());
  31. taskModel.setProcessDefId(task.getProcessDefinitionId());
  32. // 获取流程变量
  33. Map<String, Object> variables = runtimeService
  34. .getVariables(task.getProcessInstanceId());
  35. Set<String> keysSet = variables.keySet();
  36. Iterator<String> keySet = keysSet.iterator();
  37. while (keySet.hasNext()) {
  38. String key = keySet.next();
  39. if (key.endsWith("cause")) {
  40. taskModel.setCause((String) variables.get("cause"));
  41. } else if (key.endsWith("content")) {
  42. taskModel.setContent((String) variables
  43. .get("content"));
  44. } else if (key.endsWith("taskType")) {
  45. taskModel.setTaskType((String) variables
  46. .get("taskType"));
  47. } else if (!assginee.equals(variables.get(key))) {
  48. // 想办法查询是否还有下一个任务节点
  49. Iterator<FlowElement> iterator = this.findFlow(task
  50. .getProcessDefinitionId());
  51. while (iterator.hasNext()) {
  52. FlowElement flowElement = iterator.next();
  53. String classNames = flowElement.getClass()
  54. .getSimpleName();
  55. if (classNames.equals("UserTask")) {
  56. UserTask userTask = (UserTask) flowElement;
  57. String assginee11 = userTask.getAssignee();
  58. String assginee12 = assginee11.substring(
  59. assginee11.indexOf("{") + 1,
  60. assginee11.indexOf("}"));
  61. String assignee13 = (String) variables
  62. .get(assginee12);
  63. if (assginee.equals(assignee13)) {
  64. // 看下下一个节点是什么
  65. iterator.next();
  66. FlowElement flowElement2 = iterator
  67. .next();
  68. String classNames1 = flowElement2
  69. .getClass().getSimpleName();
  70. // 设置下一个任务人
  71. if (!(classNames1.equals("EndEvent"))) {
  72. UserTask userTask2 = (UserTask) flowElement2;
  73. String assginee21 = userTask2
  74. .getAssignee();
  75. String assginee22 = assginee21
  76. .substring(
  77. assginee21
  78. .indexOf("{") + 1,
  79. assginee21
  80. .indexOf("}"));
  81. String assignee23 = (String) variables
  82. .get(assginee22);
  83. taskModel.setNextPerson(ToolUtils
  84. .isEmpty(assignee23));
  85. }
  86. }
  87. }
  88. }
  89. // //////////
  90. }
  91. }
  92. taskList.add(taskModel);
  93. }
  94. }
  95. map.put("isLogin", "yes");
  96. map.put("userName",
  97. (String) req.getSession().getAttribute("userName"));
  98. map.put("result", "success");
  99. map.put("data", taskList);
  100. } else {
  101. map.put("isLogin", "no");
  102. }
  103. return map;
  104. }

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

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

(2)逻辑相关代码:

  1. angular.module('activitiApp')
  2. .controller('taskCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){
  3. $scope.init=function(){
  4. $http.post("./findTask.do").success(function(result) {
  5. if(result.isLogin==="yes"){
  6. console.log(result.data);
  7. $rootScope.userName=result.userName;
  8. $scope.taskList=result.data;
  9. }else{
  10. $location.path("/login");
  11. }
  12. });
  13. }
  14. $scope.completeTaskTo=function(task){
  15. console.log(task);
  16. $rootScope.task=task;
  17. //$location.path("/completeTaskTo");
  18. $location.path("/completeTaskTo1");
  19. }
  20. }])

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

    1. <div id="logdiv1" ng-init="init();">
    2. <p style="font-size:22px;margin-top:10px">当前任务列表</p>
    3. <center>
    4. <table border="1px" style="width:87%;font-size:14px;text-align:center;margin-top:1px;margin-left:2px;position:relative;float:left;" cellSpacing="0px" cellPadding="0px">
    5. <tr style="background-color:#ccc">
    6. <td>类型</td>
    7. <td>ID</td>
    8. <td>NAME</td>
    9. <td>ProcessIntanceId</td>
    10. <td>ProcessDefId</td>
    11. <td>创建时间</td>
    12. <td>申请人</td>
    13. <td>受理人</td>
    14. <td>申请原因</td>
    15. <td>申请内容</td>
    16. <td>操 作</td>
    17. </tr>
    18. <tr ng-repeat="task in taskList | orderBy:'id'" >
    19. <td>{{task.taskType}}</td>
    20. <td>{{task.id}}</td>
    21. <td>{{task.name}}</td>
    22. <td>{{task.processInstanceId}}</td>
    23. <td>{{task.processDefId}}</td>
    24. <td>{{task.createTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
    25. <td>{{task.assignee}}</td>
    26. <td>{{task.nextPerson}}</td>
    27. <td>{{task.cause}}</td>
    28. <td>{{task.content}}</td>
    29. <td><a href="script:;" ng-click="completeTaskTo(task)">完成任务</a>
    30. </td>
    31. </tr>
    32. </table>
    33. </center>
    34. </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. xmind的第四天笔记

  2. String,StringBuffer和StringBuilder源码解析[基于JDK6]

    最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...

  3. scala言语基础学习

    scala变长参数: 递归累加: scala异常的使用: array和arraybuffer的使用 定长array: arraybuff:

  4. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  5. 《剑指Offer》之二维数组中的查找

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 pu ...

  6. 利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning

    利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning 数据的组织格式为: 首先,所需要的脚本指令路径为: /home/wangxiao/Downloads/caffe-maste ...

  7. NOSQL Benchmarks

    www.planetcassandra.org/nosql-performance-benchmarks/ http://www.planetcassandra.org/nosql-performan ...

  8. 使用 NGUI 实现头顶文字及血条

    以下是 NGUI HUD Text 实现的: 基本原理: 1. 在角色头顶绑一个点 Pivot,用于对齐 2. 因为界面总是覆盖在人物头顶信息的上面,所以将 UIRoot 分为2个 Panel:1) ...

  9. 动态加载dll,并创建类对象放入到list中。

    private List<IVisualControlsPlug> visualPlugs = new List<IVisualControlsPlug>(); public ...

  10. 在没有spineRunTime情况下手动使用spine数据

    用spine做了一些简单UI动画,结果发现游戏用的cocos2dx版本太低了,无法集成spineRunTime,无奈只好把spine记下的关键帧数据抄到一个txt文件中,然后读取txt,再自己写代码播 ...