# 页面设计器三方业务拓展

背景:此前的一堆前、后事件,容易出现多个客开竞争冲突(同时使用流程前事件,前面的接收,后面的拒绝),多个前端请求埋点无法保障事务回滚(拿不到表单最终计算触发后的最终态数据),简化和规范协同页面扩展机制,保障协同+工作流+表单同事务提交和回滚,简化按照不同业务区分出一堆业务模块的前、后事件的问题,解决此前单一上下文无法获取完整的协同-工作流-表单完整数据获取难题

用于扩展前置事件、后置事件、适用于 发送、处理、终止、存为模板、保持待发场景,全代码执行周期进行扩展

####版本要求 9.0以及以上版本,协同前端后端分离的PC新模板支持:精致新体验布局、经典新体验布局 ####事件机制说明 表单预提交

类型 order Listener阶段
发送 100 PreListener
处理 100 PreListener
终止/回退/指定回退 200 PreListener
存为模版 1 NormalListener
保存待发 100 PreListener

若需要获取到预提交数据需要让order返回值大于上面的对应值,比如在发送阶段获取预提交值,则需要order>100才能查询到预提交数据

提供扩展抽象类

类型 className
发送 CollaborationThirdPartySendListener
处理 CollaborationThirdPartyDealListener
终止/回退/指定回退 CollaborationThirdPartyOperateListener

对象ThirdPartyListenerContext字段说明:

Field Name Field Description Field Type
thirdpartParamData 三方业务数据,由自己维护 data[*].key 匹配自己的业务 ThirdpartParamData
affairId 事项id Long
summaryId 协同id Long
formAppId 表单id Long
formRecordId 表单数据id Long
templateId 模版id Long
activityId 节点id Long
processId 流程id String
caseId 流程实例id Long
affairState 协同状态 Integer
affairSubState 协同子状态 Integer
nodePolicy 节点权限code String
workItemId 工作流的workItemId Long
submitCode 提交操作code String

对象ThirdPartyListenerContext字段说明:

Field Name Field Description Field Type
beforeEventBO 工作流执行提交前事件参数bean WorkflowBeforeEventBO (Deprecated)
data 三方数据 List
thirdPartyContext 三方传递的上下文,在hook#thirdPartyHandle 自行写入 Map<String, Object>

示例:

后端:

public class ExampleDealListener extends CollaborationThirdPartyDealListener implements PreListener<CollaborationFinishWorkItemEvent>   {

	@Override
	public int getOrder() {
		//表单预提交之后
		return 200;
	}

	@Override
	public ServiceResult doHandle(ThirdPartyListenerContext thirdPartyListenerContext) throws BusinessException {
		ThirdpartParamData thirdpartParamData = thirdPartyListenerContext.getThirdpartParamData();
		Object confirm = thirdpartParamData.getThirdPartyContext().get("weekBlock12345");
		if (confirm instanceof Map){
			Map<String, Boolean> stringObjectMap = (Map<String, Boolean>) confirm;
			if (stringObjectMap.getOrDefault("confirm",false)){
				return ServiceResult.ok();
			}
		}
		if (Objects.nonNull(thirdPartyListenerContext.getFormAppId())){
			return ServiceResult.fail(Collections.singletonMap("errorMsg","发送拦截不通过"));
		}
		return ServiceResult.ok();
	}
}

可以扩展的接口实现说明:

接口 说明 执行顺序
PreListener 前置接口,代表的是表单预提交;工作流预提交 0
NormalListener 业务数据提交接口,待办工作正式提交、协同正式提交、表单正式提交、此阶段后生成提交的数据,如生成了新的待办 1
PostListener 后置接口,代表是提交后,需要触发什么动作,比如全文检索、协同触发事件、互联互通等 2
FinalListener 最后执行的接口,用于释放锁、缓存等操作,此阶段始终会执行 3
AfterPostAsyncListener 最后执行的异步监听,用于触发事务提交成功后的动作,比如新闻、公告审批 4

前端:

//强阻塞
$.ctp.bind('thirdPartyHandle',(args)=>{
    alert(args.data.errorMsg);
    args.error();
});
//弱阻塞,带确认
$.ctp.bind('thirdPartyHandle',(args)=>{
    console.log('12313',args)
    var confirmation = confirm(args.data.errorMsg);
    if(confirmation){
        args.thirdPartyContext['weekBlock12345']={
            confirm:true//后端发现此key匹配的true无需再校验
        }
    args.success(); 
    }else{
       args.error();  
    }
});

事件列表:

事件key 事件类型
AddNode 同步事件
moreSign 同步事件
RemoveNode 同步事件
Terminate 同步事件
Cancel 同步事件
return 同步事件
specifiesReturn 同步事件
specifiesReturnCreate 同步事件
Comment 同步事件
ContinueSubmit 异步事件
beforeDealSubmit 异步事件
createMeeting 异步事件
relationDoc 异步事件
relationAttachment 异步事件
transform 异步事件
transfer 异步事件
favorite 异步事件
sign 异步事件
doZCDB 异步事件
beforSendColl 同步事件
summary-leavePage 异步事件
newColl-leavePage 异步事件
thirdPartyHandle 异步事件

设计器支持状态:

状态code 作用 规则
state.affairState 是否显示处理意见(新建自由协同不显示) 不显示:新建自由协同(新建、草稿都不显示,含协同模版)
state.showRelationData 是否显示相关数据() 不显示:新建自由协同(不含协同模版)
state.showSiderbar 是否显示侧边栏 不显示:相关数据和处理意见都不显示时候
state.showFormRuleState 是否显示智能校验 显示:表单模版
state.showPredication 是否显示流程预测 显示:表单模版
state.showPostscript 是否显示附言 不显示:模版配置不能添加附言
state.siderActiveTab 右侧胶囊当前激活页签 有附言时候:key = 发起附言
无附言时候:key = 处理意见
有意见锚点:key = 处理意见
新建模版:key = 相关数据
state.mainActiveTab 正文、流程激活页签 正文:修改正文
流程:修改流程(加签会签)
编撰人:ranpf