您的位置:首页 > 其它

activiti5学习笔记(二)伪审批汇总流程

2013-10-18 14:19 435 查看
伪汇总审批,就是每一条流程都是独立的,这些独立的流程在走到某个节点的时候,这个节点的审批人可以一次性进行多个任务的审批。

开发环境

JDK1.6
Activiti5.13
Eclipse
MYSQL5
简单起见,这里没有做一个web的项目,只是一个Java程序。

业务场景
预算填报员填写本单位的预算,预算提交到本单位的上级进行审批,上级审批后提交到总公司进行审批。
有多少个预算到了总公司审批人处,就可以对多少的预算同时进行审批,这些流程都是相对独立的。
业务数据存储在单独的报表系统中,节点可以配置打开报表的方式,表单ID,及节点是否汇总审批。

程序模拟
为方便起见
1)所有单位的预算员,审批人,汇总审批人都用三个人,kermit, fozzie,admin直接配在流程图中,实际上kermit和fozzie应会是不同的人,可以动态传入流程启动流程
2)节点是否需要汇总,可以根据在节点的参数isSum来进行动态的判定,是否执行汇总审批,程序只是展示效果,具体没有实现动态的,实现起来并不困难。
3)为了直观,节点参数都使用了中文,实际开发中肯定是编码形式

流程参数说明:
流程实例级别的参数有两个,一个填报期间period一个填报单位fillAccount
节点级别的配置参数有四个,三个固定的报表唯一编码sheetId,报表打开方式fillType和是否汇总isSum,一个在流程实例中动态生成的,当前节点的操作单位accountCode

1. 绘制流程图



总体配置



填写预算配置





审批预算配置





汇总审批预算配置





2. 测试程序

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.FormService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.task.Task;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestFormData {
/**
* @param args
*/
public static void main(String[] args) {
// 加载spring配置
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
RuntimeService runtimeService = (RuntimeService) ctx
.getBean("runtimeService");
ProcessEngine processEngine = (ProcessEngine) ctx
.getBean("processEngine");
FormService formService = (FormService) ctx.getBean("formService");
TaskService taskService = (TaskService) ctx.getBean("taskService");
// 发布流程
RepositoryService repositoryService = processEngine
.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("diagrams/formDataTest.bpmn").deploy();
fill(runtimeService, formService, taskService);
singleCheck(formService, taskService);
sum(taskService, formService);
}
/**
* 填报预算
*
* @param runtimeService
* @param formService
* @param taskService
*/
private static void fill(RuntimeService runtimeService,
FormService formService, TaskService taskService) {
// 流程开始参数,设置填报期间
Map<String, Object> p = new HashMap<String, Object>();
p.put("period", "2013-07");
// 生成3家单位填报
for (int i = 0; i < 3; i++) {
// 开始流程
runtimeService.startProcessInstanceByKey("formDataTest", p);
System.out
.println("=====================kermit开始填报=======================");
// query kermit's tasks;
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("kermit").list();
for (Task task : tasks) {
if ("fill".equals(task.getTaskDefinitionKey())) {
// 设置填报人单位编码记录在节点
taskService.setVariableLocal(task.getId(), "accoutCode",
"A110" + i);
// 设置该流程实例的填报单位
taskService.setVariable(task.getId(), "fillAccount", "A110"
+ i);
Map<String, FormProperty> propMap = createMap(formService
.getTaskFormData(task.getId()).getFormProperties());
// 获取节点报表打开类型
String fillType = (String) propMap.get("fillType")
.getValue();
// 获取节点报表表单ID
String sheetId = (String) propMap.get("sheetId").getValue();
// 获取节点是否需要汇总参数
String isSum = (String) propMap.get("isSum").getValue();
// 获取节点填报单位编码
String accoutCode = (String) taskService.getVariableLocal(
task.getId(), "accoutCode");
// 获取流程填报单位编码
String fillAccount = (String) taskService.getVariable(
task.getId(), "fillAccount");
// 获取流程填报期间
String period = (String) taskService.getVariable(
task.getId(), "period");
// 打印填报信息
System.out.println("\t打开报表类型:" + fillType);
System.out.println("\t填报表单:" + sheetId);
System.out.println("\t填报期间:" + period);
System.out.println("\t是否汇总:" + isSum);
System.out.println("\t当前节点账号:" + accoutCode);
System.out.println("\t提交审批表单填报单位:" + fillAccount);
// 节点任务结束
taskService.complete(task.getId());
System.out
.println("=============kermit填写预算单任务已完成=====================");
System.out.println();
}
}
}
}
/**
* 单个审核
*
* @param formService
* @param taskService
*/
private static void singleCheck(FormService formService,
TaskService taskService) {
System.out
.println("=====================fozzie开始单个审核=======================");
// query fozzie's tasks;
List<Task> tasks2 = taskService.createTaskQuery()
.taskAssignee("fozzie")
.processVariableValueEquals("period", "2013-07")
.processDefinitionKey("formDataTest").list();
int count = 1;
for (Task task : tasks2) {
if ("check".equals(task.getTaskDefinitionKey())) {
System.out.println("\t审核第" + count + "个");
// 设置节点审批人单位编码
taskService.setVariableLocal(task.getId(), "accoutCode",
"A1199");
Map<String, FormProperty> propMap = createMap(formService
.getTaskFormData(task.getId()).getFormProperties());
// 获取节点报表打开类型
String fillType = (String) propMap.get("fillType").getValue();
// 获取节点报表表单ID
String sheetId = (String) propMap.get("sheetId").getValue();
// 获取节点是否需要汇总参数
String isSum = (String) propMap.get("isSum").getValue();
// 获取节点填报单位编码
String accoutCode = (String) taskService.getVariableLocal(
task.getId(), "accoutCode");
// 获取流程填报单位编码
String fillAccount = (String) taskService.getVariable(
task.getId(), "fillAccount");
// 获取流程填报期间
String period = (String) taskService.getVariable(task.getId(),
"period");
// 打印填报信息
System.out.println("\t报表打开类型:" + fillType);
System.out.println("\t填报表单:" + sheetId);
System.out.println("\t填报期间:" + period);
System.out.println("\t是否汇总:" + isSum);
System.out.println("\t当前节点账号:" + accoutCode);
System.out.println("\t提交审批表单填报单位:" + fillAccount);
// 节点任务结束
taskService.complete(task.getId());
System.out.println("\t审核第" + count + "个完成");
System.out.println();
count++;
}
}
System.out
.println("===================fozzie审批预算单任务已完成===================");
System.out.println();
}
/**
* 汇总审核
*
* @param taskService
* @param formService
*/
private static void sum(TaskService taskService, FormService formService) {
System.out
.println("=======================admin开始汇总审核=====================");
List<Task> tasks3 = taskService.createTaskQuery()
.taskAssignee("admin")
.processVariableValueEquals("period", "2013-07")
.processDefinitionKey("formDataTest").list();
// 批量审批列表
List<String> completeTaskIdList = new ArrayList<String>();
// 获取节点报表打开类型
String fillType = "";
// 获取节点报表表单ID
String sheetId = "";
// 获取节点是否需要汇总参数
String isSum = "";
// 获取流程填报期间
String period = "";
for (Task task : tasks3) {
if ("sum".equals(task.getTaskDefinitionKey())) {
// 设置节点审批人单位编码
taskService.setVariableLocal(task.getId(), "accoutCode",
"A1199");
// 获取流程填报单位编码
String fillAccount = (String) taskService.getVariable(
task.getId(), "fillAccount");
Map<String, FormProperty> propMap = createMap(formService
.getTaskFormData(task.getId()).getFormProperties());
// 获取节点报表打开类型
fillType = (String) propMap.get("fillType").getValue();
// 获取节点报表表单ID
sheetId = (String) propMap.get("sheetId").getValue();
// 获取节点是否需要汇总参数
isSum = (String) propMap.get("isSum").getValue();
// 获取流程填报期间
period = (String) taskService.getVariable(task.getId(),
"period");
// 打印填报信息
System.out.println("\t提交汇总审批表单填报单位:" + fillAccount);
// 加入批量审批列表
completeTaskIdList.add(task.getId());
}
}
System.out.println("\t报表打开类型:" + fillType);
System.out.println("\t填报表单:" + sheetId);
System.out.println("\t填报期间:" + period);
System.out.println("\t是否汇总:" + isSum);
System.out.println("\t全部审批通过");
for (String t : completeTaskIdList) {
taskService.complete(t);
}
System.out.println("=========admin汇总预算单任务已完成,汇总审批"
+ completeTaskIdList.size() + "个单位=======");
}
private static Map<String, FormProperty> createMap(List<FormProperty> props) {
Map<String, FormProperty> re = new HashMap<String, FormProperty>();
for (FormProperty p : props) {
re.put(p.getId(), p);
}
return re;
}
}


3. 运行结果

=====================kermit开始填报=======================
打开报表类型:普通填报
填报表单:1
填报期间:2013-07
是否汇总:不汇总
当前节点账号:A1100
提交审批表单填报单位:A1100
=============kermit填写预算单任务已完成=====================

=====================kermit开始填报=======================
打开报表类型:普通填报
填报表单:1
填报期间:2013-07
是否汇总:不汇总
当前节点账号:A1101
提交审批表单填报单位:A1101
=============kermit填写预算单任务已完成=====================

=====================kermit开始填报=======================
打开报表类型:普通填报
填报表单:1
填报期间:2013-07
是否汇总:不汇总
当前节点账号:A1102
提交审批表单填报单位:A1102
=============kermit填写预算单任务已完成=====================

=====================fozzie开始单个审核=======================
审核第1个
报表打开类型:普通打开
填报表单:2
填报期间:2013-07
是否汇总:不汇总
当前节点账号:A1199
提交审批表单填报单位:A1100
审核第1个完成

审核第2个
报表打开类型:普通打开
填报表单:2
填报期间:2013-07
是否汇总:不汇总
当前节点账号:A1199
提交审批表单填报单位:A1101
审核第2个完成

审核第3个
报表打开类型:普通打开
填报表单:2
填报期间:2013-07
是否汇总:不汇总
当前节点账号:A1199
提交审批表单填报单位:A1102
审核第3个完成

===================fozzie审批预算单任务已完成===================

=======================admin开始汇总审核=====================
提交汇总审批表单填报单位:A1100
提交汇总审批表单填报单位:A1101
提交汇总审批表单填报单位:A1102
报表打开类型:汇总到一张表打开
填报表单:3
填报期间:2013-07
是否汇总:汇总
全部审批通过
=========admin汇总预算单任务已完成,汇总审批3个单位=======

附applicationContext.xml,数据库使用MYSQL5

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="dataSource"
class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test_activiti" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Activiti begin -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
<property name="history" value="full" />
<property name="processDefinitionCacheLimit" value="10" />
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService" />
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<bean id="formService" factory-bean="processEngine"
factory-method="getFormService" />
<bean id="identityService" factory-bean="processEngine"
factory-method="getIdentityService" />
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<bean id="historyService" factory-bean="processEngine"
factory-method="getHistoryService" />
<bean id="managementService" factory-bean="processEngine"
factory-method="getManagementService" />
<!-- Activiti end -->

</beans>


项目引用jar包就是activiti-explorer里用的所有jar包+mysql的驱动

END
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: