|
本帖最后由 hecr 于 2013-3-6 14:04 编辑
一. 流程的批启动
使用场景:针对某个data中的数据,为每一条记录启动一个流程实例。
接口协议:输入data中多个记录的id,启动多个流程实例;返回这些流程实例的第一个环节的待办任务(注意:要求每个流程实例有且只有一条待办任务,后续才能执行批流转);
实现方式:有两种方式
1. 使用process组件来启动多个流程实例
1.0 设置process组件的属性:
auto-close=true;
auto-start=false;
auto-save=true;
auto-filter=false;
1.1 声明一个全局变量,用来存储流程启动后的待办任务
var tasks = []; //用于存在流程启动后关系的待办,将会在process的start commit事件中赋值
1.2 遍历data中的数据,分别启动流程
function batchStartProcess(dataID, processID){
var data = justep.xbl(dataID);
if (data.getCount()<1){
alert("当前业务数据为空!");
return;
}
//根据业务数据启动多个流程实例,在启动的process的start commit事件中收集待办任务的id
justep.Request.beginBatch();
var p = justep.xbl(processID);
for (var i=0; i<data.getCount(); i++){
p.start(justep.Context.getCurrentProcess(), justep.Context.getCurrentActivity(), data.getID(i), "");
}
justep.Request.endBatch();
if (tasks.length == 0){
alert("启动流程失败!");
return;
}
}
1.3 在process的onStartCommit事件中收集每个流程实例的待办任务
mainActivity.processStartCommit = function(event){
tasks.push(event.task);
};
1.4 到此为止,流程已经启动成功,tasks变量中存储了所有流程实例的待办任务;
2. 使用自定义的action来启动多个流程实例
2.0 后台自定义一个batchStartProcessAction,接收多个业务数据ID,启动多个流程实例,具体定义如下:
<action name="batchStartProcessAction" global="false" procedure="batchStartProcessProcedure">
<public type="String" name="process"/>
<public type="List" name="datas"/>
</action>
<procedure name="batchStartProcessProcedure" code-model="/demo/process/logic/code"
code="Process.batchStartProcess">
<parameter name="process" type="String"/>
<parameter name="datas" type="List"/>
</procedure>
public static List<String> batchStartProcess(String process, List<String> datas){
List<String> result = new ArrayList<String>();
for (String data : datas){
Document doc = ProcessUtils.startProcess(process, null, data, null);
List<?> nodes = doc.selectNodes(".//task");
if (nodes.size() != 1){
throw new RuntimeException("流程启动后必须有且只能有一个待办!");
}
String task = ((Element)nodes.get(0)).getTextTrim();
result.add(task);
}
return result;
}
2.1 界面的js中启动这个batchStartProcessAction,如下:
function batchStartProcess2(dataID){
var options = {};
options.process = justep.Context.getCurrentProcess();
options.activity = justep.Context.getCurrentActivity();
options.action = "batchStartProcessAction";
options.contentType = "json";
options.directExecute = true;
options.parameters = new justep.Request.ActionParam();
var dataParam = new justep.Request.ListParam();
var data = justep.xbl(dataID);
if (data.getCount()<1){
alert("当前业务数据为空!");
return;
}
for (var i=0; i<data.getCount(); i++){
dataParam.add(data.getID(i));
}
options.parameters.setList("datas", dataParam);
options.parameters.setString("process", justep.Context.getCurrentProcess());
var r = justep.Request.sendBizRequest2(options);
if (justep.Request.isBizSuccess(r)){
tasks = justep.Request.transformList(justep.Request.getData(r.responseXML));
}
}
2.2 到此为止,多个流程实例已经启动,所有的待办都存储在全局变量tasks中.
二. 流程的批流转
使用场景:已知多个待办任务,对这些待办任务进行批量流转,要求这些待办的后续环节和执行者信息一致;
接口协议:输入多个流程实例的待办,执行流转操作。
基本思路:使用其中一条待办任务进行流转查询,弹出对话框供用户修改流转信息(主要是执行者信息);之后根据用户选择的执行者,批量流转所有的待办任务。
实现步骤:
1. 使用第个待办任务执行流转查询
function batchAdvanceProcess(processID){
var p = justep.xbl(processID);
//使用其中的一条待办执行流转查询,并弹出流转对话框给用户修改,以得到control信息
p.advanceQueryExt(tasks[0]);
}
2. 用户可以看到流转对话框,修改其中的执行者信息
3. 在process组件的onBeforeAdvance事件中,获取编辑后的流转信息,取消后续操作,调用后台的自定义的批流转动作(batchAdvanceProcessAction)
mainActivity.processBeforeAdvance = function(event){
event.cancel = true; //取消后续操作
//所有的待办按得到的control中的执行人进行流转
var options = {};
options.process = justep.Context.getCurrentProcess();
options.activity = justep.Context.getCurrentActivity();
options.action = "batchAdvanceProcessAction";
options.directExecute = true;
options.parameters = new justep.Request.ActionParam();
var taskParam = new justep.Request.ListParam();
for (var i=0; i<tasks.length; i++){
taskParam.add(tasks);
}
options.parameters.setList("tasks", taskParam);
var controlData = null;
if (event.processControl.getDataType != undefined){
//2000 sp2及之后的版本
if (event.processControl.getDataType() == "json"){
options.contentType = "json";
controlData = event.processControl.getData();
}else{
options.contentType = "xml";
controlData = event.processControl.getXMLString();
}
}else{
//2000 sp2之前的版本
options.contentType = "xml";
controlData = event.processControl.getXMLString();
}
var controlParam = new justep.Request.ObjectParam(controlData, "com.justep.system.process.ProcessControl");
options.parameters.setObject("control", controlParam);
justep.Request.sendBizRequest2(options);
justep.Portal.closeWindow();
};
4. batchAdvanceProcessAction的定义可以参考附件中的内容,关键实现如下:
public static void batchAdvanceProcess(List<String> tasks, ProcessControl control){
for (String task : tasks){
ProcessControl cur = ProcessUtils.advanceProcessQuery(task);
modifyFlowToExecutor(cur, control);
modifyNoticeExecutor(cur, control);
ProcessUtils.advanceProcess(task, cur);
}
}
private static void modifyNoticeExecutor(ProcessControl cur, ProcessControl control){
Iterator<ProcessControlItem> it = cur.getNotices().iterator();
while (it.hasNext()){
ProcessControlItem item = it.next();
ProcessControlItem template = control.getNotice(item.getUnit());
if (template == null){
it.remove();
}else{
item.clearExecutors();
item.addExecutors(template.getExecutors());
}
}
}
private static void modifyFlowToExecutor(ProcessControl cur, ProcessControl control){
Iterator<ProcessControlItem> it = cur.getFlowTos().iterator();
while (it.hasNext()){
ProcessControlItem item = it.next();
ProcessControlItem template = control.getFlowTo(item.getUnit());
if (template == null){
it.remove();
}else{
item.clearExecutors();
item.addExecutors(template.getExecutors());
}
}
}
|
|