FaaS 连接器 - 钉钉开放平台 - 通过高级查询条件获取表单实例数据(包括子表单组件数据)
注意:不建议以 HTTP 连接器的形式在前端数据源中直接使用此 OpenAPI,请参考此案例配置 FaaS 连接器后方可使用。否则会导致 systemToken 参数的泄露,威胁应用的数据安全。
1. 使用场景
本例开发语言:NodeJS
本例介绍一下如何使用钉钉开放平台 OpenAPI 实现通过高级查询条件获取表单实例数据(包括子表单组件数据)。
2. 实现功能
2.1. 申请钉钉开放平台应用凭证及接口权限
若已申请,可忽略此步骤。
准备工作 - 宜搭自定义连接器鉴权凭证申请及接口权限申请 | 钉钉宜搭·帮助中心
2.2. 创建并配置 FaaS 连接器
2.2.1. 创建 FaaS 连接器
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1700789701785-e4a4a7bd-5601-4732-b77a-310b6d0201de.png)
2.2.2. 配置连接器基本信息和开发语言
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701162662788-8eb8d2c6-625e-41e5-94e7-65607c17a854.png)
2.2.3. 配置连接器执行动作
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701162695261-0d90d56d-3444-4325-b6e1-0a15bddcb539.png)
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701162713919-adf6842e-9633-40cb-91f0-8e8c196b9676.png)
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701162731695-6e7320bc-c112-4672-9931-da0b2cb00656.png)
注意解析 Body 并配置成功标志位。
{
"appType" : "String",
"formUuid" : "String",
"pageNumber" : "Integer",
"pageSize" : "Integer",
"originatorId" : "String",
"searchCondition" : "String",
"orderConfigJson" : "String",
"modifiedToTimeGMT" : "String",
"modifiedFromTimeGMT" : "String",
"createToTimeGMT" : "String",
"createFromTimeGMT" : "String"
}
{
"success": true,
"content": "",
"error": ""
}
2.3. 开发 FaaS 连接器
2.3.1. 前往云 IDE 开发并在 dingOpenApiUtil.js 文件中添加代码
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701162769125-9f9e3575-2330-45cb-b8c1-27d7453e51a4.png)
添加完毕后需保存。
Windows:Ctrl + S
Mac:Command + S
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701162844219-a0e603e6-e1d3-48f1-9d11-e64af38b7839.png)
复制下列代码,整个替换上图标记的「 searchFormDataSecondGeneration 」。
searchFormDataSecondGeneration: async function (searchFormDataSecondGenerationInputs) {
let client = createClient();
let searchFormDataSecondGenerationHeaders = new $dingtalkyida_1_0.SearchFormDataSecondGenerationHeaders({});
searchFormDataSecondGenerationHeaders.xAcsDingtalkAccessToken = innerGetAccessToken();
let searchFormDataSecondGenerationRequest = new $dingtalkyida_1_0.SearchFormDataSecondGenerationRequest(searchFormDataSecondGenerationInputs);
try {
const result = await client.searchFormDataSecondGenerationWithOptions(searchFormDataSecondGenerationRequest, searchFormDataSecondGenerationHeaders, new $Util.RuntimeOptions({}));
return result.body;
} catch (err) {
if (!Util.empty(err.code) && !Util.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
throw err;
}
return null;
},
2.3.2. 将 faasEntry.js 文件中的代码完全替换
注意根据实际情况修改固定参数。
appKey、appSecret 为 2.1 申请的应用凭证。
systemToken 可直接在宜搭 应用设置 - 部署运维 中找到。
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701163004584-1751d16a-a738-40fa-92e0-1d2206d73a3f.png)
const { openApi: OpenAPIUtil, yidaConnector: YidaConnectorUtil, httpUtil: HttpUtil } = require('./utils');
const { ConnectorTypeEnum } = YidaConnectorUtil;
// 注意:涉及数据安全的参数(如:appKey、appSecret、systemToken)一定要在服务端发送,不可在前端数据源里传入。
const appKey = 'XXXXXXXXXXXXXXXXXXXX';
const appSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const systemToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
module.exports = async function (faasInputs, context) {
// 这里的 inputs 跟你配置连接器时的 Body 参数及字段格式保持一致
const { inputs = {}, yidaContext = {} } = faasInputs || {};
const userId = yidaContext ? yidaContext['userId'] : ''; // 从连接器上下文获取调用人的 userId
const corpId = yidaContext ? yidaContext['corpId'] : ''; // 从连接器上下文获取调用组织的 corpId
const accessToken = yidaContext ? yidaContext['accessToken'] : '';
const consumeCode = yidaContext ? yidaContext['consumeCode'] : '';
OpenAPIUtil.setAccessToken(accessToken);
await OpenAPIUtil.getCustomAccessTokenThenCache(appKey, appSecret); // 获取调用连接器的 accessToken
YidaConnectorUtil.setConsumeCode(consumeCode);
inputs['systemToken'] = systemToken;
inputs['userId'] = userId;
return await searchFormDataSecondGeneration(inputs).then((result) => {
return {
success: true,
content: result,
error: null,
};
}).catch((error) => {
return {
success: false,
content: null,
error: error,
};
});
};
async function searchFormDataSecondGeneration(inputs) {
return await OpenAPIUtil.searchFormDataSecondGeneration(inputs);
}
2.4. 部署 FaaS 连接器
注意保存添加的代码。
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701163091265-2904fd5c-9ba0-48fa-92ff-0f1430f28192.png)
当提示代码部署成功即完成 FaaS 连接器云 IDE 开发。
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1700708582353-59ee5c93-25e2-4cc1-9411-9a9d59ee7176.png)
2.5. 返回连接器配置并点击保存
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701163112234-74b50b55-64b9-40a0-bcaf-c1c195621fb6.png)
2.6. 在宜搭页面配置数据源和使用数据源
2.6.1. 获取数据并展示在表格中
可参考下述案例,本例是对下述案例搜索数据功能的升级。
2.6.2. 在数据源中选择刚刚创建的连接器
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1700794967596-8b05bde6-25c6-4cc8-a11a-1185e5127080.png)
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701238668863-50c89e8f-6ab6-45db-8f9c-8d29b212a82a.png)
2.6.3. 前端直接调用数据源
searchCondition(高级查询条件)参数格式说明:
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701240057264-be9ba2ee-4460-430d-b559-2431ed23a19d.png)
// 加载表单数据
export function getData() {
const { currentPage, pageSize, searchCondition = [], } = this.state;
this.dataSourceMap.getData.load({
inputs: JSON.stringify({
body: {
appType: pageConfig.appType,
formUuid,
pageSize,
pageNumber: currentPage,
searchCondition: JSON.stringify(searchCondition),
},
}),
}).then(res => {
const { content, success, error } = res;
if (!success) {
this.utils.toast({
title: error,
type: 'error',
});
this.setState({
loading: false,
});
return;
}
const result = (content.data || []).map((item) => {
const { formInstanceId, formUuid, formData } = item;
return {
formInstId: formInstanceId,
formUuid,
...formData,
};
});
this.setState({
tableData: {
currentPage: content.pageNumber,
data: result,
totalCount: content.totalCount,
},
loading: false
});
}).catch(error => {
this.utils.toast({
title: error.message,
type: 'error',
});
this.setState({
loading: false,
});
});
}
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701239057294-5ed64019-acc8-4d50-84d3-57c564a8b28d.png)
// 搜索
export function onSubmit(values) {
const searchCondition = [{
'key': 'textField_lcpug407', // 姓名
'value': values.textField_lpas7xw1,
'type': 'TEXT',
'operator': values.selectField_lpb05kua,
'componentName': 'TextField',
}, {
'key': 'selectField_lpgn09sv', // 性别
'value': values.multiSelectField_lpgpe5te && values.selectField_lpgpe5td === 'eq' ? values.multiSelectField_lpgpe5te[0] : values.multiSelectField_lpgpe5te,
'type': 'ARRAY',
'operator': values.selectField_lpgpe5td,
'componentName': 'RadioField',
}, {
'key': 'numberField_lcpusnib', // 年龄
'value': values.numberField_lpgpe5tf,
'type': 'DOUBLE',
'operator': values.selectField_lpgpe5tg,
'componentName': 'NumberField',
}, {
'key': 'multiSelectField_lpgn09su', // 擅长技术
'value': values.multiSelectField_lpgpe5th,
'type': 'ARRAY',
'operator': values.selectField_lpgpe5ti,
'componentName': 'MultiSelectField',
}, {
'key': 'dateField_lpbyrnq7', // 入职日期
'value': values.dateField_lpgpe5tj,
'type': 'DOUBLE',
'operator': values.selectField_lpgpe5tk,
'componentName': 'DateField',
}, {
'key': 'employeeField_lpgn09st', // 直属主管
'value': values.employeeField_lpgpe5tl ? (values.selectField_lpgpe5tm === 'eq' ? values.employeeField_lpgpe5tl.value : values.employeeField_lpgpe5tl.map(item => item.value)) : '',
'type': 'STRING',
'operator': values.selectField_lpgpe5tm,
'componentName': 'EmployeeField',
}];
this.setState({
currentPage: 1,
loading: true,
searchCondition,
});
this.getData();
}
3. 实现效果
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701239853941-17c65ae0-f76d-46b8-9e07-61ae333dfe28.png)
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1701239805626-ea1a9227-32b6-4645-ba21-4f2a28f6214b.png)
4. 在线试玩
本文档对您是否有帮助?