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

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

流程定义列表页面如下:

对应的html代码:

<div id="logdiv1" ng-init="init();">
   <p style="font-size:24px;margin:3px">流程列表</p>
   <center>
   <table border="1px" style="margin-top:1px;width:87%;font-size:14px;text-align:center;margin-top:1px;margin-left:2px;position:relative;float:left;" cellSpacing="0px" cellPadding="0px">
      <tr style="background-color:#ccc">
         <td>ID</td>
         <td>NAME</td>
         <td>DeploymentID</td>
         <td>KEY</td>
         <td>版本</td>
         <td>resourceName</td>
         <td>DiagramResourceName</td>
         <td>操 作</td>
      </tr>
      <tr ng-repeat="process in processList | orderBy:'id'" >
         <td>{{process.id}}</td>
         <td>{{process.name}}</td>
         <td>{{process.deploymentId}}</td>
         <td>{{process.key}}</td>
         <td>{{process.version}}</td>
         <td>{{process.resourceName}}</td>
         <td>{{process.diagramResourceName}}</td>
         <td><a href="script:;" ng-click="toProcess(process)">启动</a> 
         <a href="script:;" ng-click="deleteProcess(process)">删除</a> 
         </td>
      </tr>
   </table>
   <div id="handleTemplate" ></div>
   </center>
</div>  

对应的angularjs代码:

angular.module('activitiApp')
.controller('processCtr', ['$rootScope','$scope','$http','$location', function($rootScope,$scope,$http,$location){
$scope.init=function(){
        $http.post("./processList.do").success(function(result) {
        	if(result.isLogin==="yes"){
        	$rootScope.userName=result.userName;
    	    $scope.processList=result.data;
        	}else{
        		$location.path("/login");
        	}
        });
}     

    	//开始流程
        $scope.toProcess= function(process){
        	$rootScope.process=process;
        	$('#handleTemplate').html('').dialog({
        		title:'流程名称[' + process.name + ']',
    			modal: true,
    			width: $.common.window.getClientWidth() * 0.6,
    			height: $.common.window.getClientHeight() * 0.9,
    			open: function() {
    				// 获取json格式的表单数据,就是流程定义中的所有field
    				readForm.call(this, process.deploymentId);
    			},
    			buttons: [{
    				text: '启动流程',
    				click: function() {
    					$("#handleTemplate").dialog("close");
    					sendStartupRequest();
    					setTimeout(function(){
    						window.location.href =("#/findFirstTask");
    					},1500);

    				}
    			}]
    		}).position({
    			   //my: "center",
    			   //at: "center",
    			offset:'300 300',
    			   of: window,
    			   collision:"fit"
    			});
;
    	};
    	//读取流程启动表单
    	function readForm(deploymentId) {
    		var dialog = this;
    		// 读取启动时的表单
    		$.post('./getStartForm.do',deploymentId, function(result) {
    			// 获取的form是字符行,html格式直接显示在对话框内就可以了,然后用form包裹起来

    			$(dialog).append("<div class='formContent' />");
    			$('.formContent').html('').wrap("<form id='startform' class='formkey-form' method='post' />");

    			var $form = $('.formkey-form');

    			// 设置表单action    getStartFormAndStartProcess
    			$form.attr('action', './getStartFormAndStartProcess');
    			//设置部署的Id
    			$form.append("<input type='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));
    		});
    	}

    	/**
    	 * 提交表单
    	 * @return {[type]} [description]
    	 */
    	function sendStartupRequest() {
    		if ($(".formkey-form").valid()) {
    			var url = './getStartFormAndStartProcess.do';
    			var args = $('#startform').serialize();
    			$.post(url, args, function(data){
    				$("#handleTemplate").dialog("close");
					$location.path("/findFirstTask");
    			});
    		}
    	}

}])

在上边的代码中就有需要注意的地方了,从代码中可以看到,当我们点击页面的启动按钮时,会触发toProcess方法,而这个方法就使用到了dialog对话框,对话框中显示的内容便是之前自定义的表单,从后台数据库中请求过来。

那么读取的时候发送了getStartForm.do的请求,后台对应的代码如下:

@RequestMapping(value = "/getStartForm.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
	@ResponseBody
	public Object getStartForm(@RequestBody String deploymentId) {
		Map<String, String> map = new HashMap<String, String>();
		String deString = null;
		deString = deploymentId.replaceAll("=", "");
		String form = this.getStartForm1(deString);
		map.put("form", form);
		return map;
	}

	public String getStartForm1(String deploymentId) {
		String deString = null;
		deString = deploymentId.replaceAll("=", "");
		ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
				.deploymentId(deString).singleResult();
		String form = (String) formService.getRenderedStartForm(pd.getId());
		return form;
	}

要说明的是这里之所以能使用formService.getRenderedStartForm方法,便是因为在上一节部署的时候进行了设置,否则这个方法是无法正常使用的。

那么这个对话框弹出界面视图如下:

需要注意的是dialog的css样式在jquery-ui.css中,不要忘了导入进来,当然了,也可以按自己的喜好修改。

那么填写好相关的数据点击提交,同过上边的js可以知道就走到了后台getStartFormAndStartProcess这里,启动流程实例:

/**
	 * @throws XMLStreamException
	 *             启动流程
	 *
	 * @author:tuzongxun
	 * @Title: startProcess
	 * @param @return
	 * @return Object
	 * @date Mar 17, 2016 2:06:34 PM
	 * @throws
	 */
	@RequestMapping(value = "/getStartFormAndStartProcess.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
	@ResponseBody
	public Object startProcess1(HttpServletRequest req)
			throws XMLStreamException {
		Map<String, String[]> formMap = req.getParameterMap();
		String deploymentId = formMap.get("deploymentId")[0];
		// 拿到第一个data_1设置申请人
		String person1 = (String) formMap.get("data_1")[0];
		Map<String, String> map = new HashMap<String, String>();
		boolean isLogin = this.isLogin(req);
		if (isLogin) {
			if (deploymentId != null) {
				HttpSession session = req.getSession();
				String assginee = (String) session.getAttribute("userName");
				ProcessDefinition pd = repositoryService
						.createProcessDefinitionQuery()
						.deploymentId(deploymentId).singleResult();
				String processDefinitionId = pd.getId();
				Map<String, String> formProperties = new HashMap<String, String>();
				Iterator<FlowElement> iterator1 = this
						.findFlow(processDefinitionId);
				// 取第一个节点,开始节点的行号
				String row = null;
				while (iterator1.hasNext()) {
					FlowElement flowElement = iterator1.next();
					row = flowElement.getXmlRowNumber() + "";
					break;
				}

				// 从request中读取参数然后转换
				Set<Entry<String, String[]>> entrySet = formMap.entrySet();
				for (Entry<String, String[]> entry : entrySet) {
					String key = entry.getKey();
					String value = entry.getValue()[0];
					if (!key.equals("deploymentId")) {
						String keyString = key + row;
						formProperties.put(keyString, value);
					}
				}
				formProperties.put("deploymentId", deploymentId);
				Iterator<FlowElement> iterator = this.findFlow(pd.getId());
				int i = 1;
				while (iterator.hasNext()) {
					FlowElement flowElement = iterator.next(); // 申请人
					if (flowElement.getClass().getSimpleName()
							.equals("UserTask")
							&& i == 1) {
						UserTask userTask = (UserTask) flowElement;
						String assignee = userTask.getAssignee();
						int index1 = assignee.indexOf("{");
						int index2 = assignee.indexOf("}");
						formProperties
								.put(assignee.substring(index1 + 1, index2),
										person1);
						break;
					}
				}
				identityService.setAuthenticatedUserId(assginee);
				ProcessInstance processInstance = formService
						.submitStartFormData(processDefinitionId,
								formProperties);
				map.put("userName",
						(String) req.getSession().getAttribute("userName"));
				map.put("isLogin", "yes");
				map.put("result", "success");
			} else {
				map.put("result", "fail");
			}
		} else {
			map.put("isLogin", "no");
		}
		return map;
	}

而这里最重要的是对前台数据的处理,如果大家使用了ueditor插件,会发现他传递到后台的数据是存放在request中的一个map中,而map的key都是data_1、data_2、data_3的形式。

这样问题就来了,到后边对任务进行操作的时候,这些数据还是这样从data_1开始,那么如果我们原样保存到数据库,以后查询时自然就会有问题了,所以这里就根据每个流程中流程节点行号的唯一性进行了重新组合,然后把这些数据保存为流程变量。

时间: 2024-10-12 07:03:30

activiti自定义流程之整合(五):启动流程时获取自定义表单的相关文章

ssh整合-myeclipse整合框架启动tomcat时太慢了

问题描述 myeclipse整合框架启动tomcat时太慢了 信息: Initializing Spring root WebApplicationContext.启动tomcat,执行到这一步的时候,真的是太慢了,受不鸟了,有谁可以解决下?网上什么删掉一些没用的包之类的试过了,没什么用:另外单独启动tomcat的话,不习惯:菜鸟一枚,求指教. 解决方案 1.改成生产模式启动 2.换个高配的本子

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

流程启动后,流程节点便进入到了任务相关的部分.可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据.实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的数据进行设置.   至于这两种方式的优劣,我暂时还不太确定,单独从功能上来说都是可以实现的,因此大家可以都试一试,然后视不同的情况而定,按自己究竟要用哪种.   而在任务相关的部分,我是把用户任务分成了两种,一种是我的申请,一种是我的任务.区别就是我发起的任务,和别人提交给我的或者反馈给我的任务.

解决启动电脑时提示注册表出错的问题

  故障问题:每次启动计算机时系统就报告注册表出错然后死机,重新安装ghost xp系统并杀毒后故障现象仍然存在. 故障处理:从故障现象来看,应该是CMOS出现了问题,可在BIOS设置中选择"恢复默认值"选项将BIOS设置恢复到出厂设定即可.如果仍然不能解决系统之家问题,应该对CMOS进行放电处理系统下载. 对CMOS进行放电可通过主板上的路线开关,对照主板说明书,一般短接即可.如果主板上没有预留该跳线开关,可以短接主板电池的正负极进行放电,但放电完毕要等几个小时才可以重新启动计算机,

activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程

注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring整合activiti-modeler5.16实例(二):创建流程模型         (3)流程模型列表展示:activiti自定义流程之Spring整合activiti-modeler5.16实例(三):流程模型列表展示        (4)部署流程定义:activiti自定义流程之Spring整

高通Qualcomm平台lk(light kernel)启动流程2——aboot_init()

0lk 启动总体流程 1lk启动流程代码 lk app aboot abootc 更多相关文章: <高通Qualcomm平台lk(light kernel)启动流程1--aboot_init()之前>: http://blog.csdn.net/u014134180/article/details/78133916 <高通Qualcomm平台lk(light kernel)启动流程2--aboot_init()>: http://blog.csdn.net/u014134180/a

高通Qualcomm平台lk(light kernel)启动流程3——到高通lcm屏点亮

0lk 启动总体流程 1lk启动流程代码 lk app aboot abootc lk target msm8953 target_displayc lk dev gcdb display gcdb_displayc 更多相关文章: <高通Qualcomm平台lk(light kernel)启动流程1--aboot_init()之前>: http://blog.csdn.net/u014134180/article/details/78133916 <高通Qualcomm平台lk(lig

jquery自定义表单验证插件_jquery

本文实例为大家分享了jquery表单验证插件,供大家参考,具体内容如下 //正则表达式 var map = new Map(); map.put("*", /[\w\W]+/); map.put("*6-16", /^[\w\W]{6,16}$/); map.put("n", /^\d+$/); map.put("n6-16", /^\d{6,16}$/); map.put("s", /^[\u4E00-\

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

注:整体环境搭建:activiti自定义流程之整合(一):整体环境配置 基础环境搭建完毕,接下来就该正式着手代码编写了,在说代码之前,我觉得有必要先说明一下activit自定义流程的操作. 抛开自定义的表单不谈,通过之前的了解,我们知道一个新的流程开始,是在启动流程实例(processIntence)的时候,而流程实例依赖于流程定义(processDefinition),流程定义又依赖于流程模型(model). 我们用到的自定义表单需要在创建模型,画模型图的时候就指定表单的名称formKey,需

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

综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之后,模型列表的展示也是和之前的没有什么区别,而且都是很简单的后台查询以及前台展示,这一部分也就不过多的讲了. 模型列表页面如下:   至于其中的修改和删除也没什么多讲的,删除很简单,而修改也是activiti-modeler实现的主要功能,我们只需要跳转过去就行. 重要的部分在于部署,因为点击部署到