activiti 工作流会签 / 多人审批时一人通过也可 / 在当前节点获取下一节点的信息 / 流程部署之后发布之前获取所有节点的信息 / 流程启动开始之前传送之后节点办理人 / 同一结点设置多个监听
来源:互联网 发布:广州恒大淘宝俱乐部u16 编辑:程序博客网 时间:2024/06/05 05:34
下面是项目开发中使用到的内容,做一下记录
1. activiti 工作流会签时为所有的都审批通过才可进入下一环节:
1.1 编写监听类
public class MyTaksListener implements TaskListener {
public void notify(DelegateTask delegateTask) {
System.out.println("delegateTask.getEventName() = " + delegateTask.getEventName());
//添加会签的人员,以下所有的都审批通过才可进入下一环节
List<String> assigneeList = new ArrayList<String>();
assigneeList.add("wangba");
assigneeList.add("wangjiu");
delegateTask.setVariable("publicityList",assigneeList);
}
}
1.2 “员工请假申请”中添加此监听类
1.3 “项目组长审批”中
isSequential=false时,表示的并行执行,即该节点下的多条任务可以同时执行。activiti:collection:用于执行该会签环节的参与参与的人,此处是使用的一个名叫publicityList的流程变量activiti:elementVariable:此处表示的是每一个分支都有一个名叫publicity的流程变量,和上方的activiti:assignee结合
以上几个字段的解释可以参照下面这篇文章:http://www.wangchao.net.cn/it/detail_132191.html
1.4 项目组长审批时,通过taskAssignee来获取个人任务
// 获取总记录数
total = taskService.createTaskQuery().taskAssignee(userId).taskNameLike("%" + s_name + "%").count();
// 可以观察表 ACT_RU_TASK 的变化
taskList = taskService.createTaskQuery()
// 根据用户id查询
.taskAssignee(userId)
// 根据任务名称查询
.taskNameLike("%" + s_name + "%")
// 返回带分页的结果集合
.listPage(pageInfo.getPageIndex(), pageInfo.getPageSize());
==================================================================================
2. activiti 工作流多人审批时若一人通过也可进入下一环节:
2.1 编写监听类
public class MangerTaskHandlerCandidateUsers implements TaskListener{
public void notify(DelegateTask delegateTask) {
//添加审批的人员,以下任何一人通过即可进入下一环节
String[] empLoyees = {"wangba","wangjiu"};
delegateTask.addCandidateUsers(Arrays.asList(empLoyees));
}
}
2.2 “项目组长审批”中
2.3 项目组长审批时,通过taskCandidateUser来获取个人任务
// 获取总记录数
total = taskService.createTaskQuery().taskCandidateUser(userId).taskNameLike("%" + s_name + "%").count();
// 有想法的话,可以去数据库观察 ACT_RU_TASK 的变化
taskList = taskService.createTaskQuery()
// 根据用户id查询
.taskCandidateUser(userId)
// 根据任务名称查询
.taskNameLike("%" + s_name + "%")
// 返回带分页的结果集合
.listPage(pageInfo.getPageIndex(), pageInfo.getPageSize());
============================================================================
在当前节点获取下一节点的信息
/**
* 根据实例编号查找下一个任务节点
*
* @param String
* procInstId :实例编号
* @return
*/
@RequestMapping("/backTaskTab")
public TaskDefinition backTaskTab(String taskId) {
Task task = taskService.createTaskQuery() // 创建任务查询
.taskId(taskId) // 根据任务id查询
.singleResult();
String procInstId = task.getProcessInstanceId();
// 流程标示
String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId)
.singleResult().getProcessDefinitionId();
ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(processDefinitionId);
// 执行实例
ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery()
.processInstanceId(procInstId).singleResult();
// 当前实例的执行到哪个节点
String activitiId = execution.getActivityId();
// 获得当前任务的所有节点
List<ActivityImpl> activitiList = def.getActivities();
ActivityImpl activityImpl=null;
for(int i=0;i< activitiList.size();i++){
String flag=activitiList.get(i).getId();
if(flag.equals(activitiId)){
activityImpl=activitiList.get(i);
}
}
String id = null;
int num=activitiList.indexOf(activityImpl);
ActivityImpl activityImpl_=activitiList.get(num+1);
TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl_.getActivityBehavior())
.getTaskDefinition();
// 获取下一节点的代办人
System.out.println(taskDefinition.getCandidateGroupIdExpressions().toArray()[0]);
return null;
}
此篇文章,也具有一定的参照意义:
http://cheen.iteye.com/blog/1591900
============================================================================
流程部署之后发布之前获取所有节点的信息
(参照此篇文章:http://blog.csdn.net/hiyohu/article/details/51682005)
初步设想实现一个部署完工作流之后,为UserTask节点动态分配任务执行者,或者在分支节点上添加进入条件的功能。为了实现这个功能需要解析流程定义文件取出文件中定义的所有节点。这里有两个方法可以实现此功能。
方法一(流程部署至服务器上之后可使用):
方法二 读取流程定义文件方式
InputStream resouceStream = this.getClass().getClassLoader().getResourceAsStream("leave- formkey.bpmn20.xml");
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStreamReader in;
XMLStreamReader xtr;
try {
in = new InputStreamReader(resouceStream, "UTF-8");
xtr = xif.createXMLStreamReader(in);
BpmnModel model = new BpmnXMLConverter().convertToBpmnModel(xtr);
Collection<FlowElement> flowElements = model.getMainProcess().getFlowElements();
for (FlowElement e : flowElements) {
System.out.println("flowelement id:" + e.getId() + " name:" + e.getName() + " class:"
+ e.getClass().toString());
}
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
该方法的好处在于可以解析本地或者未部署至Activiti引擎中的流程定义文件。
两次测试打印结果如下:
流程定义文件leave-formkey.bpmn20.xml:
流程启动开始之前将第二个和第三个节点所需要的人带过去
//下面name2和name3是前台传过来的第二个和第三个节点的办理人
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("leaveId", leaveId);
variables.put("name2", "XXX");//(前台传过来的第二个节点的办理人)
variables.put("name3", "YYY");//(前台传过来的第三个节点的办理人)
// 启动流程
pi = runtimeService.startProcessInstanceByKey("activitiemployeeProcess", variables);
在第一个节点指定第二个节点的监听
public class MyTaksListener2 implements TaskListener {
public void notify(DelegateTask delegateTask) {
Map<String, Object> variables=delegateTask.getVariables();
variables.get("name2");(前台传过来的第二个节点的办理人)
//拆分variables
List<String> assigneeList = new ArrayList<String>();
assigneeList.add("wangba");
delegateTask.setVariable("publicityList",assigneeList);
}
}
在第三个节点指定本节点的办理人监听
public class MyTaksListener3 implements TaskListener {
public void notify(DelegateTask delegateTask) {
Map<String, Object> variables=delegateTask.getVariables();
System.out.println(variables);
variables.get("name3");
// String result=(String) variables.get("name3");(前台传过来的第三个节点的办理人)
String[] empLoyees = {"szx"};
delegateTask.addCandidateUsers(Arrays.asList(empLoyees));
}
}
同一结点设置多个监听
在同一结点设置两个监听,一个是设置本节点的监听,指定办理人;
一个是设置下一个节点的监听,指定会签人;
设置本节点的监听,指定办理人
public class MyTaksListener3 implements TaskListener {
public void notify(DelegateTask delegateTask) {
Map<String, Object> variables=delegateTask.getVariables();
System.out.println(variables);
String result=(String) variables.get("name3");
String[] empLoyees = {"szx"};
delegateTask.addCandidateUsers(Arrays.asList(empLoyees));
}
}
设置下一个节点的监听,指定会签人
public class MyTaksListener4 implements TaskListener {
public void notify(DelegateTask delegateTask) {
Map<String, Object> variables=delegateTask.getVariables();
String result=(String)variables.get("name2");
List<String> assigneeList = new ArrayList<String>();
assigneeList.add("ss");
delegateTask.setVariable("publicityList",assigneeList);
}
}
- activiti 工作流会签 / 多人审批时一人通过也可 / 在当前节点获取下一节点的信息 / 流程部署之后发布之前获取所有节点的信息 / 流程启动开始之前传送之后节点办理人 / 同一结点设置多个监听
- Activiti工作流会签与获取下一节点任务信息
- Activiti工作流之获取流程定义中所有的节点
- Activiti工作流之获取流程定义中所有的节点
- Activiti获取某个流程实例已经审批的节点记录
- activiti中有任务id,获取当前流程节点的信息
- activiti根据当前节点获取下一个节点信息
- activiti 工作流会签 / 多人审批时若一人通过即可
- activiti 工作流会签 / 多人审批时若一人通过即可
- DOM节点信息的获取
- 【Activiti】跳转到工作流的任意节点(本例用跳转到上一节点讲解即流程回退)
- [置顶]自动行政审批流程组件的审批流程节点定义【民间称为工作流组件、官方称为审批流程组件】
- 自动行政审批流程组件的审批流程节点定义【民间称为工作流组件、官方称为审批流程组件】
- activiti 配置节点 连线信息获取
- 工作流中实现一个节点多个节点的顺序审批
- web工作流管理系统开发之十二 同一张表单在流程多节点中流转的权限控件
- 工作流管理系统开发之十二 同一张表单在流程多节点中流转的权限控件
- 工作流中有条件判断节点时有必要的,可以减少划线,多个审批节点共同使用一个判断节点
- Linux 高级编程
- EL表达式与JSTL
- Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)
- C#--抽象类、抽象方法、多态机制
- 我的编程习惯
- activiti 工作流会签 / 多人审批时一人通过也可 / 在当前节点获取下一节点的信息 / 流程部署之后发布之前获取所有节点的信息 / 流程启动开始之前传送之后节点办理人 / 同一结点设置多个监听
- [Leetcode] 388. Longest Absolute File Path 解题报告
- Activiti进阶(一)——HelloWorld
- Hadoop格式化HDFS报错java.net.UnknownHostException: centos0
- 第十一节:多窗口切换
- 文章标题
- python 中model.py详解
- 【PHP】wamp集成环境下PHPStorm安装XDebug插件
- mybatis知识点