`

liferay-workflow-jbpm 动态task实例

阅读更多
公司需求开发,测试,部署,内容更新的流程管理.用到动态分配任务。
流程定义文件如下:
<?xml version="1.0"?>

<process-definition name="demand-management">

<!-- Event Logging -->


<!-- Swimlanes -->

<swimlane name="tester" >
<assignment class="com.liferay.jbpm.handler.IdentityAssignmentHandler" config-type="field">
<type>user</type>
<companyId>10113</companyId>
<id>10045</id>
</assignment>
</swimlane >


<swimlane name="requestor" >
<assignment class="com.liferay.jbpm.handler.IdentityAssignmentHandler" config-type="field">
<type>user</type>
<companyId>10113</companyId>
<id>10045</id>
</assignment>
</swimlane >

<swimlane name="approver">
<assignment class="com.liferay.jbpm.handler.IdentityAssignmentHandler" config-type="field">
<type>user</type>
<companyId>10113</companyId>
<id>10045</id>
</assignment>
</swimlane>



<!-- Nodes -->
<!-- 流程开始-->
<start-state name="add-Demand">
<task swimlane="tester">
<controller>
<variable name="text:demand-name" access="read,write,required" />
<variable name="textarea:demand-comments" access="read,write,required" />
<variable name="date:demand-start-date" access="read,write,required" />
</controller>
</task>
<transition name="add-Demand" to="manager-manage" />
</start-state>

<!-- 经理审核需求-->
<task-node name="manager-manage">
<task swimlane="tester">
<controller>
<variable name="textarea:why-testfaling" access="read,required" />
<variable name="text:demand-name" access="read,required" />
<variable name="textarea:demand-comments" access="read,required" />
<variable name="date:demand-start-date" access="read,required" />
</controller>
</task>
<transition name="approve-demand" to="manager-assign-task" />
<transition name="reject-demand" to="back-Demand" />
<transition name="exit-demand" to="end" />
</task-node>

<!-- 填写分配任务-->
<task-node name="manager-assign-task">
<task swimlane="tester">
<controller>
<variable name="text:task-name" access="read,write,required" />
<variable name="textarea:task-comments" access="read,write,required" />
<variable name="radio:assign-to-user1:yes,no" access="read,write,required" />
<variable name="radio:assign-to-user2:yes,no" access="read,write,required" />
<variable name="radio:assign-to-user3:yes,no" access="read,write,required" />
</controller>
</task>
<transition name="assign-task-submit" to="dynamic-create-task" />
</task-node>

<!-- 动态生成任务实例-->
<task-node name="dynamic-create-task" signal="last-wait" create-tasks="false">
<task swimlane="requestor">   
<controller>
<variable name="text:task-name" access="read,required" />
<variable name="textarea:task-comments" access="read,required" />

<variable name="radio:assign-to-user1:yes,no" access="read,required" />
<variable name="radio:assign-to-user2:yes,no" access="read,required" />
<variable name="radio:assign-to-user3:yes,no" access="read,required" />

</controller>    
</task>
<!-- 动态分配任务调用外部动作 -->
<event type="node-enter">  
            <action name="createInstance"  
        class="com.liferay.jbpm.handler.CreateTasksAction">  
            </action>  
     </event>  
<transition name="task-finished" to="manager-checkup-task" />
</task-node>

<!--添加返回原因-->
<task-node name="back-Demand">
<task swimlane="tester">
<controller>

<variable name="text:demand-name" access="read,required" />
<variable name="textarea:demand-comments" access="read,required" />
<variable name="date:back-demand-date" access="read,write,required" />
<variable name="textarea:why-reject" access="read,write,required" />
</controller>
</task>
<transition name="back-demand-submit" to="back-Demand-resubmit" />
</task-node>



<!--返回修改需求-->
<task-node name="back-Demand-resubmit">
<task swimlane="tester">
<controller>
<variable name="textarea:why-reject" access="read,required" />
<variable name="date:back-demand-date" access="read,required" />
<variable name="text:demand-name" access="read,write,required" />
<variable name="textarea:demand-comments" access="read,write,required" />
<variable name="date:demand-start-date" access="read,write,required" />

</controller>
</task>
<transition name="modify-demand-resubmit" to="manager-manage" />
</task-node>


<!-- 经理审核任务-->
<task-node name="manager-checkup-task">
<task swimlane="tester">
<controller>
<variable name="text:task-name" access="read,write,required" />
<variable name="textarea:task-comments" access="read,write,required" />
<variable name="date:task-end-date" access="read,write,required" />

</controller>
</task>
<transition name="all-task-finished" to="test-manage" />
</task-node>



<!---测试已经开发完成的任务-->
<task-node name="test-manage">
<task swimlane="tester">
<controller>
<variable name="text:task-name" access="read,required" />
<variable name="textarea:task-comments" access="read,required" />
<variable name="date:test-end-date" access="read,wrire,quired" />
</controller>
</task>
<transition name="test-finish" to="deploy-manage" />
<transition name="test-failing" to="failing-modify" />
</task-node>

<!-- 测试失败-->
<task-node name="failing-modify">

<task swimlane="tester">
<controller>
<variable name="text:task-name" access="read,required" />
<variable name="textarea:task-comments" access="read,required" />
<variable name="date:test-end-date" access="read,quired" />
<variable name="textarea:why-testfaling" access="read,write,required" />

</controller>
</task>
<transition name="failing-modify-submit" to="manager-manage" />
</task-node>

<!-- 填写失败原因-->
<task-node name="deploy-manage">
<task swimlane="tester">
<controller>
<variable name="text:task-name" access="read,required" />
<variable name="textarea:task-comments" access="read,required" />
<variable name="date:deploy-end-date" access="read,write,required" />
</controller>
</task>
<transition name="deploy-submit" to="end" />
</task-node>
<!-- 流程结束-->
<end-state name="end" />
</process-definition>


其中流转到开发经理审核时,采用了项目经理可以动态将需求划分成不同的子任务,等待所有任务完成后在重新审阅后,统一流转到下一个节点。动态创建任务的CreateTaskAction 如下:
/**
* Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package com.liferay.jbpm.handler;

import com.liferay.client.soap.portal.model.UserSoap;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringUtil;

import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.Token;
import org.jbpm.graph.node.TaskNode;
import org.jbpm.taskmgmt.def.Swimlane;
import org.jbpm.taskmgmt.def.Task;
import org.jbpm.taskmgmt.def.TaskMgmtDefinition;
import org.jbpm.taskmgmt.exe.SwimlaneInstance;
import org.jbpm.taskmgmt.exe.TaskMgmtInstance;

/**
* <a href="NotifyRequestorActionHandler.java.html"><b><i>View Source</i></b>
* </a>
*
* @author Charles May
*
*/
public class CreateTasksAction implements ActionHandler {


  private static final long serialVersionUID = 1L;  
 
/*     public void execute(ExecutionContext executionContext) throws Exception {  
        Token token = executionContext.getToken();  
        TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();  
 
        TaskNode taskNode = (TaskNode) executionContext.getNode();  
        Task task= taskNode.getTask("manager-assign");  
        tmi.createTaskInstance(task, token)  
                      .setPooledActors(new String[]{"10045"});  
        tmi.createTaskInstance(task, token)  
                      .setPooledActors(new String[]{"10045"});  
 
    }
}*/



public void execute(ExecutionContext executionContext) {

ProcessDefinition definition = executionContext.getProcessDefinition();

TaskMgmtDefinition taskMgmtDefinition =
definition.getTaskMgmtDefinition();
TaskMgmtInstance taskMgmtInstance =
executionContext.getTaskMgmtInstance();

Swimlane requestorSwimlane =
taskMgmtDefinition.getSwimlane("requestor");
SwimlaneInstance requestorSwimlaneInstance =
taskMgmtInstance.getInitializedSwimlaneInstance(
executionContext, requestorSwimlane);

String userId = getDedicatedUserId(); // requestorSwimlaneInstance.getActorId();

//my test code
Token token = executionContext.getToken();  
        TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();  
 
        TaskNode taskNode = (TaskNode) executionContext.getNode();  
        Task task= taskNode.getTask("dynamic-create-task");  
      //ActorId is UserId in liferay's userTable
        //tmi.createTaskInstance(task, token).setActorId("10145");
       // tmi.createTaskInstance(task, token).setActorId("14145");
       // tmi.createTaskInstance(task, token).setActorId("14154");
        //<variable name="radio:assign-to-user1:yes,no" access="read,write,required" />
//<variable name="radio:assign-to-user2:yes,no" access="read,write,required" />
//<variable name="radio:assign-to-user3:yes,no" access="read,write,required" />
       
      //test code2
        ContextInstance contextInstance = executionContext.getContextInstance();
String radio1 = (String)contextInstance.getVariable("radio:assign-to-user1:yes,no");
String radio2 = (String)contextInstance.getVariable("radio:assign-to-user2:yes,no");
String radio3 = (String)contextInstance.getVariable("radio:assign-to-user3:yes,no");

String checkBox1 = (String)contextInstance.getVariable("checkbox:assign-to-user1:yes");
String checkBox2 = (String)contextInstance.getVariable("checkbox:assign-to-user2:yes");
String checkBox3 = (String)contextInstance.getVariable("checkbox:assign-to-user3:yes");

if (radio1!= null && radio1.equals("yes")) {
tmi.createTaskInstance(task, token).setActorId("14145");
}
if (radio2!= null && radio2.equals("yes")) {
tmi.createTaskInstance(task, token).setActorId("14154");
}
if (radio3!= null && radio3.equals("yes")) {
tmi.createTaskInstance(task, token).setActorId("10145");
}



//Radio test assign task
/*if (taskRadio!= null && taskRadio.equals("assign-to-user1")) {
tmi.createTaskInstance(task, token).setActorId("14145");
}else if (taskRadio!= null && taskRadio.equals("assign-to-user2")) {
tmi.createTaskInstance(task, token).setActorId("14154");
}
else {
tmi.createTaskInstance(task, token).setActorId("10145");
}*/
//checkBox assign task
/* if (checkBox1 != null && checkBox1.equals("true")) {
tmi.createTaskInstance(task, token).setActorId("14145");
}
if (checkBox2 != null && checkBox2.equals("true")) {
tmi.createTaskInstance(task, token).setActorId("14154");
}
if (checkBox3 != null && checkBox3.equals("true")) {
tmi.createTaskInstance(task, token).setActorId("10145");
}

System.out.println("checkBox1======================================:"+checkBox1);
System.out.println("checkBox2======================================:"+checkBox2);
System.out.println("checkBox3======================================:"+checkBox2);*/
       
        executionContext.getJbpmContext().getSession().saveOrUpdate(tmi);
       
//                       .setPooledActors(new String[]{"10145"}); 
//         tmi.createTaskInstance(task, token)  
//            .setPooledActors(new String[]{"14145"});
//         tmi.createTaskInstance(task, token)  
//   .setPooledActors(new String[]{"14154"}); 
      
      
// executionContext.leaveNode();
}

private String getDedicatedUserId() {
String userId = "10145";
return userId;
}

private static Log _log =
LogFactoryUtil.getLog(CreateTasksAction.class);

}


0
0
分享到:
评论

相关推荐

    liferay-portal-sql-6.1.1-ce-ga2-20120731132656558

    标题 "liferay-portal-sql-6.1.1-ce-ga2-20120731132656558" 暗示了这是一个关于Liferay Portal 6.1.1社区版(CE GA2)的SQL相关资源,发布日期为2012年7月31日。Liferay Portal是一个开源的企业级内容管理平台,它...

    liferay-plugins-sdk-6.1.1-20130816114619181.zip

    此外,SDK还包括了构建脚本(如`build.xml`)和配置文件(如`liferay-plugin-package.xml`),这些文件用于控制项目的构建过程和插件的元数据。`build.xml`通常使用Ant构建工具,定义了编译、测试、打包和部署的步骤...

    liferay-ide-eclipse-updatesite-1.6.2

    本文将详细介绍“liferay-ide-eclipse-updatesite-1.6.2”这一更新站点及其相关知识点。 一、Liferay IDE Liferay IDE是由Liferay公司开发的,它是基于Eclipse平台的插件,专门用于简化Liferay Portal的开发工作。...

    liferay-ide-eclipse-updatesite-1.1.0.zip

    在IT行业中,Liferay IDE是一款专为Liferay Portal开发设计的强大工具,而"Liferay-ide-eclipse-updatesite-1.1.0.zip"正是这个工具的更新站点包,它提供了针对Liferay 6.0版本的定制化集成开发环境。Liferay IDE是...

    liferay-portal-src-6.0.6-20110225.part2

    liferay-portal-src-6.0.6-20110225.part2

    liferay-faces-bridge-impl-3.0.0-ga1.zip

    【标题】"liferay-faces-bridge-impl-3.0.0-ga1.zip" 涉及的是Liferay Faces Bridge项目的实现模块,版本为3.0.0 GA1。Liferay Faces是Liferay门户平台的一个扩展,它提供了一种在Java EE环境中集成和使用JSF(Java...

    liferay-servicebuilder-archetype-6.1.1.zip

    【标题】"liferay-servicebuilder-archetype-6.1.1.zip" 是一个与Liferay门户框架相关的开源项目构建工具。Liferay是一款流行的开源企业级门户平台,它提供了多种服务来帮助开发者创建、管理和集成Web应用。"service...

    liferay-developer-guide-6.0_liferay_

    《Liferay Developer Guide 6.0》是一本深入讲解Liferay Portal开发的指南,由Liferay公司官方发布,旨在帮助开发者充分利用Liferay平台构建企业级的Web应用。这本书详细介绍了如何利用Liferay的API、服务和插件进行...

    liferay-plugins-sdk-5.1.2

    此外,SDK提供了一种简便的方式将插件部署到本地或远程的Liferay实例,以进行实际环境的测试。 为了充分利用Liferay Plugins SDK 5.1.2,开发者需要熟悉Java编程、Maven构建系统、portlet规范以及Liferay Portal的...

    liferay-6.2-sdk

    Liferay 6.2 SDK 是一个开发工具包,专为构建和扩展Liferay Portal 6.2 版本而设计。Liferay Portal 是一个开源的企业级内容管理平台,提供了丰富的功能,如网站创建、协作、内容管理、社交媒体整合等。Liferay ...

    liferay-ide-eclipse插件

    Liferay IDE Eclipse插件是专为开发者设计的一款强大的工具,旨在提升在Eclipse集成开发环境中的Liferay Portal项目开发效率。这款插件提供了丰富的特性,使得开发者能够在Eclipse内无缝地进行Liferay相关的代码调试...

    liferay环境的搭建

    - **Liferay Plugins SDK (Software Development Kit)**: 下载地址为[liferay-plugins-sdk-6.2(PluginsSDK)](https://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.2.5%20GA6/)。这是开发portlet的...

    liferay-portal-tomcat-5.5-5.1.1.part4.rar

    liferay-portal-tomcat-5.5-5.1.1.part4.rar

    liferay-portal-tomcat-5.5-5.1.1.part1.rar

    liferay-portal-tomcat-5.5-5.1.1.part1.rar

    liferay-portal-tomcat-5.5-5.1.1.part2.rar

    liferay-portal-tomcat-5.5-5.1.1.part2.rar

    liferay-portal-tomcat-5.5-5.1.1.part3.rar

    liferay-portal-tomcat-5.5-5.1.1.part3.rar

    liferay-administrator-guide-6.0.pdf

    最新的liferay-administrator-guide-6.0 所有关于liferay的管理

    liferay-portal详解

    liferay-portal详解 Liferay Portal 是一个基于 Java 的开源门户平台,提供了一个灵活的框架来构建企业门户和 web 应用程序。本文档将从架构解析、portal 规范、portlet 容器、portlet 生命周期、liferay portal ...

    liferay-portlet-icefaces-archetype-6.1.30.zip

    commons-configuration-gae.zip,配置的实现(由apache commons配置库提供),使用google app engine datastore api存储配置参数;配置的实现(由apache commons配置库提供),使用google app engine datastore api...

Global site tag (gtag.js) - Google Analytics