`

二十六、JbpmFacade简单实现

 
阅读更多

public class JbpmFacadeImpl extends AbstractManager implements JbpmFacade {

    private JbpmConfiguration jbpmConfiguration;
   
    public long addProcessInstance(String processName, Document document) {
       
        JbpmContext context = getJbpmContext();
       
        ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition(processName);
       
        ProcessInstance instance = new ProcessInstance(def);
       
        instance.getContextInstance().setVariable("document", document.getId());
       
        //将公文标题也提交到流程实例变量中,以便在E-Mail中能够提示这个公文的名称
        instance.getContextInstance().setVariable("docTitle", document.getTitle());
       
        //将公文的相关属性设置进入流程实例变量
        Map props = document.getProperties();
        if(props != null){
            Set entries = props.entrySet();
            for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
                Map.Entry entry = (Map.Entry) iterator.next();
                String propertyName = (String)entry.getKey();
                Object obj = document.getProperty(propertyName);
                //将变量放入流程实例变量
                instance.getContextInstance().setVariable(propertyName, obj);
            }
        }
       
        context.save(instance);
       
        return instance.getId();
    }

    public void delProcessDefinition(String processName) {
        JbpmContext context = getJbpmContext();
        List defs = context.getGraphSession().findAllProcessDefinitionVersions(processName);
        for (Iterator iterator = defs.iterator(); iterator.hasNext();) {
            ProcessDefinition def = (ProcessDefinition) iterator.next();
            context.getGraphSession().deleteProcessDefinition(def);
        }
    }

    public void delProcessInstance(long processInstanceId) {
        JbpmContext context = getJbpmContext();
        context.getGraphSession().deleteProcessInstance(processInstanceId);
    }

    public String deployProcessDefinition(byte[] processDef) {
       
        JbpmContext context = getJbpmContext();
       
        ProcessDefinition def = ProcessDefinition.parseXmlInputStream(
            new ByteArrayInputStream(processDef)
        );
       
        context.deployProcessDefinition(def);
       
        return def.getName();
    }

    public String nextStep(long processInstanceId, String actorId,
            String transitionName) {
       
        JbpmContext context = getJbpmContext();
        ProcessInstance instance = context.getProcessInstance(processInstanceId);
       
        //当前节点
        String currentNodeName = instance.getRootToken().getNode().getName();
       
        //起点的名称
        String startNodeName = instance.getProcessDefinition().getStartState().getName();
               
        //如果是在起点
        if(startNodeName.equals(currentNodeName)){
            if(transitionName == null){
                instance.signal();
            }else{
                instance.signal(transitionName);
            }
        }else{
            List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
            for (Iterator iterator = taskInstances.iterator(); iterator
                    .hasNext();) {
                TaskInstance ti = (TaskInstance) iterator.next();
                if(ti.getProcessInstance().getId() == processInstanceId){
                    if(transitionName == null){
                        ti.end();
                    }else{
                        ti.end(transitionName);
                    }
                    break;
                }
            }
           
           
            //查找所属组的任务实例
            List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
            for (Iterator iterator = pooledTaskInstances.iterator(); iterator
                    .hasNext();) {
                TaskInstance ti = (TaskInstance) iterator.next();
                if(ti.getProcessInstance().getId() == processInstanceId){
                    if(transitionName == null){
                        ti.end();
                    }else{
                        ti.end(transitionName);
                    }
                    break;
                }
            }
        }
       
        //返回转向之后的节点名称
        return instance.getRootToken().getNode().getName();
    }
   
    //回退
    public Object[] backStep(long processInstanceId, String actorId) {
        JbpmContext context = getJbpmContext();
       
        //根据流程实例标识查找流程实例
        ProcessInstance instance = context.getProcessInstance(processInstanceId);
        Object[] os = new Object[2];
        //搜索用户对应的所有的任务实例
        List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
        for (Iterator iterator = taskInstances.iterator(); iterator
                .hasNext();) {
            TaskInstance ti = (TaskInstance) iterator.next();
            if(ti.getProcessInstance().getId() == processInstanceId){
               
                //先判断是否是要回退到起点
                Set set = ti.getToken().getNode().getArrivingTransitions();
                for (Iterator iterator2 = set.iterator(); iterator2.hasNext();) {
                    Transition t = (Transition) iterator2.next();
                    //如果它需要回退到起点
                    if(t.getFrom().equals(ti.getProcessInstance().getProcessDefinition().getStartState())){
                        int docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document");
                        //结束当前的流程实例
                        ti.getProcessInstance().end();
                        //结束当前任务实例
                        ti.end();
                       
                        //重新创建流程实例对象
                        ProcessInstance pi = new ProcessInstance(ti.getProcessInstance().getProcessDefinition());
                        pi.getContextInstance().setVariable("document", docId);
                        //将流程实例对象重新持久化到数据库
                        context.save(pi);
                       
                        os[0] = Document.STATUS_NEW;
                        os[1] = pi.getId();
                       
                        return os;
                    }
                }
               
                //如果不需要回退到起点
                ti.end(CreateTransitionAction.BACK_TRANSITION);
                break;
            }
        }
       
        os[0] = instance.getRootToken().getNode().getName();
        os[1] = processInstanceId;
       
        return os;
    }

    public List searchMyTaskList(String actorId) {
       
        JbpmContext context = getJbpmContext();
        List docIds = new ArrayList();
        List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
        for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) {
            TaskInstance ti = (TaskInstance) iterator.next();
            Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document");
            docIds.add(docId);
        }
       
        //查找所属组的任务实例
        List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
        for (Iterator iterator = pooledTaskInstances.iterator(); iterator
                .hasNext();) {
            TaskInstance ti = (TaskInstance) iterator.next();
            Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document");
            docIds.add(docId);
        }       
       
        return docIds;
    }

    public List searchNextTransitions(long processInstanceId, String actorId) {
        JbpmContext context = getJbpmContext();
        ProcessInstance instance = context.getProcessInstance(processInstanceId);
       
        //当前节点
        String currentNodeName = instance.getRootToken().getNode().getName();
       
        //起点的名称
        String startNodeName = instance.getProcessDefinition().getStartState().getName();
       
        Collection transitions = null;
       
        //如果是在起点
        if(startNodeName.equals(currentNodeName)){
            transitions = instance.getRootToken().getAvailableTransitions();
        }else{
            List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId);
            for (Iterator iterator = taskInstances.iterator(); iterator
                    .hasNext();) {
                TaskInstance ti = (TaskInstance) iterator.next();
                if(ti.getProcessInstance().getId() == processInstanceId){
                    transitions = ti.getAvailableTransitions();
                    break;
                }
            }
           
            //查找所属组的任务实例
            List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId);
            for (Iterator iterator = pooledTaskInstances.iterator(); iterator
                    .hasNext();) {
                TaskInstance ti = (TaskInstance) iterator.next();
                if(ti.getProcessInstance().getId() == processInstanceId){
                    transitions = ti.getAvailableTransitions();
                }
            }
        }
       
        List transitionNames = new ArrayList();
       
        if(transitions != null){
            //为了不把Transition对象直接暴露给OA系统,需要将其转换为名称列表
            for (Iterator iterator = transitions.iterator(); iterator.hasNext();) {
                Transition transition = (Transition) iterator.next();
                transitionNames.add(transition.getName());
            }
        }
       
        return transitionNames;
    }
   
    private JbpmContext getJbpmContext(){
        JbpmContext context = jbpmConfiguration.createJbpmContext();
        context.setSession(getSession());
        return context;
    }

    public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
        this.jbpmConfiguration = jbpmConfiguration;
    }

}

分享到:
评论

相关推荐

    【大厂面试专栏】一份Java程序员需要的技术指南,这里有面试题、系统架构

    【大厂面试专栏】一份Java程序员需要的技术指南,这里有面试题、系统架构、职场锦囊、主流中间件等,让你成为更牛的自己!_technology-talk

    flashocc-QAT-PTQ.zip

    flashocc-QAT-PTQ.zip

    大连理工大学城市学院在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    川北医学院在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    黑河学院在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    西安邮电大学在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    【光学】基于matlab两列单色平面波+合成【含Matlab源码 9007期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,尽我所能,为你服务; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、物理应用 仿真:导航、地震、电磁、电路、电能、机械、工业控制、水位控制、直流电机、平面电磁波、管道瞬变流、刚度计算 光学:光栅、杨氏双缝、单缝、多缝、圆孔、矩孔衍射、夫琅禾费、干涉、拉盖尔高斯、光束、光波、涡旋 定位问题:chan、taylor、RSSI、music、卡尔曼滤波UWB 气动学:弹道、气体扩散、龙格库弹道 运动学:倒立摆、泊车 天体学:卫星轨道、姿态 船舶:控制、运动 电磁学:电场分布、电偶极子、永磁同步、变压器

    文件比较工具、文件夹比较工具、linux、ubuntu、linx麒麟等免费使用多日

    文件比较工具、文件夹比较工具、linux、ubuntu、linx麒麟等免费使用多日

    Spire.XLS是一个基于.NET的组件,使用它我们可以创建Excel文件

    Spire.XLS是一个基于.NET的组件,使用它我们可以创建Excel文件,编辑已有的Excel并且可以转换Excel文件.zip

    【Unity完整游戏模板】Downhill Ride 轻松开发极限运动或竞速类的下坡滑行游戏

    文件名:Downhill Ride - Game Template 2020 LTS v1.2.3.unitypackage Downhill Ride - Game Template (2020 LTS) 是一个为 Unity 2020 LTS 版本开发的完整游戏模板,主要适用于开发极限运动或竞速类的下坡滑行游戏。这个模板专为快速原型设计和项目开发而打造,提供了关键功能和资源,帮助开发者轻松实现类似下坡竞速的游戏项目。 主要特点: 完整的游戏框架: 该模板包含基础的游戏逻辑,允许玩家通过控制角色在下坡道上滑行或骑行,避开障碍物并尽可能快速完成赛道。 物理与控制系统: 内置的物理引擎和角色控制器已经经过优化,可以实现平滑的下坡滑行体验,提供真实感十足的物理效果。 多种关卡支持: 模板支持多个关卡设计,开发者可以根据需要扩展或自定义不同难度的关卡。 UI 和交互设计: 包含基本的用户界面(UI)设计,带有主菜单、关卡选择、计分系统等功能,用户可以轻松扩展或定制这些 UI 元素。 优化的性能: 模板专为移动平台和桌面平台优化,确保良好的性能表现......

    Java课程设计之销售管理系统

    (1)课程设计项目简单描述 鉴于当今超市产品种类繁多,光靠人手动的登记已经不能满足一般商家的需求。我们编辑该程序帮助商家完成产品、商家信息的管理,包括产品、客户、供应商等相关信息的添加、修改、删除等功能。 (2)需求分析(或是任务分析) 1)产品类别信息管理:对客户的基本信息进行添加、修改和删除。 2)产品信息管理:对产品的基本信息进行添加、修改和删除。 3)供应商信息管理: 对供应商的基本信息进行添加、修改和删除。 4)订单信息管理:对订单的基本信 息进行添加、修改和删除。 5)统计报表:按选择日期期间,并按产品类别分组统 计订单金额,使用表格显示统计结果

    常州大学在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    yolo算法-工地佩戴头盔数据集-1608张图像带标签-epi-d4clr.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    Android System Webview(com.google.android.webvie) 125.0.6422.82

    Android System Webview(com.google.android.webvie) 125.0.6422.82 一般情况下设备可以从google play上更新,但是google play 中没有历史版本下载,所以在自己需要之后把资源上传

    VLP超低轮廓铜箔,全球前10强生产商排名及市场份额(by QYResearch).docx

    VLP超低轮廓铜箔,全球前10强生产商排名及市场份额(by QYResearch).docx

    南宁学院在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    PPServ是一个Web开发集成环境,可以使用Apache,PHP,Mysql创建Web应用 -PPServ.zip

    网鼎杯PPServ是一个Web开发集成环境,可以使用Apache,PHP,Mysql创建Web应用。_PPServ.zip

    沧州交通学院在四川2020-2024各专业最低录取分数及位次表.pdf

    那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据

    windows 安装包Miniconda3-py38-4.11.0-Windows-x86-64

    windows 安装包Miniconda3-py38-4.11.0-Windows-x86-64

    yolo算法-公路等级数据集-8188张图像带标签-汽车客车摩托highway-classification.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

Global site tag (gtag.js) - Google Analytics