一. 流程的批启动

使用场景:针对某个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,启动多个流程实例,具体定义如下:

public static List batchStartProcess(String process, List datas){
List result = new ArrayList();
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 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 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 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());
}
}
} 

   model.rar  支持批流转

本文由WeX5君整理,WeX5一款开源免费的html5开发工具H5 App开发就用WeX5!

阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443