当前位置: 首页 > news >正文

有关activit工作流的项目的一些简述:一

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一:创建一个ActivitiHandle,就是一个操作类

 

@Component("activitiHandle")
public class ActivitiHandle {

    //该路径为activiti工作流的pbmn图的位置

    private static final String PBMN_URL = "com/diagrams/";

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private HistoryService historyService;

    @Autowired
    private ActivitiService activitiService;

    /**
     * 流程部署;对于流程部署来说,需要两个参数;一个该工作流的名字,一个是pbmn文件的文字;这样是为了方便多次部署流程,也可以部署不同的流程;
     */
    public void deployFlow(String workflowName, String pbmnName) {
        Deployment deployment = repositoryService.createDeployment()//这个service是工作流中的类,无需自己创建,导入相关的jar包即可
                .name(workflowName).addClasspathResource(PBMN_URL + pbmnName)
                .deploy();
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

    /**
     * 启动流程:启动已经部署好的流程,即创建流程实例:例如在工单项目中新疆工单的时候就启动一个流程;即创建一个流程实例
     */
    public String flowstart(String workflowFlg,Map<String,Object> paramter){
        Map<String,Object> variables = new HashMap<String, Object>();
        variables.put(ActivitiParamter.WO_VARIABLES, paramter);
        // 用key启动时按照最新的流程版本定义启动
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(workflowFlg, variables);
        String ss = processInstance.getDescription();
        return  processInstance.getId();
    }

    /**
     * 查询组内待领取任务
     */
    public DataGrid findGroupTask(ActivitiDto activitiDto) {
        return activitiService.findGroupTask(activitiDto);
    }

    /**
     * 查询个人待办任务
     */
    public DataGrid findPersonTask(ActivitiDto activitiDto) {
        return activitiService.findPersonTask(activitiDto);
    }

    /**
     * 认领任务:认领任务,需要任务的标识和员工的标识,因为一般情况下,认领都是个人行为
     */
    public void claimTask(String taskId, String userId) {
        taskService.claim(taskId, userId);
    }

    /**
     * 重新认领:已经被认领的任务,重新认领,需要参数同认领方法
     * 
     * @param taskId
     * @param ouserId
     */
    public void reClaimTak(String taskId, String ouserId) {
        taskService.setAssignee(taskId, ouserId);
    }

    /**
     * 完成任务:完成任务只需要taskId。
     * 
     * @param taskId
     */
    public void completeTask(String taskId) {
        taskService.complete(taskId);
        System.out.println("完成任务,任务ID:" + taskId);
    }

    /**
     * 完成任务:同样是完成任务,但是可以加入一些工作流变量(全局变量)
     * 
     * @param taskId
     * @param paramter
     */
    public void completeTask(String taskId, Map<String, Object> va) {
        taskService.complete(taskId, va);
        System.out.println("完成任务,任务ID:" + taskId);
    }

    /**
     * 查询节点描述:根据taskId查询该任务节点详细:这里是取描述字段,并转化为ActivitiCode对象(工作流码表对象)
     * @param taskId
     * @return
     */
    public ActivitiCode queryTaskDescription(String taskId){
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        String des = task.getDescription();
        ActivitiCode activitiCode = JSONObject.parseObject(des, ActivitiCode.class);
        //String lastNode  =activitiCode.getCodeValue().get(activitiCode.getLastNodeName());
        return activitiCode;
    }
    
    /**
     * 流程退回:根据taskId,查询该任务节点:并取出上一个节点,根绝上一个节点完成流程退回
     * @param taskId
     */
    public void fallBack(String taskId) {

        //根据taskId查询任务节点对象
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();

        //取出该节点描述
        String des = task.getDescription();

        //将该节点转化成工作流码表对象
        ActivitiCode activitiCode = JSONObject.parseObject(des,
                ActivitiCode.class);

        //然后获取到该节点的上一节点
        String lastNode = activitiCode.getCodeValue().get(activitiCode.getLastNodeName()).toString();
        if (!StringUtils.isEmpty(lastNode)) {
            // 查询上一个节点处理记录taskDefKey即为我们查询出来的lastNode
            WoProcessLoggning ps = woProcessLoggningService.lastProcessLogging(
                    lastNode, task.getExecutionId());
            Map<String, Object> variables = new HashMap<String, Object>();
            // 设置任务委派类型为个人
            variables.put(ActivitiParamter.WO_TYPE,
                    ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey());
            // 设置任务委派人:即上一节点流程处理记录里面的操作者
            variables.put(ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey(),
                    ps.getOperatorFlag());
            // 设置不强制结束
            variables.put(ActivitiParamter.WO_END_STATUS, "0");
            // 设置审核类型为不通过
            variables.put(ActivitiParamterCaifu.WO_AUDIT_STATUS,
                    ActivitiParamterCaifu.AUDIT_STATUS.NO.getKey());
            // 设置全局变量
            runtimeService.setVariable(task.getExecutionId(),
                    ActivitiParamter.WO_VARIABLES, variables);
            // 完成任务
            taskService.complete(taskId, variables);
        }
    }
    
    /**
     * 完成任务
     * @param dto
     * executionId 和 taskId必填
     */
    public void completeTaskByExecution(ActivitiParamter dto) {
        if (!StringUtils.isEmpty(dto.getExecutionId())) {

            //流程实例id不能为空
            Map<String, Object> variables = new HashMap<String, Object>();
            if (!StringUtils.isEmpty(dto.getWoAssignee())) {

                //如果委托人不为空,那就是个人任务。所以设置流程全局变量的时候就设置为个人
                variables.put(ActivitiParamter.WO_TYPE,
                        ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey());
                variables.put(ActivitiParamter.WO_TYPE_ENUM.ASSIGNEE.getKey(),
                        dto.getWoAssignee());
            } else if (!StringUtils.isEmpty(dto.getWoGroup())) {

                //如果个人为空,组不为空就将全局变量设置为组
                variables.put(ActivitiParamter.WO_TYPE,
                        ActivitiParamter.WO_TYPE_ENUM.GROUP.getKey());
                variables.put(ActivitiParamter.WO_TYPE_ENUM.GROUP.getKey(),
                        dto.getWoGroup());
            }

            //向全局变量添加完成
            variables.put(ActivitiParamter.WO_END_STATUS, dto.getEndStatus());
            variables.putAll(dto.getVariables());

                        //设置该流程实例的流程变量
         runtimeService.setVariable(dto.getExecutionId(), ActivitiParamter.WO_VARIABLES, variables);
        }

        //完成任务
        taskService.complete(dto.getTaskId(), dto.getVariables());
    }
}

转载于:https://my.oschina.net/u/3045515/blog/842058

相关文章:

  • 资源的积累
  • windows下ueditor1.4.3.3 jsp 版本在线管理图片显示问题。
  • 致歉
  • 最长下降/上升子序列问题
  • Android源码设计模式解析与实战(八)
  • .net 中viewstate的原理和使用
  • struts1的配置文件
  • mac 安装PHPredis扩展
  • 金山反间谍(系统清理专家)2007年2月1-2日更新报告
  • 在数据库里面相对安全的数据清理方式
  • LINUX下的DHCP
  • 【CODEVS】1034 家园
  • [导入]MsAjax Lib- Number 类型扩展
  • SpringMVC学习(5):数据绑定2 @PathVariable、@CookieValue、@RequestHeader、@ModelAttribute.....
  • Effective C# 第二章:.Net资源管理(翻译)
  • SegmentFault for Android 3.0 发布
  • 【Amaple教程】5. 插件
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • bearychat的java client
  • HTML-表单
  • javascript面向对象之创建对象
  • Java的Interrupt与线程中断
  • laravel 用artisan创建自己的模板
  • leetcode386. Lexicographical Numbers
  • PAT A1092
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Sass Day-01
  • Service Worker
  • SpringBoot几种定时任务的实现方式
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前言-如何学习区块链
  • 一个JAVA程序员成长之路分享
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​学习一下,什么是预包装食品?​
  • # include “ “ 和 # include < >两者的区别
  • #AngularJS#$sce.trustAsResourceUrl
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $(function(){})与(function($){....})(jQuery)的区别
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (三)docker:Dockerfile构建容器运行jar包
  • (转载)利用webkit抓取动态网页和链接
  • . NET自动找可写目录
  • .NET Core 中的路径问题
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net流程开发平台的一些难点(1)
  • .net中生成excel后调整宽度
  • @AliasFor注解
  • [ C++ ] STL---string类的模拟实现
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限