neo-cmp-cli 1.8.3 → 1.8.6

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 (189) hide show
  1. package/package.json +3 -3
  2. package/src/utils/cmpUtils/createCmpByTemplate.js +1 -1
  3. package/src/utils/projectUtils/createCmpProjectByTemplate.js +1 -1
  4. package/template/antd-custom-cmp-template/.prettierrc.js +12 -0
  5. package/template/antd-custom-cmp-template/README.md +153 -0
  6. package/template/antd-custom-cmp-template/commitlint.config.js +59 -0
  7. package/template/antd-custom-cmp-template/neo.config.js +144 -0
  8. package/template/antd-custom-cmp-template/package.json +60 -0
  9. package/template/antd-custom-cmp-template/public/css/base.css +283 -0
  10. package/template/antd-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  11. package/template/antd-custom-cmp-template/public/template.html +13 -0
  12. package/template/antd-custom-cmp-template/src/assets/css/common.scss +127 -0
  13. package/template/antd-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  14. package/template/antd-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  15. package/template/antd-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  16. package/template/antd-custom-cmp-template/src/assets/img/favicon.png +0 -0
  17. package/template/antd-custom-cmp-template/src/components/dataDashboard/README.md +39 -0
  18. package/template/antd-custom-cmp-template/src/components/dataDashboard/index.tsx +462 -0
  19. package/template/antd-custom-cmp-template/src/components/dataDashboard/model.ts +75 -0
  20. package/template/antd-custom-cmp-template/src/components/dataDashboard/style.scss +1667 -0
  21. package/template/antd-custom-cmp-template/src/components/infoCard/index.tsx +87 -0
  22. package/template/antd-custom-cmp-template/src/components/infoCard/model.ts +80 -0
  23. package/template/antd-custom-cmp-template/src/components/infoCard/style.scss +105 -0
  24. package/template/antd-custom-cmp-template/tsconfig.json +68 -0
  25. package/template/develop/neo-custom-cmp-template/.prettierrc.js +12 -0
  26. package/template/develop/neo-custom-cmp-template/README.md +48 -0
  27. package/template/develop/neo-custom-cmp-template/commitlint.config.js +59 -0
  28. package/template/develop/neo-custom-cmp-template/docs/README.md +13 -0
  29. package/template/develop/neo-custom-cmp-template/neo.config.js +121 -0
  30. package/template/develop/neo-custom-cmp-template/package.json +63 -0
  31. package/template/develop/neo-custom-cmp-template/public/css/base.css +283 -0
  32. package/template/develop/neo-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  33. package/template/develop/neo-custom-cmp-template/public/template.html +13 -0
  34. package/template/develop/neo-custom-cmp-template/src/assets/css/common.scss +127 -0
  35. package/template/develop/neo-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  36. package/template/develop/neo-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  37. package/template/develop/neo-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  38. package/template/develop/neo-custom-cmp-template/src/assets/img/favicon.png +0 -0
  39. package/template/develop/neo-custom-cmp-template/src/assets/img/table.svg +1 -0
  40. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/README.md +65 -0
  41. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/index.tsx +180 -0
  42. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/model.ts +50 -0
  43. package/template/develop/neo-custom-cmp-template/src/components/contactCardList/style.scss +260 -0
  44. package/template/develop/neo-custom-cmp-template/src/components/contactForm/README.md +94 -0
  45. package/template/develop/neo-custom-cmp-template/src/components/contactForm/index.tsx +251 -0
  46. package/template/develop/neo-custom-cmp-template/src/components/contactForm/model.ts +56 -0
  47. package/template/develop/neo-custom-cmp-template/src/components/contactForm/style.scss +120 -0
  48. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/README.md +115 -0
  49. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/index.tsx +304 -0
  50. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/model.ts +87 -0
  51. package/template/develop/neo-custom-cmp-template/src/components/neoEntityGrid/style.scss +127 -0
  52. package/template/develop/neo-custom-cmp-template/src/utils/axiosFetcher.ts +29 -0
  53. package/template/develop/neo-custom-cmp-template/src/utils/queryObjectData.ts +39 -0
  54. package/template/develop/neo-custom-cmp-template/src/utils/xobjects.ts +203 -0
  55. package/template/develop/neo-custom-cmp-template/tsconfig.json +68 -0
  56. package/template/echarts-custom-cmp-template/.prettierrc.js +12 -0
  57. package/template/echarts-custom-cmp-template/README.md +198 -0
  58. package/template/echarts-custom-cmp-template/commitlint.config.js +59 -0
  59. package/template/echarts-custom-cmp-template/neo.config.js +140 -0
  60. package/template/echarts-custom-cmp-template/package.json +61 -0
  61. package/template/echarts-custom-cmp-template/public/css/base.css +283 -0
  62. package/template/echarts-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  63. package/template/echarts-custom-cmp-template/public/template.html +13 -0
  64. package/template/echarts-custom-cmp-template/src/assets/css/common.scss +127 -0
  65. package/template/echarts-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  66. package/template/echarts-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  67. package/template/echarts-custom-cmp-template/src/assets/img/chart.svg +1 -0
  68. package/template/echarts-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  69. package/template/echarts-custom-cmp-template/src/assets/img/favicon.png +0 -0
  70. package/template/echarts-custom-cmp-template/src/components/chartWidget/README.md +186 -0
  71. package/template/echarts-custom-cmp-template/src/components/chartWidget/index.tsx +724 -0
  72. package/template/echarts-custom-cmp-template/src/components/chartWidget/model.ts +151 -0
  73. package/template/echarts-custom-cmp-template/src/components/chartWidget/style.scss +209 -0
  74. package/template/echarts-custom-cmp-template/src/components/mapWidget/README.md +125 -0
  75. package/template/echarts-custom-cmp-template/src/components/mapWidget/USAGE.md +190 -0
  76. package/template/echarts-custom-cmp-template/src/components/mapWidget/index.tsx +385 -0
  77. package/template/echarts-custom-cmp-template/src/components/mapWidget/model.ts +107 -0
  78. package/template/echarts-custom-cmp-template/src/components/mapWidget/style.scss +192 -0
  79. package/template/echarts-custom-cmp-template/src/utils/url.ts +82 -0
  80. package/template/echarts-custom-cmp-template/tsconfig.json +68 -0
  81. package/template/empty-cmp/index.tsx +58 -0
  82. package/template/empty-cmp/model.ts +79 -0
  83. package/template/empty-cmp/style.scss +72 -0
  84. package/template/empty-custom-cmp-template/.prettierrc.js +12 -0
  85. package/template/empty-custom-cmp-template/README.md +154 -0
  86. package/template/empty-custom-cmp-template/commitlint.config.js +59 -0
  87. package/template/empty-custom-cmp-template/neo.config.js +138 -0
  88. package/template/empty-custom-cmp-template/package.json +58 -0
  89. package/template/empty-custom-cmp-template/public/css/base.css +283 -0
  90. package/template/empty-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  91. package/template/empty-custom-cmp-template/public/template.html +13 -0
  92. package/template/empty-custom-cmp-template/src/assets/css/common.scss +127 -0
  93. package/template/empty-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  94. package/template/empty-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  95. package/template/empty-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  96. package/template/empty-custom-cmp-template/src/assets/img/favicon.png +0 -0
  97. package/template/empty-custom-cmp-template/src/assets/img/map.svg +1 -0
  98. package/template/empty-custom-cmp-template/src/components/README.md +3 -0
  99. package/template/empty-custom-cmp-template/tsconfig.json +68 -0
  100. package/template/neo-custom-cmp-template/.prettierrc.js +12 -0
  101. package/template/neo-custom-cmp-template/README.md +155 -0
  102. package/template/neo-custom-cmp-template/commitlint.config.js +59 -0
  103. package/template/neo-custom-cmp-template/docs/README.md +244 -0
  104. package/template/neo-custom-cmp-template/neo.config.js +140 -0
  105. package/template/neo-custom-cmp-template/package.json +66 -0
  106. package/template/neo-custom-cmp-template/public/css/base.css +283 -0
  107. package/template/neo-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  108. package/template/neo-custom-cmp-template/public/template.html +13 -0
  109. package/template/neo-custom-cmp-template/src/assets/css/common.scss +127 -0
  110. package/template/neo-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  111. package/template/neo-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  112. package/template/neo-custom-cmp-template/src/assets/img/card-list.svg +1 -0
  113. package/template/neo-custom-cmp-template/src/assets/img/contact-form.svg +1 -0
  114. package/template/neo-custom-cmp-template/src/assets/img/custom-form.svg +1 -0
  115. package/template/neo-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  116. package/template/neo-custom-cmp-template/src/assets/img/data-list.svg +1 -0
  117. package/template/neo-custom-cmp-template/src/assets/img/detail.svg +1 -0
  118. package/template/neo-custom-cmp-template/src/assets/img/table.svg +1 -0
  119. package/template/neo-custom-cmp-template/src/components/entityCardList/README.md +61 -0
  120. package/template/neo-custom-cmp-template/src/components/entityCardList/index.tsx +202 -0
  121. package/template/neo-custom-cmp-template/src/components/entityCardList/model.ts +74 -0
  122. package/template/neo-custom-cmp-template/src/components/entityCardList/style.scss +260 -0
  123. package/template/neo-custom-cmp-template/src/components/entityDetail/README.md +176 -0
  124. package/template/neo-custom-cmp-template/src/components/entityDetail/index.tsx +334 -0
  125. package/template/neo-custom-cmp-template/src/components/entityDetail/model.ts +123 -0
  126. package/template/neo-custom-cmp-template/src/components/entityDetail/style.scss +292 -0
  127. package/template/neo-custom-cmp-template/src/components/entityForm/README.md +176 -0
  128. package/template/neo-custom-cmp-template/src/components/entityForm/index.tsx +615 -0
  129. package/template/neo-custom-cmp-template/src/components/entityForm/model.ts +107 -0
  130. package/template/neo-custom-cmp-template/src/components/entityForm/style.scss +370 -0
  131. package/template/neo-custom-cmp-template/src/components/entityTable/README.md +92 -0
  132. package/template/neo-custom-cmp-template/src/components/entityTable/index.tsx +784 -0
  133. package/template/neo-custom-cmp-template/src/components/entityTable/model.ts +134 -0
  134. package/template/neo-custom-cmp-template/src/components/entityTable/style.scss +304 -0
  135. package/template/neo-custom-cmp-template/src/utils/axiosFetcher.ts +37 -0
  136. package/template/neo-custom-cmp-template/src/utils/queryObjectData.ts +76 -0
  137. package/template/neo-custom-cmp-template/src/utils/xobjects.ts +162 -0
  138. package/template/neo-custom-cmp-template/tsconfig.json +49 -0
  139. package/template/react-custom-cmp-template/.prettierrc.js +12 -0
  140. package/template/react-custom-cmp-template/README.md +154 -0
  141. package/template/react-custom-cmp-template/commitlint.config.js +59 -0
  142. package/template/react-custom-cmp-template/neo.config.js +137 -0
  143. package/template/react-custom-cmp-template/package.json +57 -0
  144. package/template/react-custom-cmp-template/public/css/base.css +283 -0
  145. package/template/react-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  146. package/template/react-custom-cmp-template/public/template.html +13 -0
  147. package/template/react-custom-cmp-template/src/assets/css/common.scss +127 -0
  148. package/template/react-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  149. package/template/react-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  150. package/template/react-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  151. package/template/react-custom-cmp-template/src/assets/img/favicon.png +0 -0
  152. package/template/react-custom-cmp-template/src/components/infoCard/index.jsx +45 -0
  153. package/template/react-custom-cmp-template/src/components/infoCard/model.js +81 -0
  154. package/template/react-custom-cmp-template/src/components/infoCard/style.scss +67 -0
  155. package/template/react-ts-custom-cmp-template/.prettierrc.js +12 -0
  156. package/template/react-ts-custom-cmp-template/README.md +154 -0
  157. package/template/react-ts-custom-cmp-template/commitlint.config.js +59 -0
  158. package/template/react-ts-custom-cmp-template/neo.config.js +138 -0
  159. package/template/react-ts-custom-cmp-template/package.json +59 -0
  160. package/template/react-ts-custom-cmp-template/public/css/base.css +283 -0
  161. package/template/react-ts-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  162. package/template/react-ts-custom-cmp-template/public/template.html +13 -0
  163. package/template/react-ts-custom-cmp-template/src/assets/css/common.scss +127 -0
  164. package/template/react-ts-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  165. package/template/react-ts-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  166. package/template/react-ts-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  167. package/template/react-ts-custom-cmp-template/src/assets/img/favicon.png +0 -0
  168. package/template/react-ts-custom-cmp-template/src/assets/img/map.svg +1 -0
  169. package/template/react-ts-custom-cmp-template/src/components/listWidget/README.md +2 -0
  170. package/template/react-ts-custom-cmp-template/src/components/listWidget/index.tsx +208 -0
  171. package/template/react-ts-custom-cmp-template/src/components/listWidget/model.ts +92 -0
  172. package/template/react-ts-custom-cmp-template/src/components/listWidget/style.scss +350 -0
  173. package/template/react-ts-custom-cmp-template/tsconfig.json +68 -0
  174. package/template/vue2-custom-cmp-template/.prettierrc.js +12 -0
  175. package/template/vue2-custom-cmp-template/README.md +154 -0
  176. package/template/vue2-custom-cmp-template/commitlint.config.js +59 -0
  177. package/template/vue2-custom-cmp-template/neo.config.js +146 -0
  178. package/template/vue2-custom-cmp-template/package.json +59 -0
  179. package/template/vue2-custom-cmp-template/public/css/base.css +283 -0
  180. package/template/vue2-custom-cmp-template/public/scripts/app/bluebird.js +6679 -0
  181. package/template/vue2-custom-cmp-template/public/template.html +13 -0
  182. package/template/vue2-custom-cmp-template/src/assets/css/common.scss +126 -0
  183. package/template/vue2-custom-cmp-template/src/assets/css/mixin.scss +47 -0
  184. package/template/vue2-custom-cmp-template/src/assets/img/NeoCRM.jpg +0 -0
  185. package/template/vue2-custom-cmp-template/src/assets/img/custom-widget.svg +1 -0
  186. package/template/vue2-custom-cmp-template/src/assets/img/favicon.png +0 -0
  187. package/template/vue2-custom-cmp-template/src/components/vueInfoCard/index.vue +131 -0
  188. package/template/vue2-custom-cmp-template/src/components/vueInfoCard/model.js +81 -0
  189. package/test/deprecate-versions.js +1 -1
@@ -0,0 +1,724 @@
1
+ import * as React from 'react';
2
+ import * as echarts from 'echarts';
3
+ import './style.scss';
4
+
5
+ /**
6
+ * 图表组件属性接口
7
+ * 定义了图表组件接收的所有配置参数
8
+ */
9
+ interface ChartWidgetProps {
10
+ /** 图表类型:line(折线图)、bar(柱状图)、pie(饼图)、scatter(散点图)、radar(雷达图)、gauge(仪表盘)、funnel(漏斗图)、sankey(桑基图) */
11
+ chartType: string;
12
+ /** 图表主标题 */
13
+ title: string;
14
+ /** 图表副标题 */
15
+ subtitle: string;
16
+ /** 图表宽度(像素) */
17
+ width: number;
18
+ /** 图表高度(像素) */
19
+ height: number;
20
+ /** 图表主题:default(默认)、dark(深色)、light(明亮)、business(商务) */
21
+ theme: string;
22
+ /** 是否显示图例 */
23
+ showLegend: boolean;
24
+ /** 是否显示提示框 */
25
+ showTooltip: boolean;
26
+ /** 是否显示数据缩放控件 */
27
+ showDataZoom: boolean;
28
+ /** 是否显示网格线 */
29
+ showGrid: boolean;
30
+ /** 背景颜色 */
31
+ backgroundColor: string;
32
+ /** 文字颜色 */
33
+ textColor: string;
34
+ /** 模拟数据对象,包含各种图表类型的数据 */
35
+ mockData: any;
36
+ /** 数据配置对象 */
37
+ dataConfig: any;
38
+ /** AMIS 数据对象,包含用户信息和系统信息 */
39
+ data?: any;
40
+ }
41
+
42
+ /**
43
+ * 酷炫图表组件
44
+ * 基于 ECharts 实现的多类型图表组件,支持折线图、柱状图、饼图、散点图、雷达图、仪表盘、漏斗图、桑基图
45
+ * 提供丰富的配置选项和交互功能
46
+ */
47
+ export default class ChartWidget extends React.PureComponent<ChartWidgetProps> {
48
+ /** 图表容器的 DOM 引用 */
49
+ private chartRef: React.RefObject<HTMLDivElement>;
50
+
51
+ /** ECharts 实例对象 */
52
+ private chartInstance: echarts.ECharts | null = null;
53
+
54
+ constructor(props: ChartWidgetProps) {
55
+ super(props);
56
+ this.chartRef = React.createRef();
57
+ }
58
+
59
+ /**
60
+ * 组件默认属性配置
61
+ * 当父组件未传入对应属性时使用这些默认值
62
+ */
63
+ static defaultProps = {
64
+ chartType: 'line',
65
+ title: '图表标题',
66
+ subtitle: '',
67
+ width: 800,
68
+ height: 400,
69
+ theme: 'default',
70
+ showLegend: true,
71
+ showTooltip: true,
72
+ showDataZoom: false,
73
+ showGrid: true,
74
+ backgroundColor: 'transparent',
75
+ textColor: '#333',
76
+ mockData: {},
77
+ dataConfig: {},
78
+ };
79
+
80
+ /**
81
+ * 组件挂载完成后初始化图表
82
+ */
83
+ componentDidMount() {
84
+ this.initChart();
85
+ }
86
+
87
+ /**
88
+ * 组件更新时检查是否需要重新渲染图表
89
+ * @param prevProps 上一次的属性
90
+ */
91
+ componentDidUpdate(prevProps: ChartWidgetProps) {
92
+ if (this.shouldUpdateChart(prevProps)) {
93
+ this.updateChart();
94
+ }
95
+ }
96
+
97
+ /**
98
+ * 组件卸载前清理图表实例,防止内存泄漏
99
+ */
100
+ componentWillUnmount() {
101
+ if (this.chartInstance) {
102
+ this.chartInstance.dispose();
103
+ }
104
+ }
105
+
106
+ /**
107
+ * 判断是否需要更新图表
108
+ * 通过比较当前属性和上一次属性,决定是否重新渲染图表
109
+ * @param prevProps 上一次的属性
110
+ * @returns 是否需要更新图表
111
+ */
112
+ shouldUpdateChart(prevProps: ChartWidgetProps) {
113
+ const {
114
+ chartType,
115
+ mockData,
116
+ dataConfig,
117
+ width,
118
+ height,
119
+ theme,
120
+ title,
121
+ subtitle,
122
+ backgroundColor,
123
+ textColor,
124
+ showLegend,
125
+ showTooltip,
126
+ showDataZoom,
127
+ showGrid,
128
+ } = this.props;
129
+ return (
130
+ chartType !== prevProps.chartType ||
131
+ mockData !== prevProps.mockData ||
132
+ dataConfig !== prevProps.dataConfig ||
133
+ title !== prevProps.title ||
134
+ subtitle !== prevProps.subtitle ||
135
+ width !== prevProps.width ||
136
+ height !== prevProps.height ||
137
+ theme !== prevProps.theme ||
138
+ backgroundColor !== prevProps.backgroundColor ||
139
+ textColor !== prevProps.textColor ||
140
+ showLegend !== prevProps.showLegend ||
141
+ showTooltip !== prevProps.showTooltip ||
142
+ showDataZoom !== prevProps.showDataZoom ||
143
+ showGrid !== prevProps.showGrid
144
+ );
145
+ }
146
+
147
+ /**
148
+ * 初始化图表实例
149
+ * 创建 ECharts 实例并设置初始配置
150
+ */
151
+ initChart() {
152
+ if (!this.chartRef.current) return;
153
+
154
+ this.chartInstance = echarts.init(this.chartRef.current, this.props.theme);
155
+ this.updateChart();
156
+ }
157
+
158
+ /**
159
+ * 更新图表配置
160
+ * 根据当前属性生成新的图表配置并应用
161
+ */
162
+ updateChart() {
163
+ if (!this.chartInstance) return;
164
+
165
+ try {
166
+ const option = this.getChartOption();
167
+ // 验证 option 是否有效
168
+ if (option && option.series && Array.isArray(option.series)) {
169
+ this.chartInstance.setOption(option, true);
170
+ } else {
171
+ console.warn('Chart option is invalid:', option);
172
+ }
173
+ } catch (error) {
174
+ console.error('Error updating chart:', error);
175
+ }
176
+ }
177
+
178
+ /**
179
+ * 获取图表配置选项
180
+ * 根据组件属性生成 ECharts 配置对象
181
+ * @returns ECharts 配置对象
182
+ */
183
+ getChartOption() {
184
+ const {
185
+ chartType,
186
+ title,
187
+ subtitle,
188
+ showLegend,
189
+ showTooltip,
190
+ showDataZoom,
191
+ showGrid,
192
+ backgroundColor,
193
+ textColor,
194
+ mockData,
195
+ dataConfig,
196
+ } = this.props;
197
+
198
+ // 基础配置选项,所有图表类型共享
199
+ const baseOption = {
200
+ backgroundColor: backgroundColor || 'transparent',
201
+ textStyle: {
202
+ color: textColor || '#333',
203
+ },
204
+ title: {
205
+ text: title || '图表标题',
206
+ subtext: subtitle || '',
207
+ left: 'left',
208
+ textStyle: {
209
+ color: textColor || '#333',
210
+ fontSize: 18,
211
+ fontWeight: 'bold',
212
+ },
213
+ subtextStyle: {
214
+ color: textColor || '#666',
215
+ fontSize: 12,
216
+ },
217
+ },
218
+ tooltip: showTooltip
219
+ ? {
220
+ trigger: 'axis',
221
+ backgroundColor: 'rgba(0, 0, 0, 0.8)',
222
+ borderColor: '#333',
223
+ textStyle: {
224
+ color: '#fff',
225
+ },
226
+ axisPointer: {
227
+ type: 'cross',
228
+ crossStyle: {
229
+ color: '#999',
230
+ },
231
+ },
232
+ }
233
+ : undefined,
234
+ legend: showLegend
235
+ ? {
236
+ data: mockData?.series?.map((s: any) => s.name) || [],
237
+ top: 'bottom',
238
+ textStyle: {
239
+ color: textColor || '#333',
240
+ },
241
+ }
242
+ : undefined,
243
+ grid: showGrid
244
+ ? {
245
+ left: '3%',
246
+ right: '4%',
247
+ bottom: '10%',
248
+ top: '18%',
249
+ containLabel: true,
250
+ }
251
+ : undefined,
252
+ dataZoom: showDataZoom
253
+ ? [
254
+ {
255
+ type: 'inside',
256
+ start: 0,
257
+ end: 100,
258
+ },
259
+ {
260
+ start: 0,
261
+ end: 100,
262
+ height: 30,
263
+ bottom: 10,
264
+ },
265
+ ]
266
+ : undefined,
267
+ };
268
+
269
+ // 根据图表类型返回对应的配置
270
+ switch (chartType) {
271
+ case 'line':
272
+ return this.getLineChartOption(baseOption, mockData, dataConfig);
273
+ case 'bar':
274
+ return this.getBarChartOption(baseOption, mockData, dataConfig);
275
+ case 'pie':
276
+ return this.getPieChartOption(baseOption, mockData, dataConfig);
277
+ case 'scatter':
278
+ return this.getScatterChartOption(baseOption, mockData, dataConfig);
279
+ case 'radar':
280
+ return this.getRadarChartOption(baseOption, mockData, dataConfig);
281
+ case 'gauge':
282
+ return this.getGaugeChartOption(baseOption, mockData, dataConfig);
283
+ case 'funnel':
284
+ return this.getFunnelChartOption(baseOption, mockData, dataConfig);
285
+ case 'sankey':
286
+ return this.getSankeyChartOption(baseOption, mockData, dataConfig);
287
+ default:
288
+ return this.getLineChartOption(baseOption, mockData, dataConfig);
289
+ }
290
+ }
291
+
292
+ /**
293
+ * 获取折线图配置
294
+ * @param baseOption 基础配置选项
295
+ * @param mockData 模拟数据
296
+ * @param dataConfig 数据配置
297
+ * @returns 折线图配置对象
298
+ */
299
+ getLineChartOption(baseOption: any, mockData: any, dataConfig: any) {
300
+ const series = mockData?.series || [
301
+ {
302
+ name: '数据',
303
+ data: [120, 200, 150, 80, 70, 110, 130],
304
+ },
305
+ ];
306
+
307
+ // 确保每个 series 都有正确的 type 属性
308
+ const formattedSeries = series.map((item: any) => ({
309
+ name: item.name || '数据',
310
+ type: 'line',
311
+ data: item.data || [],
312
+ smooth: true,
313
+ symbol: 'circle',
314
+ symbolSize: 6,
315
+ lineStyle: {
316
+ width: 3,
317
+ },
318
+ areaStyle: {
319
+ opacity: 0.3,
320
+ },
321
+ }));
322
+
323
+ return {
324
+ ...baseOption,
325
+ xAxis: {
326
+ type: 'category',
327
+ data: mockData?.xAxis || [
328
+ 'Mon',
329
+ 'Tue',
330
+ 'Wed',
331
+ 'Thu',
332
+ 'Fri',
333
+ 'Sat',
334
+ 'Sun',
335
+ ],
336
+ axisLine: {
337
+ lineStyle: {
338
+ color: this.props.textColor || '#333',
339
+ },
340
+ },
341
+ },
342
+ yAxis: {
343
+ type: 'value',
344
+ axisLine: {
345
+ lineStyle: {
346
+ color: this.props.textColor || '#333',
347
+ },
348
+ },
349
+ },
350
+ series: formattedSeries,
351
+ };
352
+ }
353
+
354
+ /**
355
+ * 获取柱状图配置
356
+ * @param baseOption 基础配置选项
357
+ * @param mockData 模拟数据
358
+ * @param dataConfig 数据配置
359
+ * @returns 柱状图配置对象
360
+ */
361
+ getBarChartOption(baseOption: any, mockData: any, dataConfig: any) {
362
+ const series = mockData?.series || [
363
+ {
364
+ name: '数据',
365
+ data: [120, 200, 150, 80, 70, 110, 130],
366
+ },
367
+ ];
368
+
369
+ // 确保每个 series 都有正确的 type 属性
370
+ const formattedSeries = series.map((item: any) => ({
371
+ name: item.name || '数据',
372
+ type: 'bar',
373
+ data: item.data || [],
374
+ itemStyle: {
375
+ borderRadius: [4, 4, 0, 0],
376
+ },
377
+ }));
378
+
379
+ return {
380
+ ...baseOption,
381
+ xAxis: {
382
+ type: 'category',
383
+ data: mockData?.xAxis || [
384
+ 'Mon',
385
+ 'Tue',
386
+ 'Wed',
387
+ 'Thu',
388
+ 'Fri',
389
+ 'Sat',
390
+ 'Sun',
391
+ ],
392
+ axisLine: {
393
+ lineStyle: {
394
+ color: this.props.textColor || '#333',
395
+ },
396
+ },
397
+ },
398
+ yAxis: {
399
+ type: 'value',
400
+ axisLine: {
401
+ lineStyle: {
402
+ color: this.props.textColor || '#333',
403
+ },
404
+ },
405
+ },
406
+ series: formattedSeries,
407
+ };
408
+ }
409
+
410
+ /**
411
+ * 获取饼图配置
412
+ * @param baseOption 基础配置选项
413
+ * @param mockData 模拟数据
414
+ * @param dataConfig 数据配置
415
+ * @returns 饼图配置对象
416
+ */
417
+ getPieChartOption(baseOption: any, mockData: any, dataConfig: any) {
418
+ // 饼图数据获取逻辑修复
419
+ let pieData = [];
420
+
421
+ // 尝试多种数据源
422
+ if (mockData?.pieData && Array.isArray(mockData.pieData)) {
423
+ // 优先使用专门的饼图数据
424
+ pieData = mockData.pieData;
425
+ } else if (mockData?.series?.[0]?.data && Array.isArray(mockData.series[0].data)) {
426
+ // 使用系列数据
427
+ pieData = mockData.series[0].data;
428
+ } else if (mockData?.series && Array.isArray(mockData.series)) {
429
+ // 将系列数据转换为饼图格式
430
+ pieData = mockData.series.map((item: any) => ({
431
+ name: item.name || '数据',
432
+ value: Array.isArray(item.data) ? item.data.reduce((sum: number, val: number) => sum + val, 0) : item.value || 0
433
+ }));
434
+ } else {
435
+ // 使用默认数据
436
+ pieData = [
437
+ { value: 1048, name: '搜索引擎' },
438
+ { value: 735, name: '直接访问' },
439
+ { value: 580, name: '邮件营销' },
440
+ { value: 484, name: '联盟广告' },
441
+ { value: 300, name: '视频广告' },
442
+ ];
443
+ }
444
+
445
+ return {
446
+ ...baseOption,
447
+ series: [
448
+ {
449
+ name: '数据',
450
+ type: 'pie',
451
+ radius: ['40%', '70%'],
452
+ center: ['50%', '50%'],
453
+ data: pieData,
454
+ label: {
455
+ show: true,
456
+ position: 'outside',
457
+ fontSize: 12,
458
+ color: this.props.textColor || '#333',
459
+ formatter: '{c} ({d}%)',
460
+ overflow: 'truncate'
461
+ },
462
+ labelLine: {
463
+ show: true,
464
+ length: 15,
465
+ length2: 10,
466
+ smooth: true,
467
+ lineStyle: {
468
+ color: this.props.textColor || '#333',
469
+ width: 1
470
+ }
471
+ },
472
+ emphasis: {
473
+ itemStyle: {
474
+ shadowBlur: 10,
475
+ shadowOffsetX: 0,
476
+ shadowColor: 'rgba(0, 0, 0, 0.5)',
477
+ },
478
+ label: {
479
+ show: true,
480
+ fontSize: 14,
481
+ fontWeight: 'bold'
482
+ }
483
+ },
484
+ },
485
+ ],
486
+ };
487
+ }
488
+
489
+ /**
490
+ * 获取散点图配置
491
+ * @param baseOption 基础配置选项
492
+ * @param mockData 模拟数据
493
+ * @param dataConfig 数据配置
494
+ * @returns 散点图配置对象
495
+ */
496
+ getScatterChartOption(baseOption: any, mockData: any, dataConfig: any) {
497
+ return {
498
+ ...baseOption,
499
+ xAxis: {
500
+ type: 'value',
501
+ scale: true,
502
+ axisLine: {
503
+ lineStyle: {
504
+ color: this.props.textColor || '#333',
505
+ },
506
+ },
507
+ },
508
+ yAxis: {
509
+ type: 'value',
510
+ scale: true,
511
+ axisLine: {
512
+ lineStyle: {
513
+ color: this.props.textColor || '#333',
514
+ },
515
+ },
516
+ },
517
+ series: [
518
+ {
519
+ name: '数据',
520
+ type: 'scatter',
521
+ data: mockData?.series?.[0]?.data || [
522
+ [161.2, 51.6],
523
+ [167.5, 59.0],
524
+ [159.5, 49.2],
525
+ [157.0, 63.0],
526
+ [155.8, 53.6],
527
+ [170.0, 59.0],
528
+ [159.1, 47.6],
529
+ [166.0, 69.8],
530
+ [176.2, 66.8],
531
+ [160.2, 75.2],
532
+ ],
533
+ symbolSize: 8,
534
+ },
535
+ ],
536
+ };
537
+ }
538
+
539
+ /**
540
+ * 获取雷达图配置
541
+ * @param baseOption 基础配置选项
542
+ * @param mockData 模拟数据
543
+ * @param dataConfig 数据配置
544
+ * @returns 雷达图配置对象
545
+ */
546
+ getRadarChartOption(baseOption: any, mockData: any, dataConfig: any) {
547
+ return {
548
+ ...baseOption,
549
+ radar: {
550
+ indicator: mockData?.indicator || [
551
+ { name: '销售', max: 6500 },
552
+ { name: '管理', max: 16000 },
553
+ { name: '信息技术', max: 30000 },
554
+ { name: '客服', max: 38000 },
555
+ { name: '研发', max: 52000 },
556
+ { name: '市场', max: 25000 },
557
+ ],
558
+ },
559
+ series: [
560
+ {
561
+ name: '数据',
562
+ type: 'radar',
563
+ data: mockData?.series || [
564
+ {
565
+ value: [4200, 3000, 20000, 35000, 50000, 18000],
566
+ name: '预算分配',
567
+ },
568
+ ],
569
+ },
570
+ ],
571
+ };
572
+ }
573
+
574
+ /**
575
+ * 获取仪表盘配置
576
+ * @param baseOption 基础配置选项
577
+ * @param mockData 模拟数据
578
+ * @param dataConfig 数据配置
579
+ * @returns 仪表盘配置对象
580
+ */
581
+ getGaugeChartOption(baseOption: any, mockData: any, dataConfig: any) {
582
+ return {
583
+ ...baseOption,
584
+ series: [
585
+ {
586
+ name: '数据',
587
+ type: 'gauge',
588
+ data: mockData?.series?.[0]?.data || [{ value: 50, name: '完成率' }],
589
+ detail: {
590
+ formatter: '{value}%',
591
+ },
592
+ },
593
+ ],
594
+ };
595
+ }
596
+
597
+ /**
598
+ * 获取漏斗图配置
599
+ * @param baseOption 基础配置选项
600
+ * @param mockData 模拟数据
601
+ * @param dataConfig 数据配置
602
+ * @returns 漏斗图配置对象
603
+ */
604
+ getFunnelChartOption(baseOption: any, mockData: any, dataConfig: any) {
605
+ return {
606
+ ...baseOption,
607
+ series: [
608
+ {
609
+ name: '数据',
610
+ type: 'funnel',
611
+ left: '10%',
612
+ top: 60,
613
+ bottom: 60,
614
+ width: '80%',
615
+ min: 0,
616
+ max: 100,
617
+ minSize: '0%',
618
+ maxSize: '100%',
619
+ sort: 'descending',
620
+ gap: 2,
621
+ label: {
622
+ show: true,
623
+ position: 'inside',
624
+ },
625
+ labelLine: {
626
+ length: 10,
627
+ lineStyle: {
628
+ width: 1,
629
+ type: 'solid',
630
+ },
631
+ },
632
+ itemStyle: {
633
+ borderColor: '#fff',
634
+ borderWidth: 1,
635
+ },
636
+ emphasis: {
637
+ label: {
638
+ fontSize: 20,
639
+ },
640
+ },
641
+ data: mockData?.series?.[0]?.data || [
642
+ { value: 60, name: '访问' },
643
+ { value: 40, name: '咨询' },
644
+ { value: 20, name: '订单' },
645
+ { value: 80, name: '点击' },
646
+ { value: 100, name: '展现' },
647
+ ],
648
+ },
649
+ ],
650
+ };
651
+ }
652
+
653
+ /**
654
+ * 获取桑基图配置
655
+ * @param baseOption 基础配置选项
656
+ * @param mockData 模拟数据
657
+ * @param dataConfig 数据配置
658
+ * @returns 桑基图配置对象
659
+ */
660
+ getSankeyChartOption(baseOption: any, mockData: any, dataConfig: any) {
661
+ return {
662
+ ...baseOption,
663
+ series: [
664
+ {
665
+ name: '数据',
666
+ type: 'sankey',
667
+ data: mockData?.nodes || [
668
+ { name: '节点1' },
669
+ { name: '节点2' },
670
+ { name: '节点3' },
671
+ { name: '节点4' },
672
+ ],
673
+ links: mockData?.links || [
674
+ { source: '节点1', target: '节点2', value: 10 },
675
+ { source: '节点2', target: '节点3', value: 15 },
676
+ { source: '节点3', target: '节点4', value: 20 },
677
+ ],
678
+ emphasis: {
679
+ focus: 'adjacency',
680
+ },
681
+ lineStyle: {
682
+ color: 'gradient',
683
+ curveness: 0.5,
684
+ },
685
+ },
686
+ ],
687
+ };
688
+ }
689
+
690
+ /**
691
+ * 渲染组件
692
+ * 显示用户信息(如果可用)和图表容器
693
+ * @returns JSX 元素
694
+ */
695
+ render() {
696
+ const { width, height } = this.props;
697
+ const curAmisData = this.props.data || {};
698
+ const userInfo = curAmisData.__NeoCurrentUser;
699
+ const systemInfo = curAmisData.__NeoSystemInfo || {};
700
+
701
+ return (
702
+ <div className="chart-widget-container">
703
+ {/* 显示当前用户信息 */}
704
+ {userInfo && userInfo.name && (
705
+ <div className="user-info">
706
+ <span className="user-name">用户:{userInfo.name}</span>
707
+ {systemInfo.tenantName && (
708
+ <span className="tenant-name">租户:{systemInfo.tenantName}</span>
709
+ )}
710
+ </div>
711
+ )}
712
+ {/* 图表容器 */}
713
+ <div
714
+ ref={this.chartRef}
715
+ className="chart-container"
716
+ style={{
717
+ width: width || '100%',
718
+ height: height || 400,
719
+ }}
720
+ />
721
+ </div>
722
+ );
723
+ }
724
+ }