关于 JOffice 的业务表单与流程的整合问题
目前JOffice中提供三种流程表单整合方式:
一、 在线制作表单,并且能完成自动的表单对应的物理表的生成
二、 跟系统现在的业务表单整合,采用EXT表单模板
三、 跟系统现有的业务或其他系统现有的表单整合,采用URL表单模板
三种方式都可以,但是需要根据情况来选择,第一种适用于全新的表单及流程开发,第二种适用于已经在系统中开发了业务的管理功能,但又希望可以在系统中进行流程的审批管理(可以用EXT模板进行简单及复杂化的管理功能(适用于开发人员)),第三种则适用于旧的B/S系统的业务表单跟现在的流程进行整合处理。
以下我们介绍一下最后一种:流程的开发一般都会面临一个比较大的问题就是业务表单,不同的系统的业务表单还是比较复杂,我们不得不面对以前旧系统遗留下来的业务表单。
旧系统的遗留的表单一般分为两种,一种是C/S结构的表单,一种是B/C结构的表单,对于前者,整合需要采用WebService来进行或其他对外的接口等,若为后者,目前我们提供另一种更方便的整合,以下我们先来讨论这种方式。
如上图所示,外围为流程的跳转执行,IFrame里的表单则为原系统中的业务表单,其执行还是原来的执行方式,不过加了可以调用外窗口的流程执行跳转,所以可以在里面的执行跳转那里加上一些执行跳转参数,以方便其完成业务表单的数据保存后直接调用外围窗口来执行流程的跳转。
那么,业务表单与流程如何实现关联?当在后台我们完成对流程的任务设置加载的URL后,前台启动流程的时候,我们需要把里面业务表单的数据需要跟流程作一个关联,在JBPM中,一般我们采用表单的变量来进行,但对于业务表单需要保存的业务变量,我们允许开发人员在自己的B/S表单上自己加上调用。
如我们的角色表单若需要走流程的话,可以加上一保存完成后,把保存的角色实体对应的id放在外面的表单中中,方便外围的流程进行跳转及加载表单的处理。
如我们在访问系统的url: http://localhost:8080/joffice21/pages/demo/roleForm.jsp
出现以下的表单:
该表单能完成保存的操作,保存完成后,我们仅需要把其值实体的id 存至外围的流程中去即可。于是我们在以下的表单中,改造了类似的代码:
- <%@page import="com.htsoft.oa.service.system.AppRoleService"%>
- <%@page import="com.htsoft.core.util.AppUtil"%>
- <%@page import="com.htsoft.oa.model.system.AppRole"%>
- <%@page import="org.apache.commons.lang.StringUtils"%>
- <%@page contentType="text/html; charset=UTF-8"%>
- <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- <html>
- <head>
- <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/admin.css"/>
- <title>角色表单示例</title>
- <%
- AppRoleService appRoleService=(AppRoleService)AppUtil.getBean("appRoleService");
- //用于提交时进行获取表单参数
- AppRole appRole=new AppRole();
- String roleId=request.getParameter("roleId");
- //若原来已经存在,则加载
- if(StringUtils.isNotEmpty(roleId)){
- appRole=appRoleService.get(new Long(roleId));
- }
- if("POST".equals(request.getMethod())){//保存提交值
- String roleName=request.getParameter("roleName");
- String roleDesc=request.getParameter("roleDesc");
- String status=request.getParameter("status");
- appRole.setRoleName(roleName);
- appRole.setRoleDesc(roleDesc);
- appRole.setStatus(new Short(status));
- appRole.setIsDefaultIn((short)0);
- appRoleService.save(appRole);
- }
- request.setAttribute("appRole",appRole);
- String defId=request.getParameter("defId");
- String taskId=request.getParameter("taskId");
- %>
- <script type="text/javascript">
- window.onload=function(){
- //保存后,把业务实体的id保存至外窗口流程实例中
- <%
- if("POST".equals(request.getMethod())){
- if(defId!=null){
- %>
- parent.document.getElementById('defParams<%=defId%>').value="roleId:<%=appRole.getRoleId()%>";
- <%
- }else{
- %>
- parent.document.getElementById('taskParams<%=taskId%>').value="roleId:<%=appRole.getRoleId()%>";
- <%
- }
- }
- %>
- };
- </script>
- </head>
- <body>
- <form action="roleForm.jsp" method="post">
- <table class="table-info" cellpadding="0" cellspacing="1" width="98%">
- <tr>
- <th align="center" colspan="2">角色详细信息</th>
- </tr>
- <tr>
- <th>角色名字</th>
- <td>
- <input type="hidden" name="defId" value="<%=defId%>"/>
- <input type="hidden" name="taskId" value="<%=taskId%>"/>
- <input type="hidden" name="roleId" value="${appRole.roleId}"/>
- <input name="roleName" type="text" width="400" value="${appRole.roleName}"/>
- </td>
- </tr>
- <tr>
- <th>角色状态</th>
- <td>
- <select name="status">
- <option value="1" <c:if test="${appRole.status==1}">selected</c:if>>激活</option>
- <option value="0" <c:if test="${appRole.status==0}">selected</c:if>>禁用</option>
- </select>
- </td>
- </tr>
- <tr>
- <th>
- 描述
- </th>
- <td>
- <textarea name="roleDesc" rows="5" cols="50">${appRole.roleDesc}</textarea>
- </td>
- </tr>
- <tr>
- <td colspan="2" align="center">
- <input type="submit" value="保 存 "/>
- </td>
- </tr>
- </table>
- </form>
- </body>
- </html>
<%@page import="com.htsoft.oa.service.system.AppRoleService"%> <%@page import="com.htsoft.core.util.AppUtil"%> <%@page import="com.htsoft.oa.model.system.AppRole"%> <%@page import="org.apache.commons.lang.StringUtils"%> <%@page contentType="text/html; charset=UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/admin.css"/> <title>角色表单示例</title> <% AppRoleService appRoleService=(AppRoleService)AppUtil.getBean("appRoleService"); //用于提交时进行获取表单参数 AppRole appRole=new AppRole(); String roleId=request.getParameter("roleId"); //若原来已经存在,则加载 if(StringUtils.isNotEmpty(roleId)){ appRole=appRoleService.get(new Long(roleId)); } if("POST".equals(request.getMethod())){//保存提交值 String roleName=request.getParameter("roleName"); String roleDesc=request.getParameter("roleDesc"); String status=request.getParameter("status"); appRole.setRoleName(roleName); appRole.setRoleDesc(roleDesc); appRole.setStatus(new Short(status)); appRole.setIsDefaultIn((short)0); appRoleService.save(appRole); } request.setAttribute("appRole",appRole); String defId=request.getParameter("defId"); String taskId=request.getParameter("taskId"); %> <script type="text/javascript"> window.onload=function(){ //保存后,把业务实体的id保存至外窗口流程实例中 <% if("POST".equals(request.getMethod())){ if(defId!=null){ %> parent.document.getElementById('defParams<%=defId%>').value="roleId:<%=appRole.getRoleId()%>"; <% }else{ %> parent.document.getElementById('taskParams<%=taskId%>').value="roleId:<%=appRole.getRoleId()%>"; <% } } %> }; </script> </head> <body> <form action="roleForm.jsp" method="post"> <table class="table-info" cellpadding="0" cellspacing="1" width="98%"> <tr> <th align="center" colspan="2">角色详细信息</th> </tr> <tr> <th>角色名字</th> <td> <input type="hidden" name="defId" value="<%=defId%>"/> <input type="hidden" name="taskId" value="<%=taskId%>"/> <input type="hidden" name="roleId" value="${appRole.roleId}"/> <input name="roleName" type="text" width="400" value="${appRole.roleName}"/> </td> </tr> <tr> <th>角色状态</th> <td> <select name="status"> <option value="1" <c:if test="${appRole.status==1}">selected</c:if>>激活</option> <option value="0" <c:if test="${appRole.status==0}">selected</c:if>>禁用</option> </select> </td> </tr> <tr> <th> 描述 </th> <td> <textarea name="roleDesc" rows="5" cols="50">${appRole.roleDesc}</textarea> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="保 存 "/> </td> </tr> </table> </form> </body> </html>
以上代码部分只有一功能是跟外围流程有关的,则把业务参数传至流程实例中去。
- <%
- if("POST".equals(request.getMethod())){
- if(defId!=null){
- %>
- parent.document.getElementById('defParams<%=defId%>').value="roleId:<%=appRole.getRoleId()%>";
- <%
- }else{
- %>
- parent.document.getElementById('taskParams<%=taskId%>').value="roleId:<%=appRole.getRoleId()%>";
- <%
- }
- }
- %>
<% if("POST".equals(request.getMethod())){ if(defId!=null){ %> parent.document.getElementById('defParams<%=defId%>').value="roleId:<%=appRole.getRoleId()%>"; <% }else{ %> parent.document.getElementById('taskParams<%=taskId%>').value="roleId:<%=appRole.getRoleId()%>"; <% } } %>
后台的流程设置我们则设计如下:
其表单采用了URL模块,所以需要设置其对应表单的URL,URL可以采用相对路径,如/pages/demo/roleForm.jsp
启动节点可以不用设置后续的参数,但在后续的任务节点,由于需要加载对应的流程表单业务数据,所以需要把业务表单的数据加载出来,因此其URL配置则改成
/pages/demo/roleForm.jsp?roleId=${roleId}
${roleId}则表示参数 roleId为流程的参数。后续的流程任务则通过该url去加载其对应的角色出来给当前用户来进行审批。因此启动时候,其界面如下所示:
当保存完成后,我们再点上面的“提交并启动流程”按钮则可。
这种方式是先保存业务里的数据再启动流程。当流程跳至下一步时,其则类似如下:
这样就可以实现整个流程与业务表单的整合,若业务表单有其他数据需要传至流程进行计算,则也是采用类似传参数方式则可。
在外围的流程加载URL表单中,其代码则如下所示:
- <%@page import="java.util.Iterator"%>
- <%@page import="java.util.Map"%>
- <%@page import="org.apache.commons.lang.StringUtils"%>
- <%@page import="com.htsoft.oa.model.flow.FormTemplate"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <%
- Long taskId=(Long)request.getAttribute("taskId");
- Long defId=(Long)request.getAttribute("defId");
- FormTemplate formTemplate=(FormTemplate)request.getAttribute("formTemplate");
- Map formVars=(Map)request.getAttribute("formVars");
- String url=formTemplate.getFormUrl();
- if(StringUtils.isNotEmpty(url)){
- if(!url.startsWith("http")){//采用相对路径,则表示引用为本系统中的表单
- url=request.getScheme() + "://" + request.getHeader("host") + request.getContextPath()+url;
- }
- }
- if(url.indexOf("?")==-1){
- url+="?";
- }else{
- url+="&";
- }
- if(defId!=null){
- url+="defId="+defId;
- %>
- <input type="hidden" name="defParams" id="defParams<%=defId%>" />
- <%
- }else{
- url+="taskId="+taskId;
- %>
- <input type="hidden" name="taskParams" id="taskParams<%=taskId%>" />
- <%
- }
- if(formVars!=null){
- Iterator<String> it= formVars.keySet().iterator();
- while(it.hasNext()){
- String key=it.next();
- Object value=(Object)formVars.get(key);
- System.out.println("key:" + key + " VALUE:"+ value);
- if(value!=null){
- url=url.replace("${"+key+"}", value.toString());
- }
- }
- }
- %>
- <iframe frameborder="0" width="100%" height="100%" src="<%=url%>" onload="this.height=this.contentWindow.document.body.scrollHeight"></iframe>
<%@page import="java.util.Iterator"%> <%@page import="java.util.Map"%> <%@page import="org.apache.commons.lang.StringUtils"%> <%@page import="com.htsoft.oa.model.flow.FormTemplate"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% Long taskId=(Long)request.getAttribute("taskId"); Long defId=(Long)request.getAttribute("defId"); FormTemplate formTemplate=(FormTemplate)request.getAttribute("formTemplate"); Map formVars=(Map)request.getAttribute("formVars"); String url=formTemplate.getFormUrl(); if(StringUtils.isNotEmpty(url)){ if(!url.startsWith("http")){//采用相对路径,则表示引用为本系统中的表单 url=request.getScheme() + "://" + request.getHeader("host") + request.getContextPath()+url; } } if(url.indexOf("?")==-1){ url+="?"; }else{ url+="&"; } if(defId!=null){ url+="defId="+defId; %> <input type="hidden" name="defParams" id="defParams<%=defId%>" /> <% }else{ url+="taskId="+taskId; %> <input type="hidden" name="taskParams" id="taskParams<%=taskId%>" /> <% } if(formVars!=null){ Iterator<String> it= formVars.keySet().iterator(); while(it.hasNext()){ String key=it.next(); Object value=(Object)formVars.get(key); System.out.println("key:" + key + " VALUE:"+ value); if(value!=null){ url=url.replace("${"+key+"}", value.toString()); } } } %> <iframe frameborder="0" width="100%" height="100%" src="<%=url%>" onload="this.height=this.contentWindow.document.body.scrollHeight"></iframe>
发表评论
-
基于开源流程引擎Activiti5的工作流开发平台 BPMX3
2012-07-26 14:35 4189BPMX3平台是宏天软件在ESTBPM2的基础上,追随开源工作 ... -
Activiti 工作流会签开发设计思路
2012-07-26 14:32 3318Activiti 工作流会签开发设计思路 在流程业务管 ... -
BPM X3--activiti 5在线流程设计器开发
2012-06-11 09:12 7jbpm4的开发成员tom离开 ... -
J.Office中的公文签名及签章
2011-08-12 13:58 1728政府的很多系统都有涉及到电子签名及签章的管理功能,在jof ... -
JOffice2中WebService的使用(CXF)
2011-08-12 13:54 15691. WebService基本概念 WSDL: ... -
JOffice2 发布了开源的开发者体验版本
2011-08-12 13:48 1118JOffice的爱好者有福音了,经公司决定,现在 ... -
JOffice的EXT性能优化方法
2011-07-11 10:39 1658JOffice由于用了Ext,所以在客户端的性能表现总是平平, ...
相关推荐
关于 JOffice1.3使用手册,方便快捷,大家来下载
这个JOffice V1.2 beta版,也就是官方说开源的版本之一。 说实话,这个公司很讨厌,打着开源的幌子来宣传自己的产品,里面的 东西根本没有开源,还很恶心的包留了一部分代码,htcore.jar。 对于这样的开源,我表示...
- **自定义流程表单设计**:根据需求自定义表单界面。 - **人员设置** - **流程处理权限授给用户**:指派流程处理权限给具体用户。 - **流程处理权限授给角色**:指派流程处理权限给角色。 7. **公共文档** - *...
在JOffice2中,JBPM4是一个强大的工作流引擎,用于管理和执行业务流程。本文将深入探讨如何在JOffice2中实现JBPM4任务的回退功能,这在处理复杂流程时尤其重要,允许用户纠正错误或根据需要调整流程方向。 任务回退...
// Chat.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "Chat.h" #include "ChatDlg.h" #ifdef _DEBUG #define new DEBUG_NEW ... m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_...
office文档转pdf后,再转swf,最终显示需要的一些工具及jar包,包括一个office转pdf转swf的java文件。因目前可上传的文件大小限制,OpenOffice安装文件未上传,工具目前最新版本为3.4.1,请另行下载
在本例中,我们关注的是一个特定的Java应用程序——J.Office1.3.1,它与Tomcat6服务器绑定,并需要JDK 1.6和MySQL 5.0的支持。 首先,J.Office1.3.1是基于Java的一个办公软件,可能包含了处理文档、表格和演示文稿...
SSH开发的办公自动化系统OA是一种基于Struts、Spring和Hibernate技术框架构建的企业级应用,它旨在提高工作效率,简化日常办公流程。SSH(Struts、Spring、Hibernate)是Java Web开发中常用的三大开源框架,它们各自...
在压缩包中提到的“joffice”可能是该项目的一个组件或子目录,可能包含与Java Office集成相关的代码。这可能涉及到读取、写入或处理Office文档(如Word、Excel)的功能,使用户能够直接在邮箱中预览和编辑附件。 ...
在JOffice中,权限管理采用了基于角色的管理策略,这使得系统能够高效地实现对用户访问权限的控制。这种策略与Spring Security 2框架相结合,允许开发者通过配置文件对整个系统的权限进行集中管理。Spring Security...
2. **安装中文包**: 如果需要处理中文数据,需要安装iTextAsian.jar,这是解决中文PDF显示问题的亚洲语言包。在IReport的选项中添加这个包,以确保中文能在预览和PDF输出中正确显示。 3. **配置数据库**: 在IReport...
除了jBoss AS外,该地址还包含了其他与jBoss相关的项目源码。 #### 七、Struts2 Struts2框架的源码可以通过以下地址获取: - `http://svn.apache.org/repos/asf/struts/struts2/trunk/struts2` - `...
虽然题目主要关注的是如何使用Java命令创建JAR文件,但提到了一个额外的SQL命令:`mysql->source F:/joffice131.sql`。这个命令用于MySQL数据库,它的作用是从指定的SQL脚本文件(这里是`F:/joffice131.sql`)读取并...
JoPro是一个生产力和办公套件,将文字处理器,电子表格设计器,演示设计器和svg查看器集成到一个应用程序中! 基于Netbeans平台。 图像和代码由Anthony Goubard设计。 最初称为Joffice。
这些技术的应用能够大幅度减少客户端与服务器之间的数据传输量,改善用户体验,并在带宽受限的环境下尤为重要。需要注意的是,在实施这些优化措施时,开发者应保证代码的正确性和性能的平衡,避免引入新的瓶颈,比如...
JOffVis 一个基于 Java Swing 的工具,用于可视化 ...先决条件:1) Java SDK 72) Maven 3要编译应用程序,请运行以下命令mvn 干净编译要启动应用程序,请运行以下命令mvn exec:java -Dexec.mainClass="joffice.gui.App