美文网首页
BOS项目第10天

BOS项目第10天

作者: KaveeDJ | 来源:发表于2019-08-19 15:14 被阅读0次

10 BOS项目第10天

今天继续学习工作流activity,流程变量

10.1 请假流程存在的问题

  • 缺少请假原因和请假天数,后期可能还会有其它数据要补充
  • activiti把这些数据称为流程变量,内部提供了一张act_ru_variable 表来存这些数据


    image.png

10.2 设置流程变量的方式

  • 重新创建一个Java项目和数据库,这次用报销流程讲解


    image.png

10.2.1 第一种:启动流程实例时设置流程变量

@Test
    public void test1(){
        //2.获取部署构建器对象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

        //3.添加流程资源
        deploymentBuilder.addClasspathResource("bxlc.bpmn");
        deploymentBuilder.addClasspathResource("bxlc.jpg");

        //4.部署
        Deployment deployment = deploymentBuilder.deploy();
        System.out.println(deployment.getId());
    }

    /**
     * 启动流程实例时设置流程变量
     */
    @Test
    public void test2(){
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差机票");
        varibles.put("bxje", "980");
        processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
    }

10.2.2 第二种:办理任务时设置流程变量

/**
     * 审核任务时设置流程变量
     */
    @Test
    public void test3(){
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差动车票");
        varibles.put("bxje", "260.00");
        processEngine.getTaskService().complete("1106", varibles);
    }

10.2.3 使用RuntimeService的set方法设置流程变量

/**
     * 使用RuntimeService的set方法设置流程变量
     */
    @Test
    public void test4(){
        String processInstanceId = "1101";
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("审核状态", "同意");
        processEngine.getRuntimeService().setVariables(processInstanceId, varibles);
    }

10.2.4 用TaskService的set方法设置

/**
     * 用TaskService的set方法设置
     */
    @Test
    public void test5(){
        String taskId = "1202";//任务id
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("审核状态", "不同意");
        processEngine.getTaskService().setVariables(taskId, varibles);
    }

10.2.5 如果设置的是自定义的类型,需要实现序列化接口

@Test
    public void test5(){
        String taskId = "1202";//任务id
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("审核状态", "不同意");
        varibles.put("user", new User("kdj", "123456"));
        processEngine.getTaskService().setVariables(taskId, varibles);
    }

10.3 读取流程变量的方式

10.3.1 方式一:使用RuntimeService的get方法获取

@Test
    public void test6() {
        //用getRuntimeService的get方法获取流程变量
        String processInstanceId = "1101";
        User user = (User) processEngine.getRuntimeService().getVariable(processInstanceId, "user");
        System.out.println(user);

        String state = (String) processEngine.getRuntimeService().getVariable(processInstanceId, "审核状态");
        System.out.println(state);
    }

10.3.2 使用TaskService的get方法获取

@Test
    public void test7() {
        //用TaskService的get方法获取流程变量
        String taskId = "1202";
        User user = (User) processEngine.getTaskService().getVariable(taskId, "user");
        System.out.println(user);

        String state = (String) processEngine.getTaskService().getVariable(taskId, "审核状态");
        System.out.println(state);
    }

10.4 动态设置任务的候选人

  • 第一步:在启动流程实现时,需要添加一个表达式里的变量值
@Test
    public void test2() {
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差机票");
        varibles.put("bxje", "2800");
        varibles.put("employeeName", "lisi");
        processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
    }
  • 在任务的Assignee写表达式


    image.png

10.5 组任务操作

10.5.1 候选人组任务(了解)

  • 第一步:给任务添加多个用户


    image.png
  • 第二步:重新部署流程和启动流程实现

@Test
    public void test1() {
        //2.获取部署构建器对象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

        //3.添加流程资源
        deploymentBuilder.addClasspathResource("bxlc.bpmn");
        deploymentBuilder.addClasspathResource("bxlc.jpg");

        //4.部署
        Deployment deployment = deploymentBuilder.deploy();
        System.out.println(deployment.getId());
    }

    /**
     * 启动流程实例时设置流程变量
     */
    @Test
    public void test2() {
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差机票");
        varibles.put("bxje", "2800");
        varibles.put("employeeName", "lisi");
        processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
    }
  • 第三步:办理第一个流程任务
@Test
    public void test3() {
        //李四提交申请
        processEngine.getTaskService().complete("107");
    }
  • 第四步:根据用户id查询任务
@Test
    public void test4() {
        //查找财务人员要审核任务
        TaskQuery tq = processEngine.getTaskService().createTaskQuery();

        //设置候选人名称
        tq.taskCandidateUser("kdj01");

        //打印任务id,打印名称
        for (Task task : tq.list()) {
            System.out.println(task.getId() + ":" + task.getName());
        }
    }
  • 第五步:拾取任务
@Test
    public void test4() {
        //查找财务人员要审核任务
        TaskQuery tq = processEngine.getTaskService().createTaskQuery();

        //设置候选人名称
        String user = "kdj01";
        tq.taskCandidateUser(user);

        //打印任务id,打印名称
        for (Task task : tq.list()) {
            System.out.println(task.getId() + ":" + task.getName());

            //拾取任务
            processEngine.getTaskService().claim(task.getId(), user);
        }
    }

10.5.2 候选组组任务(重点)

  • 第一步:设置一个财务分组id


    image.png
  • 第二步:重新部署流程并启动流程实例然后complete提交申请

  • 第三步:添加组


    image.png
  • 第四步:添加用户


    image.png
  • 第五步:建立用户和组的关系


    image.png
  • 第六步:根据用户id或者组查询任务

    • 注意:查询任务时,要先启动流程实现并输第一个任务
@Test
        public void testProcessInstance(){
            //启动流程实例:
            Map<String,Object> variables = new HashMap<String,Object>();
            variables.put("bxyy", "南京出差机机票");
            variables.put("bxje", "890");
            variables.put("employeeName", "小李");
            pe.getRuntimeService().startProcessInstanceByKey("bxlc", variables);
        }
        
        @Test
        public void testComplete(){
            //处理第一个任务
            pe.getTaskService().complete("2307");
        }
        @Test
        public void test5(){
            //查询组任务
            TaskQuery tq = pe.getTaskService().createTaskQuery();
            String userId = "1";
            //tq.taskCandidateUser(userId);
            tq.taskCandidateGroup("财务组");
            List<Task> tasks = tq.list();
            for(Task t:tasks){
                System.out.println(t.getId());
            }
        }
  • 第七步:拾起任务
    pe.getTaskService().claim("2402", "1");

10.6 排他网关

10.6.1 排他网关流程图

image.png

10.6.2 测试网关

  • 在开启流程实例时,必需设置流量变量qjts
public class GateWayTest {
    //1.获取流程引擎
            ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
                    
            @Test
            public void test1(){
                
                //2.获取部署构建器对象
                DeploymentBuilder db = pe.getRepositoryService().createDeployment();
                
                //3.添加流程资源
                db.addClasspathResource("com/huaizhi/activiti/gateway/qjlc.bpmn");
                db.addClasspathResource("com/huaizhi/activiti/gateway/qjlc.png");
            
                //4.部署
                Deployment deployment = db.deploy();
                System.out.println(deployment.getId());
            }
            
            @Test
            public void test2(){
                Map<String,Object> variables = new HashMap<String,Object>();
                variables.put("qjyy", "感冒..");
                variables.put("qjts",5);
                pe.getRuntimeService().startProcessInstanceByKey("qjlc", variables);
                
            }
            @Test
            public void test3(){
                String taskId = "606";
                pe.getTaskService().complete(taskId);
                
            }
}

10.7 activiti与spring整合

10.7.1 applicationContext.xml

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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.xsd
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 配置数据源  -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url"  value="jdbc:mysql:///activiti_day1"/>
        <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>

    <!-- 流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource"/>
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

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

10.7.2 单元测试

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Main5 {

    @Test
    public void test1() {
        //1.创建spring工厂
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2.获取bean
        ProcessEngine pe = (ProcessEngine) ac.getBean("processEngine");

        List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().list();

        //有流程定义打印,代表配置成功
        for(ProcessDefinition pd : list){
            System.out.println(pd.getKey());
        }
    }
}

10.8 Bos项目集成activiti

10.8.1 第一步:在Bos数据库添加activiti所需要的表

  • 之前三个sql文件,已经导入了

10.8.2 第二步:将activiti与spring的整合转移到Bos项目中

  • 导入jar包到项目:使用spring3.2以上版本,不需要添加spring-asm.jar

  • spring中配置processengin

<!-- 流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
         class="org.activiti.spring.SpringProcessEngineConfiguration">
         <property name="dataSource" ref="dataSource"/>
         <property name="transactionManager" ref="transactionManager"/>
    </bean>

    <!-- 使用工厂创建流程引擎对象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>
  • 再配置activiti的各种service
<!-- 注册Service -->
    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
  • 测试下是否能获取到流程定义
@Autowired
    private RepositoryService rs;
    public String login(){
        logger.info(getModel());

        System.out.println(rs); //如果有值,证明activiti的配置木有问题

10.9 流程定义管理模型

10.9.1 修改系统管理的菜单数据

  • 在admin.json 添加两行数据
  • 注意:系统管理的数据是从json中获取,不是从数据库
    { "id":"1004", "pId":"100", "name":"流程定义管理", "page":"processDefinitionAction_list.action"},
    { "id":"1005", "pId":"100", "name":"查看正在运行的流程实例", "page":"processInstanceAction_list.action"}

10.9.2 查看流程定义

  • 创建ProcessDefinitionAction,完成流程定义列表展现

10.9.3 部署流程定义

//发布一个流程
    public String deploy() throws FileNotFoundException {

        //1.获取部署的对象
        DeploymentBuilder builder = rs.createDeployment();

        //2.builder 添加压缩包的输入流
        builder.addZipInputStream(new ZipInputStream(new FileInputStream(zipFile)));

        builder.deploy();

        //部署完后回到list页面
        return "list";
    }

10.9.4 查看流程定义图

  • 第一步:修改jsp页面
<td>
    <a onclick="showPng('${id}')" class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程图</a>
</td>
<script>
    function showPng(id) {
        //alert(id);
        //显示流程图
        window.open("${pageContext.request.contextPath}/processDefinitionAction_viewpng.action?id=" + id);
    }
</script>
  • 第二步:Action
public String viewpng(){
        //返回一张图片给客户端
        //1.根据流程id获取图片
        InputStream imgIS = rs.getProcessDiagram(id);

        //2.把imgIS放在值栈
        ActionContext.getContext().getValueStack().set("imgIS", imgIS);
        return "viewpng";
}
  • 第三步:Struts
<action name="processDefinitionAction_*" class="com.kdj.bos.web.action.ProcessDefinitionAction" method="{1}">
    <result name="list">/WEB-INF/pages/workflow/processdefinition_list.jsp</result>

    <!--告诉客户端返回流文件-->
    <result name="viewpng" type="stream">
        <param name="contentType">image/png</param>
        <param name="inputName">imgIS</param>
    </result>
</action>

10.9.5 删除流程定义

  • 效果


    image.png
  • 第一步:添加删除的js代码

function del(id) {
    $.messager.confirm("提示","是否要删除?", function (r) {
        if (r){
            var url = "${pageContext.request.contextPath}/processDefinitionAction_del.action";
            $.post(url, {id:id}, function (data) {
                if (data == "success") {
                    $.messager.alert("提示", "删除成功", "info", function () {
                        location.href = "${pageContext.request.contextPath}/processDefinitionAction_list.action"
                    });
                } else{
                    $.messager.alert("提示", "删除失败", "error");
                }
            });
        }
    });
}
  • 第二步:Action代码
public void del() throws IOException {
    //1.先根据流程定义的id查找部署id
    ProcessDefinitionQuery query = rs.createProcessDefinitionQuery();
    query.processDefinitionId(id);
    ProcessDefinition pd = query.singleResult();

    String deploymentId = pd.getDeploymentId();
    rs.deleteDeployment(deploymentId);
    ServletActionContext.getResponse().getWriter().write("success");
}

相关文章

  • BOS项目第11天

    11 BOS项目第11天 今天学习将activiti整合进BOS系统 11.1 查看流程实例列表 前提:使用jun...

  • BOS项目第10天

    10 BOS项目第10天 今天继续学习工作流activity,流程变量 10.1 请假流程存在的问题 缺少请假原因...

  • BOS项目第09天

    9 BOS项目第09天 今天开始学习工作流activity 9.1 工作流概念 类似于流程图,完成业务的自动化 9...

  • BOS项目第08天

    8 BOS项目第08天 对权限涉及的5张表,进行CRUD的操作 8.1 初始化权限数据 权限功能需要一张权限表记录...

  • 如何创建自定义普通基础资料(模组配置)

    [BOS]菜单打开->基础管理->基础资料普通基础资料 [BOS]复制普通基础资料模板;工程项目 [Adminis...

  • 第一天

    《1 项目概述 1.1 项目背景介绍 BOS----Bussiness Operating System 业务操作...

  • 如何在bloks.io上检查您的BOS帐户名称(3)

    第2步: 输入您的EOS用户名,它会显示您的BOS帐户名和其他信息,例如BOS快照时的EOS余额,空投您的BOS数...

  • 百度Bos上传文件工具类-BosUtils(java)

    功能要求 java项目中所有的图片均使用对象存储BOS 准备材料 首先你要又百度bos的账号,找到自己的ak、sk...

  • BOS物流管理项目

    基于itheimaSSH阶段物流管理项目 Kotlin入门也好久了,但好像还是不熟悉,熟悉一个语言还是用起来会熟悉...

  • 币创将于1月17日上线BOS

    尊敬的币创用户: 币创将于1月17日上线BOS: 1月17日21:00 (GMT+8)BOS主网上线后,币创将在第...

网友评论

      本文标题:BOS项目第10天

      本文链接:https://www.haomeiwen.com/subject/fuxssctx.html