activiti--完成当前任务,动态指定下一级执行者

最近在做一个工作流审批的项目,类似与申请一个请假,但是在完成任务的时候需要动态指定下一级人物,在最开始了解的时候,书上都是直接根据taskId来完成,后来终于实现了这个动态指定下一级处理人的功能。
我们的项目是这么一个流程
工作流
那么例如我是一个提交申请的人,例如是一个标准的请假,那么我需要完成当前的人物,还需要动态的指定下一级的是谁来审批,可是有一个前提,那就是我是不知道是谁来完成我的审批,我只需要直接提交申请的就可以。那如果我们是对工作流信息进行审批的人呢,今天我们就看一下activiti的TaskListener。

TaskListener

TaskListener,他类似与C#中委托的功能,他能准确的再你执行完成当人物的方法时去调用该接口中你需要执行的一个方法notify。而我就是在这个方法里边去指定的他的下一级是谁。下边我以学术审批的功能来将一下我是如何实现这个的。

代码实现

添加Listener

添加
单机new按钮
添加2
选择create,单机Select class,然后选择我们实现了TaskListener的类就可以了。

代码

既然是完成,那么我们就直接来一个完成的代码

    @RequestMapping("/completeByTeacher")
    public String throwApply(HttpServletRequest request,
            HttpServletResponse response) {
        // 1.获取页面上要处理的任务ID,按钮信息,评论信息
         String userId = request.getParameter("usercode");
        //String userId = "456";
        String strTaskId = request.getParameter("taskId");
        String isapprove = request.getParameter("msg");
        String comment = request.getParameter("comment");
        // String strTaskId = "11209";
        // 将获取的任务id的字符串转换成数组
        String[] taskIds = strTaskId.split(",");

        try {
            // 2.循环完成任務
            for (String taskId : taskIds) {
                // String taskId="3212";

                // 2.1根据人物ID查询流程实力ID
                Task task = processEngine.getTaskService().createTaskQuery()
                        .taskId(taskId).singleResult();
                // 获取流程实例ID
                String processInstance = task.getProcessInstanceId();
                // 2.2根据流程实例ID,人物ID,评论的消息,保存教师或者学术对与该学生申请的评论信息
                processEngine.getTaskService().addComment(taskId,
                        processInstance, comment);

                EngineController engineController = new EngineController();
                // 2.3查询当前任务后边的连线名称
                List<String> list = findOutComeListByTaskId(taskId);
                if (list.size() > 0 && list != null) {
                    Map<String, Object> map = new HashMap<String, Object>();
                    // 如果是批准操作,则根据连线名称和当前的任务名称,完成操作。
                    map.put("outcome", isapprove);
                    // 2.4如果又连线名称,则根据连线和任务ID完成人物
                    engineController.compalete(taskId, map);
                } else {
                    // 2.4如果只有任务id,连线没有名称,则直接完成当前任务,并修改用户的当前状态。
                    intershipBean.updateUserInfoByID("itoo_intership", userId,
                            "1");
                    processEngine.getTaskService().complete(taskId);

                }
            }
        } catch (Exception e) {
            // 报错
            return "redirect:/queryTaksByRole";
        }
        return "redirect:/queryTaksByRole";

    }

上边是我的完成人物,但是我需要根据前台我选择的是通过或者驳回,来执行,那么我就需要判断我的这个任务之后的连线,很明显我的是一个通过和驳回,那么获取前台按钮的名称就可以了。然后去执行,那么我们的方法如下:

// 一直任务ID,查询processDefinitionEntity对象,从而获取
    // 当前任务完成之后的连线名称,并设置到List<String>对象中
    public List<String> findOutComeListByTaskId(String taskId) {
        // 返回连线的名称集合
        List<String> list = new ArrayList<String>();

        // 1.使用任务ID查询任务对象
        Task task = processEngine.getTaskService().createTaskQuery()
                .taskId(taskId).singleResult();
        // 2.获取流程定义ID
        String processDefinitionId = task.getProcessDefinitionId();
        // 3.查询流程定义(ProcessDefinitionEntity)的实体对象
        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) processEngine
                .getRepositoryService().getProcessDefinition(
                        processDefinitionId);
        // 使用任务对象Task获取流程实例ID
        String processInstanceId = task.getProcessInstanceId();
        // 使用历程实例ID,查询正在执行的对象表,返回流程实例对象
        ProcessInstance pi = processEngine.getRuntimeService()
                .createProcessInstanceQuery()
                .processInstanceId(processInstanceId).singleResult();

        // 4.获取当前的活动
        ActivityImpl activityImpl = processDefinitionEntity.findActivity(pi
                .getActivityId());

        // 5.获取当前活动完成之后连线的名称
        List<PvmTransition> pvmList = activityImpl.getOutgoingTransitions();
        if (pvmList != null && pvmList.size() > 0) {
            for (PvmTransition pvm : pvmList) {
                String name = (String) pvm.getProperty("name");
                if (name != null) {
                    list.add(name);
                }
            }
        }
        return list;
    }

Listener的实现类

/**用来指定任务的办理人*/
    @Override
    public void notify(DelegateTask delegateTask) {
            //如果任务的个数大于1的话,则ID为RoleID
                String sql = "select * From tb_relation where intershipid='" + processDefId + "' and childCode='" + lastassignee + "'";

                Dbhelper dbCourseCurrentadd = new Dbhelper();
                 dbCourseCurrentadd.setSql(sql.toString());      
                 List<Map<String,Object>> listmap =  dbCourseCurrentadd.findItemById();

                 if(listmap.size() > 0 && listmap!=null){
                     Map<String, Object> m = listmap.get(0);    
                     nextLevel = (String) m.get("fatherCode");
                 }
    }

需要说明的是DelegateTask这个参数中又流程实例的ID,我们可以根据这个ID,找到我们是做的哪一个审批,然后去查询相应的下一级办理人。因为我又一个tb_relation的表来存储下一级,所以直接查询就可以了。

小结

当然我们完全可以不用TaskListener的方法来实现,只是这样的话,我们是不是就可以直接达到服用,这个流程可以用这个类,其他的流程也是直接添加一下Listener,然后就不用管这里的逻辑了,能更好的实现解耦。

activiti-explorer是一个基于Activiti工作流引擎的Web应用程序,用于管理和监控工作流流程。它提供了一个直观的用户界面,允许用户查看和操作工作流程的各个方面。 activiti-explorer具有以下几个主要功能和特点: 1. 流程管理:activiti-explorer允许用户部署、启动、停止和删除工作流程。用户可以通过界面创建和编辑工作流程定义,并将其部署到Activiti引擎中。用户还可以查看流程实例和任务列表,以便监控工作流程的执行状态。 2. 任务管理:activiti-explorer使用户能够处理任务。用户可以接受、拒绝、转接和完成任务,还可以添加和查看任务的备注和附件。任务的执行状态和历史记录也可以通过界面进行查询和跟踪。 3. 用户管理:activiti-explorer允许管理员管理用户和组织角色。管理员可以创建、编辑和删除用户,分配和撤销用户的角色。这样可以确保只有授权的用户能够访问和操作特定的工作流程。 4. 报表和统计:activiti-explorer提供了一些报表和统计功能,用于分析和评估工作流程的性能和效率。用户可以查看工作流程的完成情况、平均处理时间和执行过程中的问题等指标。 总之,activiti-explorer是一个功能强大的工作流管理工具,可以帮助用户有效地管理和监控工作流程。它提供了直观的界面和丰富的功能,使用户能够轻松地创建、部署和处理工作流程,提高工作效率和质量。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值