在上一篇的获得我的申请中,可以看到js代码中还包含了预览和完成任务的代码,既然上一篇已经罗列了相关代码,这里也就不重复。

那么需要补充的是,在上边的完成任务的js代码中,我们还调用了getTaskForm请求,目的是从后台获取提交任务时的其他数据,例如指定下一个处理人等,当然了,根据不同的业务逻辑可能有所变化。

那么这个请求对应的后台代码如下,如果弄明白了整个数据库的设计,那么对于这些代码就很容易明白。

  1. @RequestMapping(value = "/getTaskForm.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
  2. @ResponseBody
  3. public Object getTaskForm(@RequestBody String taskFormKey) {
  4. Map<String, String> map = new HashMap<String, String>();
  5. //System.out.println(taskFormKey);
  6. taskFormKey = taskFormKey.replace("=", "");
  7. String form = myFormService.findFormByFormName(taskFormKey);
  8. // (String)formService.getRenderedTaskForm(taskFormKey);
  9. map.put("form", form);
  10. return map;
  11. }

这里边的findFormByFormName方法在前边的章节中讲过,就是很简单的根据一个字段查询整条记录的操作。

那么这里补充的说明完了,下一步就是提交申请,把任务交到下一个人的手上,也就是上边的js中的complete.do请求,这个请求的后台代码如下:

  1. /**
  2. * @throwsXMLStreamException
  3. *             完成个人任务
  4. *
  5. * @author:tuzongxun
  6. * @Title: completeTask
  7. * @param@return
  8. * @return Object
  9. * @date Mar 17, 20164: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(HttpServletRequest req)
  15. throws XMLStreamException {
  16. Map<String, String[]> formMap = req.getParameterMap();
  17. String taskId = (String) formMap.get("taskId")[0];
  18. boolean isLogin = this.isLogin(req);
  19. if (isLogin) {
  20. if (taskId != null) {
  21. // 根据taskName和流程节点中的名字判断当前节点之后是否还有任务
  22. Task task = taskService.createTaskQuery().taskId(taskId)
  23. .singleResult();
  24. String taskName = task.getName();
  25. Iterator<FlowElement> flows = this.findFlow(task
  26. .getProcessDefinitionId());
  27. String row0 = null;
  28. Map<String, Object> formProperties = new HashMap<String, Object>();
  29. while (flows.hasNext()) {
  30. FlowElement flowElement = flows.next();
  31. // 找到当前节点,查询出下下一个节点是否是结束节点,如果不是则需要设置下一个任务人,否则直接保存相关流程变量结束
  32. // 同时要查处当前任务的行数用来设置流程变量名称
  33. if (taskName.equals(flowElement.getName())) {
  34. // 设置行号
  35. row0 = flowElement.getXmlRowNumber() + "";
  36. FlowElement flowElement3 = flows.next();
  37. System.out.println("SequenceFlow".equals(flowElement3
  38. .getClass().getSimpleName()));
  39. if ("SequenceFlow".equals(flowElement3.getClass()
  40. .getSimpleName())) {
  41. SequenceFlow seq = (SequenceFlow) flowElement3;
  42. System.out.println(seq.getConditionExpression()
  43. + "," + seq.getName());
  44. }
  45. FlowElement flowElement2 = flows.next();
  46. // 当前任务不是最后一个任务,流程没有结束,需要设置下一个处理人
  47. if (flowElement2 != null
  48. && !("EndEvent".equals(flowElement2.getClass()
  49. .getSimpleName()) && !("SequenceFlow"
  50. .equals(flowElement2.getClass()
  51. .getSimpleName())))) {
  52. UserTask userTask = (UserTask) flowElement2;
  53. // 获取userTask中的
  54. String assignee = userTask.getAssignee();
  55. int index1 = assignee.indexOf("{");
  56. int index2 = assignee.indexOf("}");
  57. String person1 = (String) formMap.get("data_1")[0];
  58. formProperties.put(
  59. assignee.substring(index1 + 1, index2),
  60. person1);
  61. }
  62. break;
  63. }
  64. }
  65. // 从request中读取参数然后转换0
  66. Set<Entry<String, String[]>> entrySet = formMap.entrySet();
  67. for (Entry<String, String[]> entry : entrySet) {
  68. String key = entry.getKey() + row0;
  69. String value = entry.getValue()[0];
  70. if (!key.equals("taskId")) {
  71. formProperties.put(key, value);
  72. }
  73. }
  74. taskService.complete(taskId, formProperties);
  75. ;
  76. }
  77. }
  78. return null;
  79. }

因为这一个完成任务的方法和之后处理别人提交给自己的任务方法共用了,因此我便同时列出查询别人提交给我的任务的后台代码,如下:

  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 = "/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. // 获取部署名
  27. String processdefintionId = task.getProcessDefinitionId();
  28. ProcessDefinition processDefinition = repositoryService
  29. .createProcessDefinitionQuery()
  30. .processDefinitionId(processdefintionId)
  31. .singleResult();
  32. // 根据taskname和节点判断是否是第一个
  33. String taskName = task.getName();
  34. Iterator<FlowElement> iterator = this
  35. .findFlow(processdefintionId);
  36. String row0 = null;
  37. String eleName0 = null;
  38. String rowStart = null;
  39. // 保存上上一个节点的信息
  40. FlowElement flowElement00 = null;
  41. findFole: while (iterator.hasNext()) {
  42. FlowElement flowElement0 = iterator.next();
  43. // 注意usertask下一个节点是连线而不是task
  44. FlowElement flowElement = null;
  45. String eleName = null;
  46. // 得到流程启动节点的行号
  47. if (flowElement0.getClass().getSimpleName()
  48. .equals("StartEvent")) {
  49. rowStart = flowElement0.getXmlRowNumber() + "";
  50. // 如果当前不是连线,则下一个是
  51. } else if (flowElement0 != null
  52. && !(flowElement0.getClass().getSimpleName()
  53. .equals("SequenceFlow"))
  54. && iterator.hasNext()) {
  55. do {
  56. iterator.next();
  57. if (iterator.hasNext()) {
  58. flowElement = iterator.next();
  59. eleName = flowElement.getName();
  60. // 下下一个节点
  61. if (taskName.equals(eleName)) {
  62. row0 = flowElement0.getXmlRowNumber()
  63. + "";
  64. eleName0 = flowElement0.getClass()
  65. .getSimpleName();
  66. flowElement00 = flowElement0;
  67. break findFole;
  68. } else {
  69. flowElement0 = flowElement;
  70. }
  71. }
  72. } while (true);
  73. }
  74. }
  75. // 此处需要修改,怎么判断是别人提交给我的?如果当前节点名是申请,那么当上一个节点类名是StartEvent时,证明是自己的申请
  76. if (eleName0 != null && !("StartEvent".equals(eleName0))) {
  77. // 先查询出上一个任务(已完成),根据流程实例id
  78. List<HistoricTaskInstance> hisTaskList = historyService
  79. .createHistoricTaskInstanceQuery()
  80. .processDefinitionId(processdefintionId)
  81. .finished()
  82. .orderByHistoricTaskInstanceEndTime().desc()
  83. .list();
  84. String formName = null;
  85. if (hisTaskList != null && hisTaskList.size() > 0) {
  86. HistoricTaskInstance historicTaskInstance = hisTaskList
  87. .get(0);
  88. formName = historicTaskInstance.getFormKey();
  89. String form = this.getTaskForm1(formName);
  90. taskModel.setLastForm(form);
  91. }
  92. // 当是别人提交过来的任务时,form就应该是任务相关的form,task里边保存的有formName
  93. taskModel.setAssignee(task.getAssignee());
  94. taskModel.setCreateTime(task.getCreateTime());
  95. taskModel.setId(task.getId());
  96. taskModel.setName(task.getName());
  97. taskModel.setProcessInstanceId(task
  98. .getProcessInstanceId());
  99. taskModel
  100. .setProcessDefId(task.getProcessDefinitionId());
  101. taskModel.setFormKey(task.getFormKey());
  102. String deploymentId = processDefinition
  103. .getDeploymentId();
  104. Deployment deployment = repositoryService
  105. .createDeploymentQuery()
  106. .deploymentId(deploymentId).singleResult();
  107. String deploymentName = deployment.getName();
  108. taskModel.setDeploymentName(deploymentName);
  109. List<HistoricVariableInstance> variables = historyService
  110. .createHistoricVariableInstanceQuery()
  111. .processInstanceId(task.getProcessInstanceId())
  112. .list();
  113. // 获取上一个节点填写的数据
  114. Map<String, String> formData = new HashMap<String,String>();
  115. Map<String, String> formData1 = new HashMap<String,String>();
  116. for (HistoricVariableInstance variableInstance : variables) {
  117. System.out.println(variableInstance);
  118. String varName = variableInstance.getVariableName();
  119. System.out.println(varName);
  120. System.out.println(variableInstance.getValue());
  121. if (varName.contains(row0)) {
  122. formData.put(varName,
  123. (String) variableInstance.getValue());
  124. }
  125. if (varName.contains(rowStart)) {
  126. formData1.put(varName,
  127. (String) variableInstance.getValue());
  128. }
  129. }
  130. // 获取流程启动时填写的数据,即申请数据
  131. // 获取流程启动的表单form
  132. String firstForm = this.getStartForm1(deploymentId);
  133. // 这里的代码提取出去成为getStartFormAndData
  134. StringBuffer firstFormAndData = setFormAndData(
  135. rowStart, formData1, firstForm);
  136. taskModel.setFirstFormAndData(firstFormAndData
  137. .toString());
  138. taskModel.setFormData(formData);
  139. taskList.add(taskModel);
  140. }
  141. }
  142. }
  143. map.put("isLogin", "yes");
  144. map.put("userName",
  145. (String) req.getSession().getAttribute("userName"));
  146. map.put("result", "success");
  147. map.put("data", taskList);
  148. } else {
  149. map.put("isLogin", "no");
  150. }
  151. return map;
  152. }

我觉得这里边最重要的便是如何判断究竟是别人提交给我的,还是我自己申请的任务,而这里边如果用流程节点flowElevent来判断的话,会出现一些问题,因为我操作的过程中发现,当一个任务后便的连线不唯一时,各个节点的顺序也是不固定的,endEvent并不一定就在最后边,因此还需要从其他的地方进行判断。

如果有需要了解的朋友,可以把之前的那个我的申请列表的代码和这个一起拿到eclipse中对比一下,然后大概就能了解个七七八八了。

那么对于我的任务,也就是别人提交给我的任务列表,其相关的前端代码,与我的申请的前端代码非常类似,我也就不列出了。

还有之后的历史任务等等,也都可以结合之前的内容,只要了解了流程节点的结构,以及各个表的关联关系,那么简单实现自定义应该就不是太难。难得就是真正的要逻辑非常缜密,然后更加智能。

activiti自定义流程之整合(七):完成我的申请任务的更多相关文章

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

    注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置 基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作. 抛开自定义 ...

  2. activiti自定义流程之整合(一):整体环境配置

    结合之前所说的自定义流程的思路,分别是后台.前台.整合,之前的内容也分别进行了相关的练习和尝试,现在就该到了最后的整合了,依旧是以实现功能为目的,细节暂且不去管他. 因为我们实际项目后端用的是spri ...

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

    本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单 ...

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

    综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...

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

    流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么区别,因此也不多说.我们先看看列表页面以及对应的代码,然后在一步步说明点击启动按钮时如何调用自定 ...

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

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

  7. activiti自定义流程之自定义表单(三):表单列表及预览和删除

    注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...

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

    注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进 ...

  9. 关于我上传的activiti自定义流程demo的说明

    最近又收到了一些询问activiti的问题,其中好几个都是向我索要我上传的这个activiti自定义流程demo的数据库设计. 索要的多了,而我早就把这个库给删掉了,所以我便觉得有必要做一个说明: 我 ...

随机推荐

  1. linux 下mysql的安装,并设置必要的密码

    首先,我使用的是redhat linux ,版本号为: [root@localhost init.d]# cat /proc/version Linux version - (bhcompile@po ...

  2. RabbitMq、ActiveMq、ZeroMq 和 kafka 比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料.第一部分 ...

  3. web 标准相关

    摘自:http://www.cnblogs.com/artech/p/restful-web-api-01.html 一.TCP/IP与HTTP TCP/IP是以IP和TCP协议为核心的一整套网络协议 ...

  4. mybaties 查询 语句正确 但是查不到结果

        控制台输出的语句拿到数据库查询就有数据,但是一直显示不出来  也不报错 后来  百度发现数据库连接不对  因为其中引用了两个数据库 所有写混了   ---------------------- ...

  5. MVC模式与三层架构的区别

    之前总是混淆MVC表现模式和三层架构模式,为此记录下. 三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层) 三层架构(3-tier application) ...

  6. SQL Server 2008中查看锁信息

    ;with tran_locks as(select resource_type,db_name(resource_database_id) as db_name,resource_descripti ...

  7. Top Five Hacker Tools Every CISO Should Understand

    As the role of the CISO continues to evolve within organizations towards that of an executive level ...

  8. PHP 函数

    字符串函数: $name = "fakeface"; $myname =substr($name,0,3);//输出前面三个字符 fak print $myname; $name ...

  9. Spring与JPA

    Java持久化API(Java Persistence API),即JPA Spring中使用JPA的第一步是要在Spring应用上下文中将实体管理器工厂(entity manager factory ...

  10. Excel Access 新建空白文档/打开已有文档 提示内存或磁盘空间不足的解决方法--验证

    服务器上发现,打开mdb数据库,点知道只有个空白的截面,打开已有的excel文件,一样,但多了个提示:内存磁盘空间不足或者关闭不再使用的工作表或者程序.检查过,内存和磁盘很充裕啊.那里不足啊,任务管理 ...