//设置任务变量 processEngine.getTaskService().setVariables(bpmCtlParam.getTaskid(), var); CounterSignCommand cmd = new CounterSignCommand("同意", "不同意", bpmCtlParam.getTaskid()); boolean b = false; //获取真正的子任务taskid String sql = "select dbid_ taskid from jbpm4_task t where t.supertask_ = '"+bpmCtlParam.getTaskid()+"' and t.assignee_ ='"+bpmCtlParam.getCuruser().getCode()+"'"; QueryUtil qu = new QueryUtil(); qu.setWholeSQL(sql); List list = qu.list(); String taskid = ((Map)list.get(0)).get("taskid").toString();
谢谢
/**
* 传递会签意见的变量
*/
public static final String VAR_SIGN = "sign";
/**
* 审批通过的转移路径
*/
private String transitionPassName;
/**
* 审批不通过的转移路径
*/
private String transitionNoPassName;
/**
* 父节点任务ID
*/
private String parentTaskId;
/**
* 主任务
*/
private Task parentTask;
/**
* 流程ID,运行时计算得出
*/
private String pid;
/**
* 会签对象任务,由客户端通过setter方法注入
*/
private Task joinsignTask;
public String getPid() {
return pid;
}
public void setJoinsignTask(Task joinsignTask) {
this.joinsignTask = joinsignTask;
}
/**构造方法
* @param transitionPassName
* @param trainsitionNoPassName
* @param parentTaskId
*/
public CounterSignCommand(String transitionPassName,
String trainsitionNoPassName, String parentTaskId) {
super();
this.transitionPassName = transitionPassName;
this.transitionNoPassName = trainsitionNoPassName;
this.parentTaskId = parentTaskId;
}
/* (non-Javadoc)
* @see org.jbpm.api.cmd.Command#execute(org.jbpm.api.cmd.Environment)
*/
@Override
public Boolean execute(Environment environment) throws Exception {
//获取任务服务
TaskService taskService = environment.get(TaskService.class);
//计算出主任务和流程实例ID
this.parentTask = taskService.getTask(parentTaskId);
this.pid = parentTask.getExecutionId();
//获取当前的会签任务
String joinsignTaskId = joinsignTask.getId();
//从当前会签任务的历史变量里面获取‘会签意见’
String sign = (String) taskService.getVariable(parentTaskId, VAR_SIGN);
//设定规则{一票否决}:会签意见为 {false,no,不同意} ,则表示否决
if(StringUtils.equalsIgnoreCase("false", sign)||StringUtils.equalsIgnoreCase("no", sign)||
StringUtils.equalsIgnoreCase("不同意", sign)){
//首先结束会签任务
taskService.completeTask(joinsignTaskId);
//为会签主任务增加一条会签意见的注释记录,一杯日后查询
taskService.addTaskComment(parentTaskId, joinsignTask.getAssignee()+"审批意见:"+ VAR_SIGN);
//结束主任务并流向预定义的会签否决转移
taskService.completeTask(parentTaskId, transitionNoPassName);
//全部结束oa待办
updateOATodo(joinsignTaskId,pid,parentTask.getActivityName());
//返回true,表示会签活动结束
return true;
}
//会签任务通过
taskService.completeTask(joinsignTaskId);
//将当前的用户的协作关系清掉 避免待办任务里继续出现(这里属于特殊处理)
String delSql = "delete jbpm4_participation where task_='"+parentTaskId+"' and userid_=(select t.assignee_ from jbpm4_task t where t.dbid_='"+joinsignTaskId+"' )";
ExecUtil eu = new ExecUtil();
eu.setSQL(delSql);
eu.exec();
//结束当前oa待办
updateOATodo(joinsignTaskId,null,null);
//System.out.println(joinsignTaskId);
//为主任务增加一条注释
taskService.addTaskComment(parentTaskId, joinsignTask.getAssignee()+"审批意见:"+ VAR_SIGN);
//taskService.getSubTasks(parentTaskId).size();// 此处会出错。。
//判断是否还有会签子任务
if(taskService.getSubTasks(parentTaskId).size() == 0){
//已无会签子任务,表明全体会签通过
//结束主任务,并流向会签通过转移
taskService.completeTask(parentTaskId, transitionPassName);
//返回true,表示会签活动结束
return true;
}
//返回false。表示会签活动尚未结束,继续惊进行
return false;
}
<start g="61,6,48,48" name="start1">
<transition to="拟定需求"/>
</start>
<task form="forwardbyparm.do?target=BPM/client/qd/startRequestInfo" g="34,87,101,52" name="拟定需求">
<on event="end">
<event-listener class="org.huitu.business.utask.util.bpmtasklistener.HuiTaskEndListener">
</event-listener>
</on>
<transition g="267,111:-76,-15" name="提交" to="市场部主任一次会签"/>
</task>
<task form="forwardbyparm.do?target=BPM/client/qd/sign" g="204,175,126,52" name="市场部主任一次会签">
<description>{participant:{type:'Role',param1:'R_SIGN_SCBZR'}}</description>
<assignment-handler class="org.huitu.business.utask.util.sign.CommercialTripAssignment">
<field name="participantRule"><string value="{type:'Role',param1:'R_SIGN_SCBZR'}"/></field>
</assignment-handler>
<transition g="156,205:-6,-29" name="不同意" to="需求打回"/>
<transition g="-13,-14" name="同意" to="市场部承办人会签"/>
</task>流程图
<field name="participantRule"><string value="{type:'Role',param1:'R_SIGN_SCBZR'}"/></field>
</assignment-handler>这个类会处理启动子流程CommercialTripAssignment.java
public class CommercialTripAssignment implements AssignmentHandler{
/**
*
*/
private static final long serialVersionUID = -3920702116151020548L; /**
* 获取流程引擎
*/
private final static ProcessEngine processEngine = (ProcessEngine) HuiServiceManager.getInstance().getIocService("processEngine");
/**
* 任务服务
*/
private final static TaskService taskService = processEngine.getTaskService();
/**
* 参与人员,从流程变量获取
*/
private List<String> participants;
/**
* 参与人员,从配置文件中读取
*/
private List<HuiParticipant> participant;
/**
* 参与者规则
*/
String participantRule;
@Override
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
// 获取会签参与人
HuiParticipantRule rule = HuiParticipantRuleUtil.getParticipantRule4Handler(participantRule);
participant = ParticipantParserUtil.getParticipants4Handler(rule, execution);
// 获取会签参与人
//participants = (List<String>) execution.getVariable("participants");
String pid = execution.getProcessInstance().getId();
//获取主任务
Task task = taskService.createTaskQuery().processInstanceId(pid).activityName(execution.getName()).uniqueResult();
createSubTask(task,execution);
}
/**创建子任务
* @param task
*/
private void createSubTask(Task task,OpenExecution execution){
if(participant!=null&&!participant.isEmpty()){
for (HuiParticipant p : participant) {
//创建子流程
Task subTask = ((OpenTask)task).createSubTask();
//设置会签参与者为子任务的分配者
subTask.setAssignee(p.getCode());
//oa待办
insertOATodo(subTask,execution);
//关联主任务
taskService.addTaskParticipatingUser(task.getId(), p.getCode(), Participation.CLIENT);
}
/*
for (String participant : participants) {
//创建子流程
Task subTask = ((OpenTask)task).createSubTask();
//设置会签参与者为子任务的分配者
subTask.setAssignee(participant);
//关联主任务
taskService.addTaskParticipatingUser(task.getId(), participant, Participation.CLIENT);
} */
}
}
}这样就有了多个子任务
processEngine.getTaskService().setVariables(bpmCtlParam.getTaskid(), var);
CounterSignCommand cmd = new CounterSignCommand("同意", "不同意", bpmCtlParam.getTaskid());
boolean b = false;
//获取真正的子任务taskid
String sql = "select dbid_ taskid from jbpm4_task t where t.supertask_ = '"+bpmCtlParam.getTaskid()+"' and t.assignee_ ='"+bpmCtlParam.getCuruser().getCode()+"'";
QueryUtil qu = new QueryUtil();
qu.setWholeSQL(sql);
List list = qu.list();
String taskid = ((Map)list.get(0)).get("taskid").toString();
Task subtask = processEngine.getTaskService().getTask(taskid);//.findPersonalTasks("jacky").get(0);
cmd.setJoinsignTask(subtask);
b =processEngine.execute(cmd);
//执行代码见第一个回复
processEngine.execute(cmd);