activiti工作流框架简介

常见的工作流框架:activiti, JBPM, OSWorkflow

activiti框架基于23张基础的表数据, 基于Mybatis操作数据库.

JBPM框架基于18张基础的表数据, 基于hibernate操作数据库.

一. activiti基础数据表的创建

1.通过sql创建

导入activiti-5.13\database\create目录下的sql建表语句, 如果数据库是mysql, 则需要导入activiti.mysql.create.engine.sql, activiti.mysql.create.history.sql, activiti.mysql.create.identity.sql三张表;

2.通过java代码创建

2.1 在不提供xml配置文件的情况下

  //通过在java中创建流程引擎配置对象来创activiti的基础表数据
    @Test
    public void demo1 () {
        //创建流程引擎配置对象
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        configuration.setJdbcDriver("com.mysql.jdbc.Driver");
        configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti_demo");
        configuration.setJdbcUsername("root");
        configuration.setJdbcPassword("123");
        //设置自动建表
        configuration.setDatabaseSchemaUpdate("true");
        //创建流程引擎对象, 在创建流程引擎对象时会自动建表
        ProcessEngine buildProcessEngine = configuration.buildProcessEngine();
    }

2.2 提供xml配置文件

1.配置文件位于src根路径下, 名称为activiti-context.xml

    <!-- 配置一个流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
        class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_demo"></property>
        <property name="jdbcUsername" value="root"></property>
        <property name="jdbcPassword" value="luoji1025"></property>
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>
    
    <!-- 配置一个流程引擎工厂bean用于创建流程引擎配置对象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"></property>
    </bean>
</beans>

2.Java代码

     //通过配置文件结合java代码实现activiti基础表的创建
    @Test
    public void demo2() {
        //通过配置文件,创建流程引擎配置对象
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.
                createProcessEngineConfigurationFromResource("activiti-context.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
    }

 2.3 使用默认的配置文件(推荐使用)

  要求配置文件必须在类路径的根路径下,配置文件的名称必须为activiti-context.xml或者为activiti.cfg.xml,xml配置文件中必须配置流程引擎配置对象,id必须为processEngineConfiguration,必须配置流程引擎工厂bean,id必须为processEngine(具体配置与上面的xml一致)

     //通过默认的配置文件创建activiti基础表
    @Test
    public void demo3 () {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    }

二. activiti中23张表的介绍

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

1)      ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

2)      ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

3)      ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。

4)      ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_GE_*: 通用数据, 用于不同场景下。

  业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)

 三. activiti中常用的对象

3.1 几个和流程相关的对象

Deployment:部署对象,和部署表对应act_re_deployment

ProcessDefinition:流程定义对象,和流程定义表对应act_re_procdef

ProcessInstance:流程实例对象,和流程实例表对应act_ru_execution

Task:任务对象,和任务表对应act_ru_task

 

3.2 几个Service对象

RepositoryService:操作部署、流程定义等静态资源信息

RuntimeService:操作流程实例,启动流程实例、查询流程实例、删除流程实例等动态信息

TaskService:操作任务,查询任务、办理任务等和任务相关的信息

HistoryService:操作历史信息的,查询历史信息

IdentityService:操作用户和组

 

3.3  几个Query对象

DeploymentQuery:对应查询部署表act_re_deployment

ProcessDefinitionQuery:对应查询流程定义表act_re_procdef

ProcessInstanceQuery:对应查询流程实例表act_ru_execution

TaskQuery:对应查询任务表act_ru_task

 四. Activiti流程定义框架中常用的API

 4.1 部署与流程定义相关的API

4.1.1 部署流程定义

1>基于元数据(bpmn和png)文件创建

 /*
     * 部署流程定义
     * 影响的表
     * 1.act_re_deployment:部署表
     * 2.act_re_procdef:流程定义表(流程部署后,会在流程定义表中创建一个流程定义对象)
     * 3.act_ge_bytearray:二进制表(保存bpmn和png文件)
     */

 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    @Test
    public void demo4 () {
        //创建一个部署构建器对象, 用于加载制定的文件
        DeploymentBuilder deployment = processEngine.getRepositoryService().createDeployment();
        deployment.addClasspathResource("qjlc.bpmn");
        deployment.addClasspathResource("qjlc.png");
        //部署,返回部署对象
        Deployment deploy = deployment.deploy();
        System.out.println(deploy.getId());
    }

2> 基于bpmn和png文件的压缩文件创建

@Test
    public void demo1 () {
        //获取文件部署构建器对象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
        //2.通过zip文件部署(常用)
        ZipInputStream zipInputStream = new ZipInputStream(this.getClass().getClassLoader()
                .getResourceAsStream("qjlc.zip"));
        deploymentBuilder.addZipInputStream(zipInputStream);
        Deployment deploy = deploymentBuilder.deploy();
        System.out.println(deploy.getId());
    }

 4.1.2 查询部署信息

    @Test
    public void demo2 () {
        DeploymentQuery query = processEngine.getRepositoryService().createDeploymentQuery();
//        query.deploymentId("701");
        List<Deployment> list = query.list();
        for (Deployment deployment : list) {
            System.out.println(deployment.getId() + " " + deployment.getName());
        }
    }

 4.1.3 删除部署信息

    /*
     * 删除部署信息
     */
    @Test
    public void demo3 () {
        String deploymentId = "601";
        boolean cascade = false;
        processEngine.getRepositoryService().deleteDeployment(deploymentId, cascade);
    }

 4.1.4 查询流程定义

 /*
     * 查询流程定义
     * 操作的数据表:act_re_procdef流程定义表
     */
    @Test
    public void demo5 () {
        //获取流程定义查询对象
        ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
        //根据流程定义的key进行过滤
        query.processDefinitionKey("qjlc");
        //添加排序条件
        query.orderByProcessDefinitionVersion().desc();

   //查询最新的版本

   query.latestVersion();
        //查询
        List<ProcessDefinition> list = query.list();
        for (ProcessDefinition definition : list) {
            System.out.println(definition.getId() + " " + definition.getKey() + " " + definition.getName());
        }
    }

4.1.5 查询一次部署对应的流程部署文件名称和输入流 

   @Test
    public void demo5 () {
        String deploymentId = "1";
        List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
        for (String name : names) {
            System.out.println(name);
            InputStream inputStream = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
            try {
                FileUtils.copyInputStreamToFile(inputStream, new File("E:\\"+name));
                inputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

4.1.6 获取文件名称和输入流

    @Test
    public void demo6 () throws IOException {
        //获取流程定义的id
        String processDefinitionId = "qjlc:4:904";
        //获取流程定义查询对象
        ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
        //根据id进行查询
        query.processDefinitionId(processDefinitionId);
        //调整查询结果集
        ProcessDefinition processDefinition = query.singleResult();
        //根据流程定义对象获取png图片的名称
        String name = processDefinition.getDiagramResourceName();
        //获取png图片对应的输入流
        InputStream inputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);
        //调用fileutils工具类查询数据
        FileUtils.copyInputStreamToFile(inputStream, new File("e:\\"+name));
        inputStream.close();
    }

 4.2 流程定义实例和任务相关的API

 4.2.1 启动流程定义实例

  /*
     * 启动流程实例
     * 操作的数据表:
     * 1.act_ru_execution:流程实例表
     * 2.act_ru_task:任务表(启动流程实例时,会在任务表中创建一个任务)
     */
    @Test
    public void demo6 () {
        //流程定义的id
        String processId = "qjlc:1:4";
        //通过runtimeservice启动流程实例
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(processId);
        System.out.println(processInstance.getId() + "  " + processInstance.getBusinessKey() + "  " + processInstance.getParentId());    
    }

4.2.2 查询流程实例

    @Test
    public void demo8 () {
        ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
        List<ProcessInstance> list = query.list();
        for (ProcessInstance processInstance : list) {
            System.out.println(processInstance.getId() + " " + processInstance.getActivityId());
        }
        //查询任务
        TaskQuery query2 = processEngine.getTaskService().createTaskQuery();
        List<Task> list2 = query2.list();
        for (Task task : list2) {
            System.out.println(task.getId() + "  " + task.getName());
        }
    }

 4.2.3 查询任务

     /*
     * 查询任务
     */
    @Test
    public void demo7 () {
        TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();
        taskQuery.taskAssignee("王五");
        List<Task> list = taskQuery.list();
        for (Task task : list) {
            System.out.println(task.getId() + "  " + task.getName());
        }
    }

 4.2.4 办理任务

     /*
     * 办理任务
     */
    @Test
    public void demo8 () {
        String taskId = "402";
        processEngine.getTaskService().complete(taskId);
    }

五. 流程变量

5.1流程变量的创建

流程变量的创建有四种方式:创建流程实例时创建, 办理任务时创建, 基于runtimeservice创建, 基于taskservice创建

5.1.1 当流程实例启动时设置流程变量

     @Test
    public void demo2 () {
        String processDefinitionId = "qjlc:5:1604";
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("key1", "value1");
        variables.put("key2", "value2");
        ProcessInstance  processInstance = processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId, variables);
        System.out.println(processInstance.getId());
    }

 5.1.2 在办理任务时创建

     @Test
    public void demo3 () {
        TaskService taskService = processEngine.getTaskService();
        TaskQuery taskQuery = taskService.createTaskQuery();
        List<Task> list = taskQuery.list();
        for (Task task : list) {
            System.out.println(task.getId());
            String taskId = task.getId();
            Map<String, Object> variables = new HashMap<String, Object>();
            variables.put("k1", "v1");
            variables.put("k2", "v2");
            taskService.complete(taskId, variables);
        }
        
    }

5.1.3 利用runtimeservice创建流程变量

     @Test
    public void demo4 () {
        String executionId = "1701";
        String variableName = "qjyy";
        Object value = "想请假了!";
        //创建单个流程变量
        processEngine.getRuntimeService().setVariable(executionId, variableName, value);
        //创建多个流程变量
        Map<String, Object> variables = new HashMap<>();
        variables.put("k3", "v3");
        variables.put("k4", "v4");
        processEngine.getRuntimeService().setVariables(executionId, variables);
    }

5.1.4 利用taskservice创建流程变量

     @Test
    public void demo5 () {
        String taskId = "1804";
        String variableName = "qjts";
        Object value = 7;
        //创建单个流程变量
        processEngine.getTaskService().setVariable(taskId, variableName, value);
        //创建多个流程对象
        Map<String, Object> variables = new HashMap<>();
        variables.put("k5", "v5");
        variables.put("k6", "v6");
        processEngine.getTaskService().setVariables(taskId, variables);
    }

 5.1.5 流程变量中存放自定义对象(自定义对象要实现Serializable接口)

     @Test
    public void demo5_1 () {
        //创建流程实例
        /*String processDefinitionKey = "qjlc";
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey );
        System.out.println(processInstance.getId());*/
        //创建流程变量
        String executionId = "2501";
        Map<String, Object> variables = new HashMap<>();
        User user = new User();
        user.setUsername("老王");
        user.setPassword("123");
        variables.put("user", user );
        processEngine.getRuntimeService().setVariables(executionId , variables);
    }

自定义对象User

package cn.rodge.activiti.variable;
import java.io.Serializable;
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

 5.2 流程变量的获取

 5.2.1 基于RuntimeService获取

     @Test
    public void demo6 () {
        String executionId = "1701";
        String variableName = "qjts";
        //获取单个流程变量
        Object variable = processEngine.getRuntimeService().getVariable(executionId, variableName);
        System.out.println(variable);
        //获取多个流程变量
        Map<String, Object> variables = processEngine.getRuntimeService().getVariables(executionId);
        System.out.println(variables);
    }

 5.2.2 基于TaskService获取

    @Test
    public void demo7 () {
        String taskId = "1804";
        String variableName = "qjyy";
        //获取单个流程变量
        Object variable = processEngine.getTaskService().getVariable(taskId, variableName);
        System.out.println(variable);
        Object getVariables;
        //获取多个流程变量, 获取当前流程所在流程实例中的所有流程变量
        Map<String, Object> variables = processEngine.getTaskService().getVariables(taskId);
        System.out.println(variables);
    }

 六. 组任务

6.1 候选人组任务

 

6.1.1 查询组任务

    @Test
    public void demo5 () {
        TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();
        taskQuery.taskCandidateUser("李四");
        List<Task> list = taskQuery.list();
        for (Task task : list) {
            System.out.println(task.getId() + "  " + task.getName());
        }
    }

6.1.2 拾取组任务

    @Test
    public void demo6 () {
        String taskId = "3802";
        String userId = "李四";
        processEngine.getTaskService().claim(taskId, userId);
    }

 6.1.3 退回组任务

     @Test
    public void demo7 () {
        String taskId = "3802";
        String userId = null;
        processEngine.getTaskService().setAssignee(taskId, userId);
    }

 6.2 候选组组任务

 

6.2.1 创建组

        @Test
        public void demo3 () {
            Group group = new GroupEntity();
            group.setId("财务人员组");
            group.setName("财务人员组");
            processEngine.getIdentityService().saveGroup(group);
        }

6.2.2 创建用户

    @Test
    public void demo4 () {
        User user = new UserEntity();
        user.setId("002");
        user.setFirstName("小明");
        processEngine.getIdentityService().saveUser(user);
    }

6.2.3 将用户添加到组

    @Test
    public void demo5 () {
        String groupId = "财务人员组";
        String userId = "002";
        processEngine.getIdentityService().createMembership(userId, groupId);
    }

6.2.4 查询组任务

    @Test
    public void demo8 () {
        TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();
        taskQuery.taskCandidateUser("002");
        List<Task> list = taskQuery.list();
        for (Task task : list) {
            System.out.println(task.getId() + " " + task.getName());
        }
    }

6.2.5 拾取组任务

    @Test
    public void demo9 () {
        String userId = "002";
        String taskId = "4702";
        processEngine.getTaskService().claim(taskId, userId);
    }

拾取完组任务后,就可以按照正常的任务办理流程办理任务了

6.2.6 退回组任务

     @Test
    public void demo10 () {
        String userId = null;
        String taskId = "4702";
        processEngine.getTaskService().setAssignee(taskId, userId);
    }

 七. 网关(排他网关)

 

 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /*
     * 部署流程
     */
    @Test
    public void demo1() {
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
        deploymentBuilder.addClasspathResource("cn/rodge/activiti/gatewall/bxlcnew.bpmn");
        deploymentBuilder.addClasspathResource("cn/rodge/activiti/gatewall/bxlcnew.png");
        Deployment deploy = deploymentBuilder.deploy();
        System.out.println(deploy.getId());
    }

    /*
     * 创建流程实例
     */
    @Test
    public void demo2() {
        String processDefinitionKey = "cwlc";
        ProcessInstance processInstance = processEngine.getRuntimeService()
                .startProcessInstanceByKey(processDefinitionKey);
        System.out.println(processInstance.getId());
    }

    /*
     * 查询流程实例
     */
    @Test
    public void demo3() {
        ProcessInstanceQuery processInstanceQuery = processEngine.getRuntimeService().createProcessInstanceQuery();
        List<ProcessInstance> list = processInstanceQuery.list();
        for (ProcessInstance processInstance : list) {
            System.out.println(processInstance.getId() + "  " + processInstance.getActivityId());
        }
    }
    /*
     * 查询任务
     */
    @Test
    public void demo4 () {
        TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();
        taskQuery.taskAssignee("王五");
        List<Task> list = taskQuery.list();
        for (Task task : list) {
            System.out.println(task.getId() + "  " + task.getAssignee());
        }
    }
    /*
     * 执行任务同时创建变量bxje
     */
    @Test
    public void demo5 () {
        String taskId = "6004";
        Map<String, Object> variables = new HashMap<>();
        variables.put("bxje", 2000);
        processEngine.getTaskService().complete(taskId, variables);
    }

 当定义的流程变量bxje>1000时, 就会执行"财务主管审批"的分支

 八. spring整合activiti

第一步:提供spring配置文件,配置数据源、事务管理器、spring提供的流程引擎配置对象、流程引擎工厂bean

 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-2.5.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/activiti_demo"></property>
        <property name="username" value="root"></property>
        <property name="password" value="luoji1025"></property>
    </bean>
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置一个Spring整合流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
        class="org.activiti.spring.SpringProcessEngineConfiguration">
        <!-- 配置数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 配置事务 -->
        <property name="transactionManager" ref="transactionManager"></property>
        <!-- 配置自动activiti的自动建表 -->
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>
    
    <!-- 配置一个流程引擎工厂bean用于创建流程引擎配置对象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"></property>
    </bean>
</beans>

 java代码

public class ActivitiSpring {
    public static void main(String[] args) {
        // 获取配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 从配置文件中获取流程引擎对象
        ProcessEngine processEngine = (ProcessEngine) context.getBean("processEngine");
        ProcessDefinitionQuery definitionQuery = processEngine.getRepositoryService().createProcessDefinitionQuery();
        List<ProcessDefinition> list = definitionQuery.list();
        for (ProcessDefinition processDefinition : list) {
            System.out.println(processDefinition.getId() + "  " + processDefinition.getName());
        }
    }
}

 

转载于:https://www.cnblogs.com/rodge-run/p/6492842.html

宏天BPM X3软件平台是一个易于部署和使用的新一代业务流程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务流程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM流程管 理架构。通过实施BPM方案让您的企业在运营效率、透明度、控制力和敏捷性方面迅速受益。 BPMX3是基于J2EE开源、轻量级的企业业务开发平台,基于代码重用、组件重用、业务逻辑重用、组装重用,结合快速开发平台中的工具,将开发人员从重复的代码编写中解放出来,把更多的精力集中解决客户的业务逻辑处理上。 BPMX3是支持流程管理、监控、优化、再造的全套IT管理开发平台,并且集单点登录、企业单位门户、业务流程管理、开发、整合、业务分析及重构等多重职能于一身的软件开发工具和企业IT架构平台。 BPMX3是企业管理业务的创新关键,可以帮忙用户更科学、更有效管理企业业务的各个环节,企业通过BPMX3可以明显实现业务的高效运营。同时,由于其架构的开放性,采用业界开放性的技术及流程标准,使其能够成为企业SOA架构的流程基础平台及开发平台,越来越多的企业更偏向采用开源的平台来解决其内部的信息化平台的要求,BPMX3却允许更多的平台系统接入及自身扩展更多的功能,以满足更多的企业不同的个性化的需求,以达到最大满足最终的客户使用要求。 【图一】工作流引擎中心 1.BPMX3的特点 1.是一个开放式、轻量级的开发平台 2.BPMX3多层系统架构 3.基于模板代码生成 4.丰富的报表展示 5.跨数据库的数据访问支持 6.简易的前端使用 7.参照最新的BPMN2标准设计 8.满足中国特色流程需求 9.在线的可视化流程设计、可视化的流程监控 10.完全独立的流程引擎服务,可与其他系统无缝集成 11.基于流行的JAVA 流程引擎Activiti 5.8扩展 12.灵活的在线流程定义 13.灵活的嵌入式部署、独立部署 14.灵活的在线表单定义及版本管理(支持按内表及外部表及视图生成表单) 15.灵活的第三方表单集成 16.开放式的流程体系 17.灵活的组织结构支持 18.流程的导入与导出 19.子流程支持 20.流程任务逐步回退处理(任务追回及多驳回 ) 21.流程自由跳转 22.流程跳转业务规则设置 23.多级分发任务与任务汇总 24.会签(并行与串行)、补签及投票处理 25.流程版本变更管理 26.流程催办(基于MQ短信及邮件设置) 27.流程任务的工作日设置(用于统计流程任务执行效率) 28.任务监控管理 29.流程委办、转办 2.BPMX3多层架构 系统采用多层的系统架构进行功能开发,有利于代码功能责任分开,同时有利于不同开发人员的分工及合作,也有利于代码的单元测试。系统总体结构如下图所示: 【图二】BPMX3多层架构 •数据访问层Dao: 负责与数据库交互 •业务处理层Service: 负责系统的所有业务逻辑处理 •数据控制层Controller: 负责系统的页面数据准备及跳转处理 •视图层View :负责数据的展示处理 整合的开源技术 1.Spring Core 3.0.4 2.Spring MVC 3.0 3.Spring Security 3.0.5 4.Spring AOP 3.0.4 5.Apache Active MQ 5.5 6.MyBatis 3 7.CKEditor 3.6 8.JQuery 1.8 9.CXF 2.0 10.Alfresco Activiti 5.8 11.Compass + Lucene 12.JasperReport 4.5 13.JavaMail 14.Other: Log4j,Velocity,Sitemesh,Jfreechart,Jforum,Solr 15.Maven 2 3.BPMX3的组件构建方式 BPMX3同时也是基于组件构构建,整个系统的构建如下所示: 【图三】BPMX3组件构建 系统提供在线流程设计器,在线表单设计器,代码生成器,结合BPMX3的基础组件,以实现复杂的流程业务应用。基础组件包括: Spring基础组件库,报表引擎,数据库访问模块,短信模块,后台定时任务调用组件,短信访问组件,搜索引擎组件,JMS消息组件,Activiti工作流组件,Cas统一用户认证组件,Spring安全认证组件。 4.BPMX3总体功能 1.多系统管理 BPMX3支持多个业务系统同时运行及切换处理,根据不同的用户授权允许用户进入不同的系统进行访问,而不同的业务系统的开发可以基于BPMX3平台上开发,也可以由其他开发框架开发再与BPMX3做整合。这种模式非常适合企业把BPMX3作为其内部的首先开发平台,以使后续的新应用系统都整合在一起进行管理及使用。 【图四】多系统管理 2.用户管理 BPMX3提供多种维度的用户人员管理,以支持各种类型的组织机构及人员的统一管理,目前可以支持内部组织、外部组织 、虚拟组织。而且还提供用户的属性自定义,允许对用户进行多种属性的扩展,以支持工作流中的任务节点的人员的复杂查找计算。 3.系统安全管理 系统的安全管理由Spring Security 3提供配置及管理,非常容易与第三方的用户或认证平台进行整合,如与CAS服务器作统一认证,只需要加上新的配置模块即可实现,不影响系统现有的功能模块。大大满足了各种不同系统的安全管理认证的需要。 同时系统可以支持URL访问权限、数据权限、列权限及页面按钮权限的统一配置管理。系统的安全认证机制如下所示: 【图五】系统安全拦截原理 4.动态表单管理 BPMX3提供了基于数据库内部表、外部表、视图等来生成在线的流程表单的功能,其生成是基于模板,模板可由开发人员进行自定义,也可以采用BPMX3提供的默认模板。生成的表单后,系统管理员还可以对表单进行编辑管理以实现企业的业务要求,其中,还允许开发人员在表单上编写编写脚本,以实现更复杂的应用。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 【图六】在线动态表单 5.流程管理 BPMX3提供了基于BPMN2标准的流程管理,包括流程版本变量,流程节点表单设置,表单的权限设置,流程任务通知,催办,代办,转化,并行会签、串行会签、补签,子流程,同步任务,多实例任务,人工任务、消息任务、邮件任务等,任务多级分发与汇总、任务追回、任务层层驳回,任务自由跳转等中国特色的流程需求。能满足企业复杂的流程应用需求。 BPMX3在流程管理上,不但能结合在线设计的复杂表单,还能结合本系统或其他系统其他模块的功能表单一起进行业务审批的工作。这大大方便了业务流程在所有的系统中进行流程开发的工作,简化了以往开发流程业务的代码固死的做法,把程序员或业务员真正从流程业务中解放出来。 【图七】在线流程管理 【图八】在线流程设计 6.报表管理 系统的报表管理是基于模板来进行设置管理的,目前支持FineReport及Jasper Report两种报表引擎,前者是商业报表,其功能非常强大,可以实现多样式数据呈现方式,支持HTML、PDF、EXCEL、Word、TXT、Flash样式呈,能完美解决中国式报表难题,无论数据库内原始数据是以何种样式的表结构存储,无论最终用户要求数据以何种表格样式显示,FineReport报表软件独创的多数据源关联查询、公式动态扩展计算等强大的功能,在无需改变表结构,无需改变用户的要求的基础上,完全按照用户的需求制作出报表模板。 【图九】报表管理 7.系统基础组件 系统的基础组件如用户模块一样,是系统的业务功能的基础,在其他业务模块中被大量使用。 ◦定时任务管理 通过配置以实现某时刻重复执行的系统任务,如配置每月最后一天进行库存清算任务,并且启动库存清算审批流程。 ◦系统日志管理 记录进入系统中的每个用户访问的每个功能 ◦数据源管理 可以设置多种数据源,为在线表单设计及展示提供数据来源 ◦资源管理 管理系统的所有资源,包括URL,业务方法等,提供给安全管理进行极限配置 ◦流水号管理 用于产生业务的一些处理流水单号 ◦数据字典管理 用于管理所有的业务中常用的数据字典的数据 ◦附件管理 管理系统中所有的上传附件。 ◦桌面管理 管理用户的桌面布局及常用的功能展示 ◦邮件、短信模板管理 用于配置系统的发送邮件、短信的模板 ◦工作日历管理 用于配置系统的工作流的待办事项的处理工作时间的计算处理 ◦动态脚本管理 用于为流程任务节点或事件中可被调用的逻辑计算代码 ◦短信收发管理 基于USB短信猫的短信模块或短信网关,以实现收发手机短信功能。 ◦外部邮件管理 支持POP3,IMap协议的邮件服务收发功能,允许用户设置多个外部邮箱。 ◦内部短消息收发管理 在系统中用户之间可以收发短消息,如工作流任务的通知也采用短消息进行实时提醒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值