test-chat-sdk 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/.prettierrc.js +24 -0
  2. package/README.md +46 -0
  3. package/config/env.js +104 -0
  4. package/config/getHttpsConfig.js +66 -0
  5. package/config/jest/babelTransform.js +29 -0
  6. package/config/jest/cssTransform.js +14 -0
  7. package/config/jest/fileTransform.js +40 -0
  8. package/config/modules.js +134 -0
  9. package/config/paths.js +77 -0
  10. package/config/webpack/persistentCache/createEnvironmentHash.js +9 -0
  11. package/config/webpack.config.js +785 -0
  12. package/config/webpackDevServer.config.js +127 -0
  13. package/dist/Chat/AgentList/index.d.ts +9 -0
  14. package/dist/Chat/ChatFooter/index.d.ts +17 -0
  15. package/dist/Chat/Conversation/index.d.ts +11 -0
  16. package/dist/Chat/MessageContainer/index.d.ts +19 -0
  17. package/dist/Chat/MobileAgents/index.d.ts +11 -0
  18. package/dist/Chat/components/AgentTip/index.d.ts +8 -0
  19. package/dist/Chat/components/ConversationModal/index.d.ts +10 -0
  20. package/dist/Chat/components/CopilotAvatar/index.d.ts +2 -0
  21. package/dist/Chat/components/Message.d.ts +10 -0
  22. package/dist/Chat/components/RecommendQuestions/index.d.ts +6 -0
  23. package/dist/Chat/components/Text.d.ts +9 -0
  24. package/dist/Chat/constants.d.ts +19 -0
  25. package/dist/Chat/index.d.ts +17 -0
  26. package/dist/Chat/service.d.ts +11 -0
  27. package/dist/Chat/type.d.ts +97 -0
  28. package/dist/Copilot/constants.d.ts +11 -0
  29. package/dist/Copilot/index.d.ts +13 -0
  30. package/dist/ShowCase/index.d.ts +8 -0
  31. package/dist/ShowCase/service.d.ts +2 -0
  32. package/dist/ShowCase/type.d.ts +11 -0
  33. package/dist/common/constants.d.ts +58 -0
  34. package/dist/common/env.d.ts +3 -0
  35. package/dist/common/type.d.ts +247 -0
  36. package/dist/components/ChatItem/ExecuteItem.d.ts +25 -0
  37. package/dist/components/ChatItem/ExpandParseTip.d.ts +20 -0
  38. package/dist/components/ChatItem/FilterItem.d.ts +17 -0
  39. package/dist/components/ChatItem/Loading.d.ts +2 -0
  40. package/dist/components/ChatItem/ParseTip.d.ts +26 -0
  41. package/dist/components/ChatItem/ParseTipUtils.d.ts +10 -0
  42. package/dist/components/ChatItem/SimilarQuestionItem.d.ts +10 -0
  43. package/dist/components/ChatItem/SqlItem.d.ts +17 -0
  44. package/dist/components/ChatItem/SwitchEntity.d.ts +9 -0
  45. package/dist/components/ChatItem/Text.d.ts +6 -0
  46. package/dist/components/ChatItem/Typing.d.ts +2 -0
  47. package/dist/components/ChatItem/index.d.ts +33 -0
  48. package/dist/components/ChatMsg/ApplyAuth/index.d.ts +7 -0
  49. package/dist/components/ChatMsg/Bar/index.d.ts +13 -0
  50. package/dist/components/ChatMsg/DateOptions/index.d.ts +9 -0
  51. package/dist/components/ChatMsg/FilterSection/index.d.ts +8 -0
  52. package/dist/components/ChatMsg/MarkDown/index.d.ts +10 -0
  53. package/dist/components/ChatMsg/Message/index.d.ts +18 -0
  54. package/dist/components/ChatMsg/MetricCard/PeriodCompareItem.d.ts +7 -0
  55. package/dist/components/ChatMsg/MetricCard/index.d.ts +10 -0
  56. package/dist/components/ChatMsg/MetricTrend/MetricInfo.d.ts +8 -0
  57. package/dist/components/ChatMsg/MetricTrend/MetricTrendChart.d.ts +14 -0
  58. package/dist/components/ChatMsg/MetricTrend/MultiMetricsTrendChart.d.ts +12 -0
  59. package/dist/components/ChatMsg/MetricTrend/index.d.ts +16 -0
  60. package/dist/components/ChatMsg/NoPermissionChart/index.d.ts +8 -0
  61. package/dist/components/ChatMsg/Pie/PieChart.d.ts +11 -0
  62. package/dist/components/ChatMsg/Pie/index.d.ts +14 -0
  63. package/dist/components/ChatMsg/Table/index.d.ts +12 -0
  64. package/dist/components/ChatMsg/Text/index.d.ts +9 -0
  65. package/dist/components/ChatMsg/WebPage/index.d.ts +8 -0
  66. package/dist/components/ChatMsg/index.d.ts +15 -0
  67. package/dist/components/DrillDownDimensions/DimensionSection.d.ts +11 -0
  68. package/dist/components/DrillDownDimensions/index.d.ts +13 -0
  69. package/dist/components/IconFont/index.d.ts +3 -0
  70. package/dist/components/MetricOptions/index.d.ts +11 -0
  71. package/dist/components/RecommendOptions/index.d.ts +9 -0
  72. package/dist/components/Tools/FeedbackModal.d.ts +9 -0
  73. package/dist/components/Tools/index.d.ts +12 -0
  74. package/dist/demo/Chat.d.ts +2 -0
  75. package/dist/demo/ChatDemo.d.ts +4 -0
  76. package/dist/demo/CopilotDemo.d.ts +2 -0
  77. package/dist/hooks/index.d.ts +3 -0
  78. package/dist/hooks/useComposing.d.ts +5 -0
  79. package/dist/hooks/useExportByEcharts.d.ts +10 -0
  80. package/dist/hooks/useMethodRegister.d.ts +4 -0
  81. package/dist/index.d.ts +10 -0
  82. package/dist/index.es.js +1 -0
  83. package/dist/service/axiosInstance.d.ts +3 -0
  84. package/dist/service/index.d.ts +25 -0
  85. package/dist/utils/utils.d.ts +45 -0
  86. package/package.json +214 -0
  87. package/public/favicon.ico +0 -0
  88. package/public/index.html +43 -0
  89. package/public/manifest.json +15 -0
  90. package/public/robots.txt +3 -0
  91. package/rollup/rollup.config.mjs +37 -0
  92. package/rollup/rollup.esm.config.mjs +21 -0
  93. package/rollup/rollup.umd.config.mjs +30 -0
  94. package/scripts/build.js +217 -0
  95. package/scripts/start.js +154 -0
  96. package/scripts/test.js +52 -0
  97. package/src/Chat/AgentList/index.tsx +52 -0
  98. package/src/Chat/AgentList/style.module.less +83 -0
  99. package/src/Chat/ChatFooter/index.tsx +423 -0
  100. package/src/Chat/ChatFooter/style.module.less +225 -0
  101. package/src/Chat/Conversation/index.tsx +236 -0
  102. package/src/Chat/Conversation/style.module.less +171 -0
  103. package/src/Chat/MessageContainer/index.tsx +145 -0
  104. package/src/Chat/MessageContainer/style.module.less +53 -0
  105. package/src/Chat/MobileAgents/index.tsx +62 -0
  106. package/src/Chat/MobileAgents/style.module.less +55 -0
  107. package/src/Chat/components/AgentTip/index.tsx +48 -0
  108. package/src/Chat/components/AgentTip/style.module.less +44 -0
  109. package/src/Chat/components/ConversationModal/index.tsx +65 -0
  110. package/src/Chat/components/CopilotAvatar/index.tsx +8 -0
  111. package/src/Chat/components/CopilotAvatar/style.module.less +13 -0
  112. package/src/Chat/components/Message.tsx +38 -0
  113. package/src/Chat/components/RecommendQuestions/index.tsx +64 -0
  114. package/src/Chat/components/RecommendQuestions/style.module.less +36 -0
  115. package/src/Chat/components/Text.tsx +42 -0
  116. package/src/Chat/components/style.module.less +311 -0
  117. package/src/Chat/constants.ts +37 -0
  118. package/src/Chat/index.tsx +526 -0
  119. package/src/Chat/service.ts +49 -0
  120. package/src/Chat/style.module.less +119 -0
  121. package/src/Chat/type.ts +107 -0
  122. package/src/Copilot/constants.ts +11 -0
  123. package/src/Copilot/index.tsx +149 -0
  124. package/src/Copilot/style.module.less +151 -0
  125. package/src/ShowCase/index.tsx +120 -0
  126. package/src/ShowCase/service.ts +12 -0
  127. package/src/ShowCase/style.module.less +46 -0
  128. package/src/ShowCase/type.ts +14 -0
  129. package/src/common/constants.ts +93 -0
  130. package/src/common/env.ts +5 -0
  131. package/src/common/type.ts +270 -0
  132. package/src/components/ChatItem/ExecuteItem.tsx +210 -0
  133. package/src/components/ChatItem/ExpandParseTip.tsx +333 -0
  134. package/src/components/ChatItem/FilterItem.tsx +209 -0
  135. package/src/components/ChatItem/Loading.tsx +14 -0
  136. package/src/components/ChatItem/ParseTip.tsx +322 -0
  137. package/src/components/ChatItem/ParseTipUtils.tsx +205 -0
  138. package/src/components/ChatItem/SimilarQuestionItem.tsx +84 -0
  139. package/src/components/ChatItem/SqlItem.tsx +410 -0
  140. package/src/components/ChatItem/SwitchEntity.tsx +52 -0
  141. package/src/components/ChatItem/Text.tsx +17 -0
  142. package/src/components/ChatItem/Typing.tsx +19 -0
  143. package/src/components/ChatItem/index.tsx +843 -0
  144. package/src/components/ChatItem/style.less +670 -0
  145. package/src/components/ChatMsg/ApplyAuth/index.tsx +30 -0
  146. package/src/components/ChatMsg/ApplyAuth/style.less +13 -0
  147. package/src/components/ChatMsg/Bar/index.tsx +208 -0
  148. package/src/components/ChatMsg/Bar/style.less +60 -0
  149. package/src/components/ChatMsg/DateOptions/index.tsx +46 -0
  150. package/src/components/ChatMsg/DateOptions/style.less +43 -0
  151. package/src/components/ChatMsg/FilterSection/index.tsx +42 -0
  152. package/src/components/ChatMsg/FilterSection/style.less +37 -0
  153. package/src/components/ChatMsg/MarkDown/index.tsx +26 -0
  154. package/src/components/ChatMsg/MarkDown/style.less +9 -0
  155. package/src/components/ChatMsg/Message/index.tsx +105 -0
  156. package/src/components/ChatMsg/Message/style.less +119 -0
  157. package/src/components/ChatMsg/MetricCard/PeriodCompareItem.tsx +29 -0
  158. package/src/components/ChatMsg/MetricCard/index.tsx +80 -0
  159. package/src/components/ChatMsg/MetricCard/style.less +126 -0
  160. package/src/components/ChatMsg/MetricTrend/MetricInfo.tsx +60 -0
  161. package/src/components/ChatMsg/MetricTrend/MetricTrendChart.tsx +235 -0
  162. package/src/components/ChatMsg/MetricTrend/MultiMetricsTrendChart.tsx +162 -0
  163. package/src/components/ChatMsg/MetricTrend/index.tsx +127 -0
  164. package/src/components/ChatMsg/MetricTrend/style.less +195 -0
  165. package/src/components/ChatMsg/NoPermissionChart/index.tsx +28 -0
  166. package/src/components/ChatMsg/NoPermissionChart/style.less +26 -0
  167. package/src/components/ChatMsg/Pie/PieChart.tsx +120 -0
  168. package/src/components/ChatMsg/Pie/index.tsx +88 -0
  169. package/src/components/ChatMsg/Pie/style.less +43 -0
  170. package/src/components/ChatMsg/Table/index.tsx +103 -0
  171. package/src/components/ChatMsg/Table/style.less +131 -0
  172. package/src/components/ChatMsg/Text/index.tsx +70 -0
  173. package/src/components/ChatMsg/Text/style.less +38 -0
  174. package/src/components/ChatMsg/WebPage/index.tsx +125 -0
  175. package/src/components/ChatMsg/index.tsx +428 -0
  176. package/src/components/ChatMsg/style.less +28 -0
  177. package/src/components/DrillDownDimensions/DimensionSection.tsx +99 -0
  178. package/src/components/DrillDownDimensions/index.tsx +76 -0
  179. package/src/components/DrillDownDimensions/style.less +64 -0
  180. package/src/components/IconFont/index.tsx +7 -0
  181. package/src/components/MetricOptions/index.tsx +75 -0
  182. package/src/components/MetricOptions/style.less +69 -0
  183. package/src/components/RecommendOptions/index.tsx +126 -0
  184. package/src/components/RecommendOptions/style.less +24 -0
  185. package/src/components/Tools/FeedbackModal.tsx +55 -0
  186. package/src/components/Tools/index.tsx +126 -0
  187. package/src/components/Tools/style.less +67 -0
  188. package/src/demo/Chat.tsx +73 -0
  189. package/src/demo/ChatDemo.tsx +14 -0
  190. package/src/demo/CopilotDemo.tsx +43 -0
  191. package/src/demo/style.module.less +19 -0
  192. package/src/hooks/index.ts +3 -0
  193. package/src/hooks/useComposing.ts +31 -0
  194. package/src/hooks/useExportByEcharts.ts +41 -0
  195. package/src/hooks/useMethodRegister.ts +25 -0
  196. package/src/index.tsx +44 -0
  197. package/src/service/axiosInstance.ts +58 -0
  198. package/src/service/index.ts +174 -0
  199. package/src/setupProxy.js +18 -0
  200. package/src/setupTests.ts +5 -0
  201. package/src/styles/global.less +52 -0
  202. package/src/styles/index.less +39 -0
  203. package/src/styles/reboot.less +14 -0
  204. package/src/styles/variables.less +80 -0
  205. package/src/typings.d.ts +179 -0
  206. package/src/utils/utils.ts +346 -0
  207. package/tsconfig.build.json +20 -0
  208. package/tsconfig.json +27 -0
@@ -0,0 +1,843 @@
1
+ import {
2
+ ChatContextType,
3
+ DateInfoType,
4
+ EntityInfoType,
5
+ FilterItemType,
6
+ MsgDataType,
7
+ ParseStateEnum,
8
+ ParseTimeCostType,
9
+ RangeValue,
10
+ SimilarQuestionType,
11
+ } from '../../common/type';
12
+ import { createContext, useEffect, useRef, useState } from 'react';
13
+ import { chatExecute, chatParse, queryData, deleteQuery, switchEntity } from '../../service';
14
+ import { PARSE_ERROR_TIP, PREFIX_CLS, SEARCH_EXCEPTION_TIP } from '../../common/constants';
15
+ import { message, Spin } from 'antd';
16
+ import IconFont from '../IconFont';
17
+ import ExpandParseTip from './ExpandParseTip';
18
+ import ParseTip from './ParseTip';
19
+ import ExecuteItem from './ExecuteItem';
20
+ import { isMobile } from '../../utils/utils';
21
+ import classNames from 'classnames';
22
+ import Tools from '../Tools';
23
+ import SqlItem from './SqlItem';
24
+ import SimilarQuestionItem from './SimilarQuestionItem';
25
+ import { AgentType } from '../../Chat/type';
26
+ import dayjs, { Dayjs } from 'dayjs';
27
+ import { exportCsvFile } from '../../utils/utils';
28
+ import { useMethodRegister } from '../../hooks';
29
+
30
+ type Props = {
31
+ msg: string;
32
+ conversationId?: number;
33
+ questionId?: number;
34
+ modelId?: number;
35
+ agentId?: number;
36
+ score?: number;
37
+ filter?: any[];
38
+ parseInfos?: ChatContextType[];
39
+ parseTimeCostValue?: ParseTimeCostType;
40
+ msgData?: MsgDataType;
41
+ triggerResize?: boolean;
42
+ isDeveloper?: boolean;
43
+ integrateSystem?: string;
44
+ executeItemNode?: React.ReactNode;
45
+ renderCustomExecuteNode?: boolean;
46
+ isSimpleMode?: boolean;
47
+ isDebugMode?: boolean;
48
+ currentAgent?: AgentType;
49
+ isLastMessage?: boolean;
50
+ onMsgDataLoaded?: (data: MsgDataType, valid: boolean, isRefresh?: boolean) => void;
51
+ onUpdateMessageScroll?: () => void;
52
+ onSendMsg?: (msg: string) => void;
53
+ };
54
+
55
+ export const ChartItemContext = createContext({
56
+ register: (...args: any[]) => {},
57
+ call: (...args: any[]) => {},
58
+ });
59
+
60
+ const ChatItem: React.FC<Props> = ({
61
+ msg,
62
+ conversationId,
63
+ questionId,
64
+ modelId,
65
+ agentId,
66
+ score,
67
+ filter,
68
+ triggerResize,
69
+ parseInfos,
70
+ parseTimeCostValue,
71
+ msgData,
72
+ isDeveloper,
73
+ integrateSystem,
74
+ executeItemNode,
75
+ renderCustomExecuteNode,
76
+ isSimpleMode,
77
+ currentAgent,
78
+ isDebugMode,
79
+ isLastMessage,
80
+ onMsgDataLoaded,
81
+ onUpdateMessageScroll,
82
+ onSendMsg,
83
+ }) => {
84
+ const [parseLoading, setParseLoading] = useState(false);
85
+ const [parseTimeCost, setParseTimeCost] = useState<ParseTimeCostType>();
86
+ const [parseInfo, setParseInfo] = useState<ChatContextType>();
87
+ const [parseInfoOptions, setParseInfoOptions] = useState<ChatContextType[]>([]);
88
+ const [preParseInfoOptions, setPreParseInfoOptions] = useState<ChatContextType[]>([]);
89
+ const [parseTip, setParseTip] = useState('');
90
+ const [executeMode, setExecuteMode] = useState(false);
91
+ const [preParseMode, setPreParseMode] = useState(false);
92
+ const [showExpandParseTip, setShowExpandParseTip] = useState(false);
93
+ const [executeLoading, setExecuteLoading] = useState(false);
94
+ const [executeTip, setExecuteTip] = useState('');
95
+ const [executeErrorMsg, setExecuteErrorMsg] = useState('');
96
+ const [data, setData] = useState<MsgDataType>();
97
+ const [entitySwitchLoading, setEntitySwitchLoading] = useState(false);
98
+ const [dimensionFilters, setDimensionFilters] = useState<FilterItemType[]>([]);
99
+ const [dateInfo, setDateInfo] = useState<DateInfoType>({} as DateInfoType);
100
+ const [entityInfo, setEntityInfo] = useState<EntityInfoType>({} as EntityInfoType);
101
+ const [dataCache, setDataCache] = useState<Record<number, { tip: string; data?: MsgDataType }>>(
102
+ {}
103
+ );
104
+ const [isParserError, setIsParseError] = useState<boolean>(false);
105
+ const [selectedDataSetIds, setSelectedDataSetIds] = useState<number[]>([]);
106
+ const [streamingSummary, setStreamingSummary] = useState<string>('');
107
+ const resetState = () => {
108
+ setParseLoading(false);
109
+ setParseTimeCost(undefined);
110
+ setParseInfo(undefined);
111
+ setParseInfoOptions([]);
112
+ setPreParseMode(false);
113
+ setShowExpandParseTip(false);
114
+ setPreParseInfoOptions([]);
115
+ setParseTip('');
116
+ setExecuteMode(false);
117
+ setDimensionFilters([]);
118
+ setData(undefined);
119
+ setExecuteErrorMsg('');
120
+ setDateInfo({} as DateInfoType);
121
+ setEntityInfo({} as EntityInfoType);
122
+ setDataCache({});
123
+ setIsParseError(false);
124
+ setSelectedDataSetIds([]);
125
+ setStreamingSummary('');
126
+ };
127
+
128
+ const prefixCls = `${PREFIX_CLS}-item`;
129
+
130
+ // 生成包含数据集ID的缓存键,确保数据集切换后使用不同的缓存
131
+ const generateCacheKey = (chatContext: any): string => {
132
+ if (!chatContext) return '';
133
+
134
+ // 使用解析ID和数据集ID组合作为缓存键
135
+ const parseId = chatContext.id || '';
136
+ const dataSetIds = chatContext.dataSetIds || [];
137
+
138
+ // 关键修复:如果chatContext中有dataSet对象,使用其ID作为缓存键的一部分
139
+ // 这样可以确保数据集对象本身变化时也能触发缓存更新
140
+ const dataSetId = chatContext.dataSet?.id || '';
141
+
142
+ // 处理空数组的情况,确保缓存键的唯一性
143
+ if (dataSetIds.length === 0 && !dataSetId) {
144
+ return `${parseId}_no_dataset`;
145
+ }
146
+
147
+ // 将数据集ID数组转换为字符串,确保顺序一致
148
+ const dataSetIdStr = dataSetIds.sort().join('_');
149
+
150
+ // 如果有dataSet对象ID,将其加入缓存键
151
+ const dataSetObjId = dataSetId ? `_${dataSetId}` : '';
152
+
153
+ return `${parseId}_${dataSetIdStr}${dataSetObjId}`;
154
+ };
155
+
156
+ const updateData = (res: Result<MsgDataType>) => {
157
+ let tip: string = '';
158
+ let data: MsgDataType | undefined = undefined;
159
+ const { queryColumns, queryResults, queryState, queryMode, response, chatContext, errorMsg } =
160
+ res.data || {};
161
+ setExecuteErrorMsg(errorMsg);
162
+ if (res.code === 400 || res.code === 401 || res.code === 412) {
163
+ tip = res.msg;
164
+ } else if (res.code !== 200) {
165
+ tip = SEARCH_EXCEPTION_TIP;
166
+ } else if (queryState !== 'SUCCESS') {
167
+ tip = response && typeof response === 'string' ? response : SEARCH_EXCEPTION_TIP;
168
+ } else if (
169
+ (queryColumns && queryColumns.length > 0 && queryResults) ||
170
+ queryMode === 'WEB_PAGE' ||
171
+ queryMode === 'WEB_SERVICE' ||
172
+ queryMode === 'PLAIN_TEXT'
173
+ ) {
174
+ data = res.data;
175
+ tip = '';
176
+ }
177
+ if (chatContext) {
178
+ // 生成包含数据集ID的缓存键,确保数据集切换后使用不同的缓存
179
+ const cacheKey = generateCacheKey(chatContext);
180
+ setDataCache({ ...dataCache, [cacheKey]: { tip, data } });
181
+ }
182
+ if (data) {
183
+ setData(data);
184
+ setExecuteTip('');
185
+ return true;
186
+ }
187
+ setExecuteTip(tip || SEARCH_EXCEPTION_TIP);
188
+ return false;
189
+ };
190
+
191
+ const onExecute = async (
192
+ parseInfoValue: ChatContextType,
193
+ parseInfos?: ChatContextType[],
194
+ isSwitchParseInfo?: boolean,
195
+ isRefresh = false
196
+ ) => {
197
+ setExecuteMode(true);
198
+ if (isSwitchParseInfo) {
199
+ setEntitySwitchLoading(true);
200
+ } else {
201
+ setExecuteLoading(true);
202
+ }
203
+ try {
204
+ // 确保使用最新的数据集ID - 优先使用组件状态中的selectedDataSetIds
205
+ const effectiveDataSetIds = selectedDataSetIds.length > 0 ? selectedDataSetIds :
206
+ (parseInfoValue.dataSetIds || (parseInfoValue.dataSet?.id ? [parseInfoValue.dataSet.id] : undefined));
207
+
208
+ // 检查是否切换了数据集 - 使用JSON.stringify进行精确比较
209
+ const currentDataSetIds = parseInfo?.dataSetIds || [];
210
+ const newDataSetIds = effectiveDataSetIds || [];
211
+ const isDataSetSwitched = JSON.stringify(currentDataSetIds.sort()) !== JSON.stringify(newDataSetIds.sort());
212
+
213
+ // 如果切换了数据集,强制清除当前数据状态,确保显示新的查询结果
214
+ if (isDataSetSwitched) {
215
+ setData(undefined);
216
+ setExecuteTip('');
217
+ }
218
+
219
+ // 创建包含正确数据集ID的parseInfo对象
220
+ const parseInfoWithCorrectDataSetIds = {
221
+ ...parseInfoValue,
222
+ dataSetIds: effectiveDataSetIds
223
+ };
224
+
225
+ const res: any = await chatExecute(msg, conversationId!, parseInfoWithCorrectDataSetIds, agentId);
226
+ const valid = updateData(res);
227
+ // 更新parseInfo状态,确保SqlItem组件能获取到最新的SQL信息
228
+ setParseInfo(parseInfoWithCorrectDataSetIds);
229
+ onMsgDataLoaded?.(
230
+ {
231
+ ...res.data,
232
+ parseInfos,
233
+ queryId: parseInfoValue.queryId,
234
+ },
235
+ valid,
236
+ isRefresh
237
+ );
238
+ } catch (e) {
239
+ const tip = SEARCH_EXCEPTION_TIP;
240
+ setExecuteTip(SEARCH_EXCEPTION_TIP);
241
+ // 使用新的缓存键生成方式
242
+ const cacheKey = generateCacheKey(parseInfoValue);
243
+ setDataCache({ ...dataCache, [cacheKey]: { tip } });
244
+ }
245
+ if (isSwitchParseInfo) {
246
+ setEntitySwitchLoading(false);
247
+ } else {
248
+ setExecuteLoading(false);
249
+ }
250
+ };
251
+
252
+ const updateDimensionFitlers = (filters: FilterItemType[]) => {
253
+ setDimensionFilters(
254
+ filters.sort((a, b) => {
255
+ if (a.name < b.name) {
256
+ return -1;
257
+ }
258
+ if (a.name > b.name) {
259
+ return 1;
260
+ }
261
+ return 0;
262
+ })
263
+ );
264
+ };
265
+
266
+ const sendMsg = async () => {
267
+ setParseLoading(true);
268
+ const parseData: any = await chatParse({
269
+ queryText: msg,
270
+ chatId: conversationId,
271
+ modelId,
272
+ agentId,
273
+ filters: filter,
274
+ dataSetIds: selectedDataSetIds.length > 0 ? selectedDataSetIds : undefined,
275
+ });
276
+ setParseLoading(false);
277
+ const { code, data } = parseData || {};
278
+ const { state, selectedParses, candidateParses, queryId, parseTimeCost, errorMsg } = data || {};
279
+ const parses = selectedParses?.concat(candidateParses || []) || [];
280
+ if (
281
+ code !== 200 ||
282
+ state === ParseStateEnum.FAILED ||
283
+ !parses.length ||
284
+ (!parses[0]?.properties?.type && !parses[0]?.queryMode)
285
+ ) {
286
+ setParseTip(state === ParseStateEnum.FAILED && errorMsg ? errorMsg : PARSE_ERROR_TIP);
287
+
288
+ setParseInfo({ queryId } as any);
289
+ return;
290
+ }
291
+ onUpdateMessageScroll?.();
292
+ const parseInfos = parses.slice(0, 5).map((item: any) => ({
293
+ ...item,
294
+ queryId,
295
+ }));
296
+ if (parseInfos.length > 1) {
297
+ setPreParseInfoOptions(parseInfos);
298
+ setShowExpandParseTip(true);
299
+ setPreParseMode(true);
300
+ }
301
+ setParseInfoOptions(parseInfos || []);
302
+ const parseInfoValue = parseInfos[0];
303
+ if (!(currentAgent?.enableFeedback === 1 && parseInfos.length > 1)) {
304
+ setParseInfo(parseInfoValue);
305
+ }
306
+ setParseTimeCost(parseTimeCost);
307
+ setEntityInfo(parseInfoValue.entityInfo || {});
308
+ updateDimensionFitlers(parseInfoValue?.dimensionFilters || []);
309
+ setDateInfo(parseInfoValue?.dateInfo);
310
+ if (parseInfos.length === 1) {
311
+ onExecute(parseInfoValue, parseInfos);
312
+ }
313
+ };
314
+
315
+ const initChatItem = (msg, msgData) => {
316
+ if (msgData) {
317
+ const parseInfoOptionsValue =
318
+ parseInfos && parseInfos.length > 0
319
+ ? parseInfos.map(item => ({ ...item, queryId: msgData.queryId }))
320
+ : [{ ...msgData.chatContext, queryId: msgData.queryId }];
321
+ const parseInfoValue = parseInfoOptionsValue[0];
322
+ setParseInfoOptions(parseInfoOptionsValue);
323
+ setParseInfo(parseInfoValue);
324
+ setParseTimeCost(parseTimeCostValue);
325
+ updateDimensionFitlers(parseInfoValue.dimensionFilters || []);
326
+ setDateInfo(parseInfoValue.dateInfo);
327
+ setExecuteMode(true);
328
+ updateData({ code: 200, data: msgData, msg: 'success' });
329
+ } else if (msg) {
330
+ sendMsg();
331
+ }
332
+ };
333
+
334
+ useEffect(() => {
335
+ if (data !== undefined || executeTip !== '' || parseLoading) {
336
+ return;
337
+ }
338
+ initChatItem(msg, msgData);
339
+ }, [msg, msgData]);
340
+
341
+ const onSwitchEntity = async (entityId: string) => {
342
+ setEntitySwitchLoading(true);
343
+ const res = await switchEntity(entityId, data?.chatContext?.modelId, conversationId || 0);
344
+ setEntitySwitchLoading(false);
345
+ setData(res.data);
346
+ const { chatContext, entityInfo } = res.data || {};
347
+ const chatContextValue = { ...(chatContext || {}), queryId: parseInfo?.queryId };
348
+ setParseInfo(chatContextValue);
349
+ setEntityInfo(entityInfo);
350
+ updateDimensionFitlers(chatContextValue?.dimensionFilters || []);
351
+ setDateInfo(chatContextValue?.dateInfo);
352
+ // 使用新的缓存键生成方式
353
+ const cacheKey = generateCacheKey(chatContextValue);
354
+ setDataCache({ ...dataCache, [cacheKey]: { tip: '', data: res.data } });
355
+ };
356
+
357
+ const onFiltersChange = (dimensionFilters: FilterItemType[]) => {
358
+ setDimensionFilters(dimensionFilters);
359
+ };
360
+
361
+ const onDateInfoChange = (dates: [Dayjs | null, Dayjs | null] | null) => {
362
+ if (dates && dates[0] && dates[1]) {
363
+ const [start, end] = dates;
364
+ setDateInfo({
365
+ ...(dateInfo || {}),
366
+ startDate: dayjs(start).format('YYYY-MM-DD'),
367
+ endDate: dayjs(end).format('YYYY-MM-DD'),
368
+ dateMode: 'BETWEEN',
369
+ unit: 0,
370
+ });
371
+ }
372
+ };
373
+
374
+ const handlePresetClick = (range: RangeValue) => {
375
+ setDateInfo({
376
+ ...(dateInfo || {}),
377
+ startDate: dayjs(range[0]).format('YYYY-MM-DD'),
378
+ endDate: dayjs(range[1]).format('YYYY-MM-DD'),
379
+ dateMode: 'BETWEEN',
380
+ unit: 0,
381
+ });
382
+ };
383
+
384
+ const onRefresh = async (parseInfoValue?: ChatContextType) => {
385
+ setEntitySwitchLoading(true);
386
+ const { dimensions, metrics, id, queryId, dataSetIds, dataSet } = parseInfoValue || parseInfo || {};
387
+ // 优先使用传递的dataSetIds参数,其次是parseInfo中的dataSetIds,最后是selectedDataSetIds状态
388
+ const effectiveDataSetIds = dataSetIds || (parseInfoValue?.dataSetIds || parseInfo?.dataSetIds) || (selectedDataSetIds.length > 0 ? selectedDataSetIds : undefined);
389
+
390
+ // 检查是否切换了数据集 - 使用JSON.stringify进行精确比较
391
+ const isDataSetSwitched = effectiveDataSetIds &&
392
+ parseInfo?.dataSetIds &&
393
+ JSON.stringify(effectiveDataSetIds.sort()) !== JSON.stringify((parseInfo.dataSetIds || []).sort());
394
+
395
+ // 不再使用regenerateSQL标志,仅根据数据集切换情况决定是否需要重新解析
396
+ if (isDataSetSwitched || (parseInfoValue !== undefined && parseInfoValue !== parseInfo)) {
397
+ // 数据集切换时,清除所有相关缓存
398
+ const newDataCache = { ...dataCache };
399
+ Object.keys(newDataCache).forEach(key => {
400
+ newDataCache[key] = { tip: '', data: undefined };
401
+ });
402
+ setDataCache(newDataCache);
403
+
404
+ // 强制清除当前数据状态,确保重新执行查询
405
+ setData(undefined);
406
+ setExecuteTip('');
407
+
408
+ // 数据集切换时,重新调用chatParse获取新的解析结果
409
+ const { code, data }: any = await chatParse({
410
+ queryText: msg,
411
+ chatId: conversationId,
412
+ modelId,
413
+ agentId,
414
+ filters: filter,
415
+ parseId: id,
416
+ queryId,
417
+ parseInfo: parseInfoValue || parseInfo,
418
+ dataSetIds: effectiveDataSetIds
419
+ });
420
+ setEntitySwitchLoading(false);
421
+ if (code === 200) {
422
+ setParseTimeCost(data.parseTimeCost);
423
+ const newParseInfo = data.selectedParses[0];
424
+ newParseInfo.queryId = data.queryId;
425
+ // 确保新的解析结果包含正确的数据集ID
426
+ newParseInfo.dataSetIds = effectiveDataSetIds;
427
+
428
+ // 重要修复:确保newParseInfo有正确的dataSet信息
429
+ // 如果API没有返回dataSet信息,但知道数据集ID,需要构建dataSet对象
430
+ if (!newParseInfo.dataSet && effectiveDataSetIds && effectiveDataSetIds.length > 0) {
431
+ // 尝试从当前parseInfo中获取数据集名称,或者使用ID作为名称
432
+ const currentDataSetName = parseInfo?.dataSet?.name ||
433
+ (parseInfoOptions.find(opt => {
434
+ const optDataSetId = opt.dataSet?.id || (opt.dataSetIds && opt.dataSetIds[0]);
435
+ return optDataSetId && effectiveDataSetIds.includes(optDataSetId);
436
+ })?.dataSet?.name) ||
437
+ `数据集${effectiveDataSetIds[0]}`;
438
+
439
+ newParseInfo.dataSet = {
440
+ id: effectiveDataSetIds[0],
441
+ name: currentDataSetName
442
+ };
443
+ }
444
+
445
+ // 重要修复:基于数据集ID来匹配和更新解析选项,而不是基于解析选项的id
446
+ // 这样可以确保数据集切换后正确替换对应数据集的解析信息
447
+ const updatedParseInfoOptions = parseInfoOptions.map(option => {
448
+ // 检查当前选项的数据集ID是否与新的解析结果的数据集ID匹配
449
+ const optionDataSetId = option.dataSet?.id || (option.dataSetIds && option.dataSetIds[0]);
450
+ const newParseInfoDataSetId = newParseInfo.dataSet?.id || (newParseInfo.dataSetIds && newParseInfo.dataSetIds[0]);
451
+
452
+ if (optionDataSetId && newParseInfoDataSetId && optionDataSetId === newParseInfoDataSetId) {
453
+ return newParseInfo;
454
+ }
455
+ return option;
456
+ });
457
+
458
+ // 如果新的解析信息的数据集不在原有选项中,则添加它
459
+ const newParseInfoDataSetId = newParseInfo.dataSet?.id || (newParseInfo.dataSetIds && newParseInfo.dataSetIds[0]);
460
+ const existingDataSetOption = updatedParseInfoOptions.find(option => {
461
+ const optionDataSetId = option.dataSet?.id || (option.dataSetIds && option.dataSetIds[0]);
462
+ return optionDataSetId && newParseInfoDataSetId && optionDataSetId === newParseInfoDataSetId;
463
+ });
464
+
465
+ if (!existingDataSetOption) {
466
+ updatedParseInfoOptions.push(newParseInfo);
467
+ }
468
+
469
+ setParseInfoOptions(updatedParseInfoOptions);
470
+ setParseInfo(newParseInfo);
471
+ updateDimensionFitlers(newParseInfo.dimensionFilters || []);
472
+ setDateInfo(newParseInfo.dateInfo);
473
+ if (newParseInfo.entityInfo) {
474
+ setEntityInfo(newParseInfo.entityInfo);
475
+ }
476
+ // 清除旧缓存,确保使用新的查询结果
477
+ const cacheKey = generateCacheKey(newParseInfo);
478
+ setDataCache({ ...dataCache, [cacheKey]: { tip: '', data: undefined } });
479
+ // 确保传递正确的数据集ID给onExecute
480
+ const parseInfoWithDataSetIds = {
481
+ ...newParseInfo,
482
+ dataSetIds: effectiveDataSetIds
483
+ };
484
+ onExecute(parseInfoWithDataSetIds, updatedParseInfoOptions, true, true);
485
+ }
486
+ } else {
487
+ // 非数据集切换时,调用queryData查询数据
488
+ const chatContextValue = {
489
+ dimensions,
490
+ metrics,
491
+ dateInfo,
492
+ dimensionFilters,
493
+ parseId: id,
494
+ queryId,
495
+ dataSetIds: effectiveDataSetIds,
496
+ // 确保传递正确的数据集信息 - 使用parseInfo中的dataSet或保持undefined
497
+ dataSet: parseInfoValue?.dataSet || parseInfo?.dataSet
498
+ };
499
+ const res: any = await queryData(chatContextValue);
500
+ setEntitySwitchLoading(false);
501
+ if (res.code === 200) {
502
+ const resChatContext = res.data?.chatContext;
503
+ // 保留原始的properties.CONTEXT信息,确保SqlItem组件能正确显示Schema映射
504
+ const contextValue = {
505
+ ...(resChatContext || chatContextValue),
506
+ queryId,
507
+ properties: {
508
+ ...(parseInfoValue?.properties || parseInfo?.properties || {}),
509
+ // 确保CONTEXT属性被正确保留
510
+ CONTEXT: parseInfoValue?.properties?.CONTEXT || parseInfo?.properties?.CONTEXT
511
+ }
512
+ };
513
+ const dataValue = {
514
+ ...res.data,
515
+ chatContext: contextValue,
516
+ parseInfos: parseInfoOptions,
517
+ queryId,
518
+ };
519
+ onMsgDataLoaded?.(dataValue, true, true);
520
+ setData(dataValue);
521
+ setParseInfo(contextValue);
522
+ // 使用新的缓存键生成方式
523
+ const cacheKey = generateCacheKey(contextValue);
524
+ setDataCache({ ...dataCache, [cacheKey]: { tip: '', data: dataValue } });
525
+ }
526
+ }
527
+ };
528
+
529
+ const deleteQueryInfo = async (queryId: number) => {
530
+ const { code }: any = await deleteQuery(queryId);
531
+ if (code === 200) {
532
+ resetState();
533
+ initChatItem(msg, undefined);
534
+ }
535
+ };
536
+
537
+ const onSelectParseInfo = async (parseInfoValue: ChatContextType) => {
538
+ setParseInfo(parseInfoValue);
539
+ updateDimensionFitlers(parseInfoValue.dimensionFilters || []);
540
+ setDateInfo(parseInfoValue.dateInfo);
541
+ if (parseInfoValue.entityInfo) {
542
+ setEntityInfo(parseInfoValue.entityInfo);
543
+ }
544
+ // 设置选择的数据集ID
545
+ const effectiveDataSetIds = parseInfoValue.dataSet?.id ?
546
+ [parseInfoValue.dataSet.id] :
547
+ (parseInfoValue.dataSetIds || selectedDataSetIds);
548
+
549
+ if (effectiveDataSetIds && effectiveDataSetIds.length > 0) {
550
+ setSelectedDataSetIds(effectiveDataSetIds);
551
+ }
552
+
553
+ // 检查是否切换了数据集 - 使用JSON.stringify进行精确比较
554
+ const currentDataSetIds = parseInfo?.dataSetIds || [];
555
+ const newDataSetIds = effectiveDataSetIds || [];
556
+ const isDataSetSwitched = JSON.stringify(currentDataSetIds.sort()) !== JSON.stringify(newDataSetIds.sort());
557
+
558
+ // 如果切换了数据集,清除所有相关缓存
559
+ if (isDataSetSwitched) {
560
+ const newDataCache = { ...dataCache };
561
+ Object.keys(newDataCache).forEach(key => {
562
+ newDataCache[key] = { tip: '', data: undefined };
563
+ });
564
+ setDataCache(newDataCache);
565
+ // 强制清除当前数据状态,确保重新执行查询
566
+ setData(undefined);
567
+ setExecuteTip('');
568
+ }
569
+
570
+ // 使用新的缓存键生成方式
571
+ const cacheKey = generateCacheKey(parseInfoValue);
572
+ if (dataCache[cacheKey] && !isDataSetSwitched) {
573
+ const { tip, data } = dataCache[cacheKey];
574
+ setExecuteTip(tip);
575
+ setData(data);
576
+ } else {
577
+ // 如果没有缓存数据或者切换了数据集,强制重新执行查询
578
+ const parseInfoWithDataSetIds = {
579
+ ...parseInfoValue,
580
+ dataSetIds: effectiveDataSetIds
581
+ };
582
+ // 重要修复:无论是否切换数据集,都传递所有的解析选项,确保下拉列表显示所有可用选项
583
+ const executeParseOptions = parseInfoOptions;
584
+ onExecute(parseInfoWithDataSetIds, executeParseOptions, true);
585
+ }
586
+ };
587
+
588
+ const onExpandSelectParseInfo = async (parseInfoValue: ChatContextType) => {
589
+ setParseInfo(parseInfoValue);
590
+ setPreParseMode(false);
591
+ // 设置选择的数据集ID
592
+ const effectiveDataSetIds = parseInfoValue.dataSet?.id ?
593
+ [parseInfoValue.dataSet.id] :
594
+ (parseInfoValue.dataSetIds || selectedDataSetIds);
595
+
596
+ if (effectiveDataSetIds && effectiveDataSetIds.length > 0) {
597
+ setSelectedDataSetIds(effectiveDataSetIds);
598
+ }
599
+
600
+ const { id: parseId, queryId } = parseInfoValue;
601
+ setParseLoading(true);
602
+ const { code, data }: any = await chatParse({
603
+ queryText: msg,
604
+ chatId: conversationId,
605
+ modelId,
606
+ agentId,
607
+ filters: filter,
608
+ parseId,
609
+ queryId,
610
+ parseInfo: parseInfoValue,
611
+ dataSetIds: effectiveDataSetIds,
612
+ });
613
+ setParseLoading(false);
614
+ if (code === 200) {
615
+ setParseTimeCost(data.parseTimeCost);
616
+ const parseInfo = data.selectedParses[0];
617
+ parseInfo.queryId = data.queryId;
618
+ // 确保新的解析结果包含正确的数据集ID
619
+ parseInfo.dataSetIds = effectiveDataSetIds;
620
+
621
+ // 重要修复:确保parseInfo有正确的dataSet信息
622
+ // 如果API没有返回dataSet信息,但知道数据集ID,需要构建dataSet对象
623
+ if (!parseInfo.dataSet && effectiveDataSetIds && effectiveDataSetIds.length > 0) {
624
+ // 尝试从当前parseInfo中获取数据集名称,或者使用ID作为名称
625
+ const currentDataSetName = parseInfo?.dataSet?.name ||
626
+ (parseInfoOptions.find(opt => {
627
+ const optDataSetId = opt.dataSet?.id || (opt.dataSetIds && opt.dataSetIds[0]);
628
+ return optDataSetId && effectiveDataSetIds.includes(optDataSetId);
629
+ })?.dataSet?.name) ||
630
+ `数据集${effectiveDataSetIds[0]}`;
631
+
632
+ parseInfo.dataSet = {
633
+ id: effectiveDataSetIds[0],
634
+ name: currentDataSetName
635
+ };
636
+ }
637
+
638
+ // 重要修复:基于数据集ID来匹配和更新解析选项,而不是基于解析选项的id
639
+ // 这样可以确保数据集切换后正确替换对应数据集的解析信息
640
+ const updatedParseInfoOptions = parseInfoOptions.map(option => {
641
+ // 检查当前选项的数据集ID是否与新的解析结果的数据集ID匹配
642
+ const optionDataSetId = option.dataSet?.id || (option.dataSetIds && option.dataSetIds[0]);
643
+ const newParseInfoDataSetId = parseInfo.dataSet?.id || (parseInfo.dataSetIds && parseInfo.dataSetIds[0]);
644
+
645
+ if (optionDataSetId && newParseInfoDataSetId && optionDataSetId === newParseInfoDataSetId) {
646
+ return parseInfo;
647
+ }
648
+ return option;
649
+ });
650
+
651
+ // 如果新的解析信息的数据集不在原有选项中,则添加它
652
+ const newParseInfoDataSetId = parseInfo.dataSet?.id || (parseInfo.dataSetIds && parseInfo.dataSetIds[0]);
653
+ const existingDataSetOption = updatedParseInfoOptions.find(option => {
654
+ const optionDataSetId = option.dataSet?.id || (option.dataSetIds && option.dataSetIds[0]);
655
+ return optionDataSetId && newParseInfoDataSetId && optionDataSetId === newParseInfoDataSetId;
656
+ });
657
+
658
+ if (!existingDataSetOption) {
659
+ updatedParseInfoOptions.push(parseInfo);
660
+ }
661
+
662
+ setParseInfoOptions(updatedParseInfoOptions);
663
+ setParseInfo(parseInfo);
664
+ updateDimensionFitlers(parseInfo.dimensionFilters || []);
665
+ setDateInfo(parseInfo.dateInfo);
666
+ if (parseInfo.entityInfo) {
667
+ setEntityInfo(parseInfo.entityInfo);
668
+ }
669
+ // 确保传递正确的数据集ID给onExecute
670
+ const parseInfoWithDataSetIds = {
671
+ ...parseInfo,
672
+ dataSetIds: effectiveDataSetIds
673
+ };
674
+ onExecute(parseInfoWithDataSetIds, updatedParseInfoOptions, true, true);
675
+ }
676
+ };
677
+
678
+ const onExportData = () => {
679
+ const { queryColumns, queryResults } = data || {};
680
+ if (!!queryResults && !!queryColumns) {
681
+ const exportData = queryResults.map(item => {
682
+ return queryColumns.reduce((result, column) => {
683
+ result[column.name || column.nameEn] = item[column.nameEn];
684
+ return result;
685
+ }, {});
686
+ });
687
+ exportCsvFile(exportData);
688
+ }
689
+ };
690
+
691
+ const onSelectQuestion = (question: SimilarQuestionType) => {
692
+ onSendMsg?.(question.queryText);
693
+ };
694
+
695
+ const contentClass = classNames(`${prefixCls}-content`, {
696
+ [`${prefixCls}-content-mobile`]: isMobile,
697
+ });
698
+
699
+ const { llmReq, llmResp } = parseInfo?.properties?.CONTEXT || {};
700
+
701
+ const { register, call } = useMethodRegister(() => message.error('该条消息暂不支持该操作'));
702
+
703
+ let actualQueryText=parseInfo?.properties?.CONTEXT?.queryText // 2025-05-27 增加判空,防止出现上下文没有 queryText 的情况
704
+ actualQueryText=actualQueryText==null?msg:actualQueryText
705
+ return (
706
+ <ChartItemContext.Provider value={{ register, call }}>
707
+ <div className={prefixCls}>
708
+ {!isMobile && <IconFont type="icon-zhinengsuanfa" className={`${prefixCls}-avatar`} />}
709
+ <div className={isMobile ? `${prefixCls}-mobile-msg-card` : ''}>
710
+ <div className={`${prefixCls}-time`}>
711
+ {parseTimeCost?.parseStartTime
712
+ ? dayjs(parseTimeCost.parseStartTime).format('M月D日 HH:mm')
713
+ : ''}
714
+ </div>
715
+ <div className={contentClass}>
716
+ <>
717
+ {currentAgent?.enableFeedback === 1 && !questionId && showExpandParseTip && (
718
+ <div style={{ marginBottom: 10 }}>
719
+ <ExpandParseTip
720
+ isSimpleMode={isSimpleMode}
721
+ parseInfoOptions={preParseInfoOptions}
722
+ agentId={agentId}
723
+ integrateSystem={integrateSystem}
724
+ parseTimeCost={parseTimeCost?.parseTime}
725
+ isDeveloper={isDeveloper}
726
+ onSelectParseInfo={onExpandSelectParseInfo}
727
+ onSwitchEntity={onSwitchEntity}
728
+ onFiltersChange={onFiltersChange}
729
+ onDateInfoChange={onDateInfoChange}
730
+ onRefresh={onRefresh}
731
+ handlePresetClick={handlePresetClick}
732
+ setSelectedDataSetIds={setSelectedDataSetIds}
733
+ />
734
+ </div>
735
+ )}
736
+
737
+ {!preParseMode && (
738
+ <ParseTip
739
+ isSimpleMode={isSimpleMode}
740
+ parseLoading={parseLoading}
741
+ parseInfoOptions={parseInfoOptions}
742
+ parseTip={parseTip}
743
+ currentParseInfo={parseInfo}
744
+ agentId={agentId}
745
+ dimensionFilters={dimensionFilters}
746
+ dateInfo={dateInfo}
747
+ entityInfo={entityInfo}
748
+ integrateSystem={integrateSystem}
749
+ parseTimeCost={parseTimeCost?.parseTime}
750
+ isDeveloper={isDeveloper}
751
+ onSelectParseInfo={onSelectParseInfo}
752
+ onSwitchEntity={onSwitchEntity}
753
+ onFiltersChange={onFiltersChange}
754
+ onDateInfoChange={onDateInfoChange}
755
+ onRefresh={(parseInfo) => {
756
+ onRefresh(parseInfo);
757
+ }}
758
+ handlePresetClick={handlePresetClick}
759
+ setSelectedDataSetIds={setSelectedDataSetIds}
760
+ />
761
+ )}
762
+ </>
763
+
764
+ {executeMode && (
765
+ <Spin spinning={entitySwitchLoading}>
766
+ <div style={{ minHeight: 50 }}>
767
+ {!isMobile &&
768
+ parseInfo?.sqlInfo &&
769
+ isDeveloper &&
770
+ isDebugMode &&
771
+ !isSimpleMode && (
772
+ <SqlItem
773
+ agentId={agentId}
774
+ queryId={parseInfo.queryId}
775
+ question={actualQueryText}
776
+ llmReq={llmReq}
777
+ llmResp={llmResp}
778
+ integrateSystem={integrateSystem}
779
+ queryMode={parseInfo.queryMode}
780
+ sqlInfo={parseInfo.sqlInfo}
781
+ sqlTimeCost={parseTimeCost?.sqlTime}
782
+ executeErrorMsg={executeErrorMsg}
783
+ dataSetIds={parseInfo.dataSetIds} // 添加dataSetIds属性
784
+ />
785
+ )}
786
+ <ExecuteItem
787
+ isSimpleMode={isSimpleMode}
788
+ queryId={parseInfo?.queryId}
789
+ parseId={parseInfo?.id}
790
+ question={actualQueryText}
791
+ queryMode={parseInfo?.queryMode}
792
+ executeLoading={executeLoading}
793
+ executeTip={executeTip}
794
+ executeErrorMsg={executeErrorMsg}
795
+ chartIndex={0}
796
+ data={data}
797
+ triggerResize={triggerResize}
798
+ executeItemNode={executeItemNode}
799
+ isDeveloper={isDeveloper}
800
+ renderCustomExecuteNode={renderCustomExecuteNode}
801
+ enableStreamingSummary={!data?.textSummary}
802
+ onStreamingSummaryUpdate={setStreamingSummary}
803
+ agentId={agentId}
804
+ dataSetIds={parseInfo?.dataSetIds}
805
+ />
806
+ </div>
807
+ </Spin>
808
+ )}
809
+ {executeMode &&
810
+ !executeLoading &&
811
+ !isSimpleMode &&
812
+ parseInfo?.queryMode !== 'PLAIN_TEXT' && (
813
+ <SimilarQuestionItem
814
+ queryId={parseInfo?.queryId}
815
+ defaultExpanded={parseTip !== '' || executeTip !== ''}
816
+ similarQueries={data?.similarQueries}
817
+ onSelectQuestion={onSelectQuestion}
818
+ />
819
+ )}
820
+ </div>
821
+ {(parseTip !== '' || (executeMode && !executeLoading)) &&
822
+ parseInfo?.queryMode !== 'PLAIN_TEXT' && (
823
+ <Tools
824
+ isLastMessage={isLastMessage}
825
+ queryId={parseInfo?.queryId || 0}
826
+ scoreValue={score}
827
+ isParserError={isParserError}
828
+ onExportData={() => {
829
+ onExportData();
830
+ }}
831
+ isSimpleMode={isSimpleMode}
832
+ onReExecute={queryId => {
833
+ deleteQueryInfo(queryId);
834
+ }}
835
+ />
836
+ )}
837
+ </div>
838
+ </div>
839
+ </ChartItemContext.Provider>
840
+ );
841
+ };
842
+
843
+ export default ChatItem;