由流程向导生成的功能是一打开功能,就显示一个流程的信息,有时候需要一打开功能,就显示多个流程的信息,例如下面的界面

190
在这个功能中,可以新建一个流程、启动流程、流转、回退,也可以多选后,进行批量操作,例如:批量启动流程,批量流转流程还通过定义了公共事件,在启动和流转之后,将该流程的处理环节和处理人回写到业务数据中,这个例子是在综合案例里面的订单流程基础上扩展的,在/UI/demo/misc/process/order目录下新建listActivity.w文件

启动流程

在listActivity.w文件中放一个process组件,调用这个组件的start方法,启动流程

不需要设置process组件的data属性,auto-start、auto-close、auto-filter、auto-save都设置为false代码如下,第3个参数传列表data的行ID

justep.xbl(“process1”).start( null, null, justep.xbl(“listData”).getID(), null);

因为已经启动了的流程不能再次启动,所以,为避免重复启动,应添加适当的判断代码

新建流程

在listActivity.w文件中,放一个windowRunner组件,调用它的open方法,打开订单流程的启动界面,代码如下

justep.xbl(“detailRunner”).open(null,”/demo/misc/process/order/mainActivity.w”,”订单”);

这样就实现了在列表流程中新建一个流程,至于在保存时是否需要启动流程,就通过设置/UI/demo/misc/process/order/mainActivity.w里面的process组件(flwcOrder)的属性auto-start来控制,设置为true,则保存后启动流程,设置为false,则不启动流程

处理流程

处理流程就是对流程进行流转、回退等操作,方法是点击处理流程按钮时,调用windowRunner组件的open方法打开流程当前环节对应的w文件,在界面上进行流转、回退等操作。

例如:流程的当前环节如果是订单申请(orderReportActivity),就打开/UI/demo/misc/process/order/orderReportActivity.w文件

流程的当前环节如果是部门经理审核(deptActivity),就打开/UI/demo/misc/process/order/deptActivity.w那么,如何获得流程的当前环节等信息呢这就需要,访问sa_task表,在listActivity.w中放一个bizdata组件(dataTask),概念concept属性设置为sa_task,设置过滤条件为

(SA_Task.sKindID='tkTask' or SA_Task.sKindID='tkExecutor' or SA_Task.sKindID IS NULL)

and (SA_Task.sStatusID='tesReady' or SA_Task.sStatusID='tesExecuting')

and (SA_Task.sTypeID IS NULL or SA_Task.sTypeID <> 'WORKREMIND')

and SA_Task.sExecutorPersonID=:currentPersonID()

再设置master属性,其中data指向列表data,relation选择sData1

经过上面的设置,dataTask里面就是当前流程的当前环节的记录了。当然如果流程复杂,当前环节有多个,又都流转给了当前登录者,dataTask里面的记录就不只一条了。处理流程的代码如下

var dTask = justep.xbl("dataTask");

if(dTask.getCount()>0){

var title = dTask.getValue("sActivityName");//获得当前环节名称,作为页面的标题

var taskID = dTask.getID();//获得任务ID,url中的参数

var url = dTask.getValue("sEURL");//获得当前环节的url

url = url + "?task=" + taskID + "&activity-pattern=do";//activity-pattern=do是必须的,表示要处理这个任务

justep.xbl("detailRunner").open(null,url,title);//调用windowRunner组件的open方法打开流程当前环节对应的w文件

}else{

alert("流转未启动、已完成、或者应由其他人处理");

}

上面的代码只处理了dataTask里面的一条记录,如果超过一条记录,请酌情处理

url中的参数,等同于从待办任务中打开功能时传递的参数

打开已结束的流程

于已经结束的流程打开的方法不同于处理流程打开页面的方法。

处理流程打开页面的方法的方法是传入任务ID,系统根据任务ID,计算出业务数据ID,通过将process组件的auto-filter属性为true,让系统使用业务数据ID过滤数据。

已经结束的流程没有当前任务ID了,所以不使用上面的方法,而是使用直接传入业务数据ID,直接过滤的方式在/UI/demo/misc/process/order目录下新建listActivityDetail.w文件,可以继承自/UI/demo/misc/process/order/mainActivity.w文件,将process组件的auto-filter属性设置为false,加一个windowReceiver组件。listActivity.w文件中打开已经结束的流程的代码如下

justep.xbl("detailRunner").open(justep.xbl("listData").getID(),"/demo/misc/process/order/listActivityDetail.w?activity-pattern=detail","已完成订单");

其中第一个参数就是当前业务数据的ID,作为参数传给listActivityDetail.wlistActivityDetail.w文件中windowReceiver组件的onReceive方法里面的代码如下

var data = justep.xbl('dataDEMO_Order');

var id = event.data;//获得传入的业务数据ID

data.setFilter("idFilter", data.getConceptAliasName() + "='" + id + "'");//设置过滤条件

data.refreshData();//刷新数据

定义流程公共事件,回写业务数据

如果只有一个流程需要将流程的一些状态回写到业务数据中,那么这些代码应该写在该流程的事件中,如果同一模块(或者应用)下的流程都要回写,就应该在流程公共事件中回写业务数据,如果流程公共事件定义文件放在业务模块下,则这个业务模块下的流程都会执行这里面定义的事件,如果放在应用目录下,则整个应用里面的流程都会执行这里面定义的事件,定义流程公共事件做法如下

1、在/BIZ/demo/misc/process目录下新增popProcessEvent.m文件,文件内容如下

<?xml version="1.0" encoding="utf-8"?><model xmlns="http://www.justep.com/model">

<procedure name="orderProcessAfterStartProcedure" code="OrderProcess.orderProcessAfterStart"/>

<listener action="startProcessAction" event="after" handler="orderProcessAfterStartProcedure"/>

<procedure name="orderProcessAfterStartProcedure" code="OrderProcess.orderProcessAfterStart"/>

<procedure name="orderProcessAfterAdvanceProcedure" code="OrderProcess.orderProcessAfterAdvance"/>

<listener action="advanceProcessAction" event="after" handler="orderProcessAfterAdvanceProcedure"/>
</model>

这里面定义了两个流程公共事件,一个是启动流程之后事件,另一个是流转之后事件

2、在/BIZ/demo_X/misc/process目录下新增model.config.xml文件,文件内容如下

<?xml version="1.0" encoding="utf-8"?>

<model xmlns="http://www.justep.com/model">

<use>/system/logic/action</use>

</model>

3、在/BIZ/demo_X/misc/process目录下,新建dsrc目录,在dsrc目录下新建OrderProcess.java文件,文件内容如下

import com.justep.system.context.ContextHelper;
import com.justep.system.data.KSQL;
import com.justep.system.opm.OrgUnit;
import com.justep.system.process.ProcessControl;
import com.justep.system.process.ProcessControlItem;
import com.justep.system.process.ProcessUtils;
import com.justep.system.util.CommonUtils;

public class OrderProcess {

        public static void orderProcessAfterStart() {
                System.out.println("启动了pop");
                updateBizRecord();
        }

        public static void orderProcessAfterAdvance() {
                System.out.println("流转了pop");
                updateBizRecord();
        }

        public static void updateBizRecord() {
                String sExecutorNames = "", sActivityNames = "", sStatus;
                if (!ProcessUtils.isFlowToEnd()) {
                        ProcessControl flowControl  = (ProcessControl)ContextHelper.getActionContext().getParameter("control");
                        for (ProcessControlItem to : flowControl.getFlowTos()) {
                                for (OrgUnit ect : to.getExecutors()) {
                                        sExecutorNames = sExecutorNames + CommonUtils.getNameOfFile(ect.getFName()) + " ";
                                }
                                sActivityNames = to.getTask().getActivityName();
                        }
                        sStatus = "审批中";
                }else{
                        sStatus = "已完成";
                }
                String key = ProcessUtils.getProcessData1();
                String sConceptName = ProcessUtils.getProcessData2();
                String sDataModel = ProcessUtils.getProcessData3();
                String ksql = "update " + sConceptName + " a set a.fAuditor='" + sExecutorNames + "',a.fExamine='" + sActivityNames
                        + "',a.fPicture='" + sStatus + "' where a='" + key +"'";
                KSQL.executeUpdate(ksql, null, sDataModel, null);
        }

实现更新业务数据,需要知道业务数据的概念、ID及数据模块,因此使用sData2存放业务数据的概念,使用sData3存放数据模块,再加上系统自动将业务数据ID存入sData1,通过在启动规则中设置sData2和sData3就可以实现更新业务数据了。

启动规则的设置如下

191

双击列表中的记录,进行处理

至此,在业务数据中已经记录了流程的状态,根据这个状态,可以实现双击列表中的某条记录,对其进行相应的处理。

例如:对于没有启动的流程——流程状态为空,执行启动流程;

对于已经启动了,还未结束的流程——流程状态为审批中,执行处理流程,打开当前环节对应的页面;

对于已经流转结束的流程——流程状态为已完成,打开listActivityDetail.w文件。显示业务数据。代码如下,在本例中使用了fPicture存放流程状态

<ol>
	listActivity.listGridRowDblClick = function(event){
	   var dList = justep.xbl("listData");
	   if(dList.getValue("fPicture")==""){
	   listActivity.startFlow();
	   }else if(dList.getValue("fPicture")=="已完成"){
	 justep.xbl("detailRunner").open(dList.getID(),"/demo/misc/process/order/listActivityDetail.w?activity-pattern=detail","已完成订单");
	 }else{
	 listActivity.advanceFlow();
	 }
	};
	listActivity.startFlow = function(){
	  var dList = justep.xbl("listData");
	   if(dList.getValue("fPicture")==""){
	        justep.xbl("process1").start( null, null, dList.getID(), null);
	   justep.xbl("listData").refreshData();
	 }else{
	  alert("流转已经启动");
	}
	}
	listActivity.advanceFlow = function(){
	var dTask = justep.xbl("dataTask");
	if(dTask.getCount()&gt;0){
	    var title = dTask.getValue("sActivityName");
	    var taskID = dTask.getID();
	    var url = dTask.getValue("sEURL");
	    url = url + "?task=" + taskID + "&amp;activity-pattern=do";
	    justep.xbl("detailRunner").open(null,url,title);</li>
	    }else{</li>
	 alert("流转未启动、已完成、或者应由其他人处理");</li>
	  }
	}

流转后,刷新列表数据

流转后,当前环节页面自动关闭,显示出列表流程的页面,此时会触发tabActive事件,在这个事件中刷新列表数据,代码写在/UI/demo/misc/process/order/listActivity.js中,如下tabActive = function(){

justep.xbl(“listData”).refreshData();

}

批量处理流程

关于批量启动流程和批量处理流程,参考 流程高级特性之: 批启动批流转

http://bbs.justep.com/forum.php?mod=viewthread&tid=39581

本例使用的文件

将demo_X.rar解压到biz目录下

将order.rar解压到/UI/demo/misc/process/order目录下

  order.rar                                 demo_X.rar

本文由WeX5君整理,WeX5一款开源免费的html5开发工具H5 App开发就用WeX5!

阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443