activiti自定义流程之整合(七):完成我的申请任务
在上一篇的获得我的申请中,可以看到js代码中还包含了预览和完成任务的代码,既然上一篇已经罗列了相关代码,这里也就不重复。
那么需要补充的是,在上边的完成任务的js代码中,我们还调用了getTaskForm请求,目的是从后台获取提交任务时的其他数据,例如指定下一个处理人等,当然了,根据不同的业务逻辑可能有所变化。
那么这个请求对应的后台代码如下,如果弄明白了整个数据库的设计,那么对于这些代码就很容易明白。
- @RequestMapping(value = "/getTaskForm.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
- @ResponseBody
- public Object getTaskForm(@RequestBody String taskFormKey) {
- Map<String, String> map = new HashMap<String, String>();
- //System.out.println(taskFormKey);
- taskFormKey = taskFormKey.replace("=", "");
- String form = myFormService.findFormByFormName(taskFormKey);
- // (String)formService.getRenderedTaskForm(taskFormKey);
- map.put("form", form);
- return map;
- }
这里边的findFormByFormName方法在前边的章节中讲过,就是很简单的根据一个字段查询整条记录的操作。
那么这里补充的说明完了,下一步就是提交申请,把任务交到下一个人的手上,也就是上边的js中的complete.do请求,这个请求的后台代码如下:
- /**
- * @throwsXMLStreamException
- * 完成个人任务
- *
- * @author:tuzongxun
- * @Title: completeTask
- * @param@return
- * @return Object
- * @date Mar 17, 20164:55:31 PM
- * @throws
- */
- @RequestMapping(value = "/completeTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
- @ResponseBody
- public Object completeTask(HttpServletRequest req)
- throws XMLStreamException {
- Map<String, String[]> formMap = req.getParameterMap();
- String taskId = (String) formMap.get("taskId")[0];
- boolean isLogin = this.isLogin(req);
- if (isLogin) {
- if (taskId != null) {
- // 根据taskName和流程节点中的名字判断当前节点之后是否还有任务
- Task task = taskService.createTaskQuery().taskId(taskId)
- .singleResult();
- String taskName = task.getName();
- Iterator<FlowElement> flows = this.findFlow(task
- .getProcessDefinitionId());
- String row0 = null;
- Map<String, Object> formProperties = new HashMap<String, Object>();
- while (flows.hasNext()) {
- FlowElement flowElement = flows.next();
- // 找到当前节点,查询出下下一个节点是否是结束节点,如果不是则需要设置下一个任务人,否则直接保存相关流程变量结束
- // 同时要查处当前任务的行数用来设置流程变量名称
- if (taskName.equals(flowElement.getName())) {
- // 设置行号
- row0 = flowElement.getXmlRowNumber() + "";
- FlowElement flowElement3 = flows.next();
- System.out.println("SequenceFlow".equals(flowElement3
- .getClass().getSimpleName()));
- if ("SequenceFlow".equals(flowElement3.getClass()
- .getSimpleName())) {
- SequenceFlow seq = (SequenceFlow) flowElement3;
- System.out.println(seq.getConditionExpression()
- + "," + seq.getName());
- }
- FlowElement flowElement2 = flows.next();
- // 当前任务不是最后一个任务,流程没有结束,需要设置下一个处理人
- if (flowElement2 != null
- && !("EndEvent".equals(flowElement2.getClass()
- .getSimpleName()) && !("SequenceFlow"
- .equals(flowElement2.getClass()
- .getSimpleName())))) {
- UserTask userTask = (UserTask) flowElement2;
- // 获取userTask中的
- String assignee = userTask.getAssignee();
- int index1 = assignee.indexOf("{");
- int index2 = assignee.indexOf("}");
- String person1 = (String) formMap.get("data_1")[0];
- formProperties.put(
- assignee.substring(index1 + 1, index2),
- person1);
- }
- break;
- }
- }
- // 从request中读取参数然后转换0
- Set<Entry<String, String[]>> entrySet = formMap.entrySet();
- for (Entry<String, String[]> entry : entrySet) {
- String key = entry.getKey() + row0;
- String value = entry.getValue()[0];
- if (!key.equals("taskId")) {
- formProperties.put(key, value);
- }
- }
- taskService.complete(taskId, formProperties);
- ;
- }
- }
- return null;
- }
因为这一个完成任务的方法和之后处理别人提交给自己的任务方法共用了,因此我便同时列出查询别人提交给我的任务的后台代码,如下:
- /**
- * @throwsXMLStreamException
- * 查询别人提交给我的任务
- *
- * @author:tuzongxun
- * @Title: findTask
- * @param@return
- * @return Object
- * @date Mar 17, 20162:44:11 PM
- * @throws
- */
- @RequestMapping(value = "/findTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
- @ResponseBody
- public Object findTask(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;
- String rowStart = null;
- // 保存上上一个节点的信息
- FlowElement flowElement00 = null;
- findFole: while (iterator.hasNext()) {
- FlowElement flowElement0 = iterator.next();
- // 注意usertask下一个节点是连线而不是task
- FlowElement flowElement = null;
- String eleName = null;
- // 得到流程启动节点的行号
- if (flowElement0.getClass().getSimpleName()
- .equals("StartEvent")) {
- rowStart = flowElement0.getXmlRowNumber() + "";
- // 如果当前不是连线,则下一个是
- } else if (flowElement0 != null
- && !(flowElement0.getClass().getSimpleName()
- .equals("SequenceFlow"))
- && iterator.hasNext()) {
- do {
- iterator.next();
- if (iterator.hasNext()) {
- flowElement = iterator.next();
- eleName = flowElement.getName();
- // 下下一个节点
- if (taskName.equals(eleName)) {
- row0 = flowElement0.getXmlRowNumber()
- + "";
- eleName0 = flowElement0.getClass()
- .getSimpleName();
- flowElement00 = flowElement0;
- break findFole;
- } else {
- flowElement0 = flowElement;
- }
- }
- } while (true);
- }
- }
- // 此处需要修改,怎么判断是别人提交给我的?如果当前节点名是申请,那么当上一个节点类名是StartEvent时,证明是自己的申请
- if (eleName0 != null && !("StartEvent".equals(eleName0))) {
- // 先查询出上一个任务(已完成),根据流程实例id
- List<HistoricTaskInstance> hisTaskList = historyService
- .createHistoricTaskInstanceQuery()
- .processDefinitionId(processdefintionId)
- .finished()
- .orderByHistoricTaskInstanceEndTime().desc()
- .list();
- String formName = null;
- if (hisTaskList != null && hisTaskList.size() > 0) {
- HistoricTaskInstance historicTaskInstance = hisTaskList
- .get(0);
- formName = historicTaskInstance.getFormKey();
- String form = this.getTaskForm1(formName);
- taskModel.setLastForm(form);
- }
- // 当是别人提交过来的任务时,form就应该是任务相关的form,task里边保存的有formName
- 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);
- List<HistoricVariableInstance> variables = historyService
- .createHistoricVariableInstanceQuery()
- .processInstanceId(task.getProcessInstanceId())
- .list();
- // 获取上一个节点填写的数据
- Map<String, String> formData = new HashMap<String,String>();
- Map<String, String> formData1 = new HashMap<String,String>();
- for (HistoricVariableInstance variableInstance : variables) {
- System.out.println(variableInstance);
- String varName = variableInstance.getVariableName();
- System.out.println(varName);
- System.out.println(variableInstance.getValue());
- if (varName.contains(row0)) {
- formData.put(varName,
- (String) variableInstance.getValue());
- }
- if (varName.contains(rowStart)) {
- formData1.put(varName,
- (String) variableInstance.getValue());
- }
- }
- // 获取流程启动时填写的数据,即申请数据
- // 获取流程启动的表单form
- String firstForm = this.getStartForm1(deploymentId);
- // 这里的代码提取出去成为getStartFormAndData
- StringBuffer firstFormAndData = setFormAndData(
- rowStart, formData1, firstForm);
- taskModel.setFirstFormAndData(firstFormAndData
- .toString());
- 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;
- }
我觉得这里边最重要的便是如何判断究竟是别人提交给我的,还是我自己申请的任务,而这里边如果用流程节点flowElevent来判断的话,会出现一些问题,因为我操作的过程中发现,当一个任务后便的连线不唯一时,各个节点的顺序也是不固定的,endEvent并不一定就在最后边,因此还需要从其他的地方进行判断。
如果有需要了解的朋友,可以把之前的那个我的申请列表的代码和这个一起拿到eclipse中对比一下,然后大概就能了解个七七八八了。
那么对于我的任务,也就是别人提交给我的任务列表,其相关的前端代码,与我的申请的前端代码非常类似,我也就不列出了。
还有之后的历史任务等等,也都可以结合之前的内容,只要了解了流程节点的结构,以及各个表的关联关系,那么简单实现自定义应该就不是太难。难得就是真正的要逻辑非常缜密,然后更加智能。
activiti自定义流程之整合(七):完成我的申请任务的更多相关文章
- activiti自定义流程之整合(二):使用angular js整合ueditor创建表单
注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置 基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作. 抛开自定义 ...
- activiti自定义流程之整合(一):整体环境配置
结合之前所说的自定义流程的思路,分别是后台.前台.整合,之前的内容也分别进行了相关的练习和尝试,现在就该到了最后的整合了,依旧是以实现功能为目的,细节暂且不去管他. 因为我们实际项目后端用的是spri ...
- activiti自定义流程之整合(三):整合自定义表单创建模型
本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单 ...
- activiti自定义流程之整合(四):整合自定义表单部署流程定义
综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...
- activiti自定义流程之整合(五):启动流程时获取自定义表单
流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么区别,因此也不多说.我们先看看列表页面以及对应的代码,然后在一步步说明点击启动按钮时如何调用自定 ...
- activiti自定义流程之整合(六):获取我的申请任务
流程启动后,流程节点便进入到了任务相关的部分.可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据.实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的 ...
- activiti自定义流程之自定义表单(三):表单列表及预览和删除
注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...
- activiti自定义流程之自定义表单(二):创建表单
注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进 ...
- 关于我上传的activiti自定义流程demo的说明
最近又收到了一些询问activiti的问题,其中好几个都是向我索要我上传的这个activiti自定义流程demo的数据库设计. 索要的多了,而我早就把这个库给删掉了,所以我便觉得有必要做一个说明: 我 ...
随机推荐
- 初次使用InstallShield笔记
公司的产品需要打包发布,以前一直没打包,打包方法的学习交给了我 下面的内容是我研究过后的,通过回忆写的笔记.由于不熟悉,可能会有错误或者是笨办法,希望高手指正,感激不尽. 有些东西是什么,以及是什么意 ...
- 自己封装的一个java图片验证码
验证码生成器: package com.lz.Tools; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...
- varchar类型转换为numeric的值时有问题原因
numeric的值不应该用单引号括起来...........
- 移动 Web 开发技巧之(后续)
昨天的<移动 Web 开发技巧>的这篇文章,大家反响不错,因为这些问题在大家日常写移动端的页面时经常遇到的.所以那个文章还是超级实用的,那么我们今天继续来分享一下移动端的web开发技巧吧, ...
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
- Quartz Spring与Spring Task总结
Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下. 对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...
- 1415-2个人项目Individual Project
作业要求: 个人独立完成,实践PSP相关知识. 时 间: 两周. (本来截止4月30日,考虑到刚迁移平台,延缓至5月7日) 实践目标: Github基本源代码控制方法 利用Junit4进行程序模块的测 ...
- 建筑行业如何用BPM替换OA?
2015年4月,K2正式与上海水石建筑规划设计有限公司签约. 为提高公司运作流程的效率,有效的对各流程的运作管理和优化,降低成本,同时提高公司的资金管理水平,水石公司利用K2系统作为整个公司流程的管理 ...
- Oracle 分析函数之 lag和lead
Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列. 这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率. /*语法*/ ...
- Windows 10简体中文最新预览版Build 9926
Windows 10 消费者预览版全新特性: • 全新的开始菜单Win 10的开始菜单产生了较大改变,磁贴界面在原有磁贴概念的基础上进行了大幅度的调整,新的磁贴界面开始支持纵向滚动,并可以利用开始按钮 ...