1. 流程事件
1.1. 流程事件接口
1.1.1. 使用场景
流程事件接口:基于工作流的节点的不同的处理事件(如:发起,处理,终止,流程结束等),调用外部第三方系统。
例如:某律师事务所,采用协同对案件是否承接进行审批,审批后,以该案件作为项目单元进行管理,包括文档、人员、协同、会议等等。
此场景可以抽象为以下协同功能:
- 表单管理员:在表单《案件承接审批单》设置-触发设置中,选择 核定/其它通过后动作为:创建项目。
- 普通用户:表单流程《案件承接审批单》审批,审批通过后,自动创建项目。
“创建项目”动作,非系统自带,采取“接口+客开”模式完成。
类似的场景还有很多,例如:写入HR、写入财务、写入某某系统等等。
1.1.2. 流程事件概述
抽象成协同功能:
- 表单/模板/公文管理员,流程设置,选择动作
- 普通用户
事件基于工作流(Workflow)来实现,需要监听的事件包括:
- 发起(Start)
- 处理(FinishWorkitem)
- 终止(Stop)
- 回退(StepBack)
- 撤销(Cancel)
- 取回(TakeBack)
- 流程结束(ProcessFinished)
事件触发点,包括:
- 正常流转:发起、处理
- 督办、管理员:终止
- 自动发起:子流程、新流程
每个动作提供一组接口,分别是:
- 动作前事件(后台)——Ajax到后台处理,通过返回值控制是否阻塞当前行为
- 动作后——流程动作已经完成,事件行为不对流程起任何控制作用
- 特别说明:“流程结束”只有动作后事件
1.1.3. 实现方式
1平台提供一个抽象类AbstractWorkflowEvent,具体实现由客开来完成。
2.插件注册:在实现了抽象类AbstractWorkflowEvent(比如,实现类为MyWorkflowEvent),需要在spring的配置文件中注册(具体的插件注册)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean id="myWorkflowEvent" class="com.test.MyWorkflowEvent" />
</beans>
public abstract class AbstractWorkflowEvent {
/**
* 唯一标示,一旦生成,不可变更
* @return
*/
public abstract String getId();
/**
* 事件显示名称
* @return
*/
public abstract String getLabel();
/**
* 返回指定的模版编号
* @return
*/
public String getTemplateCode(){return "";};
//发起前事件
public WorkflowEventResult onBeforeStart(WorkflowEventData data){return null;}
//发起事件
public void onStart(WorkflowEventData data){}
//处理前事件
public WorkflowEventResult onBeforeFinishWorkitem(WorkflowEventData data){return null;}
//处理事件
public void onFinishWorkitem(WorkflowEventData data){}
//终止前事件
public WorkflowEventResult onBeforeStop(WorkflowEventData data){return null;}
//终止事件
public void onStop(WorkflowEventData data){}
//回退前事件
public WorkflowEventResult onBeforeStepBack(WorkflowEventData data){return null;}
//回退事件
public void onStepBack(WorkflowEventData data){}
//撤销前事件
public WorkflowEventResult onBeforeCancel(WorkflowEventData data){return null;}
//撤销事件
public void onCancel(WorkflowEventData data){}
//取回前事件
public WorkflowEventResult onBeforeTakeBack(WorkflowEventData data){return null;}
//取回事件
public void onTakeBack(WorkflowEventData data){}
//结束事件
public void onProcessFinished(WorkflowEventData data){}
}
WorkflowEventData类如下:
public class WorkflowEventData {
private long summaryId;//事件前获取不到
private long affairId;//事件前获取不到
/**
* 节点绑定的表单ID
*/
private String form= null;
/**
* 节点绑定的表单应用ID
*/
private String formApp= null;
/**
* 节点绑定的表单操作视图ID
*/
private String operationName= null;
/**
* 业务数据集合(包括跨表)
*/
private Map businessData= new HashMap();
//setting and getting
}
WorkflowEventResult类如下:
public class WorkflowEventResult {
public WorkflowEventResult(){}
/**
* @param alertMessage
*/
public WorkflowEventResult(String alertMessage) {
this.alertMessage = alertMessage;
}
/**
* 提示信息
*/
private String alertMessage = "";
/**
* @return the alertMessage
*/
public String getAlertMessage() {
return alertMessage;
}
/**
* @param alertMessage the alertMessage to set
*/
public void setAlertMessage(String alertMessage) {
this.alertMessage = alertMessage;
}
}
1.1.4. 功能说明
功能点一:表单/模板/公文管理员,流程设置,选择动作
发起节点和中间处理节点事件
1.1.5. 场景:通过流程事件改变表单数据
通过流程事件改变表单数据,从而可以达到影响表单分支流程的目的。 1.在表单开发高级中的“事前事件”中修改字段(如:处理前事件,回退前事件),不要在“处理事件”(如:处理事件,回退事件,撤销事件)中进行分支条件判断所用字段的修改。 2.“事前事件”中修改字段前读取数据调用:FormService.findDataById(masterId, formId),不能调用该方法的其它的重载方法! 3.“事前事件”中修改字段内容:addFieldValue("...","..."),后面无需调用saveOrUpdateFormData方法
发起节点对应事件如下:
中间处理节点对应事件如下:
全局事件
动作:撤销、终止、流程结束
无论是发起者、中间处理节点、督办者都走相同的接口,不做区分,如果业务上要做区分,代码由客开通过当前登录者和当前节点来区分。
功能点二:流程流转(普通用户登录)
如果是动作前事件,可以依据事件返回值来控制是否阻塞当前行为。
例如:事件返回对象WorkflowEventResult中的alertMessage如果为空则原流程继续执行,如果不为空则会弹出提示框,阻塞当前行为。
1.2. 流程监听接口
1.2.1. 使用场景
流程事件接口:是在触发OA中某个操作动作(如发起流程,创建人员,或是发起公告等)时,可调用外部第三方系统,注意监听事件中的工作流事件(如:发起,处理,终止,流程结束等),是全局性的监听,而非上面流程事件中针对某个流程。
底层组件(或一个模块)发生动作,需要让上层应用(或其它模块)做出响应动作。
比如:组织模型创建单位,上层公文需要给这个新单位创建一套预置公文元素、公告需要预置一套板块等等。
1.2.2. 开发步骤
事件监听(注解驱动):
其它任意模块都可以监听上述事件,只需要在方法上面使用@listenEvent(event={param}Event.class),方法参数即为Event对象。 监听类必须定义为spring bean.
1.2.3. 实现方式
监听事件:
import com.seeyon.apps.collaboration.event.CollaborationStartEvent;
import com.seeyon.ctp.event.EventTriggerMode;
import com.seeyon.ctp.util.annotation.ListenEvent;
...
public MyCollaborationEventListener{
// 监听协同发起事件,同步执行
@listenEvent(event= CollaborationStartEvent.class)//协同发起时立刻执行,同步模式,如果监听代码出了异常,会导致整个事务回滚,协同发起失败。
public void onCollaborationStart1(CollaborationStartEvent event){
//event.getSummartId()
}
// 监听协同发起事件,异步执行 Since V5.1
@listenEvent(event= CollaborationStartEvent.class,async=true)//协同发起时立刻执行,异步模式,监听代码出异常不影响协同发起。但如果协同发起自身事务回滚,监听代码仍然会执行。
public void onCollaborationStart2(CollaborationStartEvent event){
//event.getSummartId()
} // 监听协同发起事件,事务提交成功后执行 Since V5.1
@listenEvent(event= CollaborationStartEvent.class,mode=EventTriggerMode.afterCommit)//协同发起成功提交事务后执行,异步模式。
public void onCollaborationStart3(CollaborationStartEvent event){
//event.getSummartId()
}}
如非特定的需求,建议采用第三种模式;
否则以协同发起后发短信为例,第一种模式如果短信网关出错,会导致整个系统的协同都无法发起;
第二种模式,协同发起出错,但短信已经发出,无发追回。
第三种模式,只有协同发起成功了才发出短信。
<bean id="" class="com.seeyon.apps.form.MyCollaborationEventListener">
……
</bean>
1.2.4. 监听事件列表
流程事件监听列表:
事件名称 | 事件类 | 备注 |
---|---|---|
流程发起事件 | com.seeyon.apps.collaboration.event.CollaborationStartEvent | 发起协同、直接发送、转发、移动应用发送、平台接口发起协同均触发此事件 |
流程处理事件 | com.seeyon.apps.collaboration.event.CollaborationProcessEvent | (Since:V61)可以获取到协同的处理意见对象Comment |
流程结束事件 | com.seeyon.apps.collaboration.event.CollaborationFinishEvent | - |
流程撤销事件 | com.seeyon.apps.collaboration.event.CollaborationCancelEvent | - |
流程回退事件 | com.seeyon.apps.collaboration.event.CollaborationStepBackEvent | - |
流程终止事件 | com.seeyon.apps.collaboration.event.CollaborationStopEvent | - |
(Since:V61)流程处理回复监听事件 | com.seeyon.apps.collaboration.event.CollaborationAddCommentEvent | - |
(Since:V61)流程指定回退事件 | com.seeyon.apps.collaboration.event.CollaborationAppointStepBackEvent | - |
(Since:V61)流程自动跳过事件 | com.seeyon.apps.collaboration.event.CollaborationAutoSkipEvent | - |
(Since:V61)流程删除事件 | com.seeyon.apps.collaboration.event.CollaborationDelEvent | - |
(Since:V61)流程取回事件 | com.seeyon.apps.collaboration.event.CollaborationTakeBackEvent | - |
公文签收事件监听:
com.seeyon.v3x.edoc.EdocSignEvent 签收第三方公文时触发
公告与新闻事件监听(Since:V61)
事件名称 | 事件类 | 备注 |
---|---|---|
公告发起监听事件 | com.seeyon.apps.bulletin.event.BulletinAddEvent | |
新闻发起监听事件 | com.seeyon.apps.news.event.NewsAddEvent | - |
1.3. 前端事件拦截接口
1.3.1. 使用场景
前端事件拦截接口:可以给予OA流程中的前端事件(如:协同发送,协同处理等)操作时,调用外部第三方的系统。
这里所说的事件有别于JS中对象的事件。二次开发可通过编写事件监听器控制协同中某些操作是否继续或直接取代原来的操作逻辑。
例如:发送协同前想加入一些处理逻辑来满足不同的需求。
1.3.2. 开发步骤
在JS文件中需要添加事件响应函数$.ctp.bind(eventName,function(){})。
eventName为事件名称,function为绑定事件函数,此函数必须返回一个boolean值,返回值为true则原逻辑继续执行,返回值为false则中断执行原逻辑。
同一事件可以定义多个监听,无序执行(如要求有序请合并到一个监听),任一监听返回false即停止后续的处理。
1.3.3. 实现方式
【V6.1之前示例】以发送协同为例:
$.ctp.bind('beforSendColl'function(){
//逻辑处理
//TODO
returntrue;
});
【V6.1示例】以处理协同为例:
$.ctp.bind('beforeDealSubmit'function(){
//在协同处理监听增加了获取summaryID与affairID
//TODO
alert(arguments[0].summaryID);
alert(arguments[0].affairID);
return true;
});
把上述JS引入相应文件中就可以拦截协同发送事件,在发送前先执行绑定了'beforSendColl'事件的响应函数,根据函数返回值来判断是否继续执行原逻辑。
1.3.4. 拦截事件列表
目前已经开放的前端事件如下:
事件名称 | 事件说明 |
---|---|
beforSendColl | 协同发送前事件名称 |
beforeSaveDraftColl | 协同保存待发前事件名称 |
dealRepeatChange | 表单重复行增加、删除事件名称-V6.1监听增加获取(formId,dataId) |
fieldValueChange | 表单字段值改变-V6.1监听增加获取(formId,dataId) |
beforeDealSubmit | 协同处理界面:提交方法-V6.1监听增加获取(summaryID,affairId) |
beforeDealSaveWait | 协同处理界面:暂存待办-V6.1监听增加获取(summaryID,affairId) |
beforeDealCancel | 协同处理界面:流程撤销-V6.1监听增加获取(summaryID,affairId) |
beforeDealstepback | 协同处理界面:回退-V6.1监听增加获取(summaryID,affairId) |
beforeDealstepstop | 协同处理界面:终止-V6.1监听增加获取(summaryID,affairId) |
beforeDealaddnode | 协同处理界面:加签-V6.1监听增加获取(summaryID,affairId) |
beforeDealdeletenode | 协同处理界面:减签-V6.1监听增加获取(summaryID,affairId) |
beforeDealspecifiesReturn | 协同处理界面:指定回退-V6.1监听增加获取(summaryID,affairId) |
beforeDoneTakeBack | 协同已办列表取回-V6.1监听增加获取(summaryID,affairId) |
beforeWaitSendDelete | 协同待发列表删除-V6.1监听增加获取(summaryID,affairId) |
beforeSentCancel | 协同已发列表撤销-V6.1监听增加获取(summaryID,affairId) |
businessFormInit | 无流程表单修改监听事件-V6.1监听增加获取(formId,dataId) |
businessFormDel | 无流程表单删除监听事件-V6.1监听增加获取(formId,dataId) |
businessFormSave | 无流程表单保存监听事件 |