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

伪汇总审批,就是每一条流程都是独立的,这些独立的流程在走到某个节点的时候,这个节点的审批人可以一次性进行多个任务的审批。
 
开发环境
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. 绘制流程图

总体配置
 activiti5学习笔记(二)伪审批汇总流程_第1张图片
填写预算配置
activiti5学习笔记(二)伪审批汇总流程_第2张图片
activiti5学习笔记(二)伪审批汇总流程_第3张图片

审批预算配置
activiti5学习笔记(二)伪审批汇总流程_第4张图片
activiti5学习笔记(二)伪审批汇总流程_第5张图片
汇总审批预算配置
 activiti5学习笔记(二)伪审批汇总流程_第6张图片
activiti5学习笔记(二)伪审批汇总流程_第7张图片
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

你可能感兴趣的:(activiti5)