一. 流程的批启动
使用场景:针对某个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
评一波