`
qinysong
  • 浏览: 192624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

基于开源工作流引擎OSWorkflow的业务系统实例——请假审批系统

阅读更多
最近工作中一个项目打算采用工作流技术,所以对工作流特别是OSWorkflow进行了一些学习和研究,为了向项目组其他成员演示和进一步进行应用,做了这个小业务系统,现在经过整理把它拿出来,希望对想要了解OSWorkflow的朋友有一点帮助。我接触的时间也不长,所以哪个地方有问题还希望大家多多指点,对工作流技术共同提高。

这个小业务系统的主要目的
演示如何基于OSWorkflow构建业务系统,即如何将原来程序内硬编码的业务过程抽取出来,放到底层的工作流引擎中,上层业务模块只进行具体业务动作的执行,同时演示着两层如何“集成”。
本系统演示三个方面:业务处理和OSWorkflow的基本“集成”、工作流引擎根据工作流定义调用业务处理逻辑、基于业务数据的工作流跳转

业务用例描述
核心工作流:
1、员工填写请假申请单,包括“请假原因”和“请假天数”,填写后进行提交;
2、部门主管对员工请假申请进行审批,同意员工请假;
3、人力资源主管对员工请假申请进行审批,同意员工请假;
4、系统发送邮件通知员工请假申请已获得批准;
5、用例结束;

备选工作流1:
在第一步中,如果员工请假天数小于等于3天,那么不需要部门主管审批,直接从第一步跳到第三步,又人力资源审批;

备选工作流2:
在第二步中,如果部门主管不同意请假申请,那么系统将给请假员工发送请假没有通过的邮件通知,用例结束;

备选工作流3:
在第三步中,如果人力资源主管不同意请假申请,那么系统将给请假员工发送请假没有通过的邮件通知,用例结束;

系统运行/开发环境
数据库:ms sqlserver2000
应用服务器:Jboss-4.0.2
开发工具:Jbuilder2006

系统搭建
1、创建数据库,我命名为osworkflow_app,也可命名为任意名字,只要在数据源配置中正确配置即可;
2、创建数据表并初始化用户及用户组数据,执行附件中的db_leaveApprove_20070712.sql即可;
3、在jboss下配置数据源,我的配置如附件mssql-ds.xml
4、将osworkflow及log4j的配置文件leave_apply.xml、osuser.xml、osworkflow.xml、propertyset.xml、workflows.xml、log4j.properties拷贝到工程目录src下面;
可直接将附件的leaveApprove.rar解到项目中,里面包括所有的源程序和资源包。

工作流定义文件说明
依据本业务需求的工作流定义文件如下
定义中包括6个step

step1是员工请假申请的步骤,本步骤的action在执行时将回调业务方法类ApplyFunction,将申请单数据插入到数据库中,同时处理结果将根据请假申请天数dayCount进行判断,如果请假申请天数大于3天,将跳到step2让部门主管审批,如果不大于3天,将直接跳到step3让人力资源主管审批;

step2 是部门主管审批,如果审批同意(opinion!=2)将跳到step3再由人力资源主管审批,如果审批不同意(opinion==2)将跳到step5自动发“申请未批准”邮件通知步骤;

step3 是人力资源主管审批,如果审批同意(opinion!=2)将跳到step4自动发“申请批准”邮件通知步骤,如果审批不同意(opinion==2)将跳到step5自动发“申请未批准”邮件通知步骤;

step4和step5都是自动发送邮件通知步骤,执行完之后跳到空步骤step6结束该工作流实例。

工作流定义文件
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow>
	<initial-actions>
		<action id="100" name="启动请假申请工作流">
			<results>
				<unconditional-result old-status="Finished" status="Underway" step="1"/>
			</results>
		</action>
	</initial-actions>
	<steps>
		<step id="1" name="请假申请">
			<actions>
				<action id="1" name="提交需求申请">
					<restrict-to>
						<conditions type="AND">
							<condition type="class">
								<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
								<arg name="group">employee</arg>
							</condition>
						</conditions>
					</restrict-to>
					<pre-functions>
						<function type="class">
							<arg name="class.name">com.qiny.leave.ApplyFunction</arg>
						</function>
					</pre-functions>
					<results>
						<result old-status="Finished" status="Underway" step="2" owner="manager1">
							<conditions type="AND">
								<condition type="beanshell">
									<arg name="script">
									propertySet.getInt("dayCount")>3
									</arg>
								</condition>
							</conditions>
							<post-functions>
								<function type="beanshell">
									<arg name="script">
                                        System.out.println("步骤 1 提交需求申请 满足条件结果 需部门经理审批...");
                                    </arg>
								</function>
							</post-functions>
						</result>
						<unconditional-result old-status="Finished" status="Underway" step="3" owner="hr1"/>
					</results>
				</action>
			</actions>
		</step>
		<step id="2" name="请假申请审核">
			<actions>
				<action id="2" name="部门主管审批请假申请">
					<restrict-to>
						<conditions type="AND">
							<condition type="beanshell">
								<arg name="script">true</arg>
							</condition>
							<condition type="class">
								<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
								<arg name="status">Underway</arg>
							</condition>
							<condition type="class">
								<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
								<arg name="group">manager</arg>
							</condition>
						</conditions>
					</restrict-to>
					<pre-functions>
						<function type="class">
							<arg name="class.name">com.qiny.leave.ApproveFunction</arg>
						</function>
					</pre-functions>
					<results>
						<result old-status="Finished" status="Underway" step="5">
							<conditions type="AND">
								<condition type="beanshell">
									<arg name="script">
									propertySet.getInt("opinion")==2
									</arg>
								</condition>
							</conditions>
							<post-functions>
								<function type="beanshell">
									<arg name="script">
                                        System.out.println("步骤 2 请假申请审核 部门经理审批没有通过 ...");
                                    </arg>
								</function>
							</post-functions>
						</result>
						<unconditional-result old-status="Finished" status="Underway" step="3" owner="hr1"/>
					</results>
				</action>
			</actions>
		</step>
		<step id="3" name="请假申请审核">
			<actions>
				<action id="3" name="人力资源主管审批请假申请">
					<pre-functions>
						<function type="class">
							<arg name="class.name">com.qiny.leave.ApproveFunction</arg>
						</function>
					</pre-functions>
					<results>
						<result old-status="Finished" status="Underway" step="5">
							<conditions type="AND">
								<condition type="beanshell">
									<arg name="script">
									propertySet.getInt("opinion")==2
									</arg>
								</condition>
							</conditions>
						</result>
						<unconditional-result old-status="Finished" status="Underway" step="5"/>
					</results>
				</action>
			</actions>
		</step>
		<step id="4" name="请假申请结果通知">
			<actions>
				<action id="4" auto="true" name="请假申请获准邮件通知">
					<pre-functions>
						<function type="beanshell">
							<arg name="script">
                                System.out.println("步骤 4 自动动作 请假申请获准邮件通知 Send mail 祝贺你$$$$$$$");
                            </arg>
						</function>
					</pre-functions>
					<results>
						<unconditional-result old-status="Finished" status="Finished" step="6"/>
					</results>
				</action>
			</actions>
		</step>
		<step id="5" name="请假申请结果通知">
			<actions>
				<action id="5" auto="true" name="请假申请没能获准邮件通知">
					<pre-functions>
						<function type="beanshell">
							<arg name="script">
                                System.out.println("步骤 5 自动动作 请假申请没能获准邮件通知 Send mail 很抱歉$$$$$$$");
                            </arg>
						</function>
					</pre-functions>
					<results>
						<unconditional-result old-status="Finished" status="Finished" step="6"/>
					</results>
				</action>
			</actions>
		</step>
		<step id="6" name="flow over">
		</step>
	</steps>
</workflow>


回家了,明天再对一些程序进行说明
可以下载附件,建立工程后执行,数据库中有三个用户:employee1表示员工,可以提交请假申请;manager1表示部门主管;hr1表示人力资源主管,密码都是test
  • leaveApprove.rar (2.7 MB)
  • 描述: 程序源文件和需要的lib
  • 下载次数: 13282
  • databaseAndConfig.rar (2.3 KB)
  • 描述: 数据库表创建及数据初始化文件 数据源配置文件
  • 下载次数: 5181
分享到:
评论
51 楼 venlentine 2007-10-10  
前面的一些所谓的高手别说什么楼主写的好不好,有那空闲时间你们也写个规范的程序出来支持中国程序员的发展啊

OSWorkflow本身资料就少而又少

非常感谢楼主共享出范例,极度支持楼主

找了几天的资料,看了楼主的范例才让我找到下手的地方

再次感谢楼主

建议刚接触oswf的朋友都研读一下楼主的源码
50 楼 lzycxy 2007-10-09  
例子比较简单,但对初学还是比较实用。
如果能做到让客户自己定义一个流程就像发一个帖子这么简单,那才算好东东。
49 楼 tianxing12 2007-09-19  
楼猪能不能把tomcat5.X的配置发一下啊。小弟急用啊!
48 楼 dafeng2008 2007-09-19  
我发布了后为啥运行提交请假申请时报下面异常

com.opensymphony.workflow.StoreException: Unable to create current step for workflow instance #14: root cause: ORA-00933: SQL command not properly ended

at com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore.createCurrentStep(JDBCWorkflowStore.java:166)
47 楼 jorrey 2007-09-14  
如果需要派给不确定的多人进行同时审批,可以怎么做?
46 楼 java_zhanghui 2007-09-12  
我在做初始化的时候失败  long wfid = wf.initialize("os_leave", 100, null);<br/>
可以正常登陆,但是申请请假条,提交的时候出现这个问题?不知到是否是数据库的问题?<br/>
<br/>
错误日志:<br/>
请假初始化准备!<br/>
提交请假申请时出现异常,可能没有增加您提交需求的权限!<br/>
com.opensymphony.workflow.StoreException: Unable to create current step for workflow instance #16: root cause: Cannot add or update a child row: a foreign key constraint fails (`osworkflow_app/os_currentstep`, CONSTRAINT `os_currentstep_ibfk_2` FOREIGN KEY (`OWNER`) REFERENCES `os_user` (`USERNAME`))<br/>
    at com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore.createCurrentStep(JDBCWorkflowStore.java:166)<br/>
    at com.opensymphony.workflow.AbstractWorkflow.createNewCurrentStep(AbstractWorkflow.java:1509)<br/>
    at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1256)<br/>
    at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:618)<br/>
    at org.apache.jsp.leaveApplyCreate_jsp._jspService(leaveApplyCreate_jsp.java:78)<br/>
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)<br/>
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br/>
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)<br/>
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)<br/>
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)<br/>
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br/>
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)<br/>
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br/>
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)<br/>
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)<br/>
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)<br/>
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)<br/>
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)<br/>
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)<br/>
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)<br/>
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)<br/>
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)<br/>
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)<br/>
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)<br/>
    at java.lang.Thread.run(Thread.java:595)<br/>
Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`osworkflow_app/os_currentstep`, CONSTRAINT `os_currentstep_ibfk_2` FOREIGN KEY (`OWNER`) REFERENCES `os_user` (`USERNAME`))<br/>
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)<br/>
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)<br/>
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)<br/>
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)<br/>
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)<br/>
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)<br/>
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)<br/>
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)<br/>
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)<br/>
    at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)<br/>
    at com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore.createCurrentStep(JDBCWorkflowStore.java:833)<br/>
    at com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore.createCurrentStep(JDBCWorkflowStore.java:161)<br/>
    ... 24 more
45 楼 phlsbg 2007-08-15  
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'os_user' 无效。
这个错误
附件都下载了,数据库中也有这个os_user表
????????//
44 楼 qinysong 2007-08-15  
phlsbg 写道
db_leaveApprove_20070712 就是这个脚本初始化的
提示帐户错误是不是证明数据连接正常了?
OS_USER OS_GROUP OS_MEMBERSHIP 这三张表是lz自己扩展的还是这个框架自带的 ?如何修改OS_USER中的密码?
OS_MEMBERSHIP 这个表是干什么的?
用户管理这部分信息可以直接用业务系统中的数据么?

OS_USER OS_GROUP OS_MEMBERSHIP这三张表是框架自带的,在OS_USER中的密码默认是加密后的,欲求简单的话可以通过直接使用com.opensymphony.user.UserManager和com.opensymphony.user.User来管理,参看OSWorkflow官方下载包中的例子。
OS_MEMBERSHIP 这个表是用户组/用户关联表,指定哪些用户属于哪些组。
用户管理这部分应该可以用系统中的数据,因为用户数据是通过配置文件指定数据库中的表和字段的,参看osworkflow的配置文件osuser.xml。
你登陆的帐号是什么,你看看和库中的数据是否匹配
qinysong 写道
可以下载附件,建立工程后执行,数据库中有三个用户:employee1表示员工,可以提交请假申请;manager1表示部门主管;hr1表示人力资源主管,密码都是test
43 楼 phlsbg 2007-08-14  
db_leaveApprove_20070712 就是这个脚本初始化的
提示帐户错误是不是证明数据连接正常了?
OS_USER OS_GROUP OS_MEMBERSHIP 这三张表是lz自己扩展的还是这个框架自带的 ?如何修改OS_USER中的密码?
OS_MEMBERSHIP 这个表是干什么的?
用户管理这部分信息可以直接用业务系统中的数据么?
42 楼 qinysong 2007-08-14  
pantiansheng 写道
NestedExpression具体的作用是什么????
NestedExpression就是嵌套的表达式,供组合之用。
phlsbg 写道
输入用户名 密码 提示帐户错误

你的数据库数据初始化了吗
41 楼 phlsbg 2007-08-14  
输入用户名 密码 提示帐户错误
40 楼 pantiansheng 2007-08-08  
NestedExpression具体的作用是什么????
39 楼 kedou 2007-08-07  
有时间...要试试...
38 楼 qinysong 2007-08-07  
lfh220 写道
你好!
   我想实现这个功能:就是通过在页面里设置查看权,那么我是不是应该将流程定义中的owner的值变为:${caller},不知道理解的对不对,另外要是用这种方式,那么应该怎么用代码来实现授予权呢?
谢谢

${caller}表示变量引用,例如常用的是在pre-functions中调用Caller函数将用户名放到变量transientVars中,之后再通过这个引用获取。将流程定义中的owner的值变为:${caller},只是将变量集合中变量名为caller的变量值作为所有者,好像和你的功能要求不一样。
对于这个功能简单的实现可以这样,指定一个用户组,令其具有查看权,即owner为该组组名,而在权限设置页面为用户分配到这个组即可

pantiansheng 写道
还有请问那个osworkflow.xml是怎么被解析的???
被解析具体指的什么,你可以参看类com.opensymphony.workflow.config.DefaultConfiguration
37 楼 lfh220 2007-08-06  
你好!
   我想实现这个功能:就是通过在页面里设置查看权,那么我是不是应该将流程定义中的owner的值变为:${caller},不知道理解的对不对,另外要是用这种方式,那么应该怎么用代码来实现授予权呢?
谢谢
36 楼 pantiansheng 2007-08-06  
还有请问那个osworkflow.xml是怎么被解析的???
35 楼 pantiansheng 2007-08-06  
NestedExpression nestedExpression = new NestedExpression(
  new Expression[]{new FieldExpression(FieldExpression.OWNER, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, session.getAttribute("username")),
                   new FieldExpression(FieldExpression.STATUS, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Underway")}, NestedExpression.AND) ;
  WorkflowExpressionQuery query = new WorkflowExpressionQuery(nestedExpression);
34 楼 lfh220 2007-08-06  
谢谢楼主了
解释的很好的
33 楼 qinysong 2007-08-03  
lfh220 写道
能不能通过组中的人员来审批。而不是hr,manager这两个人,希望楼主提供这样的例子

通过组来审批是完全可以的,上面的例子是通过在流程定义文件中,为每个审批步骤指定一个特定的用户来作为所有者,配置如:
<result old-status="Finished" status="Underway" step="2" owner="manager1">
这样就限制了下一个步骤只能由用户名为manager1的这个人来完成。
如果某个步骤可以由一个组中的任何用户来操作,就可以将owner设置为组的名字,后面提取任务的时候通过组名来提取,比如一个部门有多个主管可以审批请假申请(先不管业务上是否合理),这些主管都属用用户组manager,这样就可以将下一步审批的owner置为manager,然后在后面用户任务提取的页面,即underway.jsp中,通过组名来提取任务即可,代码如下,注释部分为原来的提取表达式:
  String username = (String) session.getAttribute("username");
  UserManager userManager = UserManager.getInstance();
  User user = userManager.getUser(username);
  List groups = user.getGroups();
  
  Workflow wf = new BasicWorkflow(username);
  
//  NestedExpression nestedExpression = new NestedExpression(
//  new Expression[]{new FieldExpression(FieldExpression.OWNER, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, session.getAttribute("username")),
//                   new FieldExpression(FieldExpression.STATUS, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Underway")}, 
//                   NestedExpression.AND) ;

  Expression[] expressions = new Expression[groups.size()];
  for (int i = 0; i < groups.size(); i++){
    expressions[i] = new FieldExpression(FieldExpression.OWNER,
     FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, (String)groups.get(i));
  }
  NestedExpression nestedExpression = new NestedExpression(
  new Expression[]{new NestedExpression(expressions, NestedExpression.OR),
                   new FieldExpression(FieldExpression.STATUS, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Underway")}, 
                   NestedExpression.AND);
                   
  WorkflowExpressionQuery query = new WorkflowExpressionQuery(nestedExpression);

后面代码全部一样

lfh220 写道
还有hr manager都不能申请请假

在示例中hr等不能申请请假,是因为流程定义文件中有限制,如下:
  <step id="1" name="请假申请">
   <actions>
    <action id="1" name="提交请假申请">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">employee</arg>
       </condition>
      </conditions>
     </restrict-to>
     ......
    </action>
   </actions>
  </step>
32 楼 lfh220 2007-08-03  
你好,能不能通过组中的人员来审批。而不是hr,manager这两个人,希望楼主提供这样的例子,还有hr manager都不能申请请假

相关推荐

    OSWorkflow——请假审批系统(代码全,数据库mysql)

    这个开源项目为开发者提供了灵活的工作流定义和执行能力,使得在系统中实现如请假审批这样的业务流程变得简单。在这个"OSWorkflow——请假审批系统(代码全,数据库mysql)"中,我们能看到一个基于OSWorkflow实现的请假...

    OsWorkflow工作流实例

    OsWorkflow是一款开源的工作流引擎,它为应用程序提供了一种灵活且可扩展的方式来管理业务流程。在本实例中,我们将深入探讨OsWorkflow的核心概念、主要功能以及如何创建和测试一个工作流实例。 工作流引擎是软件...

    osworkflow eclipse+mysql 请假审批流程 完整示例

    这个示例提供了一个完整的osworkflow与Eclipse结合的请假审批流程,它不仅展示了osworkflow的工作流管理能力,还演示了如何将工作流引擎与实际业务逻辑相结合,为实际的企业应用提供了参考。通过学习和实践这个示例...

    OSworkFlow工作流请假流程实例

    OSworkflow(OpenSymphony Workflow)是一个开源的工作流管理系统,它提供了强大的流程定义和执行的能力,广泛应用于企业级应用中,如请假流程等业务场景。在本实例中,我们将深入探讨如何利用OSworkflow来实现一个...

    OSWorkFlow 请假实例

    OSWorkFlow是一个强大的工作流引擎,它在IT领域中被广泛应用来实现业务流程自动化。工作流,简单来说,就是一系列相互关联的任务,按照特定的顺序执行,以完成一个业务过程。OSWorkFlow作为开源的工作流解决方案,为...

    osworkflow请假实例

    osWorkflow(简称OSW)是一个开源的工作流引擎,它允许开发者在应用程序中定义、管理和执行工作流程。这个实例是基于OSW的请假申请流程,使用了Tomcat 6.0作为应用服务器,Oracle数据库作为数据存储,并且可以方便地...

    工作流 osworkflow 例子和原理

    OSWorkflow(OpenSymphony Workflow)是一个开源的工作流引擎,它提供了一种灵活的方式来设计、实施和管理业务流程。本篇文章将深入探讨OSWorkflow的工作原理及其应用实例。 OSWorkflow的核心概念包括工作流定义、...

    yy.rar_DEMO_demo osworkflow_流程引擎_请假流程引擎

    标题提到的"yy.rar_DEMO_demo osworkflow_流程引擎_请假流程引擎"是一个基于osWorkflow的工作流引擎的演示项目,专门设计用来展示如何实现请假流程。osWorkflow是一款开源的工作流引擎,它允许开发者定义、执行和...

    基于osworkflow框架的OA系统demo

    通过基于osworkflow的OA系统DEMO,我们可以学习到如何利用工作流引擎实现业务流程自动化,提高办公效率。同时,osworkflow的灵活性和强大功能,使其成为构建复杂OA系统时的理想选择。理解并掌握osworkflow的使用,...

    Osworkflow 入门级例子

    Osworkflow 是一个开源的工作流引擎,它为应用程序提供了一种灵活的方式来管理业务流程。这个入门级的例子将带你了解 Osworkflow2.8 的基本概念和如何在项目中简单地实现工作流。 Osworkflow 提供了一个强大的框架...

    osworkflow开发指南

    2. **osWorkFlow架构**:了解osWorkFlow的设计原理和组件,如流程定义、流程实例、任务服务、持久化机制等,这有助于你构建和维护工作流系统。 3. **流程定义**:学习如何使用XML或图形工具(如FlowDesigner)来...

    osworkfolw 工作流demo

    osWorkflow 是一个开源的工作流引擎,它主要用于设计和执行复杂的业务流程。这个“osworkflow 工作流demo”提供了一个具体的应用示例,演示了如何使用 osWorkflow 实现请假审批这样的工作流程。osWorkflow 提供了...

    osworkflow2.8基于Spring+Hibernate

    osworkflow是一款开源的工作流引擎,它提供了灵活的工作流程定义和执行管理功能。在Java应用中,osworkflow常常与Spring和Hibernate这两个主流的框架结合使用,以实现业务流程的自动化处理。本篇文章将深入探讨如何...

    osworkflow_leaveApprove_mysql

    在"osworkflow_leaveApprove_mysql"项目中,我们看到的是一个基于OSWorkflow的请假审批流程示例,专为初学者设计,帮助他们快速理解和掌握工作流系统的运作原理。 MySQL作为全球最受欢迎的开源关系型数据库管理系统...

    osworkflow中文手册

    OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个中文手册是为了解决中文用户在理解和使用OSWorkflow时的语言障碍,提供详细的指南和实例解析。 工作流引擎是软件系统中一个...

    osworkflow简单实现

    OSWorkflow,全称为OpenSymphony Workflow,是一款开源的工作流引擎,用于在应用程序中实现复杂的业务流程。这个项目由OpenSymphony Group开发,现在已经并入到Atlassian的Confluence产品中。OSWorkflow提供了一种...

    OSWorkflow 可以请假小例子(mysql+tomcat)

    OSWorkflow 是一个强大的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。在这个"可以请假的小例子"中,我们将探讨如何使用OSWorkflow与MySQL数据库、Tomcat应用服务器以及Eclipse开发环境集成,来创建一...

    OSWorkFlow入门

    OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个框架提供了灵活的流程定义、状态跟踪、任务分配以及事件通知等功能,使得开发人员能够轻松地创建和管理动态工作流程。本文将...

    画流程图的例子(源码)OsWorkFlow.rar

    OsWorkFlow,作为一款开源的工作流引擎,它提供了强大的流程图绘制功能,并支持自定义流程逻辑。在本文中,我们将深入探讨如何利用OsWorkFlow来创建和管理流程图,并通过源码分析,理解其实现原理。 首先,我们要...

Global site tag (gtag.js) - Google Analytics