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

综合前几篇博文内容。我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功。

正由于如此,在创建了流程模型之后。模型列表的展示也是和之前的没有什么差别。并且都是非常easy的后台查询以及前台展示。这一部分也就只是多的讲了。

模型列表页面例如以下:

至于当中的改动和删除也没什么多讲的,删除非常easy,而改动也是activiti-modeler实现的主要功能。我们仅仅须要跳转过去即可。

重要的部分在于部署,由于点击部署到达后台以后。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:18px;text-align:center;margin-left:2px;margin-top:auto;position:relative;float:left;" cellSpacing="0px" cellPadding="0px">
      <tr style="background-color:#ccc">
         <td>ID</td>
         <td>NAME</td>
         <td>KEY</td>
         <td>描 述</td>
         <td>版本号</td>
         <td>创建时间</td>
         <td>改动时间</td>
         <td>操 作</td>
      </tr>
      <tr ng-repeat="model in modelList | orderBy:'id'" >
         <td>{{model.id}}</td>
         <td>{{model.name}}</td>
         <td>{{model.key}}</td>
         <td>{{model.metaInfo}}</td>
         <td>{{model.version}}</td>
         <td>{{model.createTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
         <td>{{model.lastUpdateTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
         <td><a href="script:;" ng-click="deploye(model)">部署</a> 
         <a href="script:;" ng-click="delete(model)">删除</a> 
         <a href="script:;" ng-click="update(model.id)">改动</a>
         </td>
      </tr>
   </table>
   </center>
</div>

点击部署要走到后台,前台就须要js控制,对应的js代码例如以下:

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

        $scope.update=function(modelId){
        	window.open("http://localhost:8080/activitiTest1/service/editor?

id="+modelId);
        }

}])

而后程序到达后台,后台代码例如以下:

/**
	 * 依据模型id部署流程定义
	 *
	 * @author:tuzongxun
	 * @Title: deploye
	 * @param @param activitiModel
	 * @param @param redirectAttributes
	 * @param @return
	 * @return Object
	 * @date Mar 17, 2016 12:30:05 PM
	 * @throws
	 */
	@RequestMapping(value = "/deploye.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
	@ResponseBody
	public Object deploye(@RequestBody ActivitiModel activitiModel,
			HttpServletRequest req) {
		Map<String, Object> map = new HashMap<String, Object>();
		boolean isLogin = this.isLogin(req);
		if (isLogin) {
			String modelId = activitiModel.getId();
			try {
				// 获取forms拿到formname
				Model modelData = repositoryService.getModel(modelId);
				ObjectNode modelNode = (ObjectNode) new ObjectMapper()
						.readTree(repositoryService
								.getModelEditorSource(modelData.getId()));
				byte[] bpmnBytes = null;
				BpmnModel model = new BpmnJsonConverter()
						.convertToBpmnModel(modelNode);
				bpmnBytes = new BpmnXMLConverter().convertToXML(model);
				DeploymentBuilder db = repositoryService.createDeployment()
						.name(modelData.getName());
                 //差别在这里
				List<JsonNode> forms = modelNode
						.findValues("formkeydefinition");
				for (JsonNode node : forms) {
					// aaa.form
					String formName = node.textValue();
					if (!"".equals(formName)) {
						// 就是页面的html代码依据formName找到
						String formContent = myFormService
								.findFormByFormName(formName);
						ByteArrayInputStream bi = new ByteArrayInputStream(
								formContent.getBytes());
						db.addInputStream(formName, bi);
						break;
					}
				}
				Deployment deployment = db.addString(
						modelData.getName() + ".bpmn20.xml",
						new String(bpmnBytes)).deploy();
				if (deployment != null && deployment.getId() != null) {
					map.put("isLogin", "yes");
					map.put("userName",
							(String) req.getSession().getAttribute("userName"));
					map.put("result", "success");
				}
			} catch (Exception e) {
				e.printStackTrace();

			}
		} else {
			map.put("isLogin", "no");
		}
		return map;
	}

拿这段代码和之前单独的activiti流程部署的代码相比,就能够看到这里多出了查询form的操作以及部署时新的inputStream的设置。

在这段代码中。须要我们自己依据formKey(即自己定义的表单的文件名称)从数据中查询出对应的html表单代码,这段代码也是自己写的。例如以下:

public Connection getDb() {
		Connection connection = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/testtu", "root", "123456");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connection;
	}

public String findFormByFormName(String formName) {
		String formString = null;
		Connection connection = this.getDb();
		Statement statement;
		try {
			statement = connection.createStatement();
			PreparedStatement ps = connection
					.prepareStatement("select * from formtest where formType=?

");
			ps.setString(1, formName);
			ResultSet resultSet = ps.executeQuery();
			while (resultSet.next()) {
				formString = resultSet.getString(3);
			}
			;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return formString;
	}

实现这个表单设置的目的实际上是为了之后启动流程时的操作,由于部署之后就有了流程定义列表,在流程定义列表中就能够启动流程,仅仅有在这里设置了。那么点击启动流程时才干调用activitiService的相关方法获取相应节点的表单。

有了这个操作,在我们部署成功之后。能够看到与之前的部署相比,在数据库ac_ge_bytearray表中会再多出一条表单相关的数据。如图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

那么至此,整合自己定义表单部署流程结束。

时间: 2024-12-26 17:51:20

activiti自己定义流程之整合(四):整合自己定义表单部署流程定义的相关文章

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

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

如何解耦业务表单与流程

一.问题说明 使用工作流的系统,例如OA,ERP等,都会遇到当流程到达某些环节的时候,业务表单的某些字段有值的验证要求或只在该环节显示.隐藏. 二.解决方案 1.一般方案 在业务表单里使用流程环节的特征信息来对这些字段作控制,属于硬编码的方式,业务表单与流程的耦合度太高,污染了表单代码,会有点乱.可读性.可维护性.扩展性都会大大降低. 2.更好的方案 1).环节移动相关的 当前节点上的操作和数据决定了下一步怎么走,所以业务表单里的某些字段可能要拿来作判断的或临时提供一个选择器给用户,由用户来决定

asp.net 微信企业号办公系统-表单及流程设计配置实例

在环境搭建好之后,我们就来学习一下怎样快速创建一个流程,并执行和流转该流程(我们这里讲的只是入门,不涉及到具体流程参数设置). 创建一个流程步骤为:在数据库在创建表-->设计表单-->设置流程-->配置菜单  即可点击新配置的菜单运行该流程. 1.创建业务数据表 根据自己的业务需求我们创建自己的业务表(例如政府部门常用的 文件阅办卡): 建表注意事项: 表必须要有一个主键,主键只能是int型的自增字段或者uniqueidentifier(guid)类型. 2.设计表单 打开表单设计器:

表单提交(四)——不能提交表单

Forms and their child elements should not use input names or ids that conflict with properties of a form, such as submit, length, or method. Name conflicts can cause confusing failures. For a complete list of rules and to check your markup for these

SpringMVC+Mybatis框架整合源码 项目 自定义表单 rest websocket html5

获取[下载地址]   QQ: 313596790   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 集成代码生成器(开发利器);                                         技术:313596790   增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面

Struts(十四):通用标签-form表单

form标签是struts2标签中一个重要标签: 可以生成html标签,使用起来和html的form标签差不多: Strut2的form标签会生成一个table,进行自动布局: 可以对表单提交的值进行回填:从栈顶对象开始配置属性,并把匹配的属性值赋到对应的标签value中,若栈顶对象没有对应的属性,则依次向下栈中找对应的属性. 为什么form标签可以实现填充form表单? 示例:写一个这样的form页面,提交form页面后跳转到自身页面 form-tags.jsp页面: <%@ page lan

第四节:Vue表单标签和组件的基本用法,父子组件间的通信

vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="vue.js"></script> </head> <body> <div id="app"&

(四)Jquery Mobile表单

Jquery Mobile表单与列表 一.JM表单      1.表单      普通html表单            效果:          2.只能输入数字的表单           效果:              说明:label中的for="number-pattern" 就是说,当我们点击label是就会获取到id="number-pattern"的焦点,也就是下面input框的焦点. 3.文件文本框            效果:       4.密

struts2总结四:Action与Form表单的交互

struts2 Action获取表单数据的方式有三种:1.通过属性驱动的方式.2.模型驱动方式.3.使用多个model对象的属性. 1.通过属性驱动式 首先在jsp里面编写form表单的代码如下: <form action="sys/login.action" method="post"> <input type="text" name="username"> <input type="