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

综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功。

正因为如此,在创建了流程模型之后,模型列表的展示也是和之前的没有什么区别,而且都是很简单的后台查询以及前台展示,这一部分也就不过多的讲了。

模型列表页面如下:

至于其中的修改和删除也没什么多讲的,删除很简单,而修改也是activiti-modeler实现的主要功能,我们只需要跳转过去就行。

重要的部分在于部署,因为点击部署到达后台以后,activiti就要和自定义的form表单打赏关系。
以上页面的html代码如下:

[html] view plain copy

  1. <div id="logdiv1" ng-init="init();">
  2. <p style="font-size:24px;margin:3px">模型列表</p>
  3. <center>
  4. <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">
  5. <tr style="background-color:#ccc">
  6. <td>ID</td>
  7. <td>NAME</td>
  8. <td>KEY</td>
  9. <td>描 述</td>
  10. <td>版本</td>
  11. <td>创建时间</td>
  12. <td>修改时间</td>
  13. <td>操 作</td>
  14. </tr>
  15. <tr ng-repeat="model in modelList | orderBy:‘id‘" >
  16. <td>{{model.id}}</td>
  17. <td>{{model.name}}</td>
  18. <td>{{model.key}}</td>
  19. <td>{{model.metaInfo}}</td>
  20. <td>{{model.version}}</td>
  21. <td>{{model.createTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
  22. <td>{{model.lastUpdateTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
  23. <td><a href="script:;" ng-click="deploye(model)">部署</a>
  24. <a href="script:;" ng-click="delete(model)">删除</a>
  25. <a href="script:;" ng-click="update(model.id)">修改</a>
  26. </td>
  27. </tr>
  28. </table>
  29. </center>
  30. </div>

点击部署要走到后台,前台就需要js控制,相应的js代码如下:

[javascript] view plain copy

  1. angular.module(‘activitiApp‘)
  2. .controller(‘modelCtr‘, [‘$rootScope‘,‘$scope‘,‘$http‘,‘$location‘, function($rootScope,$scope,$http,$location){
  3. $scope.init=function(){
  4. $http.post("./modelList.do").success(function(result) {
  5. if(result.isLogin==="yes"){
  6. $rootScope.userName=result.userName;
  7. console.log(result.data);
  8. $scope.modelList=result.data;
  9. }else{
  10. $location.path("/login");
  11. }
  12. });
  13. }
  14. $scope.deploye=function(model){
  15. console.log(model);
  16. $http.post("./deploye.do",model).success(function(deployResult){
  17. $location.path("/processList");
  18. });
  19. }
  20. $scope.update=function(modelId){
  21. window.open("http://localhost:8080/activitiTest1/service/editor?id="+modelId);
  22. }
  23. }])

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

[java] view plain copy

  1. /**
  2. * 根据模型id部署流程定义
  3. *
  4. * @author:tuzongxun
  5. * @Title: deploye
  6. * @param @param activitiModel
  7. * @param @param redirectAttributes
  8. * @param @return
  9. * @return Object
  10. * @date Mar 17, 2016 12:30:05 PM
  11. * @throws
  12. */
  13. @RequestMapping(value = "/deploye.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
  14. @ResponseBody
  15. public Object deploye(@RequestBody ActivitiModel activitiModel,
  16. HttpServletRequest req) {
  17. Map<String, Object> map = new HashMap<String, Object>();
  18. boolean isLogin = this.isLogin(req);
  19. if (isLogin) {
  20. String modelId = activitiModel.getId();
  21. try {
  22. // 获取forms拿到formname
  23. Model modelData = repositoryService.getModel(modelId);
  24. ObjectNode modelNode = (ObjectNode) new ObjectMapper()
  25. .readTree(repositoryService
  26. .getModelEditorSource(modelData.getId()));
  27. byte[] bpmnBytes = null;
  28. BpmnModel model = new BpmnJsonConverter()
  29. .convertToBpmnModel(modelNode);
  30. bpmnBytes = new BpmnXMLConverter().convertToXML(model);
  31. DeploymentBuilder db = repositoryService.createDeployment()
  32. .name(modelData.getName());
  33. //区别在这里
  34. List<JsonNode> forms = modelNode
  35. .findValues("formkeydefinition");
  36. for (JsonNode node : forms) {
  37. // aaa.form
  38. String formName = node.textValue();
  39. if (!"".equals(formName)) {
  40. // 就是页面的html代码根据formName找到
  41. String formContent = myFormService
  42. .findFormByFormName(formName);
  43. ByteArrayInputStream bi = new ByteArrayInputStream(
  44. formContent.getBytes());
  45. db.addInputStream(formName, bi);
  46. break;
  47. }
  48. }
  49. Deployment deployment = db.addString(
  50. modelData.getName() + ".bpmn20.xml",
  51. new String(bpmnBytes)).deploy();
  52. if (deployment != null && deployment.getId() != null) {
  53. map.put("isLogin", "yes");
  54. map.put("userName",
  55. (String) req.getSession().getAttribute("userName"));
  56. map.put("result", "success");
  57. }
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. } else {
  62. map.put("isLogin", "no");
  63. }
  64. return map;
  65. }

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

在这段代码中,需要我们自己根据formKey(即自定义的表单的文件名)从数据中查询出相应的html表单代码,这段代码也是自己写的,如下:

[java] view plain copy

  1. public Connection getDb() {
  2. Connection connection = null;
  3. try {
  4. Class.forName("com.mysql.jdbc.Driver");
  5. connection = DriverManager.getConnection(
  6. "jdbc:mysql://localhost:3306/testtu", "root", "123456");
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. return connection;
  11. }
  12. public String findFormByFormName(String formName) {
  13. String formString = null;
  14. Connection connection = this.getDb();
  15. Statement statement;
  16. try {
  17. statement = connection.createStatement();
  18. PreparedStatement ps = connection
  19. .prepareStatement("select * from formtest where formType=?");
  20. ps.setString(1, formName);
  21. ResultSet resultSet = ps.executeQuery();
  22. while (resultSet.next()) {
  23. formString = resultSet.getString(3);
  24. }
  25. ;
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. return formString;
  30. }

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

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

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

时间: 2024-10-21 07:37:24

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

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

综合前几篇博文内容.我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功. 正由于如此,在创建了流程模型之后.模型列表的展示也是和之前的没有什么差别.并且都是非常easy的后台查询以及前台展示.这一部分也就只是多的讲了. 模型列表页面例如以下: 至于当中的改动和删除也没什么多讲的,删除非常easy,而改动也是activiti-modeler实现的主要功能.我们仅仅须要跳转过去即可. 重要的部分在于

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

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

如何解耦业务表单与流程

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

首次整合struts2+spring 提交表单后报的500错误

spring+struts2整合,做了一个用户登陆的测试程序,附下配置文件片段  <constant name="struts.objectFactory" value="spring"/>  <package name="struts-config" namespace="/" extends="struts-default">   <action name="lo

Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作

前面三篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站.如何配置Servlet简单实现表单提交.如何配置MySQL实现JSP数据库查询. 这篇文章主要讲述Servlet表单的提交.Java中实现数据库的查询操作和自己遇到的瓶颈及理解.Java Web基础性文章,希望对大家有所帮助~ Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+

angular自定义验证器添加入模板驱动表单

创建自定义验证器的命令 ng generate directive forbidden-name(自定义床啊金验证器的名称) 生成的文件内容 import { Directive } from '@angular/core'; @Directive({ selector: '[appForbiddenName]' }) export class ForbiddenNameDirective { constructor() { } } 创建一个文件用来放置正则判断的验证器算法.validatot.

第四篇 HTML 表单深入了解、注释和a标签的运用

表单深入了解.注释和a标签的运用 注释,HTML中的注释格式: 开头  <!--  结束 -->   例子: <!-- <div>我被注释了</div>  --> 此注释可多行注释,如果只有开头注释, 没有结束注释,那么从开头注释以下的所有内容将会全部被注释掉:还可以用鼠标点击某行 按下 快捷键  "Ctrl + /"注释,也可选择多行再注释. 注释的用处:将无效的代码注释掉,或许它将来有用或考虑二次开发,所以不用删除掉,而是选择注释掉,

(四) HTML之表单元素

HTML中的表单元素,是构成动态网页的重要组成部分,因此,熟知表单元素是十分重要的.下面将根据表单中的一些常用标签进行介绍 1.单选按钮 <input type="radio" name="sex" value="man" checked/>男 <input type="radio" name="sex" value="weman"/>女 其中,name必须相同.

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

流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么区别,因此也不多说.我们先看看列表页面以及对应的代码,然后在一步步说明点击启动按钮时如何调用自定义的form表单. 流程定义列表页面如下: 对应的html代码: [html] view plain copy <div id="logdiv1" ng-init="init();"> <p style="font-size:24px;mar