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

QQ登录

只需一步,快速开始

查看: 15231|回复: 13

流程高级特性之: 批启动批流转

  [复制链接]

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2012-11-27 16:49:40 | 显示全部楼层 |阅读模式
本帖最后由 hecr 于 2013-3-6 14:04 编辑

一. 流程的批启动
      使用场景:针对某个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,启动多个流程实例,具体定义如下:
                   <action name="batchStartProcessAction" global="false" procedure="batchStartProcessProcedure">
                        <public type="String" name="process"/>
                        <public type="List" name="datas"/>
                  </action>
                 <procedure name="batchStartProcessProcedure" code-model="/demo/process/logic/code"
                          code="Process.batchStartProcess">
                      <parameter name="process" type="String"/>
                      <parameter name="datas" type="List"/>
                </procedure>
                 public static List<String> batchStartProcess(String process, List<String> datas){
                       List<String> result = new ArrayList<String>();
                       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<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());
                      }
                 }
           }


  






  




model.rar

35.02 KB, 下载次数: 2457

支持批流转

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
 楼主| 发表于 2012-12-13 16:11:48 | 显示全部楼层
参考/UI/system/components/process/process.js组件中
                                var processControlParameter = "";
                                if ((processControl!=undefined) && (processControl!=null) && (processControl.getXMLString() != null)){
                                        processControlParameter = "<parameter name=\"control\"><xbizbject class=\"com.justep.system.process.ProcessControl\">" + processControl.getXMLString() + "</xbizbject></parameter>";
                                }
                               
                                options.parameters = "        <parameters xmlns:xbiz=\"http://www.justep.com/xbiz#\">" +
                                "                <parameter name=\"task\">" +
                                "                        <xbiz:simple type=\"" + justep.XML.Namespaces.XMLSCHEMA_STRING + "\"" +
                                "                                >" + task + "</xbiz:simple>" +
                                "                </parameter>" + processControlParameter +
                                "        </parameters>";
调用流转操作的代码
匿名  发表于 2014-7-4 18:46:41
附言没有都添加上,批量的时候只会有一条任务数据加上了附言。是不是需要在java添加一个方法?该怎么做?

47

主题

137

帖子

320

积分

中级会员

Rank: 3Rank: 3

积分
320
发表于 2012-12-1 17:12:13 | 显示全部楼层
请问,v2000 sp1可以做批量流转么?

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
 楼主| 发表于 2012-12-2 17:18:30 | 显示全部楼层
支持,流程启动时,需要使用方式二(方式一在sp1上平台的process组件上有个bug)

0

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2012-12-12 23:16:11 | 显示全部楼层
var controlData = event.processControl.getData();
var controlParam = new justep.Request.ObjectParam(controlData,"com.justep.system.process.ProcessControl");
options.parameters.setObject("control", controlParam);
justep.Request.sendBizRequest2(options);
这里的event.processControl 已经没有 getData()方法了,是不是有新写法呢?
版本:5.2.1.2000

0

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2012-12-14 00:24:02 | 显示全部楼层
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <parameters xmlns:xbiz="http://www.justep.com/xbiz#">  
  3.   <parameter name="tasks">
  4.     <xbiz:simple type="http://www.w3.org/2001/XMLSchema#String">D2036B83C2484DE69017B7BADD9358D9</xbiz:simple>
  5.   </parameter>
  6.   <parameter name="control">
  7.     <xbiz:object class="com.justep.system.process.ProcessControl">
  8.       <process-control>
  9.         <status>none</status>
  10.         <message>返回ProcessControl状态信息不对!</message>
  11.         <dialog-enabled>true</dialog-enabled>
  12.         <save-history>true</save-history>
  13.         <task-join>false</task-join>
  14.         <customized-enabled>false</customized-enabled>
  15.         <jump-enabled>false</jump-enabled>
  16.         <runnable-activities>
  17.           <item operator="" selected="">
  18.             <activity activity="bizActivity3" name="工程公司业务人员核对" optional="false"
  19.               selected="1"/>
  20.           </item>
  21.         </runnable-activities>
  22.         <notice/>
  23.         <to>
  24.           <process-control-item selected="true" id="20b8f6c1-a85d-46e2-aa41-c80f6159141a" readonly="false"
  25.             is-end="false">
  26.             <unit>bizActivity3</unit>
  27.             <passed-activities/>
  28.             <task-assign-mode>together</task-assign-mode>
  29.             <process>/sggl/ProjectBaseInfo/process/ProjectInfo/projectInfoProcess</process>
  30.             <executor-kinds>PSM</executor-kinds>
  31.             <task-relation-value id="20b8f6c1-a85d-46e2-aa41-c80f6159141a">
  32.               <sEURL>/sggl/ProjectBaseInfo/process/ProjectInfo/bizActivity3.w</sEURL>
  33.               <sLock>1B214FDFF573418A82371EA60E0D12DB</sLock>
  34.               <sTypeName>项目概况</sTypeName>
  35.               <sExecuteMode>temPreempt</sExecuteMode>
  36.               <sActivityName>工程公司业务人员核对</sActivityName>
  37.               <sName>工程公司业务人员核对:项目概况--标准项目1</sName>
  38.               <sPreemptMode>tpmOpen</sPreemptMode>
  39.               <sActivity>bizActivity3</sActivity>
  40.               <sCreateTime>2012-12-14T00:10:22.718Z</sCreateTime>
  41.               <sCURL>/sggl/ProjectBaseInfo/process/ProjectInfo/bizActivity2.w</sCURL>
  42.               <sProcess>/sggl/ProjectBaseInfo/process/ProjectInfo/projectInfoProcess</sProcess>
  43.               <sLastModifyTime>2012-12-14T00:10:22.765Z</sLastModifyTime>
  44.               <sProcessName>项目概况</sProcessName>
  45.               <sLimitTime/>
  46.               <sEmergencyID/>
  47.               <sWarningTime/>
  48.               <sRemindMode/>
  49.               <sEmergencyName/>
  50.               <sContent/>
  51.             </task-relation-value>
  52.             <executors>
  53.               <org-unit>
  54.                 <fid>/0000000000.ogn/0011000000.ogn/0011010001.ogn/7CAD82720FB94616BC7C289B65BE5EFB.dpt/9B0074CA7244446081F6574EA18A1492.pos/472BB540259149DAB4B5B98B4F7843EA@9B0074CA7244446081F6574EA18A1492.psm</fid>
  55.                 <fname>/股份公司/XXXX/一公司/机关/业务人员/XX</fname>
  56.                 <responsible>false</responsible>
  57.                 <name>XX</name>
  58.                 <kind>psm</kind>
  59.               </org-unit>
  60.             </executors>
  61.           </process-control-item>
  62.         </to>
  63.       </process-control>
  64.     </xbiz:object>
  65.   </parameter>
  66. </parameters>
复制代码
按这个写法,打印出来的串是这样的。
  1.         public static void batchAdvanceProcess(String tasks, ProcessControl control){
  2.                 System.out.println("================进来了=========================");
  3.                 [color=Red]System.out.println("tasks-->:" + tasks);  //这里为null
  4.                 System.out.println("control-->:" + control.toString());
复制代码
//这里也是null

action,procedure如下:
  1. <action name="batchAdvanceProcessAction" global="false" procedure="batchAdvanceProcessProcedure">
  2.     <public type="String" name="tasks"/>  
  3.     <public type="Object" name="control"/>
  4.   </action>
复制代码
  1.   <procedure name="batchAdvanceProcessProcedure" code-model="/sggl/ProjectBaseInfo/logic/code"
  2.     code="Process.batchAdvanceProcess">
  3.     <parameter name="tasks" type="String"/>  
  4.     <parameter name="control" type="Object"/>
  5.   </procedure>
复制代码

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
 楼主| 发表于 2012-12-14 09:39:53 | 显示全部楼层
本帖最后由 hecr 于 2013-3-6 13:53 编辑

修改其中的流转方法,兼容2000 sp2之前版本
  1. mainActivity.processBeforeAdvance = function(event){
  2. event.cancel = true; //取消后续操作

  3. //所有的待办按得到的control中的执行人进行流转
  4. var options = {};
  5. options.process = justep.Context.getCurrentProcess();
  6. options.activity = justep.Context.getCurrentActivity();
  7. options.action = "batchAdvanceProcessAction";
  8. options.directExecute = true;

  9. options.parameters = new justep.Request.ActionParam();
  10. var taskParam = new justep.Request.ListParam();
  11. for (var i=0; i<tasks.length; i++){
  12. taskParam.add(tasks[i]);
  13. }
  14. options.parameters.setList("tasks", taskParam);

  15. var controlData = null;
  16. if (event.processControl.getDataType != undefined){
  17. //2000 sp2及之后的版本
  18. if (event.processControl.getDataType() == "json"){
  19. options.contentType = "json";
  20. controlData = event.processControl.getData();
  21. }else{
  22. options.contentType = "xml";
  23. controlData = event.processControl.getXMLString();
  24. }
  25. }else{
  26. //2000 sp2之前的版本
  27. options.contentType = "xml";
  28. controlData = event.processControl.getXMLString();
  29. }


  30. var controlParam = new justep.Request.ObjectParam(controlData, "com.justep.system.process.ProcessControl");
  31. options.parameters.setObject("control", controlParam);
  32. justep.Request.sendBizRequest2(options);

  33. justep.Portal.closeWindow();
  34. };
复制代码

model.rar

35.02 KB, 下载次数: 2068

流程批操作(流转支持2000 sp2之前的版本)

0

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2012-12-14 19:09:05 | 显示全部楼层
可是没有
justep.Request下没有ObjectParam方法呀~

41

主题

216

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
QQ
发表于 2013-7-24 17:18:01 | 显示全部楼层
学习
一二三四五,上山打老虎

170

主题

838

帖子

2136

积分

金牌会员

Rank: 6Rank: 6

积分
2136
QQ
发表于 2014-5-23 17:05:05 | 显示全部楼层
请问一下,如果我的流程都启动,或者启动后没有及时流转,下次在进来的时候,那var tasks = []; 就会为空,就不能进行批量流转了
你不向前奔跑,没有人愿意停下来等你!
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

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

GMT+8, 2024-4-20 18:43 , Processed in 0.080087 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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