From 72ed72e595c3e7276ddaee82dfdf31426aeab274 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sun, 5 Jan 2025 14:41:34 +0800 Subject: [PATCH] fix: charts plugins (#3530) --- .../content/zh-cn/docs/development/intro.md | 2 +- packages/global/common/string/tools.ts | 17 ++- .../global/core/workflow/runtime/utils.ts | 8 +- packages/global/package.json | 1 + .../plugins/src/drawing/baseChart/index.ts | 33 ++-- .../src/drawing/baseChart/template.json | 144 ++---------------- .../core/workflow/dispatch/tools/http468.ts | 8 +- pnpm-lock.yaml | 9 +- 8 files changed, 52 insertions(+), 170 deletions(-) diff --git a/docSite/content/zh-cn/docs/development/intro.md b/docSite/content/zh-cn/docs/development/intro.md index aed6864b9..078b2fd10 100644 --- a/docSite/content/zh-cn/docs/development/intro.md +++ b/docSite/content/zh-cn/docs/development/intro.md @@ -148,7 +148,7 @@ FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI ## 加入社区 -遇到困难了吗?有任何问题吗? 加入微信群与开发者和用户保持沟通。 +遇到困难了吗?有任何问题吗? 加入飞书群与开发者和用户保持沟通。 diff --git a/packages/global/common/string/tools.ts b/packages/global/common/string/tools.ts index 961616305..c44e145b1 100644 --- a/packages/global/common/string/tools.ts +++ b/packages/global/common/string/tools.ts @@ -25,17 +25,22 @@ export const simpleText = (text = '') => { return text; }; -/* - replace {{variable}} to value -*/ +export const valToStr = (val: any) => { + if (val === undefined) return 'undefined'; + if (val === null) return 'null'; + + if (typeof val === 'object') return JSON.stringify(val); + return String(val); +}; + +// replace {{variable}} to value export function replaceVariable(text: any, obj: Record) { if (typeof text !== 'string') return text; for (const key in obj) { const val = obj[key]; - const formatVal = typeof val === 'object' ? JSON.stringify(val) : String(val); - - text = text.replace(new RegExp(`{{(${key})}}`, 'g'), formatVal); + const formatVal = valToStr(val); + text = text.replace(new RegExp(`{{(${key})}}`, 'g'), () => formatVal); } return text || ''; } diff --git a/packages/global/core/workflow/runtime/utils.ts b/packages/global/core/workflow/runtime/utils.ts index e58e7a3c1..7d797d151 100644 --- a/packages/global/core/workflow/runtime/utils.ts +++ b/packages/global/core/workflow/runtime/utils.ts @@ -9,7 +9,7 @@ import { isValidReferenceValueFormat } from '../utils'; import { FlowNodeOutputItemType, ReferenceValueType } from '../type/io'; import { ChatItemType, NodeOutputItemType } from '../../../core/chat/type'; import { ChatItemValueTypeEnum, ChatRoleEnum } from '../../../core/chat/constants'; -import { replaceVariable } from '../../../common/string/tools'; +import { replaceVariable, valToStr } from '../../../common/string/tools'; export const getMaxHistoryLimitFromNodes = (nodes: StoreNodeItemType[]): number => { let limit = 10; @@ -343,11 +343,7 @@ export function replaceEditorVariable({ if (input) return getReferenceVariableValue({ value: input.value, nodes, variables }); })(); - const formatVal = (() => { - if (variableVal === undefined) return 'undefined'; - if (variableVal === null) return 'null'; - return typeof variableVal === 'object' ? JSON.stringify(variableVal) : String(variableVal); - })(); + const formatVal = valToStr(variableVal); const regex = new RegExp(`\\{\\{\\$(${nodeId}\\.${id})\\$\\}\\}`, 'g'); text = text.replace(regex, () => formatVal); diff --git a/packages/global/package.json b/packages/global/package.json index faaab7015..fbd0ad4b5 100644 --- a/packages/global/package.json +++ b/packages/global/package.json @@ -13,6 +13,7 @@ "next": "14.2.5", "openai": "4.61.0", "openapi-types": "^12.1.3", + "json5": "^2.2.3", "timezones-list": "^3.0.2" }, "devDependencies": { diff --git a/packages/plugins/src/drawing/baseChart/index.ts b/packages/plugins/src/drawing/baseChart/index.ts index f3e34b7ac..dc05be89d 100644 --- a/packages/plugins/src/drawing/baseChart/index.ts +++ b/packages/plugins/src/drawing/baseChart/index.ts @@ -4,8 +4,8 @@ import { SystemPluginSpecialResponse } from '../../../type.d'; type Props = { title: string; - xAxis: string; - yAxis: string; + xAxis: string[]; + yAxis: string[]; chartType: string; }; @@ -27,7 +27,12 @@ type Option = { series: SeriesData[]; // 使用定义的类型 }; -const generateChart = async (title: string, xAxis: string, yAxis: string, chartType: string) => { +const generateChart = async ( + title: string, + xAxis: string[], + yAxis: string[], + chartType: string +) => { // @ts-ignore 无法使用dom,如使用jsdom会出现生成图片无法正常展示,有高手可以帮忙解决 const chart = echarts.init(undefined, undefined, { renderer: 'svg', // 必须使用 SVG 模式 @@ -36,21 +41,11 @@ const generateChart = async (title: string, xAxis: string, yAxis: string, chartT height: 300 }); - let parsedXAxis: string[] = []; - let parsedYAxis: number[] = []; - try { - parsedXAxis = json5.parse(xAxis); - parsedYAxis = json5.parse(yAxis); - } catch (error: any) { - console.error('解析数据时出错:', error); - return Promise.reject('Data error'); - } - const option: Option = { backgroundColor: '#f5f5f5', title: { text: title }, tooltip: {}, - xAxis: { data: parsedXAxis }, + xAxis: { data: xAxis }, yAxis: {}, series: [] // 初始化为空数组 }; @@ -58,18 +53,18 @@ const generateChart = async (title: string, xAxis: string, yAxis: string, chartT // 根据 chartType 生成不同的图表 switch (chartType) { case '柱状图': - option.series.push({ name: 'Sample', type: 'bar', data: parsedYAxis }); + option.series.push({ name: 'Sample', type: 'bar', data: yAxis.map(Number) }); break; case '折线图': - option.series.push({ name: 'Sample', type: 'line', data: parsedYAxis }); + option.series.push({ name: 'Sample', type: 'line', data: yAxis.map(Number) }); break; case '饼图': option.series.push({ name: 'Sample', type: 'pie', - data: parsedYAxis.map((value, index) => ({ - value, - name: parsedXAxis[index] // 使用 xAxis 作为饼图的名称 + data: yAxis.map((value, index) => ({ + value: Number(value), + name: xAxis[index] // 使用 xAxis 作为饼图的名称 })) }); break; diff --git a/packages/plugins/src/drawing/baseChart/template.json b/packages/plugins/src/drawing/baseChart/template.json index 1fe584558..15402be49 100644 --- a/packages/plugins/src/drawing/baseChart/template.json +++ b/packages/plugins/src/drawing/baseChart/template.json @@ -1,6 +1,6 @@ { "author": "silencezhang", - "version": "4812", + "version": "4817", "name": "基础图表", "avatar": "core/workflow/template/baseChart", "intro": "根据数据生成图表,可根据chartType生成柱状图,折线图,饼图", @@ -68,7 +68,7 @@ "canEdit": true, "key": "yAxis", "label": "yAxis", - "description": "y轴数据,例如:['1', '2', '3']", + "description": "y轴数据,例如:[1,2,3]", "defaultValue": "", "list": [ { @@ -77,7 +77,7 @@ } ], "required": true, - "toolDescription": "y轴数据,例如:['1', '2', '3']" + "toolDescription": "y轴数据,例如:[1,2,3]" }, { "renderTypeList": ["select", "reference"], @@ -145,8 +145,8 @@ "flowNodeType": "pluginOutput", "showStatus": false, "position": { - "x": 2122.252754006148, - "y": -63.5218674613718 + "x": 2128.8138851197145, + "y": -63.52186746137181 }, "version": "481", "inputs": [ @@ -154,10 +154,12 @@ "renderTypeList": ["reference"], "valueType": "string", "canEdit": true, - "key": "相对路径URL", - "label": "相对路径URL", + "key": "图表 url", + "label": "图表 url", "description": "可用使用markdown格式展示图片,如:![图片](url)", - "value": ["ws0DFKJnCPhk", "bzaYjKyQFOw2"] + "value": ["ws0DFKJnCPhk", "bzaYjKyQFOw2"], + "isToolOutput": true, + "required": true } ], "outputs": [] @@ -170,8 +172,8 @@ "flowNodeType": "httpRequest468", "showStatus": true, "position": { - "x": 1216.5166647574395, - "y": -206.30162946606856 + "x": 1264.2009472531117, + "y": -455.0773486762623 }, "version": "481", "inputs": [ @@ -275,7 +277,7 @@ "key": "system_httpJsonBody", "renderTypeList": ["hidden"], "valueType": "any", - "value": "{\r\n \"title\": \"{{title-plugin}}\",\r\n \"xAxis\": \"{{xAxis-plugin}}\",\r\n \"yAxis\": \"{{yAxis-plugin}}\",\r\n \"chartType\": \"{{chartType-plugin}}\"\r\n}", + "value": "{\r\n \"title\": \"{{$pluginInput.title$}}\",\r\n \"xAxis\": {{$pluginInput.xAxis$}},\r\n \"yAxis\": {{$pluginInput.yAxis$}},\r\n \"chartType\": \"{{$pluginInput.chartType$}}\"\r\n}", "label": "", "required": false, "valueDesc": "", @@ -306,126 +308,6 @@ "description": "", "debugLabel": "", "toolDescription": "" - }, - { - "renderTypeList": ["reference"], - "valueType": "string", - "canEdit": true, - "key": "title-plugin", - "label": "title-plugin", - "customInputConfig": { - "selectValueTypeList": [ - "string", - "number", - "boolean", - "object", - "arrayString", - "arrayNumber", - "arrayBoolean", - "arrayObject", - "arrayAny", - "any", - "chatHistory", - "datasetQuote", - "dynamic", - "selectApp", - "selectDataset" - ], - "showDescription": false, - "showDefaultValue": true - }, - "required": true, - "value": ["pluginInput", "title"] - }, - { - "renderTypeList": ["reference"], - "valueType": "string", - "canEdit": true, - "key": "xAxis-plugin", - "label": "xAxis-plugin", - "customInputConfig": { - "selectValueTypeList": [ - "string", - "number", - "boolean", - "object", - "arrayString", - "arrayNumber", - "arrayBoolean", - "arrayObject", - "arrayAny", - "any", - "chatHistory", - "datasetQuote", - "dynamic", - "selectApp", - "selectDataset" - ], - "showDescription": false, - "showDefaultValue": true - }, - "required": true, - "value": ["pluginInput", "xAxis"] - }, - { - "renderTypeList": ["reference"], - "valueType": "string", - "canEdit": true, - "key": "yAxis-plugin", - "label": "yAxis-plugin", - "customInputConfig": { - "selectValueTypeList": [ - "string", - "number", - "boolean", - "object", - "arrayString", - "arrayNumber", - "arrayBoolean", - "arrayObject", - "arrayAny", - "any", - "chatHistory", - "datasetQuote", - "dynamic", - "selectApp", - "selectDataset" - ], - "showDescription": false, - "showDefaultValue": true - }, - "required": true, - "value": ["pluginInput", "yAxis"] - }, - { - "renderTypeList": ["reference"], - "valueType": "string", - "canEdit": true, - "key": "chartType-plugin", - "label": "chartType-plugin", - "customInputConfig": { - "selectValueTypeList": [ - "string", - "number", - "boolean", - "object", - "arrayString", - "arrayNumber", - "arrayBoolean", - "arrayObject", - "arrayAny", - "any", - "chatHistory", - "datasetQuote", - "dynamic", - "selectApp", - "selectDataset" - ], - "showDescription": false, - "showDefaultValue": true - }, - "required": true, - "value": ["pluginInput", "chartType"] } ], "outputs": [ diff --git a/packages/service/core/workflow/dispatch/tools/http468.ts b/packages/service/core/workflow/dispatch/tools/http468.ts index e1afb480a..e55b1ad12 100644 --- a/packages/service/core/workflow/dispatch/tools/http468.ts +++ b/packages/service/core/workflow/dispatch/tools/http468.ts @@ -177,17 +177,17 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise