package com.zhy.manager.impl;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.zhy.manager.WorkflowManager;
import com.zhy.model.Document;
import com.zhy.model.Workflow;
public class WorkflowManagerImpl extends HibernateDaoSupport implements
WorkflowManager {
private JbpmConfiguration jbpmConfiguration;
public long addProcessInstance(String workflowName, int documentId) {
JbpmContext context = getContext();
//从JBPM中加载流程定义
ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition(workflowName);
//SQLServer 执行到此时,如果该定义已经创建了公文就不能继续创建公文,问题尚未解决
ProcessInstance instance = new ProcessInstance(definition);
//将公文标识绑定到流程实例
instance.getContextInstance().createVariable("document", documentId);
context.save(instance);
//存储流程实例的信息
return instance.getId();
}
public void delProcessInstance(long processInstanceId) {
JbpmContext context = getContext();
//删除流程实例
context.getGraphSession().deleteProcessInstance(processInstanceId);
}
public void delWorkflow(int workflowId) {
//在OA中删除流程的定义
Workflow workflow = (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
getHibernateTemplate().delete(workflow);
//在JBPM中删除流程定义
//JBPM对流程定义按版本进行管理,所以在同一个时刻,可能存在同一个流程定义的多个不同的版本
//如果需要对其删除,则应该删除所有的版本
//查找对应流程定义的所有版本
List defs = getContext().getGraphSession().findAllProcessDefinitionVersions(workflow.getName());
for (Iterator iter = defs.iterator(); iter.hasNext();) {
ProcessDefinition def = (ProcessDefinition) iter.next();
getContext().getGraphSession().deleteProcessDefinition(def);
}
}
public void deployProcessDefinition(byte[] processDefinition,
byte[] processImage) {
//通过byte[]创建ProcessDefinition对象
ProcessDefinition def =
ProcessDefinition.parseXmlInputStream(
new ByteArrayInputStream(processDefinition));
//将流程定义文件部署到JBPM
getContext().deployProcessDefinition(def);
//首先查找一下Workflow对象是否已经存在
Workflow workflow = (Workflow)getSession()
.createQuery("select w from Workflow w where w.name = ? ")
.setParameter(0, def.getName())
.uniqueResult();
//如果流程尚未存在,则创建
if(workflow == null){
workflow = new Workflow();
workflow.setName(def.getName());
workflow.setProcessDefinition(processDefinition);
workflow.setProcessImage(processImage);
getHibernateTemplate().save(workflow);
return;
}
//如果流程已经存在,则更新
workflow.setName(def.getName());
workflow.setProcessDefinition(processDefinition);
workflow.setProcessImage(processImage);
getHibernateTemplate().save(workflow);
}
public Workflow findWorkflow(int workflowId) {
return (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);
}
public String flowToNextStep(String username, long processInstanceId,
String transitionName) {
JbpmContext context = getContext();
String status = null;
ProcessInstance instance = context.getProcessInstance(processInstanceId);
//当前节点
String currentNodeName = instance.getRootToken().getNode().getName();
//起始节点
String startNodeName = instance.getProcessDefinition().getStartState().getName();
//如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
if(currentNodeName.equals(startNodeName)){
//需要使用流程实例的signal()方法来触发流程向下一步流动!
instance.getRootToken().signal(transitionName);
}else{
//首先找出用户的当前任务
List tasks = context.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iter = tasks.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
if(taskInstance.getProcessInstance().getId() == processInstanceId){
//这就是当前文档对应的任务,需要结束这个任务,从而触发流程向下一步骤移动!
taskInstance.end(transitionName);
break;
}
}
}
//将公文当前所处节点作为状态信息返回
status = instance.getRootToken().getNode().getName();
//判断当前的状态是否已经结束!
if(instance.hasEnded()){
status = Document.STATUS_END;
}
return status;
}
@SuppressWarnings("unchecked")
public List<Workflow> searchAllWorkflows() {
return getHibernateTemplate().find("from Workflow");
}
public List<Integer> searchApprovingDocuments(String username) {
JbpmContext context = getContext();
List<Integer> docIds = new ArrayList<Integer>();
//首先获得流转到用户的任务列表
List tasks = context.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iter = tasks.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
//任务实例是否正在等待审批,如果不是,则忽略(即不应该被列到待审批列表中!)
if(!taskInstance.isSignalling()){
continue;
}
//根据其对应的流程实例,获得公文标识
Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");
docIds.add(docId);
}
return docIds;
}
//下一步都有哪些流向?
@SuppressWarnings("unchecked")
public List<String> searchNextTransitions(String username,long processInstanceId) {
JbpmContext context = getContext();
List<String> transitions = new ArrayList<String>();
//根据流程实例标识查找流程实例
ProcessInstance instance = context.getProcessInstance(processInstanceId);
// //根据流程实例,获得当前的节点,从而得到在当前节点下有哪些流向
// List nextSteps = instance.getRootToken().getNode().getLeavingTransitions();
//当前节点
String currentNodeName = instance.getRootToken().getNode().getName();
System.err.println("当前节点名"+currentNodeName);
//起始节点
String startNodeName = instance.getProcessDefinition().getStartState().getName();
System.err.println("起始节点名"+startNodeName);
Collection nextSteps = null;
//如果是在起始节点,因为起始节点不会跟任何人相关联(即不会将任务分配给任何人)
if(currentNodeName.equals(startNodeName)){
//需要使用流程实例的signal()方法来触发流程向下一步流动!
nextSteps = instance.getRootToken().getAvailableTransitions();
System.err.println("nextSteps为:"+nextSteps);
System.err.println("instance.getRootToken().getFullName()为:"+instance.getRootToken().getName());
}else{
//首先找出用户的当前任务
List<TaskInstance> tasks = context.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iter = tasks.iterator(); iter.hasNext();) {
TaskInstance taskInstance = (TaskInstance) iter.next();
if(taskInstance.getProcessInstance().getId() == processInstanceId){
nextSteps = taskInstance.getAvailableTransitions();
break;
}
}
}
for (Iterator iter = nextSteps.iterator(); iter.hasNext();) {
Transition transition = (Transition) iter.next();
transitions.add(transition.getName());
}
return transitions;
}
/**
* 获取JbpmContext对象,需要将JbpmContext的session设置为当前的session对象
* @return
*/
private JbpmContext getContext(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSession(getSession());
return context;
}
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
this.jbpmConfiguration = jb
没有合适的资源?快使用搜索试试~ 我知道了~
jbpm ssh oa 源代码
共222个文件
gif:116个
xml:19个
class:16个
5星 · 超过95%的资源 需积分: 9 230 下载量 95 浏览量
2011-01-23
19:09:26
上传
评论 2
收藏 338KB RAR 举报
温馨提示
本代码为本人参考李腾飞老师的教学视频,模仿李腾飞老师的思路写的,正好填补了他由初级到高级的视频过度阶段的空白,可以利用次源代码继续学习他的复杂部分,当然里面还有很多bug,欢迎对我提出批评和建议,由于有容量限制jar包就不上传了,用mysql会发生字段冲突,我这有修改表的代码,成功生成表后记得在T_user表中写入张三,李四等,要不然你登陆不上去,没有做注册,sqlserver有一个问题至今未解决,有人会的话记得告诉我。(补充:sqlserver的问题已经解决,是因为processinstance的表中的key值没有设,只要在新建流程实例时把key值set进去就行了,key值与id相同,我就不改了,你们自己研究,呵呵)
资源推荐
资源详情
资源评论
收起资源包目录
jbpm ssh oa 源代码 (222个子文件)
WorkflowManagerImpl.class 8KB
NewDocumentAction.class 6KB
DocumentManagerImpl.class 4KB
WorkflowAction.class 3KB
HibernateSessionFactory.class 2KB
Document.class 2KB
LoginAction.class 2KB
WorkflowForm.class 2KB
NewDocumentForm.class 1KB
LoginManagerImpl.class 1KB
LoginForm.class 1KB
Workflow.class 1KB
MyUser.class 920B
WorkflowManager.class 624B
DocumentManager.class 519B
LoginManager.class 233B
.classpath 5KB
org.eclipse.wst.jsdt.ui.superType.container 49B
fox.css 7KB
oa.css 6KB
skin.css 5KB
login.css 1KB
Thumbs.db 175KB
login-content-bg.gif 20KB
login-wel.gif 9KB
logo.gif 7KB
gp.gif 4KB
menu_bg2.gif 4KB
servicezhgb2312.gif 3KB
buttom-right.gif 2KB
ershou_1.gif 2KB
ershou_2.gif 2KB
menu_bgs.gif 2KB
title.gif 2KB
sitebackup.gif 2KB
DefaultDocs.gif 2KB
menu_bg.gif 2KB
tool-down-pic.gif 2KB
buttom-left.gif 2KB
mime.gif 2KB
password.gif 2KB
ad.gif 2KB
lminfo.gif 2KB
defind.gif 2KB
ipsecurity.gif 2KB
user-info.gif 2KB
Redirects.gif 2KB
usercontrol.gif 2KB
menu_bg1.gif 1KB
lm.gif 1KB
Login_but.gif 1KB
pic19.gif 1KB
menu_topline.gif 1KB
pic5.gif 1KB
pic23.gif 1KB
pic18.gif 1KB
yc.gif 1018B
out.gif 859B
nav-right-bg.gif 735B
pic16.gif 651B
icon-demo.gif 648B
icon-login-seaver.gif 633B
icon-phone.gif 633B
imageedit.gif 625B
edit.gif 624B
pic17.gif 622B
report2_(delete).gif 621B
delete.gif 618B
image_(add)6.gif 617B
delete_6.gif 617B
report2_(add).gif 615B
imagedelete.gif 615B
format.gif 610B
image_1.gif 608B
add.gif 606B
pic13.gif 605B
stop.gif 604B
yx.gif 604B
buttom-copy-bg.gif 600B
str.gif 598B
ts.gif 597B
st.gif 594B
icon-mail2.gif 592B
pic14.gif 587B
pic22.gif 585B
pic9.gif 580B
pic8.gif 578B
vie.gif 578B
gw2.gif 570B
pic7.gif 563B
pic15.gif 561B
linkspic3.gif 558B
top-right.gif 556B
pic21.gif 552B
pic24.gif 551B
pic25.gif 535B
close.gif 502B
pic6.gif 440B
luck.gif 429B
set.gif 405B
共 222 条
- 1
- 2
- 3
LovePandaZHY
- 粉丝: 8
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页