后端JSF函数开发说明
JSF函数采用javascript作为脚本语言, 支持ES 2017语法,只能使用javascript的基本功能,以及端提供的sdk函数。有关sdk函数说明参考附2: backend SDK函数。
JSF按使用场景,有不同的上下文变量和返回值, 目前backend仅支持流程调用这一种后端场景函数, 实际在编写JSF函数时,只需要提供函数体即可。
流程场景函数
流程场景函数,是在一个单据执行的工作流程过程中,可以调用的函数,比如单据生效后调用,单据弃审后调用等。
场景函数的模板:
function ${funcName}(userContext, objectType, objectId, variables) {
${jsfContent}
}
场景函数的参数说明
| 字段名称 | 字段说明 | 类型 | 必填 | 备注 |
|---|---|---|---|---|
| userContext | 只读当前用户上下文对象 | object | Y | 当前调用的上下文对象, 不需要用户传递,为只读类型, 它包括的字段参考附1: 上下文对象 |
| objectType | 当前流程的单据对象类型 | string | Y | - |
| objectId | 当前流程的单据对象ID | string | Y | - |
| variables | 流程中设置的变量 | object | 它是和一KV结构, key为变量名,value为变量值对象(比如J: {"var1": {"type": "String", "value": "var1Value"}}) |
场景函数返回值规则
返回值说明:通常的返回值格式如下:
{
status: "success|error|warning", //函数是否成功执行的状态
code: "", //如果执行不成功时,提供的错误码
message: "", //如果执行不成功时,提供的错误提示信息
description: "", //如果执行不成功时,提供的错误详细描述
data: null, //成功时需要返回的数据对象
ars: null, //如果出错时,需要返回的其他错误数据
}
返回会是的属性说明:
| 字段名称 | 字段说明 | 类型 | 必填 | 备注 |
|---|---|---|---|---|
| status | 执行函数状态 | string | Y | 函数是否成功执行的状态, 取值为 success/error/warning |
| code | 错误码 | string | - | 如果执行不成功时,提供的错误码 |
| message | 错误信息 | string | - | 如果执行不成功时,提供的错误提示信息 |
| description | 错误描述 | string | - | 如果执行不成功时,提供的错误详细描述 |
| data | 返回的数据 | any | - | 成功时需要返回的数据对象 |
| args | 错误附加参数 | map | - | 如果出错时,需要返回的其他错误数据 |
| logs | 函数中输出的日志信息 | array | - | 函数中输出的日志信息 |
如果JSF函数体没有返回数据,或者返回的数据中没有status字段,则默认jsf函数执行成功, 会设置status=success, 并将返回对象当前data, 即:
return {status: "success", data: {id:"123"}}; 等价于: return {id: "123"};');
场景函数示例:
a) 收款单增加额外的逻辑检查,如果收款部门为’AA'并且收款金额>100时,检查不通过,打回单据,并显示错误信息为“XX部门收款不能超过100"。
if (objectType != 'Receipt') {
return;
}
var result = await query(objectType, ['id'], `id = '${objectId}' and ownerDept.name = 'AA' and amount > 100`);
if (result.status != 'success') {
return result;
}
if (result.data.length == 1) {
return {
status: 'error',
message: 'AA部门收款不能超过100'
};
}
return true;
说明: objectType, objectId为参数, query为backend SDK函数
b) 执行一个插入Comment的操作及删除自动插入的评论操作
return create('Comment', {
objectType: objectType,
objectId: objectId,
content: '这是一个自动增加的评论'
});
c) 执行一个删除自动添加的评论的操作
var result = await query('Comment', ['id'], `objectType = '${objectType}' and objectId = '${objectId}' and content='这是一个自动增加的评论'`);
if (result.status != 'success') {
return result;
}
if(result.data.length != 0){
return remove('Comment', result.data[0].id);
}
d) 发票增加额外弃审检查,发票金额>1000,不允许弃审,并提供弃审错误信息“发票金额大于1000,不允许弃审”。
if (objectType != 'Invoice') {
return;
}
var result = await query(objectType, ['id'], `id = '${objectId}' and amount > 1000`);
if (result.status != 'success') {
return result;
}
if (result.data.length == 1) {
return {
status: 'error',
message: '发票金额大于1000,不允许弃审'
};
}
return true;
附1: 上下文对象
上下文对象为JSF函数运行时上下文信息对象, 它包括以下内容:
{
rootRequestId: string; //根请求ID, 如果当前请求是别的请求触发的,保存的别的请求的requestId, 以便输出日志时,用来跟踪调用链
requestId: string; //当前请法求ID, 当前请求的唯一标识, 相同的requestId,以同样的参数调用时,后端会进行幂等处理,只响应第一次成功调用结果
tenantId: string; //当前租户ID
userId: string; //当前用户ID
departmentId: string; //当前用户所属部门ID
currentRoleId: string; //当前用户使用的角色ID
currentOrgId: string; //当前的组织ID
isDisableDataScope: boolean; //是否禁用数据权限
roles: Map<string, boolean>; //当前用户具有的角色信息, key为角色ID, value表示该角色是否有管理员身份
}