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格式展示图片,如:",
- "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