• Acitiviti的查询及删除(六)


    流程定义查询

    查询部署的流程定义。

    /**
     * 查询流程定义信息   //act_re_procdef
     */
    public class QueryProcessDefinition {
    
    
        public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.创建RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.得到ProcessDefinitionQuery对象,可以认为它就是一个查询器
            ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    
            //4.设置条件,并查询出当前的所有流程定义   查询条件:流程定义的key=holiday
            //orderByProcessDefinitionVersion() 设置排序方式,根据流程定义的版本号进行排序
            List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey("holiday")
                    .orderByProcessDefinitionVersion()
                    .desc().list();
    
            //5.输出流程定义信息
            for(ProcessDefinition processDefinition :list){
                System.out.println("流程定义ID:"+processDefinition.getId());
                System.out.println("流程定义名称:"+processDefinition.getName());
                System.out.println("流程定义的Key:"+processDefinition.getKey());
                System.out.println("流程定义的版本号:"+processDefinition.getVersion());
                System.out.println("流程部署的ID:"+processDefinition.getDeploymentId());
    
            }
        }
    }

     其实查的就是act_re_procdef,这个表信息

    流程定义删除

    删除已经部署成功的流程定义

    /**
     * 删除已经部署的流程定义
     *
     * 背后影响的表:
     * act_ge_bytearray
       act_re_deployment
       act_re_procdef
     */
    public class DeleteProcessDefinition {
    
        /**
         * 注意事项:
         *     1.当我们正在执行的这一套流程没有完全审批结束的时候,此时如果要删除流程定义信息就会失败
         *     2.如果公司层面要强制删除,可以使用repositoryService.deleteDeployment("1",true);
         *     //参数true代表级联删除,此时就会先删除没有完成的流程结点,最后就可以删除流程定义信息  false的值代表不级联
         *
         * @param args
         */
        public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.创建RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.执行删除流程定义  参数代表流程部署的id
            repositoryService.deleteDeployment("1");
        }
    }

    说明:
    1) 使用 repositoryService 删除流程定义
    2) 如果该流程定义下没有正在运行的流程,则可以用普通删除。
    3) 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关
    记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使
    用。

    资源的查询

    /**
     * 需求:
     * 1.从Activiti的act_ge_bytearray表中读取两个资源文件
     * 2.将两个资源文件保存到路径:
     *
     * 技术方案:
     *     1.第一种方式使用actviti的api来实现
     *     2.第二种方式:其实就是原理层面,可以使用jdbc的对blob类型,clob类型数据的读取,并保存
     *        IO流转换,最好commons-io.jar包可以轻松解决IO操作
     *
     * 真实应用场景:用户想查看这个请假流程具体有哪些步骤要走?
     *
     *
     */
    public class QueryBpmnFile {
    
        public static void main(String[] args) throws IOException {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.得到查询器:ProcessDefinitionQuery对象
            ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    
            //4.设置查询条件
           // processDefinitionQuery.processDefinitionKey("holiday");//参数是流程定义的key
    
            processDefinitionQuery.processDefinitionId("holiday:2:15004");
    
            //5.执行查询操作,查询出想要的流程定义
            ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
    
            //6.通过流程定义信息,得到部署ID
            String deploymentId = processDefinition.getDeploymentId();
    
            //7.通过repositoryService的方法,实现读取图片信息及bpmn文件信息(输入流)
            //getResourceAsStream()方法的参数说明:第一个参数部署id,第二个参数代表资源名称
            //processDefinition.getDiagramResourceName() 代表获取png图片资源的名称
            //processDefinition.getResourceName()代表获取bpmn文件的名称
            InputStream pngIs = repositoryService
                    .getResourceAsStream(deploymentId,processDefinition.getDiagramResourceName());
            InputStream bpmnIs = repositoryService
                    .getResourceAsStream(deploymentId,processDefinition.getResourceName());
    
            //8.构建出OutputStream流
            OutputStream pngOs =
                    new FileOutputStream("F:\"+processDefinition.getDiagramResourceName());
    
            OutputStream bpmnOs =
                    new FileOutputStream("F:\"+processDefinition.getResourceName());
    
            //9.输入流,输出流的转换  commons-io-xx.jar中的方法
            IOUtils.copy(pngIs,pngOs);
            IOUtils.copy(bpmnIs,bpmnOs);
            //10.关闭流
            pngOs.close();
            bpmnOs.close();
            pngIs.close();
            bpmnIs.close();
    
        }
    }

    说明:
    1) deploymentId 为流程部署 ID
    2) resource_name 为 act_ge_bytearray表中 NAME_列的值
    3) 使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下得所有文件的名

    4) 使用 repositoryService 的 getResourceAsStream 方法传入部署 ID和资源图片名称可以获取部署下
    指定名称文件的输入流
    5) 最后的将输入流中的图片资源进行输出。

     流程历史信息的查看

    即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在 activiti 的 act_hi_*相
    关的表中。所以我们还是可以查询流程执行的历史信息,可以通过 HistoryService 来查看相关的历史
    记录。

    /**
     * 需求:
     *   历史数据的查看
     *
     *
     */
    public class HistoryQuery {
    
        public static void main(String[] args) throws IOException {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到HistoryService
            HistoryService historyService = processEngine.getHistoryService();
    
            //3.得到HistoricActivitiInstanceQuery对象
            HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
    
            historicActivityInstanceQuery.processInstanceId("2501");//设置流程实例的id
    
            //4.执行查询
            List<HistoricActivityInstance> list = historicActivityInstanceQuery
                    .orderByHistoricActivityInstanceStartTime().asc().list();//排序StartTime
    
            //5.遍历查询结果
            for (HistoricActivityInstance instance :list){
                System.out.println(instance.getActivityId());
                System.out.println(instance.getActivityName());
                System.out.println(instance.getProcessDefinitionId());
                System.out.println(instance.getProcessInstanceId());
                System.out.println("=============================");
            }
        }
    }
    _2
    StartEvent
    holiday:1:4
    2501
    =============================
    _3
    填写请假申请单
    holiday:1:4
    2501
    =============================
    _4
    部门经理审批
    holiday:1:4
    2501
    =============================
    _5
    总经理审批
    holiday:1:4
    2501
    =============================
    _6
    EndEvent
    holiday:1:4
    2501
    =============================
    
    Process finished with exit code 0
  • 相关阅读:
    Objective-C代码规范
    Http中Get/Post请求区别
    使用Vitamio打造自己的Android万能播放器
    Vitamio
    图片瀑布流
    TCP与UDP
    SQLite基本操作总结
    IOS文件操作的两种方式:NSFileManager操作和流操作
    JSON和XML
    一些iOS常用的第三方库和控件及第三方框架还有动画
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11879282.html
Copyright © 2020-2023  润新知