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")
- @ResponseBody
- public 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格式的表单数据,就是流程定义中的所有field
- var 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格式的表单数据,就是流程定义中的所有field
- var 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自定义流程之整合(二):使用angular js整合ueditor创建表单
注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置 基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作. 抛开自定义 ...
- activiti自定义流程之整合(一):整体环境配置
结合之前所说的自定义流程的思路,分别是后台.前台.整合,之前的内容也分别进行了相关的练习和尝试,现在就该到了最后的整合了,依旧是以实现功能为目的,细节暂且不去管他. 因为我们实际项目后端用的是spri ...
- activiti自定义流程之整合(三):整合自定义表单创建模型
本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单 ...
- activiti自定义流程之整合(五):启动流程时获取自定义表单
流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么区别,因此也不多说.我们先看看列表页面以及对应的代码,然后在一步步说明点击启动按钮时如何调用自定 ...
- activiti自定义流程之整合(四):整合自定义表单部署流程定义
综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...
- activiti自定义流程之整合(七):完成我的申请任务
在上一篇的获得我的申请中,可以看到js代码中还包含了预览和完成任务的代码,既然上一篇已经罗列了相关代码,这里也就不重复. 那么需要补充的是,在上边的完成任务的js代码中,我们还调用了getTaskFo ...
- activiti自定义流程之自定义表单(二):创建表单
注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进 ...
- activiti自定义流程之自定义表单(三):表单列表及预览和删除
注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...
- 关于我上传的activiti自定义流程demo的说明
最近又收到了一些询问activiti的问题,其中好几个都是向我索要我上传的这个activiti自定义流程demo的数据库设计. 索要的多了,而我早就把这个库给删掉了,所以我便觉得有必要做一个说明: 我 ...
随机推荐
- SuperSlide
今天又接触到另一个新的前端插件,心情美美哒~ SuperSlide 致力于解决网站大部分特效展示问题,使网站代码规范整洁,方便维护更新,官网地址:http://www.superslide2.com/ ...
- 存储过程实现登录(.net)
工作中,可能有时为了安全等的考虑,需要更多 的运用存储过程.有的公司甚至在登录一栏也会提出这样的要求,那么怎么用存储过程实现登录呢.好处就不用言名了,一个速度,一个就是安全系统更高. 下面贴上:1.存 ...
- DownloadManager补漏
原始完成于:2014-10-24 20:01:03 DownloadManager是一个处理HTTP下载请求的系统服务: 1. 基本用法 1 private void download() { 2 R ...
- 【C语言学习】-08 指针
指针
- MongoDB下载文件 百度盘共享
1> mongodb下载地址: http://www.mongodb.org/downloads 官方下载不了,可以到百度共享盘里面下载 MongoDB 2.6.5 Windows 64位: ...
- Visual Studio 2008打开vs2010解决方案的方法
一个朋友遇到了个问题:用visual studio 2008软件,无法打开一个asp.net网站的sln解决方案.如下图,原因是此解决方案由vs2010生成的,必须由vs2010运行程序打开. 这样一 ...
- 在eclipse中安装配置WebDriver
安装好eclipse环境后,下载Selenium jar包 在eclipse中新建一个java project 之后选择新建的工程,将Selenium jar包中的lib文件夹和selenium-ja ...
- wordpress的创建
1.将mysql的安装文件放入虚拟机 2.搭建yum库 3.依次安装mysql的5个文件 最后一个server需要的依赖太多,所以用yum进行安装. 或者直接全部用yum进行安装 6.进行mysql的 ...
- 第一章 ------ AutoYout介绍
1.使用自动布局的好处: (1)让两个视图进行尺寸匹配,使两个视图始终保持相同的宽度 (2)无论父视图如何改变,视图都可以相对于父视图居中 (3)拜放一行视图时将几个视图的底部对齐 (4)将两个视图偏 ...
- 百度之星热身赛-1001(dfs拓扑排序)
题意:作为年度优秀魔法学员的奖赏,哈利得到了一台具有魔力的计算机.这台计算机一旦开始处理某个任务,就会一直处理到这个任务结束为止(所以你可以认为它是单线程的).有一天,这台计算机得到了n个任务要处理, ...