一. 流程的批启动
使用场景:针对某个data中的数据,为每一条记录启动一个流程实例。
接口协议:输入data中多个记录的id,启动多个流程实例;返回这些流程实例的第一个环节的待办任务(注意:要求每个流程实例有且只有一条待办任务,后续才能执行批流转);
实现方式:有两种方式
1. 使用process组件来启动多个流程实例
1.0 设置process组件的属性:
autoClose、autoStart、autoSave、autoFilter的属性值设置为false
1.1 声明一个实例变量,用来存储流程启动后的待办任务
var Model = function() { this.callParent(); this.tasks = [];// 用于存在流程启动后关系的待办,将会在process的onStartCommit事件中赋值 };
1.2 获取选中的数据(此案例用的dataTabels组件),分别启动流程
Model.prototype.batchStartProcess1 = function() { var dataTables = this.comp("list"); // 获取选择行的rowId var checkedIDs = dataTables.getCheckeds(); if (checkedIDs.length == 0) { alert("请选择要启动的订单!"); return; } // 根据业务数据启动多个流程实例,在启动的process的onStartCommit事件中收集待办任务的id biz.Request.beginBatch();// 启动批 var p = this.comp("process1"); for (var i = 0; i < checkedIDs.length; i++) { p.start(null, null, checkedIDs[i].getID(), null);// 批中启动流程 } biz.Request.endBatch();// 结束批 if (this.tasks.length == 0) { alert("启动流程失败!"); return; } };
1.3 在process的onStartCommit事件中收集每个流程实例的待办任务
Model.prototype.process1StartCommit = function(event) { this.tasks.push(event.task); };
1.4 到此为止,流程已经启动成功,this.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>
action对应的procedure定义如下:
<procedure name="batchStartProcessProcedure" code-model="/demo/process/logic/code" code="Process.batchStartProcess"> <parameter name="process" type="String"/> <parameter name="datas" type="List"/> </procedure>
对应的java代码如下:
public static List<String> batchStartProcess(String process, List<String> datas){ List<String> result = new ArrayList<String>(); for (String data : datas){ List<Map<String, String>> items = ProcessUtils.startProcess(process, null, data, null); if (items.size() != 1){ throw new RuntimeException("流程启动后必须有且只能有一个待办!"); } String task = items.get(0).get("task"); result.add(task); } return result; }
2.1 界面的js中调用batchStartProcessAction这个action,如下:
Model.prototype.batchStartProcess2 = function(){ var me = this; var dataTables = me.comp("list"); var dList = me.comp("mainData"); // 获取选择行的rowId var checkedIDs = dataTables.getCheckeds(); if (checkedIDs.length == 0) { alert("请选择要启动的订单!"); return; } //调用action,并传参 var param = new biz.Request.ActionParam(); var dataParam = new biz.Request.ListParam(); for (var i = 0; i < checkedIDs.length; i++) { dataParam.add(checkedIDs[i].getID()); } param.setString("process", this.getContext().getCurrentProcess()); param.setList("datas", dataParam); biz.Request.sendBizRequest({ "context" : this.getContext(), "action" : "batchStartProcessAction", "parameters" : param, "callback" : function(callbackData) { if (callbackData.state) { me.tasks = callbackData.response;//收集启动成功后返回的每个流程实例的待办任务 alert("批量启动成功") } } }); };
2.2 到此为止,多个流程实例已经启动,所有的待办都存储在实例遍历this.tasks中.
二. 流程的批流转
使用场景:已知多个待办任务,对这些待办任务进行批量流转,要求这些待办的后续环节和执行者信息一致;
接口协议:输入多个流程实例的待办,执行流转操作。
基本思路:使用其中一条待办任务进行流转查询,弹出对话框供用户修改流转信息(主要是执行者信息);之后根据用户选择的执行者,批量流转所有的待办任务。
实现步骤:
1. 使用第个待办任务执行流转查询
Model.prototype.batchAdvanceProcess = function(){ var p = this.comp("process1"); // 使用其中的一条待办执行流转查询,并弹出流转对话框给用户修改,以得到control信息 p.advanceQueryExt(this.tasks[0]); }
2. 用户可以看到流转对话框,修改其中的执行者信息
3. 在process组件的onBeforeAdvance事件中,获取编辑后的流转信息,取消后续操作,调用后台的自定义的批流转动作(batchAdvanceProcessAction)
Model.prototype.process1BeforeAdvance = function(event) { event.cancel = true; // 取消后续操作 // 所有的待办按得到的control中的执行人进行流转 var params = new biz.Request.ActionParam(); var tasksParam = new biz.Request.ListParam(); // 批量启动后直接批量流转 for (var i = 0; i < this.tasks.length; i++) { tasksParam.add(this.tasks[i]); } params.setList("tasks", tasksParam); var controlData = event.processControl.getData(); var controlParam = new biz.Request.ObjectParam(controlData, "com.justep.system.process.ProcessControl"); params.setObject("control", controlParam); biz.Request.sendBizRequest({ "context" : this.getContext(), "action" : "batchAdvanceProcessAction", "directExecute" : true, "parameters" : params }); // 流程成功后关闭页面 setTimeout(function() { me.close() }, 1); };
4. batchAdvanceProcessAction的定义如下:
<action name="batchAdvanceProcessAction" global="false" procedure="batchAdvanceProcessProcedure"> <public type="List" name="tasks"/> <public type="Object" name="control"/> </action>
action对应的procedure定义如下:
<procedure name="batchStartProcessProcedure" code-model="/demo/process/logic/code" code="Process.batchStartProcess"> <parameter name="process" type="String"/> <parameter name="datas" type="List"/> </procedure>
对应的java代码如下:
/** * 当前主要使用control中后续环节和通知的执行人信息 */ 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()); } } }
在BeX5中默认的/BIZ/demo/process下就有批启动和批流转的BIZ相关的资源包括上面发的action以及java的定义
下面的附件是对应的UI2下的资源,可以直接把目录放到/UI2/demo/process/process下,然后添加菜单配置分配功能权限即可运行batch
评一波