起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9201|回复: 5

主流程+子流程+自动环节批转 案例

  [复制链接]

4

主题

1579

帖子

2706

积分

内部用户

积分
2706
发表于 2013-9-17 17:03:42 | 显示全部楼层 |阅读模式
本帖最后由 XiaoQLuo 于 2013-9-17 17:08 编辑

案例中实现主流程+子流程+自动环节批转等特性:
简单说明案例中包含:4个流程,主流程没有关联业务数据,其中每个环节都是一个子流程,进入环节自动启动子流程,主流程任务挂起,当子流程结束后唤醒主流程继续流程分别是:
主流程(master),这是一个流程框架,没有相关业务数据
子流程(c1)
子流程(c2)
子流程(c3)

1、主流程UI使用windowFrame控制子流程界面
2、子流程启动时创建主流程,小技巧使用sData2记录关联的子流程的sData1,具体看启动主流程代码(/BIZ/demo/components/logic/code/src/com/justep/demo/DemoUtils.java)
  1. public static void startMasterProcess(String masterProcess, String masterActivity) {
  2.                 ActionContext context = ActionUtils.getRequestContext().getActionContext();
  3.                 Map<String, Object> relas = (Map<String, Object>) context.getParameter(ProcessConstants.PI_RELATION_VALUE_PARAMETER);
  4.                 //启动主流程
  5.                 String sData1 = CommonUtils.createGUID();
  6.                 String sData2 = null;
  7.                 if(null!=relas) sData2 = (String)relas.get("sData1");//把当前的sData1存到主流程的sData2
  8.                
  9.                 ProcessControl control = ProcessUtils.startProcessQuery(masterProcess, null, null);
  10.                 List<ProcessControlItem> items = control.getFlowTos();
  11.                 for(int i = items.size()-1; i>=0; i--){
  12.                         if(!masterActivity.equals(items.get(i).getUnit()))
  13.                                 control.removeFlowTo(items.get(i));//清除多余流转
  14.                 }
  15.                 ProcessControlItem item = control.getFlowTo(masterActivity);
  16.                 item.setSelected(true);
  17.                 item.clearExecutors();
  18.                 item.addExecutor(new OrgUnit(ContextHelper.getPersonMember().getFID(), ContextHelper.getPersonMember().getFName()));
  19.                 Map<String, Object> relations = new HashMap<String, Object>();
  20.                 relations.put("sName", "主流程启动-"+masterActivity+"触发");
  21.                 relations.put("sData1", sData1);
  22.                 relations.put("sData2", sData2);
  23.                 Document doc = ProcessUtils.startProcess(masterProcess, relations, control, new ArrayList<String>(), null);
  24.                 String task = doc.selectSingleNode("/items/item/task").getText();
  25.                
  26.                 //子流程写入主流程任务,用于唤醒
  27.                 if(null!=relas){
  28.                         relas.put("sData2", task);//记录主流程的任务id
  29.                 }
  30.                
  31.                 //暂停主流程
  32.                 ProcessUtils.suspendProcess(task, null);
  33.         }
复制代码
3、子流程2后自动批转到子流程等待环节
  1. public static void c2AfterAdvance() {
  2.                 //获取新任务的id
  3.                 Document doc = (Document) ContextHelper.getActionContext().getActionResult();
  4.                 String task = doc.selectSingleNode("/items/item/task").getText();

  5.                 //继续批转,到等待环节
  6.                 ProcessControl control = ProcessUtils.advanceProcessQuery(task);
  7.                 ProcessControlItem item = control.getFlowTos().get(0);
  8.                 item.clearExecutors();
  9.                 //指定相同的执行者
  10.                 ProcessControlItem c3item = ProcessUtils.getProcessContext().getProcessControl().getFlowTo("c3");
  11.                 for (OrgUnit ou : c3item.getExecutors()) {
  12.                         item.addExecutor(ou);
  13.                 }
  14.                 //批转
  15.                 ProcessUtils.advanceProcess(task, control);
  16.         }
复制代码
  1. public static void c3AfterAdvance() {
  2.                 //获取新任务的id
  3.                 Document doc = (Document) ContextHelper.getActionContext().getActionResult();
  4.                 String task = doc.selectSingleNode("/items/item/task").getText();

  5.                 //方法1,通过创建任务完成任务转移
  6.                 //产生C3流程的入口任务,通过任务的sData1传递当前暂停任务的id,执行人同主流程的执行人
  7.                 /*
  8.                 ProcessControlItem item = ProcessUtils.getProcessContext().getProcessControl().getFlowTos().get(0);
  9.                 Task t = TaskHelper.createTask("创建启动C3的功能任务", "/demo/components/process/c3/c3Process", "c3Activity", "/demo/components/process/c3/c3Activity.w",
  10.                                 "/demo/components/process/c3/c3Activity.w", task, item.getExecutors(), null);
  11.                 t.save();
  12.                 */
  13.                
  14.                 //方法2,直接产生业务数据,启动C3流程
  15.                 ProcessControlItem mitem = ProcessUtils.getProcessContext().getProcessControl().getFlowTos().get(0);
  16.                 Table t = KSQL.select("select DEMO_TABLE3.* from DEMO_TABLE3 DEMO_TABLE3 where 1 = 2", null, "/demo/components/data", null);
  17.                 t = BizData.create(t, "DEMO_TABLE3", null, null);//产生业务数据
  18.                 t.save("/demo/components/data");
  19.                 String sData1 = t.iterator().next().getString("DEMO_TABLE3");
  20.                
  21.                 ProcessControl control = ProcessUtils.startProcessQuery("/demo/components/process/c3/c3Process", null, null);
  22.                 ProcessControlItem item = control.getFlowTos().get(0);
  23.                 item.setSelected(true);
  24.                 item.clearExecutors();
  25.                 for (OrgUnit ou : mitem.getExecutors()) {
  26.                         item.addExecutor(ou);
  27.                 }
  28.                 Map<String, Object> relations = new HashMap<String, Object>();
  29.                 relations.put("sName", "C3启动-主流程触发");
  30.                 relations.put("sData1", sData1);//写入关联业务数据的id
  31.                 relations.put("sData2", task);//写入暂停的任务数据
  32.                 ProcessUtils.startProcess("/demo/components/process/c3/c3Process", relations, control, null, null);

  33.                 //暂停下一个任务
  34.                 ProcessUtils.suspendProcess(task, null);
  35.         }
复制代码
4、子流程3结束唤醒主流程
  1. public static void c3ProcessAfterFinish() {
  2.                 //唤醒主流程任务
  3.                 DemoUtils.resumeMasterProcess();
  4.         }
复制代码
主流程.png
UI1.png
c3.png
c2.png
c1.png

主流程 子流程demo.zip

280.49 KB, 下载次数: 2463

评分

参与人数 1威望 +20 收起 理由
wgs7909 + 20 很给力!

查看全部评分

2

主题

15

帖子

41

积分

新手上路

Rank: 1

积分
41
QQ
发表于 2014-3-19 14:59:49 | 显示全部楼层
1、楼主,为什么我在子流程1流转时报错null,详细如下:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at com.justep.system.action.Engine.invokeActions(Native Method)
at com.justep.system.action.Engine.invokeActions(Unknown Source)
at com.justep.business.server.BusinessServer.doAction(Unknown Source)
at com.justep.business.server.BusinessServer.doExcute(Unknown Source)
at com.justep.business.server.BusinessServer.excute(Unknown Source)
at com.justep.business.server.BusinessServerServlet.execService(Unknown Source)
at com.justep.business.server.BusinessServerServlet.service(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at com.justep.x.bs.BusinessServerServlet.service(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at com.justep.system.action.Engine.invokeAction(Native Method)
at com.justep.system.action.Engine.invokeAction(Unknown Source)
at com.justep.model.impl.UtilImplementInstance.invokeAction(Unknown Source)
at com.justep.model.impl.UtilImplementInstance.invokeAction(Unknown Source)
at com.justep.system.action.ActionUtils.invokeAction(Unknown Source)
at com.justep.system.process.ProcessUtils.startProcess(Unknown Source)
at ExternalProcessProcedure.startProcess(ExternalProcessProcedure.java:21)
... 26 more
Caused by: java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at com.justep.demo.DemoUtils.startMasterProcess(DemoUtils.java:55)
at C1Process.c1ProcessBeforeStart(C1Process.java:7)
... 37 more

url:/UI/system/service/common/bizAction.j
param:         /demo/components/process/c1/c1Process         F79557BB41314C17B5C0D51266CBC971       
at (http://127.0.0.1:8080/x5/$v511d8e98097143cfbd37ba7511ccb2f5/base/base.js?language=zh_CN:1)68

但是执行子流程2以后的流程都可以流转?

2

主题

15

帖子

41

积分

新手上路

Rank: 1

积分
41
QQ
发表于 2014-3-27 09:53:33 | 显示全部楼层
楼主,在吗?回个音呗!

4

主题

1579

帖子

2706

积分

内部用户

积分
2706
 楼主| 发表于 2014-4-1 10:18:11 | 显示全部楼层
tianyucaohao 发表于 2014-3-27 09:53
楼主,在吗?回个音呗!

你理解了上面案例的原理吗?

如果按照这个逻辑去做应该没有什么问题

850

主题

2558

帖子

5680

积分

论坛元老

Rank: 8Rank: 8

积分
5680
QQ
发表于 2017-4-16 16:07:16 | 显示全部楼层
请问版主,此案例是在哪个版本下开发出来的。我在3.6版本下打不开.w文件啊。提示.w文件有语法错误。可是我查了一下,感觉没有什么问题
企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667

4

主题

1579

帖子

2706

积分

内部用户

积分
2706
 楼主| 发表于 2017-4-24 09:26:58 | 显示全部楼层
wgs7909 发表于 2017-4-16 16:07
请问版主,此案例是在哪个版本下开发出来的。我在3.6版本下打不开.w文件啊。提示.w文件有语法错误。可是我 ...

这个例子只能在5.2系列运行,5.3系列的需要安装兼容包才能运行5.2的功能;

看懂原理可以自己在5.3上再实现相关逻辑
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2022-12-10 01:28 , Processed in 0.068396 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表