ssh2+jbpm4.4 完整请假流程

自从前些日子发布了如何整合JBPM4.4+ssh2后,有些朋友问我有没有一个完整一点的实例,我看过贩卖你的jbpm的教程,我就参考那个请假的实例把它改装成ssh2版的吧。顺便也加入了模拟不同的角色登陆后能接到不同的待办任务,我也不多啰嗦,在这里我贴出action代码,

package com.zwl.action;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipInputStream;

import javax.servlet.ServletOutputStream;

import org.apache.struts2.ServletActionContext;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.zwl.vo.ProcessVo;

public class JbpmAction extends ActionSupport
{

private ProcessEngine processEngine;
private RepositoryService repositoryService;
private ExecutionService executionService;
private TaskService taskService ;
private String id;
private List<ProcessDefinition> processDefinitionList;
private List<ProcessInstance> processInstanceList;
private List<Task> taskList;
private ActivityCoordinates ac;
private ProcessVo processVo;
private Map<String, Object> map;
private String result;

public void setId(String id)
{
this.id = id;
}

public String getId()
{
return id;
}



public ActivityCoordinates getAc()
{
return ac;
}

public List<ProcessInstance> getProcessInstanceList()
{
return processInstanceList;
}

public List<Task> getTaskList()
{
return taskList;
}

private void init()
{
repositoryService=processEngine.getRepositoryService();
executionService=processEngine.getExecutionService();
taskService=processEngine.getTaskService();
}

public List<ProcessDefinition> getProcessDefinitionList()
{
return processDefinitionList;
}

private String userName;

public String getUserName()
{
return userName;
}


public void setUserName(String userName)
{
this.userName = userName;
}


@SuppressWarnings("unchecked")
public String login()
{
Map map=ActionContext.getContext().getSession();
map.put("user", userName);
return SUCCESS;
}

/**
* 加载首页
* @return
*/
public String loadIndexPage()
{
init();
processDefinitionList=repositoryService.createProcessDefinitionQuery().list();
processInstanceList=executionService.createProcessInstanceQuery().list();


//这里模拟不同的角色登陆系统,会接到不同的待办任务
String manager="zwllxs1,zwllxs2,zwllxs3,zwllxs4";
String boss="zhangweilin,zhangweilin2,zhangweilin3,zhangweilin4";
String roleName="";//要按此名去查找它所在的节点

String name=getLoginedUserName();

//经理登陆
if(manager.contains(name))
{
roleName="manager";
}
//老板登陆
else if(boss.contains(name))
{
roleName="boss";
}
//普通用户
else
{
roleName=name;
}

System.out.println("roleName: "+roleName);
taskList=taskService.findPersonalTasks(roleName);
System.out.println("taskList: "+taskList);
return SUCCESS;
}

/**
* 部署
* @return
*/
public String deploy()
{
System.out.println("部署");
init();
// String did=repositoryService.createDeployment().addResourceFromClasspath("leave2.jpdl.xml").deploy();
ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
//发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
String did=repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();

//使用zip方式
// ZipInputStream zis = new ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
// //发起流程,仅仅就是预定义任务,即在系统中创建一个流程,这是全局的,与具体的登陆 用户无关。然后,在启动流程时,才与登陆用户关联起来
// String did=repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();

System.out.println("did: "+did);
return SUCCESS;
}

/**
* 启动
* @return
*/
@SuppressWarnings("unchecked")
public String start()
{
init();
Map map = new HashMap();
//在启动任务时,等于就是一个用户要请假了,那么,此时,要把流程信息关联到此用户上,在开始的下一个节点(也就是第一个任务节点),是指派给。所以用户名要与其对应的变量关联起来
map.put("owner", getLoginedUserName());
System.out.println("id_: "+id);
ProcessInstance processInstance=executionService.startProcessInstanceById(id, map);
System.out.println("启动时processInstance: "+processInstance.getId());
return SUCCESS;
}

/**
*
* @return
*/
public String manager()
{
init();
Task task = taskService.getTask(id);
String taskId=task.getId();
Set<String> strSet=new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
// taskService.getVariable(taskId, "owner");
map=taskService.getVariables(taskId, strSet);
System.out.println("map: "+map);
return SUCCESS;
}

/**
* 老板来了
* @return
*/
public String boss()
{
init();
Task task = taskService.getTask(id);
String taskId=task.getId();
Set<String> strSet=new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
strSet.add("sex");
strSet.add("age");
// taskService.getVariable(taskId, "owner");
map=taskService.getVariables(taskId, strSet);
return SUCCESS;
}

/**
* 老板处理
* @return
*/
public String submitBoss()
{
init();
taskService.completeTask(id);
return SUCCESS;
}

/**
* 经理提交
* @return
*/
public String submitManager()
{
init();
taskService.completeTask(id, result);
return SUCCESS;
}

/**
* 移除
* @return
*/
public String remove()
{
init();
repositoryService.deleteDeploymentCascade(id);
return SUCCESS;
}

/**
* 显示
* @return
*/
public String view()
{
init();
//通过id查到流程实例
ProcessInstance processInstance = executionService.findProcessInstanceById(id);
Set<String> activityNames = processInstance.findActiveActivityNames();

//Coordinates为相依衣物
ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),activityNames.iterator().next());
return SUCCESS;
}

/**
* 显示图片
* @throws IOException
*/
public void pic() throws IOException
{
init();
ProcessInstance processInstance = executionService.findProcessInstanceById(id);
String processDefinitionId = processInstance.getProcessDefinitionId();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).uniqueResult();

String path=ServletActionContext.getRequest().getRealPath("");
// String filePath=path+"\\WEB-INF\\classes\\leave2.png";
String filePath="leave2.png";
System.out.println("filePath: "+filePath);
File file=new File(filePath);
System.out.println("存在么: "+file.exists());

//此处不知道为什么还要特别的通过repositoryService和processDefinition.getDeploymentId()来显示此图片
InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),filePath);
System.out.println("inputStream2: "+inputStream);
//InputStream inputStream =new FileInputStream(new File("D:/program/java/servers/apache-tomcat-5.5.23/webapps/jbpm2/WEB-INF/classes/leave.png"));
byte[] b = new byte[1024];
int len = -1;
ServletOutputStream sos=ServletActionContext.getResponse().getOutputStream();
while ((len = inputStream.read(b, 0, 1024)) != -1)
{
sos.write(b, 0, len);
}
sos.close();
}


/**
* 提交
* @return
*/
@SuppressWarnings("unchecked")
public String submit()
{
init();
Map map = new HashMap();
//此day, 在xml文件中,有一个decision标签,里面有一个表达式:expr="#{day > 3 ? '老板审批' : '结束'}"
//即它与表达式中的day关联
map.put("day", processVo.getDay());
map.put("reason", processVo.getReason());
map.put("name", "张伟林submit");
//如果第二个参数为字符串,则是指定要向哪个方向完成,此是指定要向testhaha完成,并且如果线条上指定了文字,
//就只能按着文字去指定方向,如果没有文字,才能用map,
//也就是说,如果传递的参数为map,则流程会去寻找没定义名称的线条走,如果没找到。就抛出No unnamed transitions were found for the task 异常
//taskService.completeTask(taskId, "testhaha");
//如果第二个参数为map,则表示只是传递参数而已
System.out.println("提交完毕");
taskService.completeTask(processVo.getTaskId(), map);
return SUCCESS;
}

public String getLoginedUserName()
{
return (String) ActionContext.getContext().getSession().get("user");
}

public void setProcessEngine(ProcessEngine processEngine)
{
this.processEngine = processEngine;
}

/**
*
*/
private static final long serialVersionUID = 7726442371304781094L;

public ProcessVo getProcessVo()
{
return processVo;
}

public void setProcessVo(ProcessVo processVo)
{
this.processVo = processVo;
}

public Map<String, Object> getMap()
{
return map;
}

public String getResult()
{
return result;
}

public void setResult(String result)
{
this.result = result;
}




}


完整的可运行项目代码下载地址为:[url]http://download.csdn.net/source/2671401[/url]


很多朋友要求我把jar包也上传,jar包下载地址为:
[url]http://download.csdn.net/source/3084268[/url]


zwllxs@163.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值