案例中实现主流程+子流程+自动环节批转等特性:
简单说明案例中包含:4个流程,主流程没有关联业务数据,其中每个环节都是一个子流程,进入环节自动启动子流程,主流程任务挂起,当子流程结束后唤醒主流程继续流程分别是:
主流程(master),这是一个流程框架,没有相关业务数据
子流程(c1)
子流程(c2)
子流程(c3)
1、主流程UI使用windowFrame控制子流程界面
2、子流程启动时创建主流程,小技巧使用sData2记录关联的子流程的sData1,具体看启动主流程代码(/BIZ/demo/components/logic/code/src/com/justep/demo/DemoUtils.java)
public static void startMasterProcess(String masterProcess, String masterActivity) { ActionContext context = ActionUtils.getRequestContext().getActionContext(); Map<String, Object> relas = (Map<String, Object>) context.getParameter(ProcessConstants.PI_RELATION_VALUE_PARAMETER); //启动主流程 String sData1 = CommonUtils.createGUID(); String sData2 = null; if(null!=relas) sData2 = (String)relas.get("sData1");//把当前的sData1存到主流程的sData2 ProcessControl control = ProcessUtils.startProcessQuery(masterProcess, null, null); List<ProcessControlItem> items = control.getFlowTos(); for(int i = items.size()-1; i>=0; i--){ if(!masterActivity.equals(items.get(i).getUnit())) control.removeFlowTo(items.get(i));//清除多余流转 } ProcessControlItem item = control.getFlowTo(masterActivity); item.setSelected(true); item.clearExecutors(); item.addExecutor(new OrgUnit(ContextHelper.getPersonMember().getFID(), ContextHelper.getPersonMember().getFName())); Map<String, Object> relations = new HashMap<String, Object>(); relations.put("sName", "主流程启动-"+masterActivity+"触发"); relations.put("sData1", sData1); relations.put("sData2", sData2); Document doc = ProcessUtils.startProcess(masterProcess, relations, control, new ArrayList<String>(), null); String task = doc.selectSingleNode("/items/item/task").getText(); //子流程写入主流程任务,用于唤醒 if(null!=relas){ relas.put("sData2", task);//记录主流程的任务id } //暂停主流程 ProcessUtils.suspendProcess(task, null); } 复制代码
3、子流程2后自动批转到子流程等待环节
public static void c2AfterAdvance() { //获取新任务的id Document doc = (Document) ContextHelper.getActionContext().getActionResult(); String task = doc.selectSingleNode("/items/item/task").getText(); //继续批转,到等待环节 ProcessControl control = ProcessUtils.advanceProcessQuery(task); ProcessControlItem item = control.getFlowTos().get(0); item.clearExecutors(); //指定相同的执行者 ProcessControlItem c3item = ProcessUtils.getProcessContext().getProcessControl().getFlowTo("c3"); for (OrgUnit ou : c3item.getExecutors()) { item.addExecutor(ou); } //批转 ProcessUtils.advanceProcess(task, control); } 复制代码
public static void c3AfterAdvance() { //获取新任务的id Document doc = (Document) ContextHelper.getActionContext().getActionResult(); String task = doc.selectSingleNode("/items/item/task").getText(); //方法1,通过创建任务完成任务转移 //产生C3流程的入口任务,通过任务的sData1传递当前暂停任务的id,执行人同主流程的执行人 /* ProcessControlItem item = ProcessUtils.getProcessContext().getProcessControl().getFlowTos().get(0); Task t = TaskHelper.createTask("创建启动C3的功能任务", "/demo/components/process/c3/c3Process", "c3Activity", "/demo/components/process/c3/c3Activity.w", "/demo/components/process/c3/c3Activity.w", task, item.getExecutors(), null); t.save(); */ //方法2,直接产生业务数据,启动C3流程 ProcessControlItem mitem = ProcessUtils.getProcessContext().getProcessControl().getFlowTos().get(0); Table t = KSQL.select("select DEMO_TABLE3.* from DEMO_TABLE3 DEMO_TABLE3 where 1 = 2", null, "/demo/components/data", null); t = BizData.create(t, "DEMO_TABLE3", null, null);//产生业务数据 t.save("/demo/components/data"); String sData1 = t.iterator().next().getString("DEMO_TABLE3"); ProcessControl control = ProcessUtils.startProcessQuery("/demo/components/process/c3/c3Process", null, null); ProcessControlItem item = control.getFlowTos().get(0); item.setSelected(true); item.clearExecutors(); for (OrgUnit ou : mitem.getExecutors()) { item.addExecutor(ou); } Map<String, Object> relations = new HashMap<String, Object>(); relations.put("sName", "C3启动-主流程触发"); relations.put("sData1", sData1);//写入关联业务数据的id relations.put("sData2", task);//写入暂停的任务数据 ProcessUtils.startProcess("/demo/components/process/c3/c3Process", relations, control, null, null); //暂停下一个任务 ProcessUtils.suspendProcess(task, null); } 复制代码
4、子流程3结束唤醒主流程
public static void c3ProcessAfterFinish() { //唤醒主流程任务 DemoUtils.resumeMasterProcess(); } 复制代码
主流程
UI1
C3
C2
C1
本文由WeX5君整理,WeX5一款开源免费的html5开发工具,H5 App开发就用WeX5!
阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443
评一波