跳到主要内容

如何实现自动引用其他应用数据?

场景描述

例如我有产品明细表如下图

我希望可以在另一个应用产品表格中实现根据产品分类自动引用产品明细的数据

image.png

解决思路

可以通过使用代码块来实现或者使用q-linker来实现。

具体看实际场景采用,如果是手动发起数据两者都可以采用,但是如果是通过QR添加数据发起数据,那么就需要使用Q-linker来进行提交重计算。

配置过程

代码块实现

代码与测试

  • 代码注释

  • key:对应表单中产品分类字段

  • URL:需要换成对应的获取应用数据接口的URL,具体看帮助文档

  • accessToken:需要换成对应工作区中openAPI的超管token。获取位置:轻商场--拓展插件-- openAPI

  • queId:需要替换成对应获取的字段ID,queries中的queid是进行具体筛选的ID

const axios = require('axios');
var key = qf_field.{产品分类$$1686A6A92$$};
let data = JSON.stringify({
"pageSize": "50",
"pageNum": "1",
"queries": [
{
"queId": 156360776,
"searchKey": key,
"scope": 1
}
]
});

let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.qingflow.com/app/c17e3960/apply/filter',
headers: {
'accessToken': 'd866db1d-79ca-42c5-9e9c-0b1ce21*****',
'Content-Type': 'application/json'
},
data: data
};

async function fetchData() {
if (key === null) {
return []; // 返回空数组
}

const res = await axios(config);
var msg = res.data;
var result = msg.result.result;
var res_list = [];

result.forEach((value, index) => {
var res_msg = new Map();
var answers = value.answers;
answers.forEach((value, index) => {
var queId = value.queId;
var queTitle = value.queTitle;
if (queId == 156360782) {
var values = value.values;
var dataValue = values[0].dataValue;
res_msg[queTitle] = dataValue;
res_list.push(res_msg);
}
});
});

return res_list;
}

fetchData().then((res_list) => qf_output={res_list});
  • 注释

  • accessToken:需要换成对应工作区中openAPI的超管token。获取位置:轻商场--拓展插件-- openAPI

  • apiUrl1:需要换成对应的获取应用数据接口的URL,具体看帮助文档

  • key:对应表单中产品分类字段

  • queId:extractQueIdsApi1中queid需要替换成对应获取的字段ID,queriesApi1中的queid是进行具体筛选的ID

const axios = require('axios');

const headers = {
'accessToken': 'd866db1d-79ca-42c5-9e9c-0b1ce21135d2',
'Content-Type': 'application/json'
};

const apiUrl1 = 'https://api.qingflow.com/app/c17e3960/apply/filter';
const pageSize = 200;
var key = qf_field.{产品分类$$1686A6A92$$};;
const queriesApi1 = [
{
"queId": 156360776,
"searchKey": key,
"scope": 1
}
]; // API1的查询条件

async function processPage(apiUrl, pageNum, queries) {
const postData = {
pageSize: pageSize.toString(),
pageNum: pageNum.toString(),
queries: queries
};

const response = await axios.post(apiUrl, postData, { headers });
return response.data.result;
}

async function processAllPages(apiUrl, queries, extractQueIds) {
const firstPageData = await processPage(apiUrl, 1, queries);
let totalPages = firstPageData.pageAmount;

const promises = [];

for (let pageNum = 2; pageNum <= totalPages; pageNum++) {
promises.push(processPage(apiUrl, pageNum, queries));
}

const responses = await Promise.all(promises);
const reslist = extractData(firstPageData, extractQueIds);

responses.forEach((data) => {
const extractedData = extractData(data, extractQueIds);
reslist.push(...extractedData);
});

return reslist;
}

function extractData(response, queIds) {
const result = response.result;
const res_list = [];

result.forEach((value) => {
const res_msg = {};

value.answers.forEach((v) => {
const queId = v.queId;
const queTitle = v.queTitle;

if (queIds.includes(queId)) {
const values = v.values;
const dataValue = values[0].dataValue;
res_msg[queTitle] = dataValue;
}
});

res_list.push(res_msg);
});

return res_list;
}

(async () => {
const extractQueIdsApi1 =[156360782]; // API1的提取queId

if (key === null) {
qf_output={'reslist1':null};; // 返回空数组
}else{
const reslist1 = await processAllPages(apiUrl1, queriesApi1, extractQueIdsApi1);
qf_output={reslist1};
}
})();

image.png

解析与字段配置

image.png

image.png

实现效果

https://qingflow.com/f/b9acd2b0

image.png

Q-linker实现

Q-linker配置

image.png

URL

https://api.qingflow.com/app/c17e3960/apply/filter

红色部分为获取具体应用的appkey

Method

post

accessToken:*****

获取从轻商城——拓展插件——openAPI

body
{
"pageSize": "50",
"pageNum": "1",
"queries": [
{
"queId": 156360776,
"searchKey":"",
"scope": 1
}
]
}

其中pagesize表示为每页的数量,如果应用数量很大,可以填大点,这里的queid表示需要筛选的字段ID,searchKey表示筛选的具体内容。

image.png

解析规则配置

image.png

产品名称解析:

$.answers[?(@.queTitle == '产品名称')].values[0].value

作用是过滤数组,查询queTitle等于产品名称的具体内容

表格字段配置

image.png

表单字段配置

需要再加一个字段来进行输出产品分类,因为如果直接将单项选择的产品分类作为字段插入进body中的话,当自动触发q-linker的话,就会返回全部内容。

所以加了单行文字字段来进行判断输出,如果单项选择没有选择内容就输出空格,有选择就输出本身。这样就避免自动触发输出全部内容了

image.png

实际效果

https://qingflow.com/f/57d94170

image.png