activiti自定义流程之整合(六):获取我的申请任务
流程启动后,流程节点便进入到了任务相关的部分。可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据。实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置。
至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种。
而在任务相关的部分,我是把用户任务分成了两种,一种是我的申请,一种是我的任务。区别就是我发起的任务,和别人提交给我的或者反馈给我的任务。
那么流程一启动,第一个自然就是自己的申请了,这里便说明这个问题。
在这一篇中,需要注意的并不在于form表单,而是如何判断是不是初次申请,我一开始用的是流程节点来判断,这样就需要拿到流程节点并进行相关的遍历。
但是后来我回过头来再看时便发现其实远不止着一种方法,比如也可以通过任务来区分,如果整个流程实例只有一个任务,那么这个任务自然就是申请。当然了,前提是要限制任务是不能删除的。
还有就是,每一个任务都有启动时间,根据这个时间进行排序也应该可以进行判断,只是这个我还没有尝试,可行性究竟如何还有待确定。
那么下边就又到了上代码的时刻:
后台代码如下:
/*** @throwsXMLStreamException* 查询我申请未提交的任务** @author:tuzongxun* @Title: findTask* @param@return* @return Object* @date Mar 17, 20162:44:11 PM* @throws*/@RequestMapping(value = "/findFirstTask.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")@ResponseBodypublic Object findFirstTask(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;while (iterator.hasNext()) {FlowElement flowElement0 = iterator.next();// 下一个节点FlowElement flowElement = iterator.next();String eleName = flowElement.getName();if (taskName.equals(eleName)) {row0 = flowElement0.getXmlRowNumber() + "";eleName0 = flowElement0.getClass().getSimpleName();break;}}// 提交申请时if (eleName0.equals("StartEvent")) {///// 获取流程变量Map<String, Object> variables = runtimeService.getVariables(task.getProcessInstanceId());Set<String> keysSet = variables.keySet();Iterator<String> keySet = keysSet.iterator();Map<String, String> formData = new HashMap<String,String>();taskModel.setLastForm(this.getStartForm1((String) variables.get("deploymentId")));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);while (keySet.hasNext()) {String key = keySet.next();String value = (String) variables.get(key);if (key.contains(row0)) {formData.put(key, value);}}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;}
注意上边的方法中有调用getStartForm1这个方法,可在上一篇中找到。另外一个调用查询流程节点的方法如下:
/*** @throwsXMLStreamException* 查询流程节点** @author:tuzongxun* @Title: findFlow* @param@return* @return Iterator<FlowElement>* @date Mar 21, 20169:31:42 AM* @throws*/public Iterator<FlowElement> findFlow(String processDefId)throws XMLStreamException {List<ProcessDefinition> lists = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId).orderByProcessDefinitionVersion().desc().list();ProcessDefinition processDefinition = lists.get(0);processDefinition.getCategory();String resourceName = processDefinition.getResourceName();InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName);BpmnXMLConverter converter = new BpmnXMLConverter();XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader reader = factory.createXMLStreamReader(inputStream);BpmnModel bpmnModel = converter.convertToBpmnModel(reader);Process process = bpmnModel.getMainProcess();Collection<FlowElement> elements = process.getFlowElements();Iterator<FlowElement> iterator = elements.iterator();return iterator;}
前台的代码,我想经过这么久的代码罗列,app.js和html中的写法应该没有必要再写了,业务逻辑如下:
angular.module('activitiApp')
.controller('findFirstTaskCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){
$scope.init=function(){$http.post("./findFirstTask.do").success(function(result) {if(result.isLogin==="yes"){$rootScope.userName=result.userName;$scope.taskList=result.data;}else{$location.path("/login");}});
} //查看findDetail(task)$scope.findDetail=function(task){console.log(task);$('#findDetail').html('').dialog({title:'节点名称[' + task.name + ']',modal:true,width:$.common.window.getClientWidth() * 0.6,height:$.common.window.getClientHeight() * 0.9,open:function() {// 获取json格式的表单数据,就是流程定义中的所有fieldvar dialog = this;// 读取启动时的表单// 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来$(dialog).append("<div class='formContent' />");$('.formContent').html('').wrap("<form id='findDetailForm' class='formkey-form1'method='post' />"); var $form = $('.formkey-form1');//设置部署的Id$form.append("任务Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");$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>");//根据formData设置申请页面//处理form字符串var form=task.lastForm;//console.log(form);varindex0=form.lastIndexOf(">");var p=form.split("<p>");for(var i=1;i<p.length;i++){var pName=p[i].substring(0,p[i].indexOf(":")+1);var index1=p[i].indexOf('name="');var p0=p[i].substring(index1,p[i].lastIndexOf(">"));var index2=p0.indexOf('"');var keyName=p[i].substring(index1+6,index2+index1+7);var value=null;for(var key in task.formData){
// var keyString=key+"";
// if(keyString===keyName){
// value=(task.formData)[key];var keyString=key.substring(0,key.length-1);if(keyString===keyName){value=(task.formData)[key];}}$form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='createTime'value='"+value+"'></br>");}// 初始化日期组件$form.find('.datetime').datetimepicker({stepMinute: 5});$form.find('.date').datepicker();// 表单验证$form.validate($.extend({},$.common.plugin.validator));},buttons:[{text:'关闭',click:function() {$("#findDetail").dialog("close");//sendStartupRequest();}}]}).position({//my:"center",//at:"center",offset:'300 300',of: window,collision:"fit"});}//完成任务$scope.completeTaskTo=function(task){console.log(task);$('#comTask').html('').dialog({title:'节点名称[' + task.name + ']',modal:true,width:$.common.window.getClientWidth() * 0.6,height:$.common.window.getClientHeight() * 0.9,open:function() {// 获取json格式的表单数据,就是流程定义中的所有fieldvar dialog = this;// 读取启动时的表单// 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来$(dialog).append("<div class='formContent' />");$('.formContent').html('').wrap("<form id='completeTask' class='formkey-form'method='post' />"); var $form = $('.formkey-form');// 设置表单action getStartFormAndStartProcess$form.attr('action', './completeTask');//设置部署的Id$form.append("任务Id:<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' name='taskId' value="+task.id+"></br>");$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>");//根据formData设置申请页面//处理form字符串varform=task.lastForm;//console.log(form);varindex0=form.lastIndexOf(">");var p=form.split("<p>");for(var i=1;i<p.length;i++){var pName=p[i].substring(0,p[i].indexOf(":")+1);var index1=p[i].indexOf('name="');varp0=p[i].substring(index1,p[i].lastIndexOf(">"));var index2=p0.indexOf('"');var keyName=p[i].substring(index1+6,index2+index1+7);var value=null;for(var key in task.formData){var keyString=key.substring(0,key.length-1);if(keyString===keyName){value=(task.formData)[key];}}$form.append(pName+"<input type='text' readonly='readonly'style='background-color:#DEDCDC;margin-top:10px' value='"+value+"'></br>");} /// $.post('./getTaskForm.do',task.formKey, function(result) {//设置部署的Id//$form.append("<inputtype='hidden' name='deploymentId' value="+deploymentId+">");$form.append(result.form); }); // 初始化日期组件$form.find('.datetime').datetimepicker({stepMinute: 5});$form.find('.date').datepicker();// 表单验证$form.validate($.extend({},$.common.plugin.validator));},buttons:[{text:'提交',click:function() {$("#comTask").dialog("close");sendStartupRequest();}}]}).position({//my:"center",//at:"center",offset:'300 300',of: window,collision:"fit"});}/*** 提交表单* @return {[type]} [description]*/functionsendStartupRequest() {if ($(".formkey-form").valid()) {var url = './completeTask.do';var args = $('#completeTask').serialize();$.post(url,args, function(data){$("#comTask").dialog("close");//$location.path("/processList");window.location.href=("#/processList");setTimeout(function(){//$location.path("/findFirstTask");window.location.href =("#/findFirstTask");},1500);});}}}])
activiti自定义流程之整合(六):获取我的申请任务相关推荐
- activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Sprin ...
- 【整合篇】Activiti业务与流程的整合
对于无论是Activtit还是jbpm来说,业务与流程的整合均类似,启动流程是绑定业务,流程与业务的整合放到动态代理中 [java] view plain copy print? /** * 启动修 ...
- 基于Activiti的流程应用开发平台JSAAS-WF V5.3
第1章 产品概述及体系架构 1.1.概述 红迅JSAAS-WF工作流平台V5是广州红迅软件有限公司面向合作伙伴以及有IT运维团队中大型企业提供新一代的流程管理产品,它基于流行的JAVA开源技术上构建, ...
- agilebpm脑图_干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架
干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架 [干货]基于SpringBoot2开发的Activiti引擎流程管理项目脚手架 前言 在工作中,难免会遇到需要开发基于流程管 ...
- Activiti 自定义流程图颜色
Activiti 自定义流程图颜色 流程图执行的为绿色,待执行为红色. 绘制流程图 package org.jeecg.common.config;/*** activiti6流程图绘制** @aut ...
- Activiti——管理流程定义(四)
Activiti--管理流程定义 1.设计流程定义文档 1.1.流程图 1.2.bpmn文件 <?xml version="1.0" encoding="UTF-8 ...
- Activiti——工作流程-核心API(二)
.1 ProcessEngine 说明: 1) 在Activiti中最核心的类,其他的类都是由他而来. 2) 产生方式: 在前面看到了两种创建ProcessEngine(流程引擎)的方式(http:/ ...
- java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署
BPMN的介绍 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和 ...
- 【activiti】流程变量
activiti流程变量 1. 什么是流程变量 流程变量在activiti中是一个非常重要的角色,流程运转有时就需要流程变量,流程变量就是activiti在管理工作流时根据管理需要而设置的变量. 前面 ...
最新文章
- C语言实现的Web服务器
- 部署 DevStack - 每天5分钟玩转 OpenStack(17)
- Java文件路径(getResource)
- Linux查看网卡UUID另一方法
- codeforces 467A-C语言解题报告
- 关闭word_记一次毕设消失事件始末,及mac+word文档消失恢复方法汇总
- 数据库实践丨MySQL多表join分析
- win10的11对战平台突然无法启动魔兽
- 微软 Chromium Edge 禁用 Google?
- 说说Android桌面(Launcher应用)背后的故事(四)——揭秘Workspace
- MATLAB矩阵基本运算
- 华为笔试题——去除重复的数字
- 1.3多媒体存储技术
- 爬虫中国天气网数据并可视化
- Linux系统备份系统还原
- 岁月划过生命线(2016 年终总结 -季度之星)
- RITnet: Real-time Semantic Segmentation of the Eye for Gaze Tracking
- 记一次Linux 下磁盘分配和扩容操作
- Promise、Promise.all 和Promise.race用法
- pta 试试手气 C语言
热门文章
- php imagejpeg函数,php imagepng()函数有什么用?
- ESXI6.0 windows虚拟机 硬盘扩容实例...
- 服务器五大相关基础知识【转】
- 传奇列表获取失败与登录器太老怎么解决
- 415报错,两种解决方法
- ZeroMemory、memset 和 “={0}” 三者区别
- vi复制粘贴(转贴+自己总结)
- 32_mechanize使用实例
- (1)ARCH效应、均值方程、GARCH族模型、对波动率建模、预测(包含代码)
- 软件工程-----人员组织方式