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. 绘制流程图
![](http://img.blog.csdn.net/20131018141614875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
总体配置
![](http://img.blog.csdn.net/20131018141630718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
填写预算配置
![](http://img.blog.csdn.net/20131018141859640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20131018141905609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
审批预算配置
![](http://img.blog.csdn.net/20131018141640234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20131018141644796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
汇总审批预算配置
![](http://img.blog.csdn.net/20131018141707375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20131018141727375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmx1ZWxpbmc1MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2. 测试程序
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
项目引用jar包就是activiti-explorer里用的所有jar包+mysql的驱动
END
开发环境
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
相关文章推荐
- java日期相加减
- 第二章 CCNode基类
- 数组
- poj 1068 Parencodings(模拟)
- erlang杂记十二--再说尾递归
- 第八周作业---求函数的值
- 虚基类
- 使用字节码asm将pojo转换成Map,直接构造mongodb bsonobject
- include <stdio.h>
- 第一章 cocos2d简介
- php判断是否是手机登陆
- Django Session处理
- P2P网贷 天标/秒标 【超高风险、超高回报】
- 一个网页抓取的类支持get+post+cookie存储
- flex时间创建和比较总结
- 泛型与非泛型
- nginx配置安装
- 提升代码内外部质量的22条经验
- Android:Service非绑定
- 提升代码内外部质量的22条经验