日期:2014-05-17 浏览次数:20987 次
public ProcessInstance approvalProcess(final long id, final Map attrs)
            throws Exception {
        return (ProcessInstance) jbpmTemplate.execute(new JbpmCallback() {
            public Object doInJbpm(JbpmContext context) throws JbpmException {
                ProcessInstance pi = context.getGraphSession()
                        .loadProcessInstance(id);//得到流程实例
                String nodeName = "";
                String trans = "";
                try {
                    Node node = pi.getRootToken().getNode();
                    nodeName = node.getName();  //得到当前节点名称
                    Transition transition = (Transition) node
                            .getLeavingTransitions().get(0);
                    trans = transition.getName();//得到当前节点对应的发送描述
                } catch (Exception e) {
                }
                //判断流程实例是否结束
                if (!pi.hasEnded()) {
                    //得到当前实例所有任务
                    Iterator<TaskInstance> it = pi.getTaskMgmtInstance()
                            .getTaskInstances().iterator();
                    for (; it.hasNext();) {
                        TaskInstance ti = it.next();
                        //遍历所有任务,如果有和当前节点名称相同的任务
                        if (nodeName.equals(ti.getName())) {
                            //设置任务完成时间
                            ti.setEnd(new Date());
                            //设置任务完成意见
                            ti.addComment(attrs.get("comment").toString());
                            //将发送描述放到description备用
                            ti.setDescription(trans);
                            //得到任务处理人集合
                            Set se = ti.getPooledActors();
                            Iterator iterator = se.iterator();
                            while(iterator.hasNext()){
                                PooledActor pl = (PooledActor)iterator.next();
                                //attrs.get("author")是当前用户,
                                //如果匹配到任务处理人集合里有当前人,则把任务完成者设为当前用户
                                if(pl.getActorId().equals(attrs.get("author"))){
                                    ti.setActorId(pl.getActorId());
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    //发送流程实例
                    pi.signal();
                    //保存流程实例
                    context.save(pi);
                } else {
                    throw new JbpmException("ProcessInstance " + id + " is end");
                }
                return pi;
            }
        });
    }