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开始,那么如果我们原样保存到数据库,以后查询时自然就会有问题了,所以这里就根据每个流程中流程节点行号的唯一性进行了重新组合,然后把这些数据保存为流程变量。
activiti自定义流程之整合(五):启动流程时获取自定义表单的更多相关文章
- java:JavaScript2:(setTimeout定时器,history.go()前进/后退,navigator.userAgent判断浏览器,location.href,五种方法获取标签属性,setAttribute,innerHTML,三种方法获取form表单信息,JS表单验证,DOM对象,form表单操作)
1.open,setTimeout,setInterval,clearInterval,clearTimeout <!DOCTYPE> <html> <head> ...
- activiti自定义流程之整合(六):获取我的申请任务
流程启动后,流程节点便进入到了任务相关的部分.可以看到我之前的做法是在启动节点就绑定了form表单,启动时就填写相关的数据.实际上在之前我的做法是不对开始节点做任何操作,知道任务节点的时候再填写相关的 ...
- Spring启动时获取自定义注解的属性值
1.自定义注解 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documen ...
- (转)ASP.NET MVC 第五个预览版和表单提交场景
转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...
- 从零开始学习html(五)与浏览者交互,表单标签——下
六.使用下拉列表框进行多选 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type ...
- JavaWeb学习总结(十五)Jsp中提交的表单的get和post的两种方式
两者的比较: Get方式: 将请求的参数名和值转换成字符串,并附加在原来的URL之后,不安全 传输的数据量较小,一般不能大于2KB: post方式: 数量较大: 请求的参数和值放在HTML的请求头中, ...
- 第一百八十五节,jQuery,Ajax 表单插件
jQuery,Ajax 表单插件 学习要点: 1.核心方法 2.option 参数 3.工具方法 传统的表单提交,需要多次跳转页面,极大的消耗资源也缺乏良好的用户体验.而这款 form.js 表单的 ...
- 如何在我的EC2实例状态更改时获取自定义电子邮件通知
具体详情,请参见: https://amazonaws-china.com/cn/premiumsupport/knowledge-center/ec2-email-instance-state-ch ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
随机推荐
- Java Script
一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...
- JQuery 对 Select option 的操作
下拉框: <select id="selectID" > <option value="1">1</option& ...
- 学习di'z地址
Swift学习地址https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/ http://www.oschina.n ...
- qq快速聊天
和女朋友聊天的时候,每次发完消息我都习惯性把聊天界面关了,或者我想找女朋友聊天了,又要打开主界面再打开聊天窗口 每次感觉特别麻烦.所以我在想有没有一个好的办法直接打开聊天窗口的.刚好这两天又在写jav ...
- Appium移动自动化测试(一)--安装Appium
Appium 自动化测试是很早之前就想学习和研究的技术了,可是一直抽不出一块完整的时间来做这件事儿.现在终于有了. 反观各种互联网的招聘移动测试成了主流,如果再不去学习移动自动化测试技术将会被淘汰. ...
- 【转】jQuery异步上传文件
用了 jQuery Form插件来解决这个问题:http://malsup.com/jquery/form/#code-samples 有没有不用该插件来实现呢? 解决方法: 可以采用HTML5,用j ...
- sqoop将关系型的数据库得数据导入到hbase中
1.sqoop将关系数据库导入到hbase的参数说明
- MapReducer程序调试技巧
写过程序分布式代码的人都知道,分布式的程序是比较难以调试的,但是也不是不可以调试,对于Hadoop分布式集群来说,在其上面运行的是mapreduce程序,因此,有时候写好了mapreduce程序之后, ...
- BlackHat会议上将公布一款免费的汽车黑客工具
汽车,无可厚非是现代社会很重要的交通工具,但与此同时却也带来了诸多安全隐患,不管怎样,汽车安全都是我们不可忽视的一个重大问题. 即将免费分享该工具 近日一名法国研究者将发布一款检测汽车安全漏洞的工具, ...
- 加入Tomcat插件到ECLIPSE中的方法
1.下载Tomcat插件com.sysdeo.eclipse.tomcat_3.3.1.jar 下载路径http://www.eclipsetotale.com/ 2.安装插件 把下载的插件放到E:\ ...