- 浏览: 97756 次
- 来自: ...
-
最新评论
-
gongcheneric:
如果我是要在一个局域网内的某台电脑上修改其他电脑(已知电脑的I ...
java 修改系统时间 -
lijunlong:
...
java 修改系统时间 -
jljf_hh:
喔,了解一下,正好没时间研究这东西呢.哈哈
JBPM阶段性工作总结 -
yuyanshan:
你好,我也是这们做的不,不过我还不明白怎么处理任务,我是这样想 ...
会签实现
转载自http://linliangyi2007.iteye.com/blog/176345
业务流程设计
这里我们实现一个相对简化的公司借款申请流程。流程图如下:
在jPDL中,与流程设计相关的文件有三个:processdefinition.xml、gdp.xml、processimage.jpg。其中processdefinition.xml是流程定义的描述文件;gpd.xml是对图形界面呈现的XML描述;而processimage.jpg则是对图形界面的快照。下面我们将展示本样例的流程定义文件。
流程定义描述
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns ="urn:jbpm.org:jpdl-3.2" name="simple">
<start-state name="开始">
<transition name="借款发起" to="填写借款申请">
<action name="Action_StartProcess" class="com.firstflow.action.StartProcessActionHander"></action>
</transition>
</start-state>
<task-node name="填写借款申请">
<task name="Task_AssignToInitiator">
<assignment class="com.firstflow.task.NewApplicationAssignmentHandler"></assignment>
</task>
<transition to="部门经理审批" name="提交申请">
<action name="Action_SubmitApply" class="com.firstflow.action.SubmitApplyActionHandler"></action>
</transition>
</task-node>
<task-node name="部门经理审批">
<task name="Task_ManagerApprove">
<assignment class="com.firstflow.task.DepartmentManagerApproveAssignmentHandler"></assignment>
</task>
<transition to="金额判定" name="部门经理审批通过">
<action name="Task_ManagerApproved" class="com.firstflow.action.ManagerApprovedActionHandler"></action>
</transition>
<transition to="结束" name="部门经理驳回">
<action name="Action_ManagerDisapprove" class="com.firstflow.action.ManagerDisapproveActionHandler"></action>
</transition>
</task-node>
<node name="财务拨款">
<action name="Action_AccountantProcess" class="com.firstflow.action.AccountantProcessActoinHandler"></action>
<transition to="结束" name="邮件通知">
<action name="Action_Mail" class="com.firstflow.action.SendMailActionHandler"></action>
</transition>
</node>
<decision name="金额判定">
<handler class="com.firstflow.decision.MoneyCheckDecisionHandler"></handler>
<transition to="总经理审批" name=">5000元总经理审批"></transition>
<transition to="财务拨款" name="<5000元 财务拨款"></transition>
</decision>
<task-node name="总经理审批">
<task name="Task_PresidentApprove">
<assignment class="com.firstflow.task.PresidentApproveAssignmentHandler"></assignment>
</task>
<transition to="财务拨款" name="总经理审批通过">
<action name="Action_PresidentApproved" class="com.firstflow.action.PresidentApprovedActionHandler"></action>
</transition>
<transition to="结束" name="总经理驳回">
<action name="Action_PresidentDisapproved" class="com.firstflow.action.PresidentDisapprovedActionHandler"></action>
</transition>
</task-node>
<end-state name="结束"></end-state>
</process-definition>
在样例流程中,除了开始和结束结点外,我们定义了三种类型的结点:
任务结点<task-node>
任务结点是一个需要人工参与的结点类型。当流程进入结点时,会生成相应的任务实例(TaskInstatnce),并通过委派接口AssignmentHandler或jBPM表达式将任务委派给一个或多个特定的角色或参与者。结点自身进入等待状态,直到任务被参与者完成或者跳过,流程继续。
判定结点<decision>
判定结点的设计目标是根据上下文环境和程序逻辑,判定流程转向。通过指定一个实现DecisionHandlder接口的Java委派类或jBPM表达式,来返回转向(transition)的字符窜类型的名称(可以是中文哦),来达到决定流程方向的功能。
普通结点<node>
普通结点也可以定义相应的处理任务,通过定义相应的ActioinHandler类。同任务结点不同的是,普通结点定义的任务是由流程自动执行的,无须人工干预。
三种结点都可定义结点事件(event):
node-enter,该事件在流程进入结点时触发
node-leave,该事件在流程离开节点是触发
可以在事件上挂接ActioinHandler接口的实现类来完成一些特定的功能。
三种节点都可以定义异步处理方式(async属性):
异步处理意味着每个结点的事务处理是通过消息机制分离的,不再同一线程中统一调用执行。而是由消息监听线程从消息队列中取得消息体来运行相应得程序。
此外我们定义了结点间的转向(transition),用来记录和处理状态的变迁。每个转向中,可以委派一个或多个的ActioinHandler接口实现类,负责处理节点变迁时的上下文状态变更及回调用户定义的处理程序。
流程的程序接口说明
动作处理接口(ActioinHandler)
接口方法:void execute( ExecutionContext executionContext ) throws Exception
该接口是jPDL中最常用的一个回调接口。从它的接口方法可以发现,它仅仅暴露了流程执行上下文变量ExecutionContext。用户程序通过ExecutionContext来了解流程的执行状态,并通过改变ExecutionContext中的属性值来影响流程的执行。
ActioinHandler接口可以在所有能包含事件(event)、动作(action)元素的地方被回调。
判定处理接口(DecisionHandlder)
接口方法:String decide(ExecutionContext executionContext) throws Exception
判定接口仅适用于判定节点(decision)中。从它的接口方法可以看出,方法要返回一个字符串型的结果,这个结果必须和判定节点拥有的转向(transition)集合中的一条转向名称相匹配。
在DecisionHandlder的接口方法中一样能访问到ExecutionContext变量,这为判定提供了执行上下文的根据。当然,如果有必要,用户也可以在该接口中改变ExecutionContext中的变量值。
委派处理接口(AssignmentHandler)
接口方法:void assign(Assignable assignable, ExecutionContext executionContext) throws Exception;
委派处理接口被用户任务元素(task)的委派(assignment)子元素中,它的职责很明确,就是将任务分配给指定的人员或角色。
在AssignmentHandler接口的方法中,Assignable变量通常指任务实例(TaskInstance)。通过将ExecutionContext和TaskInstance两个变量都暴露给接口方法,用户就可以根据流程上下文情况,来决定要将指定的任务分配个谁。
流程的部署
用户使用jPDL的流程设计器定义业务流程,当然,你也可以直接用文档编辑器直接编辑processdefinition.xml定义文件。定义文档是可以直接被ProcessDefinition类载入使用的,但在正式运行的系统中,流程定义信息更多是使用关系型数据库来存储。从流程定义文件将数据导入流程数据库的过程,我们称之为流程部署。
jPDL的流程部署文件包含processdefinition.xml的定义部分和Java处理器的代码部分,这些文件可以被一起打包成.jpdl的zip格式包而后上传服务器端。这个过程可以在流程设计器界面的“deployment”标签页中操作:
这里我们着重要讲述的是接受部署文件上载的服务器端配置。在jBPM3.2的包中带着一个jPDL的管理控制台web应用,默认名字为jbpm-console。该应用带有接受流程定义包部署的程序,但不是最小化的。实际上完成流程部署功能的,只是jbpm-jpdl.jar核心包中的一个servlet类:org.jbpm.web.ProcessUploadServlet . 完成这个Servlet的成功部署,需要以下工作:
1. 配置web.xml,将servlet配置成启动时加载,如下:
<web-app>
<servlet>
<servlet-name>GDP Deployer Servlet</servlet-name>
<servlet-class>org.jbpm.web.ProcessUploadServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>GDP Deployer Servlet</servlet-name>
<url-pattern>/upload/*</url-pattern>
</servlet-mapping>
</web-app>
2. 建立流程定义存储数据库表:
Demo中,我们使用的数据库是MySQL的,在E:\Java\tools\jbpm-jpdl-3.2.2\db\目录下有个jbpm.jpdl.mysql.sql数据库脚本文件。但我们不能直接导入该文件, 会提示有错误, 应为该文件的SQL语句末尾少了分号,在批量执行时,MySQL报错。需要在每一行SQL的末尾添加一个分号,这样就可以用source命令导入了。
3. 配置Hibernate.cfg.xml
由于jBPM的数据库持久化是依靠Hibernate进行的,因此需要配置Hibernate.cfg.xml使其适应我们的MySQL环境
<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/linly</property>
<property name="hibernate.connection.username">linly</property>
<property name="hibernate.connection.password">coffee</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
4. Import需要的jar包
这里的jar包包括三部分:jbpm的核心包;Hibernate及其支撑包;MySQL的JDBC驱动包。
到此,我们的配置工作完成,这是实现jBPM流程部署服务端的最小化应用配置。
流程控制及API使用
样例程序中的Handler接口实现
下面,根据上述的接口分类,列出样例程序中的类名及相应的功能说明,具体可参考源代码。
动作处理接口(ActioinHandler)
这里要提到一个很重要的区别,就是作用于Node上的ActoinHandler和作用于Transition上的ActoinHandler是有不同的。区别在于,Node上的ActoinHandler在结束业务逻辑处理后,必须调用executionContext.leaveNode();或executionContext.leaveNode(transition)来保证流程向下执行;而作用于Transition上的则不需要。
判定处理接口(DecisionHandlder)
委派处理接口(AssignmentHandler)
流程测试剖析
本章节,我们将给大家剖析两个流程测试类。一个是简单的基于内存模型的流程测试FirstFlowProcessTest;一个是更贴近实用的,基于MySQL数据库操作的标准测试案例。通过对这两个测试例程的分析,来直观的学习如何通过Java API操作jPDL。
简单流程测试案例
测试案例类:FirstFlowProcessTest.java
- public class FirstFlowProcessTest extends TestCase {
- ProcessDefinition pdf ;
- ProcessInstance pi;
- public void test4000YuanApplication() throws Exception {
- deployProcessDefinition();
- createProcessInstance("linly");
- submitApplication(4000);
- approveByManager(true);
- checkTasks();
- }
- public void test6000YuanApplication() throws Exception {
- deployProcessDefinition();
- createProcessInstance("linly");
- submitApplication(6000);
- approveByManager(true);
- approveByPresident(true);
- checkTasks();
- }
- public void test7000YuanApplication() throws Exception {
- deployProcessDefinition();
- createProcessInstance("linly");
- submitApplication(7000);
- approveByManager(true);
- approveByPresident(false);
- checkTasks();
- }
- /**
- * 部署流程定义
- * @throws Exception
- */
- protected void deployProcessDefinition() throws Exception{
- System.out.println("==FirstFlowProcessTest.deployProcessDefinition()==");
- pdf = ProcessDefinition.parseXmlResource("firstflow/processdefinition.xml");
- assertNotNull("Definition should not be null", pdf);
- }
- /**
- * 生成流程实例
- */
- protected void createProcessInstance(String user){
- System.out.println("==FirstFlowProcessTest.createProcessInstance()==");
- assertNotNull("Definition should not be null", pdf);
- //生成实例
- pi = pdf.createProcessInstance();
- assertNotNull("processInstance should not be null", pi);
- //设置流程发起人
- pi.getContextInstance().createVariable("initiator", user);
- //触发流程转向
- pi.signal();
- }
- /**
- * 填写提交申请单
- * @param money
- */
- protected void submitApplication(int money){
- System.out.println("==FirstFlowProcessTest.submitApplication()==");
- TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next() ;
- System.out.println("ti.actor = " + ti.getActorId());
- ContextInstance ci = ti.getContextInstance();
- ci.setVariable("money",new Integer(money));
- ti.end();
- }
- /**
- * 部门经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByManager(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByManager()==");
- Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
- for( ;it.hasNext(); ){
- TaskInstance ti = it.next();
- if(ti.getActorId().equals("DepartmentManager")){
- List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
- for(Transition t : transitions){
- System.out.println("----Transition" + t.getName());
- }
- assertEquals("DepartmentManager",ti.getActorId());
- if(pass){
- ti.end("部门经理审批通过");
- }else{
- ti.end("部门经理驳回");
- }
- return;
- }
- }
- }
- /**
- * 总经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByPresident(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByPresident()==");
- Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
- for( ;it.hasNext(); ){
- TaskInstance ti = it.next();
- if(ti.getActorId().equals("President")){
- List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
- for(Transition t : transitions){
- System.out.println("----Transition" + t.getName());
- }
- assertEquals("President",ti.getActorId());
- if(pass){
- ti.end("总经理审批通过");
- }else{
- ti.end("总经理驳回");
- }
- return;
- }
- }
- }
- /**
- * 打印任务记录
- */
- @SuppressWarnings("unchecked")
- protected void checkTasks(){
- System.out.println("==FirstFlowProcessTest.checkTasks()==");
- Collection<TaskInstance> coll = pi.getTaskMgmtInstance().getTaskInstances();
- System.out.println("====Process has task:====");
- for(TaskInstance ti : coll){
- System.out.println("=="+ti.getName()+"==");
- System.out.println("=="+ti.getActorId()+"==");
- System.out.println("=="+ti.getVariables().toString() +"==");
- }
- System.out.println("====end====");
- }
public class FirstFlowProcessTest extends TestCase { ProcessDefinition pdf ; ProcessInstance pi; public void test4000YuanApplication() throws Exception { deployProcessDefinition(); createProcessInstance("linly"); submitApplication(4000); approveByManager(true); checkTasks(); } public void test6000YuanApplication() throws Exception { deployProcessDefinition(); createProcessInstance("linly"); submitApplication(6000); approveByManager(true); approveByPresident(true); checkTasks(); } public void test7000YuanApplication() throws Exception { deployProcessDefinition(); createProcessInstance("linly"); submitApplication(7000); approveByManager(true); approveByPresident(false); checkTasks(); } /** * 部署流程定义 * @throws Exception */ protected void deployProcessDefinition() throws Exception{ System.out.println("==FirstFlowProcessTest.deployProcessDefinition()=="); pdf = ProcessDefinition.parseXmlResource("firstflow/processdefinition.xml"); assertNotNull("Definition should not be null", pdf); } /** * 生成流程实例 */ protected void createProcessInstance(String user){ System.out.println("==FirstFlowProcessTest.createProcessInstance()=="); assertNotNull("Definition should not be null", pdf); //生成实例 pi = pdf.createProcessInstance(); assertNotNull("processInstance should not be null", pi); //设置流程发起人 pi.getContextInstance().createVariable("initiator", user); //触发流程转向 pi.signal(); } /** * 填写提交申请单 * @param money */ protected void submitApplication(int money){ System.out.println("==FirstFlowProcessTest.submitApplication()=="); TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next() ; System.out.println("ti.actor = " + ti.getActorId()); ContextInstance ci = ti.getContextInstance(); ci.setVariable("money",new Integer(money)); ti.end(); } /** * 部门经理审批 * @param pass */ @SuppressWarnings("unchecked") protected void approveByManager(boolean pass){ System.out.println("==FirstFlowProcessTest.approveByManager()=="); Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator(); for( ;it.hasNext(); ){ TaskInstance ti = it.next(); if(ti.getActorId().equals("DepartmentManager")){ List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions(); for(Transition t : transitions){ System.out.println("----Transition" + t.getName()); } assertEquals("DepartmentManager",ti.getActorId()); if(pass){ ti.end("部门经理审批通过"); }else{ ti.end("部门经理驳回"); } return; } } } /** * 总经理审批 * @param pass */ @SuppressWarnings("unchecked") protected void approveByPresident(boolean pass){ System.out.println("==FirstFlowProcessTest.approveByPresident()=="); Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator(); for( ;it.hasNext(); ){ TaskInstance ti = it.next(); if(ti.getActorId().equals("President")){ List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions(); for(Transition t : transitions){ System.out.println("----Transition" + t.getName()); } assertEquals("President",ti.getActorId()); if(pass){ ti.end("总经理审批通过"); }else{ ti.end("总经理驳回"); } return; } } } /** * 打印任务记录 */ @SuppressWarnings("unchecked") protected void checkTasks(){ System.out.println("==FirstFlowProcessTest.checkTasks()=="); Collection<TaskInstance> coll = pi.getTaskMgmtInstance().getTaskInstances(); System.out.println("====Process has task:===="); for(TaskInstance ti : coll){ System.out.println("=="+ti.getName()+"=="); System.out.println("=="+ti.getActorId()+"=="); System.out.println("=="+ti.getVariables().toString() +"=="); } System.out.println("====end===="); }
该案例是在没有数据库支持的情况下,对报销流程进行运行测试,测试逻辑如下:
1. 加载流程定义
ProcessDefinition.parseXmlResource("firstflow/processdefinition.xml")
代码说明:
在没有数据库存储的情况下,流程定义通过ProcessDefinition类直接从processdefinition.xml文件中解析加载。
2. 实例化流程对象
- //生成实例
- pi = pdf.createProcessInstance();
- assertNotNull("processInstance should not be null", pi);
- //设置流程发起人
- pi.getContextInstance().createVariable("initiator", user);
- //触发流程转向
- pi.signal();
//生成实例 pi = pdf.createProcessInstance(); assertNotNull("processInstance should not be null", pi); //设置流程发起人 pi.getContextInstance().createVariable("initiator", user); //触发流程转向 pi.signal();
代码说明:
在获得流程定义的实例后,可以用它生成流程实例,使用如下的语句:
pi = pdf.createProcessInstance();
流程实例拥有自己的ContextInstance环境变量对象。它实际上是一个HashMap,以key-value方式记录了流程的上下文变量值,代码中的
pi.getContextInstance().createVariable("initiator", user);就是向环境变量中添加一个key为initiator的对象。
每个流程实例都拥有自己Token令牌对象,主流程有自己的RootToken,子流程也拥有自己的子Token。父流程的Token和子流程的Token相互关联,形成Token树。
Token对象表示流程运行的当前位置(运行到哪个节点了)。通过对Token对象的signal()方法调用,可以使流程向下运行。代码中的pi.signal();实际上是间接调用了pi.getRootToken().signal();它使得新建的流程继续向下个节点(即借款申请单填写)进发。
3. 员工发起借款申请
- /**
- * 填写提交申请单
- * @param money
- */
- protected void submitApplication(int money){
- System.out.println("==FirstFlowProcessTest.submitApplication()==");
- TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()
- System.out.println("ti.actor = " + ti.getActorId());
- ContextInstance ci = ti.getContextInstance();
- ci.setVariable("money",new Integer(money));
- ti.end();
/** * 填写提交申请单 * @param money */ protected void submitApplication(int money){ System.out.println("==FirstFlowProcessTest.submitApplication()=="); TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next() System.out.println("ti.actor = " + ti.getActorId()); ContextInstance ci = ti.getContextInstance(); ci.setVariable("money",new Integer(money)); ti.end(); }
代码说明:
在借款流程发起后,流程进入了申请单填写阶段。这个阶段是个人工的任务,需要用户的介入。因此,对于要借款的用户而言,首先是获取填写申请单的任务实例:
TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()
在这个测试类中,由于没有数据库。对流程实例的引用是依靠了类的全局标量pi。这里通过pi获取全部的任务列表。实际上有且仅有一个任务,就是我们刚刚发起的申请单填写任务。
接下来,我们获取流程的上下文变量,将申请借款的数额记录在上下文变量中ContextInstance ci = ti.getContextInstance();
ci.setVariable("money",new Integer(money));
最后,我们要结束当前任务,告诉流程继续下行,调用ti.end();这个方法的本质依然是调用了token.signal(),它选择了一个默认的transition进行转向。这里要说明的是signal方法有多态的实现signal(Transition transition),是可以指定具体转向参数的。
4. 部门领导审批申请
- /**
- * 部门经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByManager(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByManager()==");
- Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
- for( ;it.hasNext(); ){
- TaskInstance ti = it.next();
- if(ti.getActorId().equals("DepartmentManager")){
- List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
- for(Transition t : transitions){
- System.out.println("----Transition" + t.getName());
- }
- assertEquals("DepartmentManager",ti.getActorId());
- if(pass){
- ti.end("部门经理审批通过");
- }else{
- ti.end("部门经理驳回");
- }
- return;
- }
- }
- }
/** * 部门经理审批 * @param pass */ @SuppressWarnings("unchecked") protected void approveByManager(boolean pass){ System.out.println("==FirstFlowProcessTest.approveByManager()=="); Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator(); for( ;it.hasNext(); ){ TaskInstance ti = it.next(); if(ti.getActorId().equals("DepartmentManager")){ List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions(); for(Transition t : transitions){ System.out.println("----Transition" + t.getName()); } assertEquals("DepartmentManager",ti.getActorId()); if(pass){ ti.end("部门经理审批通过"); }else{ ti.end("部门经理驳回"); } return; } } }
代码说明:
这里,流程进入了部门经理审批阶段。由于没有数据库支持,我们只能采取遍历任务列表,并比对委派者ID的方式来确定委派给部门经理的任务实例。(在后面的基于数据库的标准案例中,我们会看到如果根据用户的ID来获取分配给指定用户的任务)
ti.getActorId().equals("DepartmentManager") // 比对任务的委派人。
ti.getToken().getNode().getLeavingTransitions();//获取任务在当前节点上的所有转向。
这里我们要特别指出的是ti.end("部门经理审批通过")和ti.end("部门经理驳回")这实际上调用token.signal(transition);来完成任务的转向,从而使流程继续。
5. 总经理审批申请
- /**
- * 总经理审批
- * @param pass
- */
- @SuppressWarnings("unchecked")
- protected void approveByPresident(boolean pass){
- System.out.println("==FirstFlowProcessTest.approveByPresident()==");
- Iterator<TaskInstance> it = pi.getTaskMgmtInstance().getTaskInstances().iterator();
- for( ;it.hasNext(); ){
- TaskInstance ti = it.next();
- if(ti.getActorId().equals("President")){
- List<Transition> transitions = ti.getToken().getNode().getLeavingTransitions();
发表评论
-
节点描述
2008-08-07 21:59 1195对jBPM来讲,工作流由一 ... -
sample
2008-08-07 21:12 920xml配置 <start-state ... -
tasknode
2008-08-07 21:07 892同fork等一样是一种节点类型。任务节点是jbpm中一个非常重 ... -
controller
2008-07-31 20:44 948controller(控制器) \28在任务执行时,可能需要 ... -
exception-handler
2008-07-31 20:43 1875exception-handler 异常处理 jbpm异常 ... -
spring和jbpm事务一致性
2008-07-31 20:24 2856关于jbpm和spring结合的事务问题: 当JBPM使用sp ... -
知识点
2008-07-31 10:25 933Node Type ... -
ssh-jbpm发布遇到的问题
2008-07-30 10:04 15651.自己输入http://localhost:8080/ssh ... -
发布jbpm示例shipping遇到的问题
2008-07-28 18:09 10671 jstl和jsp2.0版本问题 <%@taglib ... -
jbpm解析流程定义
2008-07-27 19:25 1031jbpm解析流程定义有三种方式:1)par包static Pr ... -
Jbpm学习知识点
2008-07-26 21:32 1121如何运行Jbpm的示例程序?如何部署Jbpm?如何安装Jbp ... -
会签实现
2008-07-26 21:28 1469转载自http://tomkoo.iteye.com/blog ... -
Tomcat+mysql 配置
2008-07-26 09:24 1420JBoss JBPM 实践系列(一)--- 安装配置(Tomc ... -
jBPM相关概念
2008-07-26 08:25 864转载自http://fndcz.iteye.com/blog/ ... -
jbpm资源
2008-07-26 07:59 843ant和发布 http://fndcz.iteye.com/ ... -
jbpm任务分配分析
2008-07-26 07:53 2227jbpm任务分配分析 任务 ... -
JBPM源码浅析
2008-07-26 07:40 1148转载自 http://zwchen.iteye.com/blo ... -
JBPM阶段性工作总结
2008-07-26 07:37 1552转载自http://zwchen.iteye.co ... -
eclipse的jbpm插件配置
2008-07-25 17:36 4745eclipse版本3.2.2 1. jbpm插件从jbpm-s ...
相关推荐
《电子政务业务流程设计方法通用指南》是指导如何有效设计和实施电子政务系统的关键参考资料,旨在提高政府服务效率和透明度。本指南涵盖了一系列关键步骤和文档,以确保全面且一体化的建模过程。 首先,建模的主要...
电子政务的业务流程设计,可供用户在模型建设、软件设计、工具开发、数据管理方面提供支持
业务流程设计与优化是企业管理中的关键环节,尤其在财务管理领域,高效的流程对于降低成本、提高服务质量至关重要。本讲座由汉华管理咨询的陈志强分享,主要围绕TCL国际电工的业务流程改进进行了深入探讨。 首先,...
在东风汽车业务流程设计与优化的讨论中,我们聚焦于企业如何通过改进流程来提升效率和客户满意度。流程设计与优化是现代企业管理中的核心环节,尤其是在技术驱动的IT行业中,高效的流程能为企业带来显著的竞争优势。...
业务流程设计与优化是企业管理中的关键环节,尤其在财务管理领域,高效的流程能显著提升企业效率,降低成本,并增强竞争力。此PPT文档详细介绍了这一过程,包括关注流程与顾客、流程识别与设计、流程优化以及流程的...
企业业务流程设计与优化是企业管理信息化中的重要环节,旨在提高效率、降低成本并增强客户满意度。这一过程涉及到多个关键步骤和概念。 首先,关注流程和顾客是优化的基础。流程的顾客是指流程最终服务的对象,理解...
信息化业务流程设计方案.pptx
【企业业务流程设计】在现代企业管理中扮演着至关重要的角色,尤其对于装配型企业而言,有效设计业务流程能够提升效率,降低成本,确保企业运作顺畅。业务流程设计涉及将管理理念、制度、操作步骤和标准化表单整合,...
在物联网(IoT)领域,业务流程设计是构建高效、智能解决方案的关键环节。"物联网平台--业务流程设计案例.zip" 文件包含了一系列关于物联网平台业务流程的详细案例,旨在阐述如何有效地管理和协调物联网环境中的不同...
业务流程设计及绘制方法 业务流程设计及绘制方法是指通过对业务流程的分析、设计和优化,使企业的业务流程变得更加高效、灵活和可靠。该方法包括流程分析、流程设计、流程优化和流程监控等几个方面。 在企业中,...
外贸谈判外贸谈判业务流程设计及合同制作.doc
业务流程设计是现代企业管理的重要组成部分,它涉及到企业的运营效率、服务质量以及客户满意度。流程设计的基础是理解企业如何通过一系列活动来实现其业务目标。随着企业发展,传统的以部门职能划分的运作方式逐渐被...
【自动化集装箱码头业务流程设计】涉及的是现代港口运营中的一个重要领域,主要解决当前自动化集装箱码头在设计阶段缺乏统一规范和指导的问题。业务流程设计对于提高决策效率和建设效率至关重要,尤其是在全球化、...
业务流程设计与优化是企业管理中的关键环节,旨在提高效率、降低成本并增强企业的核心竞争力。这一领域涉及对现有流程的深入理解、识别与设计,以及流程的持续改进和优化。 首先,关注流程意味着企业需要从顾客的...
《04业务流程设计方法》是一份详细阐述业务流程设计的文档,主要针对的是IT行业的专业人士,特别是那些在系统开发、项目管理和业务流程优化中扮演关键角色的人。这份文档的目的是提供一套统一的业务流程设计方法,以...
《电子政务业务流程设计方法通用指南》是一份指导电子政务系统设计的重要标准草案,它涵盖了从业务调查到软件实现的全过程。以下是对其中关键知识点的详细解析: 1. **建模文档**:建模是电子政务系统设计的核心...
业务流程设计培训成为组织优化自身操作,提高客户满意度,以及实现战略目标的重要途径。本文深入探讨了业务流程重组(BPR)的关键成功要素,咨询人员在BPR项目中的作用,流程设计应遵循的原则,以及流程设计工具的...
ERP-U9项目实施解决方案的第四部分专注于业务流程设计,特别是针对特定的××业务。这份文档由作者杨运良在不同的日期进行了多次修订,旨在提供一个详细的实施蓝图,以优化和标准化企业的运营流程。 首先,文档的...
《业务流程设计与优化教材.pptx》这一教材,由汉华管理咨询的陈志强主讲,其内容深入浅出,旨在帮助企业管理者和员工掌握业务流程设计与优化的核心要点。 首先,教材强调了流程与顾客之间不可分割的联系。业务流程...
在自动化集装箱码头业务流程设计的研究中,张玉龙等学者深入探讨了当前自动化集装箱码头设计中业务流程的规范性和纲领性操作指引的不足,并针对这一问题提出了一套完整的设计方法。具体的知识点包括: 1. 基础框架...