# custom.action

custom.action是SuccBI后端嵌入式脚本的约定文件名,custom.action可用于对表单或SuperPage页面进行后端的个性化业务处理,如自定义表单或SuperPage页面的数据提交逻辑、当表单发布时执行一个特殊的业务逻辑等。

说明:

  1. 为了方便管理二次开发的代码,SuccBI将多个页面的个性化脚本代码集中到一个custom.action文件进行管理,也就是说可以通过在特定的位置编写一个custom.action文件,实现多个目标页面的个性化处理。
  2. 可以直接编辑custom.action文件,也可以在SuccIDE或应用界面中通过脚本编辑器直接编辑ts语法的脚本文件custom.action.ts,编辑器会自动编译并生成custom.action

TIP

什么时候需要export函数?

  1. 要通过浏览器端的ajax访问的脚本函数(此时脚本函数要自己判断权限)
  2. 要导出给其它脚本文件调用的函数

# 应用custom.action

应用的custom.action位于应用的根目录下,作用于应用内所有SuperPage页面,接口如下:

/**
 * 应用的后端脚本入口,脚本文件位于应用根目录下的`custom.action.ts`。
 * 
 * 后端脚本主要用于个性化数据的提交处理,例如:
 * 
 * 1. 在数据入库前进行一段业务逻辑检查,检查完成后才能入库。
 * 2. 数据库入库时同时修改一些其他的数据或执行一些个性化的业务逻辑。
 */
// import { SpgSubmitDataArgs } from "metadata/metadata-script-api";

/**
 * 服务器收到数据包后调用,此时数据还没有更新到相应的表中。
 * 
 * 脚本可以:
 * 1. 对数据包进行合法性检查,如果不合法可以抛出异常
 * 2. 直接修改数据包的内容,系统后续会使用新的数据包装入
 * 3. 根据数据包中的相关进行进行一些数据库的预处理,比如修改一下其他的表(但可以不提交,和后续的操作在一个事务一起提交)
 * 
 * @param data 数据包,包含多个页面的、多个表的提交数据,数据包中也包含前端传递的参数信息
 */
// function onUpdateData(data: Array<CallActionFlowPageArgs>): void {

// }

/**
 * 服务器收到数据包并将数据包更新到相应的表后调用,此时数据已经更新到表中,但还没有提交事务。
 * 
 * 脚本可以:
 * 1. 对数据表进行进一步修改,然后和系统的修改在一个事务内提交
 * 
 * @param data 数据包,包含多个页面的、多个表的提交数据,数据包中也包含前端传递的参数信息
 */
// function onDidUpdateData(data: Array<CallActionFlowPageArgs>): void {

// }

/**
 * 服务器收到数据包并将数据包提交到数据库后调用,此时数据已经更新到表中并已经提交事务。
 * 
 * 脚本可以:
 * 1. 由于数据已经入库并提交,脚本可以根据数据的修改做一些通知或者刷新之类的特殊业务逻辑
 * 
 * @param data 数据包,包含多个页面的、多个表的提交数据,数据包中也包含前端传递的参数信息
 */
// function onDidCommitData(data: SpgSubmitDataArgs): void {

// }

# 表单应用custom.action

表单应用的custom.action可以位于如下几个位置:

  1. /业务项目/fapp/xxx.fapp/custom.action - 作用于表单应用内表单
  2. /业务项目/settings/hooks/custom.action - 作用于项目内所有表单应用

接口如下:

/**
 * 应用发布前的事件。用于在应用发布前进行一些判断或修改
 * @param args 发布时应用信息参数,资源ID或路径等
 */
//function onPublishFApp(args: FAppPublishArgs) {
	// 去掉此函数的注释,在这里实现你期望的个性化业务逻辑
//}

/**
 * 应用发布后的事件。
 * @param args 发布时应用信息参数,资源ID或路径等
 */
//function onDidPublishFApp(args: FAppPublishArgs) {

//}

/**
 * 服务器端生成并下载数据包给前端浏览器事件。用于对服务器端生成好的数据包进行一些修改。
 */
//function onDownloadFAppFormData(args: FAppDownloadFormDataArgs) {

//}

/**
 * 后端接收到上报数据的事件。
 * @param dataPackage 上报时的数据包
 */
//function onSubmitFAppFormData(dataPackage: FAppDataPackageInfo) {

//}

/**
 * 后端将数据更新到数据库,并准备(但还未)提交数据库事务时调用。
 */
//function onCommitFAppFormData(dataPackage: FAppDataPackageInfo) {

//}

/**
 * 后端将数据写入库,并已经提交了数据库事务的事件。
 */
//function onDidCommitFAppFormData(dataPackage: FAppDataPackageInfo) {

//}

/**
 * 后端处理前端删除数据请求时的事件。此时脚本的数据库操作会和删除数据的逻辑在一个事务。
 * @param args 
 */
//function onDeleteFAppFormData(args: FAppDataOperationAPIArgs) {

//}

/**
 * 后端处理完前端删除数据请求的事件
 */
//function onDidDeleteFAppFormData(args: FAppDataOperationAPIArgs) {

//}

/**
 * 流程实例开始时执行的事件
 * * 此时流程还没开始,可以在脚本中进行一些初始化操作。
 * @param session 流程操作上下文信息
 */
//function onStartFAppFlowInstance(session: FAppFlowOperationSession) {

//}

/**
 * 流程实例开始后执行的事件
 * * 此时流程已经开始,脚本中功能与开始流程不在同一个事务中。
 * @param session 流程操作上下文信息
 */
//function onDidStartFAppFlowInstance(session: FAppFlowOperationSession) {

//}

/**
 * 流程实例结束时执行的事件
 * * 此时流程还未结束,脚本中功能与开始流程在同一个事务中。
 * @param session 流程操作上下文信息
 */
//function onEndFAppFlowInstance(session: FAppFlowOperationSession) {

//}

/**
 * 流程实例结束后执行的事件
 * * 此时流程已经结束,脚本中功能与结束流程不在同一个事务中。
 * @param session 流程操作上下文信息
 */
//function onDidEndFAppFlowInstance(session: FAppFlowOperationSession) {

//}

/**
 * 流程实例中创建一个任务时的事件
 * @param session 流程操作上下文信息
 */
//function onCreateFAppFlowTask(session: FAppFlowOperationSession) {

//}

/**
 * 流程实例中任务开始执行前的事件
 * * 此时流程操作还没真正执行,脚本中操作与流程操作在同一个事务中。
 * @param session 流程操作上下文信息
 */
//function onProcessFAppFlowTask(session: FAppFlowOperationSession) {

//}

/**
 * 流程实例中任务执行完成后的事件
 * * 此时流程操作已经结束,脚本中操作与流程操作不在同一个事务中。
 * @param session 流程操作上下文信息
 */
//function onDidProcessFAppFlowTask(session: FAppFlowOperationSession) {

//}
  1. 示例1:使用表单应用API实现提交表单数据时同步维护元数据目录
点击查看
// 引入元数据metadata模块
//import metadata from "svr-api/metadata";

// 引入模型dw模块
//import dw from "svr-api/dw";

/**
 * 后端将数据写入库,并已经提交了数据库事务的事件。
 * 脚本执行的入口
 */
function onDidCommitFAppFormData(dataPackage: FAppDataPackageInfo) {
    // 在这里输入定制的个性化需求逻辑代码

    // 获取一个元数据目录
    //metadata.getFile('FILE_PATH');

    // 修改数据包中某个模型的某个字段的值
    //dataPackage.data['TABLE_NAME']['FIELD_NAME'] = 'test';

    // 获取模型信息
    // dw.getDWTable('TABLE_NAME');
}
  1. 示例2:合同起草经过审批通过后,需要将合同起草表单数据自动同步到合同履行计划表中
点击查看
import { sendMessage } from "svr-api/sys";

/**
 * 流程结束时执行的事件。
 * 脚本执行的入口
 */
function onAfterEndInstance(session: FAppFlowOperationSession) {
	// 在这里输入定制的个性化需求逻辑代码

	/**
	 * 背景:用户提交合同起草表单,合同起草表单经过审批通过后,需要将合同起草表单数据自动同步到合同履行计划表中。
	 */
	
	// 只有当流程是正常审批通过结束的,才执行同步数据。
	if (!session.isRejected() && session.isApproved()) {
		// 查询合同起草表单数据
		let data_HTQC = session.getModelData('合同起草');

		// 将合同起草表单数据同步到合同履行计划表中。
		let data_HTLXJH = {
			'合同履行计划': [{
				'合同编号': data_HTQC['合同编号'],
				'合同开始日期': data_HTQC['合同开始日期'],
				'合同结束日期': data_HTQC['合同结束日期'],
				'总金额': data_HTQC['总金额']
			}]
		}
		// 执行更细表单数据
		session.updateData(data_HTLXJH);

		// 流程结束后,发送邮件通知用户审批通过。
		sendMessage({
			type: 'email',
			sender: '赛思小助手',
			subject: '合同审批结果',
			message: '您的合同起草已经审批通过',
			receivers: ['testuser@163.com']
		});
	}

}
是否有帮助?
0条评论
评论