diff --git a/src/views/boardGenerate/api/getData.js b/src/views/boardGenerate/api/getData.js new file mode 100644 index 0000000..7f5b797 --- /dev/null +++ b/src/views/boardGenerate/api/getData.js @@ -0,0 +1,133 @@ +import request from '@/utils/request'; +import { getDataSourceList, querySql, querySql1 } from '@/views/boardGenerate/api/dataSource.js'; +import { options } from '@/views/boardGenerate/tool.js'; +import axios from 'axios'; +import { ref } from 'vue'; + +let apiList = []; + +let getDataFlag = false; +const waitReq = () => { + return new Promise((resolve, reject) => { + let times = null; + times = setInterval(() => { + if (apiList.length > 0) { + clearInterval(times); + times = null; + resolve(true); + } + }, 100); + }) +}; +const getApiList = async () => { + if (!getDataFlag) { + getDataFlag = true; + await getDataSourceList({ + pageNum: 1, + pageSize: 9999999 + }).then((res) => { + apiList = res.rows.map((e) => { + return { + id: e.dataSourceId, + name: e.dataSourceName, + url: e.requestUrl, + method: e.requestMethod, + outputData: e.designDataFieldList, + type: e.responseType, + db: e.fieldOne, + SQL: e.fieldTwo, + isPage: e.fieldThree === 'true' + }; + }); + return true; + }); + } else { + await waitReq(); + return true; + } +}; + +const anyFun = (data, fun, key) => { + switch (fun) { + case 'map': + return data.map((e) => e[key]); + default: + return null; + } +}; +const parseData = (data, rule) => { + let resData = data; + let step = rule.split(','); + step.forEach((item) => { + if (resData) { + let fun = item.split('%'); + if (fun.length === 1) { + resData = resData[fun[0]]; + } + if (fun.length === 2) { + resData = anyFun(resData, fun[0], fun[1]); + } + } + }); + return resData; +}; +const formulaFun = (formula, inputData) => { + let data = formula.replace(/\$\{\s*([^}]+?)\s*\}/g, (_, key) => { + let infos = key.split(','); + if (infos.length === 1) { + return inputData[infos[0]] || '%%'; + } + if (infos.length === 2) { + return `AND ${infos[0]} = ${inputData[infos[1]] || '%%'}`; + } + }); + return data; +}; + +export const getData = async (res) => { + await getApiList(); + + let outputData = {}; + + const tasks = (res.request||[]).map(async (e) => { + let api = apiList.find((v) => v.id === e.dataSource); + let params = { ...res.inputData }; + + if (api.type === '1' || !api.type) { + const result = await (options.isD ? request : axios.request)({ + method: api.method, + url: api.url, + params: api.method === 'get' ? params : undefined, + data: api.method === 'post' ? params : undefined + }); + + let data = options.isD ? result : result.data || result.rows; + + api.outputData.forEach((item) => { + outputData[item.fieldOne] = parseData(data, item.fieldTwo); + }); + } + + if (api.type === '2') { + let data; + + if (api.isPage) { + data = await querySql1({ + sql: formulaFun(api.SQL, res.inputData), + linkId: api.db, + pageSize: res.inputData.pageSize, + pageNum: res.inputData.pageNum + }); + } else { + data = await querySql(formulaFun(api.SQL, res.inputData), api.db); + } + + api.outputData.forEach((item) => { + outputData[item.fieldOne] = parseData(data, item.fieldTwo); + }); + } + }); + + await Promise.all(tasks); + return outputData; +}; diff --git a/src/views/boardGenerate/nodes/board/annularNode.vue b/src/views/boardGenerate/nodes/board/annularNode.vue index f074b2c..f2a43fb 100644 --- a/src/views/boardGenerate/nodes/board/annularNode.vue +++ b/src/views/boardGenerate/nodes/board/annularNode.vue @@ -1,11 +1,16 @@