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

QQ登录

只需一步,快速开始

查看: 23636|回复: 25

列表流程

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2013-7-29 09:40:04 | 显示全部楼层 |阅读模式
由流程向导生成的功能是一打开功能,就显示一个流程的信息,有时候需要一打开功能,就显示多个流程的信息,例如下面的界面
5.png
在这个功能中,可以新建一个流程、启动流程、流转、回退,也可以多选后,进行批量操作,例如:批量启动流程,批量流转流程
还通过定义了公共事件,在启动和流转之后,将该流程的处理环节和处理人回写到业务数据中

这个例子是在综合案例里面的订单流程基础上扩展的,在/UI/demo/misc/process/order目录下新建listActivity.w文件

评分

参与人数 1威望 +20 收起 理由
wgs7909 + 20

查看全部评分

远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 10:18:06 | 显示全部楼层

启动流程

在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);
因为已经启动了的流程不能再次启动,所以,为避免重复启动,应添加适当的判断代码
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 10:06:23 | 显示全部楼层

新建流程

在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,则不启动流程

远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 10:33:22 | 显示全部楼层

处理流程

处理流程就是对流程进行流转、回退等操作,方法是点击处理流程按钮时,调用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中的参数,等同于从待办任务中打开功能时传递的参数

远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 11:09:30 | 显示全部楼层

打开已结束的流程

对于已经结束的流程打开的方法不同于处理流程打开页面的方法。
处理流程打开页面的方法的方法是传入任务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.w

listActivityDetail.w文件中windowReceiver组件的onReceive方法里面的代码如下
        var data = justep.xbl('dataDEMO_Order');
        var id = event.data;//获得传入的业务数据ID
        data.setFilter("idFilter", data.getConceptAliasName() + "='" + id + "'");//设置过滤条件
        data.refreshData();//刷新数据
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 11:38:59 | 显示全部楼层

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

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

定义流程公共事件做法如下
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文件,文件内容如下
  1. import com.justep.system.context.ContextHelper;
  2. import com.justep.system.data.KSQL;
  3. import com.justep.system.opm.OrgUnit;
  4. import com.justep.system.process.ProcessControl;
  5. import com.justep.system.process.ProcessControlItem;
  6. import com.justep.system.process.ProcessUtils;
  7. import com.justep.system.util.CommonUtils;

  8. public class OrderProcess {

  9.         public static void orderProcessAfterStart() {
  10.                 System.out.println("启动了pop");
  11.                 updateBizRecord();
  12.         }
  13.         
  14.         public static void orderProcessAfterAdvance() {
  15.                 System.out.println("流转了pop");
  16.                 updateBizRecord();
  17.         }
  18.         
  19.         public static void updateBizRecord() {
  20.                 String sExecutorNames = "", sActivityNames = "", sStatus;
  21.                 if (!ProcessUtils.isFlowToEnd()) {
  22.                         ProcessControl flowControl  = (ProcessControl)ContextHelper.getActionContext().getParameter("control");
  23.                         for (ProcessControlItem to : flowControl.getFlowTos()) {
  24.                                 for (OrgUnit ect : to.getExecutors()) {
  25.                                         sExecutorNames = sExecutorNames + CommonUtils.getNameOfFile(ect.getFName()) + " ";
  26.                                 }
  27.                                 sActivityNames = to.getTask().getActivityName();
  28.                         }
  29.                         sStatus = "审批中";
  30.                 }else{
  31.                         sStatus = "已完成";
  32.                 }
  33.                 String key = ProcessUtils.getProcessData1();
  34.                 String sConceptName = ProcessUtils.getProcessData2();
  35.                 String sDataModel = ProcessUtils.getProcessData3();
  36.                 String ksql = "update " + sConceptName + " a set a.fAuditor='" + sExecutorNames + "',a.fExamine='" + sActivityNames
  37.                         + "',a.fPicture='" + sStatus + "' where a='" + key +"'";
  38.                 KSQL.executeUpdate(ksql, null, sDataModel, null);
  39.         }
复制代码
实现更新业务数据,需要知道业务数据的概念、ID及数据模块,因此使用sData2存放业务数据的概念,使用sData3存放数据模块,再加上系统自动将业务数据ID存入sData1,通过在启动规则中设置sData2和sData3就可以实现更新业务数据了。

启动规则的设置如下
4.png
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 13:21:29 | 显示全部楼层

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

至此,在业务数据中已经记录了流程的状态,根据这个状态,可以实现双击列表中的某条记录,对其进行相应的处理。
例如:对于没有启动的流程——流程状态为空,执行启动流程;
对于已经启动了,还未结束的流程——流程状态为审批中,执行处理流程,打开当前环节对应的页面;
对于已经流转结束的流程——流程状态为已完成,打开listActivityDetail.w文件。显示业务数据。

代码如下,在本例中使用了fPicture存放流程状态
  1. listActivity.listGridRowDblClick = function(event){
  2.         var dList = justep.xbl("listData");
  3.         if(dList.getValue("fPicture")==""){
  4.                 listActivity.startFlow();
  5.         }else if(dList.getValue("fPicture")=="已完成"){
  6.                 justep.xbl("detailRunner").open(dList.getID(),"/demo/misc/process/order/listActivityDetail.w?activity-pattern=detail","已完成订单");
  7.         }else{
  8.                 listActivity.advanceFlow();
  9.         }
  10. };

  11. listActivity.startFlow = function(){
  12.         var dList = justep.xbl("listData");
  13.         if(dList.getValue("fPicture")==""){
  14.                 justep.xbl("process1").start( null, null, dList.getID(), null);
  15.                 justep.xbl("listData").refreshData();
  16.         }else{
  17.                 alert("流转已经启动");
  18.         }
  19. }

  20. listActivity.advanceFlow = function(){
  21.         var dTask = justep.xbl("dataTask");
  22.         if(dTask.getCount()>0){
  23.                 var title = dTask.getValue("sActivityName");
  24.                 var taskID = dTask.getID();
  25.                 var url = dTask.getValue("sEURL");
  26.                 url = url + "?task=" + taskID + "&activity-pattern=do";
  27.                 justep.xbl("detailRunner").open(null,url,title);
  28.         }else{
  29.                 alert("流转未启动、已完成、或者应由其他人处理");
  30.         }
  31. }
复制代码
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 13:30:45 | 显示全部楼层

流转后,刷新列表数据

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

tabActive = function(){
        justep.xbl("listData").refreshData();
}
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 13:33:11 | 显示全部楼层

批量处理流程

关于批量启动流程和批量处理流程,参考 流程高级特性之: 批启动批流转
http://bbs.justep.com/forum.php?mod=viewthread&tid=39581
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-7-29 13:36:08 | 显示全部楼层

本例使用的文件

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

order.rar

5.07 KB, 下载次数: 1351

demo_X.rar

5.77 KB, 下载次数: 1749

远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

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

GMT+8, 2024-3-29 01:23 , Processed in 0.066513 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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