BOS项目第09天

9 BOS项目第09天

今天开始学习工作流activity

9.1 工作流概念

  • 类似于流程图,完成业务的自动化

9.2 Activity简单介绍

  • 现在最新版本已经是activiti6了,工作中追求稳定,而不是追求新
  • activiti是一个工作流引擎,Activiti工作的核心,负责生成流程运行时的各种实例及数据、监控和管理流程的运行。

9.3 在IDEA安装acti插件

image.png

9.4 Eclipse中activity工作流插件安装

9.4.1 网络安装activity插件

9.4.2 离线下载安装

9.5 了解activity的目录结构

image.png

9.6 activiti的入门教程

9.6.1 导入activiti所需要的数据表

  • 这里使用mysql,所以导入database文件夹下面三个sql文件,创建23张表


    image.png

9.6.2 了解数据库表前缀代表的函数

  • Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
    1. ACT_RE_: 'RE'表示repository。 这个前缀的表包含了流程定义流程静态资源*(图片,规则,等等。
    2. ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
    3. ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
    4. ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
    5. ACT_GE_*: 通用数据, 用于不同场景下。

9.6.3 使用框架自动生成表(不建议)

  1. 创建一个java项目
  2. 导入activiti中wars程序的所有jar包
  3. 导入mysql的数据库驱动
  4. 提供一个配置文件,文件名必需为activiti-context.xml
<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">

    <!-- 1.流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver"  value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl"  value="jdbc:mysql:///activiti_day1"/>
        <property name="jdbcUsername"  value="root"/>
        <property name="jdbcPassword"  value="root"/>
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

    <!-- 2.使用工厂创建流程引擎对象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>

</beans>
  1. 写一个单元测试
    • 只要获取流程引擎对象,就会自动创建表
    • 可以添加示例程序的log4j.properties来查看日志里更多信息输出
    • 在activiti-engine-5.13.jar有数据库sql文件,用于自动创建数据库表
    @Test
    public void test1(){
        //1.获取默认的流程引擎对象
        ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
    }

9.6.4 设计一个请假流程图

  • 在Eclipse中,利用activiti插件创建一个请假流程图
  • 在每一个任务中,找到Main config的Assignee中,先固定每个任务的受理人


    image.png

    image.png

9.6.5 部署流程定义

  • 就是把流程存入数据库,写个单元测试代码
  • 流程定义部署完后,会在act_re_deployment和act_re_procdef两张表存储数据,
  • deployment的ID每次增加100
  • 同一个流程的procdef表的version是递增的
    @Test
    public void test2(){
        //1.把流程图保存到数据库
        ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();

        //2.获取仓库
        RepositoryService rs = pe.getRepositoryService();

        //3.获取一个部署的构造器对象
        DeploymentBuilder db = rs.createDeployment();

        db.addClasspathResource("qjlc.bpmn");
        db.addClasspathResource("qjlc.jpg");

        //4.部署
        db.deploy();
    }

8.6.6 查询流程定义

    @Test
    public void test3(){
        ProcessEngine  pe = ProcessEngines.getDefaultProcessEngine();
        ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();

        List<ProcessDefinition> list = query.list();
        for(ProcessDefinition pd : list){
            System.out.print("ResourceName-" +pd.getResourceName() + ": ");
            System.out.print("id-" + pd.getId() + ": ");
            System.out.print("key-" + pd.getKey() + ": ");
            System.out.print("name-" + pd.getName() + ": ");
            System.out.println();
        }
    }

8.6.7 根据流程定义启动流程实例

  • 就是把第一个请假申请任务跑
  • 内部会操作act_re_execution和act_re_task两张表
    @Test
    public void test5(){
        ProcessInstance pi = pe.getRuntimeService().startProcessInstanceById("myProcess_1:4:304");
        System.out.println("流程实例:" + pi.getProcessInstanceId());
        System.out.println("流程实例:" + pi.getId());
    }

8.6.8 查询个人任务

    @Test
    public void test7(){
        //查询个人任务
        TaskQuery tq = pe.getTaskService().createTaskQuery();
        tq.taskAssignee("zhangsan");
        tq.orderByTaskCreateTime().desc();//时间排序
        List<Task> tasks = tq.listPage(0, 10);//分页查询
        for(Task task : tasks){
            System.out.println("=================================");
            System.out.println("taskId:" + task.getId());
            System.out.println("taskName:" + task.getName());
            System.out.println("executionId:" + task.getExecutionId());
        }
    }

8.6.9 办理个人任务

  • 请求申请需要被处理,处理中会操作act_re_task和act_hi_taskinst表
  • 处理事,会进入下一个任务,往task表插入下一个流程的任务,比如请假申请后,下一个任务就是项目经理审批任务
    @Test
    public void test6(){
        //lisi审核任务
        String taskId = "602";
        pe.getTaskService().complete(taskId);
    }

8.6.10 部署流程定义的另一种方式zip文件

  • 把流程和jpg打包成zip文件
    @Test
    public void test8() throws FileNotFoundException {
        //创建部署构建器对象
        DeploymentBuilder db = pe.getRepositoryService().createDeployment();

        File file = new File("C:\\process.zip");
        FileInputStream fis = new FileInputStream(file);

        ZipInputStream zis = new ZipInputStream(fis);
        db.addZipInputStream(zis);

        //部署定义流程
        Deployment deployment = db.deploy();
        System.out.println(deployment.getId());
    }

8.6.11 删除流程定义

    @Test
    public void test8(){
        //pe.getRepositoryService().deleteDeployment("901");
        //加个true,删除process表相关记录,如果启动流程了实例,用下面的方法删除
        pe.getRepositoryService().deleteDeployment("901", true);
    }

8.6.12 6.12.查询部署对应的流程定义文件名称和输入流

    @Test
    public void test10(){
        String deploymentId = "301";
        List<String> names = pe.getRepositoryService().getDeploymentResourceNames(deploymentId);
        for (String name : names) {
            System.out.println(names);
            //可以还原成文件,默认流程定义文件存在了act_ge_bytearr表
            //InputStream in = pe.getRepositoryService().getResourceAsStream(deploymentId, name);
        }
    }

8.6.13 查询部署对应的流程定义图表

    @Test
    public void test11() throws IOException{
        String processDefinitionId = "qjlc:1:304";//流程定义id
        InputStream pngStream = pe.getRepositoryService().getProcessDiagram(processDefinitionId);
        FileUtils.copyInputStreamToFile(pngStream, new File("c:\\t\\abc.png"));
    }

8.6.14 删除流程实例

    @Test
    public void test12(){
        String processInstanceId = "401";
        String deleteReason = "不请假了";
        pe.getRuntimeService().deleteProcessInstance(processInstanceId , deleteReason );
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容