vue2-client 1.18.3 → 1.18.5

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 (244) hide show
  1. package/.claude/settings.local.json +20 -20
  2. package/.cursorrules +19 -19
  3. package/.env.apply +19 -19
  4. package/.env.gaslink +19 -19
  5. package/.env.his +19 -19
  6. package/.env.liuli +20 -20
  7. package/.env.scada +19 -19
  8. package/.serena/memories/code_style_conventions.md +217 -217
  9. package/.serena/memories/project_overview.md +54 -54
  10. package/.serena/memories/project_structure.md +329 -329
  11. package/.serena/memories/suggested_commands.md +127 -127
  12. package/.serena/memories/task_completion_checklist.md +183 -183
  13. package/.serena/memories/tech_stack.md +94 -94
  14. package/CHANGELOG.md +830 -830
  15. package/CLAUDE.md +97 -97
  16. package/docs/LowCode/lowcode.md +155 -155
  17. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  18. package/jsconfig.json +19 -19
  19. package/package.json +1 -1
  20. package/public/his/editor/editor.html +51 -51
  21. package/public/his/editor/mock/bind_data.html +779 -779
  22. package/public/his/editor/mock/data_table.html +40 -40
  23. package/public/his/editor/mock/sign.html +75 -75
  24. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  25. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  26. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  27. package/public/his/editor/vender/date97/calendar.js +4 -4
  28. package/public/his/editor/vender/date97/lang/en.js +13 -13
  29. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  30. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  31. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  32. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  33. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  34. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  35. package/public/his/editor/vender/diff.js +1627 -1627
  36. package/public/his/editor/vender/editor.js +1 -1
  37. package/public/his/editor/vender/fabric.js +31187 -31187
  38. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  39. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  40. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  41. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  42. package/public/his/editor/vender/mui/mui.min.css +4 -4
  43. package/public/his/editor/vender/mui/mui.min.js +5 -5
  44. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  45. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  46. package/public/his/editor/vender/qrcode.js +7 -7
  47. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  48. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  49. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  50. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  51. package/public/his/editor/vender/validator.js +5094 -5094
  52. package/public/his/editor/vender/weui/weui.css +5659 -5659
  53. package/public/his/editor/vender/weui/weui.min.css +4 -4
  54. package/public/his/editor/vender/weui/weui.min.js +11 -11
  55. package/src/assets/img/paymentMethod/package.info +1 -1
  56. package/src/assets/svg/badtwo.svg +1 -1
  57. package/src/assets/svg/goodtwo.svg +1 -1
  58. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  59. package/src/base-client/components/AI/demo.vue +31 -31
  60. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  61. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  62. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  63. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  64. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  65. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  66. package/src/base-client/components/common/HIS/demo.vue +61 -61
  67. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  68. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  69. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  70. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  71. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  72. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  73. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  74. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  75. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  76. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  77. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  78. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  79. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  80. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  81. package/src/base-client/components/common/Recording/index.js +3 -3
  82. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  83. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +304 -304
  84. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  85. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  86. package/src/base-client/components/common/XAddReport/index.js +3 -3
  87. package/src/base-client/components/common/XAddReport/index.md +56 -56
  88. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  89. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  90. package/src/base-client/components/common/XButtons/index.js +3 -3
  91. package/src/base-client/components/common/XButtons/index.md +61 -61
  92. package/src/base-client/components/common/XCalendar/XCalendar.vue +4 -4
  93. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  94. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  95. package/src/base-client/components/common/XDataCard/index.js +3 -3
  96. package/src/base-client/components/common/XDataCard/index.md +1 -1
  97. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  98. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  99. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  100. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  101. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  102. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  103. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  104. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  105. package/src/base-client/components/common/XFormTable/XFormTable.vue +1258 -1257
  106. package/src/base-client/components/common/XFormTable/index.md +92 -92
  107. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  108. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  109. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  110. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  111. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  112. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  113. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  114. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  115. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  116. package/src/base-client/components/common/XPrint/index.vue +97 -97
  117. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  118. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  119. package/src/base-client/components/common/XReport/index.js +3 -3
  120. package/src/base-client/components/common/XReport/print.js +186 -186
  121. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  122. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  123. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  124. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  125. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  126. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  127. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  128. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  129. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  130. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  131. package/src/base-client/components/common/XTab/index.js +3 -3
  132. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  133. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  134. package/src/base-client/components/common/XTable/XTableWrapper.vue +1 -1
  135. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  136. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  137. package/src/base-client/components/common/XTree/index.js +3 -3
  138. package/src/base-client/components/common/XTree/index.md +36 -36
  139. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  140. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  141. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  142. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  143. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -145
  144. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  145. package/src/base-client/components/index.js +51 -51
  146. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  147. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  148. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  149. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  150. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  151. package/src/base-client/plugins/Recording.js +258 -258
  152. package/src/base-client/plugins/index.js +23 -23
  153. package/src/components/CodeMirror/inedx.vue +118 -118
  154. package/src/components/CodeMirror/setting.js +40 -40
  155. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  156. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  157. package/src/components/checkbox/index.js +9 -9
  158. package/src/components/exception/ExceptionPage.vue +70 -70
  159. package/src/components/g2Charts/constants.js +202 -202
  160. package/src/components/g2Charts/demo.vue +808 -808
  161. package/src/components/g2Charts/designer.vue +228 -228
  162. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  163. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  164. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  165. package/src/components/g2Charts/index.vue +397 -397
  166. package/src/components/setting/Setting.vue +234 -234
  167. package/src/config/CreateQueryConfig.js +325 -325
  168. package/src/config/default/antd.config.js +89 -89
  169. package/src/config/default/setting.config.js +55 -55
  170. package/src/font-style/font.css +60 -60
  171. package/src/layouts/PageLayout.vue +151 -151
  172. package/src/layouts/SinglePageView.vue +136 -136
  173. package/src/layouts/header/AdminHeader.vue +132 -132
  174. package/src/layouts/header/InstitutionDetail.vue +181 -181
  175. package/src/layouts/tabs/TabsHead.vue +189 -189
  176. package/src/pages/DefaultExample/index.vue +77 -77
  177. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  178. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  179. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  180. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  181. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  182. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  183. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  184. package/src/pages/DynamicStatistics/index.vue +282 -282
  185. package/src/pages/Example/childIndex.vue +15 -15
  186. package/src/pages/Example/index.vue +30 -30
  187. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  188. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  189. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  190. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  191. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  192. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  193. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  194. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  195. package/src/pages/Recording/index.vue +77 -77
  196. package/src/pages/ServiceReview/index.vue +284 -284
  197. package/src/pages/SubExample/index.vue +26 -26
  198. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  199. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1815 -1815
  200. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1014 -1014
  201. package/src/pages/XReportView/index.vue +64 -64
  202. package/src/pages/XTreeOneProExample/index.vue +67 -67
  203. package/src/pages/login/Login.vue +379 -379
  204. package/src/pages/login/LoginV3.vue +389 -389
  205. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  206. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  207. package/src/pages/report/ReportTable.js +124 -124
  208. package/src/pages/resourceManage/orgListManage.vue +98 -98
  209. package/src/pages/system/settings/modifyPassword.vue +117 -117
  210. package/src/pages/system/ticket/index.vue +480 -480
  211. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  212. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  213. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  214. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  215. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  216. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  217. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  218. package/src/plugins/EventLogPlugin.js +33 -33
  219. package/src/plugins/FindParentsData.js +17 -17
  220. package/src/services/DataModel.js +30 -30
  221. package/src/services/LodopFuncs.js +137 -137
  222. package/src/services/api/TicketDetailsViewApi.js +46 -46
  223. package/src/services/api/entity.js +18 -18
  224. package/src/services/api/index.js +17 -17
  225. package/src/store/modules/account.js +121 -121
  226. package/src/store/modules/index.js +5 -5
  227. package/src/store/modules/lowCode.js +33 -33
  228. package/src/theme/default/style.less +58 -58
  229. package/src/theme/global.less +313 -313
  230. package/src/utils/formatter.js +74 -74
  231. package/src/utils/htmlToPDF.js +108 -108
  232. package/src/utils/htmlToPDFApi.js +5 -5
  233. package/src/utils/login.js +188 -188
  234. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  235. package/src/utils/lowcode/lowcodeLog.js +29 -29
  236. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  237. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  238. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  239. package/src/utils/map-utils.js +47 -47
  240. package/src/utils/reg.js +95 -95
  241. package/src/utils/runEvalFunction.js +14 -14
  242. package/src/utils/theme-color-replacer-extend.js +92 -92
  243. package/src/utils/util.js +329 -329
  244. package/src/utils/waterMark.js +31 -31
@@ -1,397 +1,397 @@
1
- <script setup>
2
- import { Line, Column, Pie } from '@antv/g2plot'
3
- import { queryChartsData } from '@vue2-client/services/api/common'
4
- import { ref, onUnmounted, onMounted, watch } from 'vue'
5
- import { colorItems } from './constants'
6
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
7
-
8
- const errorMsg = ref([])
9
- const loading = ref(false)
10
- const empty = ref(false)
11
- let plot = null
12
-
13
- // 接收props中的传参
14
- const props = defineProps({
15
- config: {
16
- type: Object,
17
- default: () => {}
18
- },
19
- requestParameters: {
20
- type: Object,
21
- default: () => {}
22
- },
23
- isDev: {
24
- type: Boolean,
25
- default: false
26
- },
27
- chatsKey: {
28
- type: [String, Number],
29
- default: ''
30
- }
31
- })
32
- // 添加验证函数
33
- const validateConfig = (config, requestParameters) => {
34
- const errors = []
35
- // 基础验证
36
- if (!config.type || !config.dataSource) {
37
- errors.push('图表类型或数据源未配置')
38
- }
39
- if (!config.xField) {
40
- errors.push('请选择横轴字段')
41
- }
42
- // yFieldType 验证
43
- if (config.yFieldType === 'sum') {
44
- if (!config.yField || config.yField.length === 0) {
45
- errors.push('请至少添加一个统计字段')
46
- }
47
- if (config.yField.some((field) => !field.field)) {
48
- errors.push('存在未选择的统计字段')
49
- }
50
- }
51
- if (errors.length === 0 && config?.customFunction) {
52
- const result = executeStrFunctionByContext(this, config.customFunction, [config, requestParameters])
53
- // 判断 result 是否为数组
54
- if (Array.isArray(result)) {
55
- errors.push(...result)
56
- }
57
- }
58
- return errors
59
- }
60
-
61
- // 添加排序处理函数
62
- const sortData = (data, config) => {
63
- const { xFieldSortBy, xFieldSortType, xField, yField } = config
64
-
65
- return [...data].sort((a, b) => {
66
- let compareResult = 0
67
-
68
- switch (xFieldSortBy) {
69
- case 'xValue':
70
- // 按横轴值排序
71
- compareResult = a[xField] < b[xField] ? -1 : 1
72
- break
73
- case 'yValue':
74
- // 按纵轴值排序
75
- {
76
- const yFieldName =
77
- typeof yField === 'string' ? yField : yField?.[0]?.field
78
- compareResult = parseFloat(a[yFieldName]) - parseFloat(b[yFieldName])
79
- }
80
- break
81
- default:
82
- compareResult = a[xField] < b[xField] ? -1 : 1
83
- }
84
-
85
- // 处理排序方向
86
- return xFieldSortType === 'asc' ? compareResult : -compareResult
87
- })
88
- }
89
-
90
- // 根据类型创建对应的图表实例
91
- const createPlot = (type, container, options) => {
92
- switch (type) {
93
- case 'line':
94
- return new Line(container, options)
95
- case 'bar':
96
- return new Column(container, options)
97
- case 'pie':
98
- return new Pie(container, {
99
- ...options,
100
- // 饼图特殊配置
101
- angleField: options.yField,
102
- colorField: options.xField,
103
- })
104
- default:
105
- return new Line(container, options)
106
- }
107
- }
108
-
109
- // 修改错误边界处理
110
- const handleError = (error) => {
111
- errorMsg.value = Array.isArray(error) ? error : ['图表渲染失败']
112
- // 出错时销毁图表实例
113
- if (plot) {
114
- plot.destroy()
115
- plot = null
116
- }
117
- loading.value = false
118
- }
119
-
120
- /**
121
- * 初始化
122
- * @param config 图表配置
123
- * @param requestParameters 查询参数
124
- */
125
- const init = (config = {}, requestParameters = {}) => {
126
- try {
127
- loading.value = true
128
- empty.value = false
129
- errorMsg.value = []
130
-
131
- const errors = validateConfig(config, requestParameters)
132
- if (errors.length > 0) {
133
- handleError(errors)
134
- return
135
- }
136
-
137
- // 处理请求参数,移除循环引用
138
- const sanitizedConfig = JSON.parse(JSON.stringify({
139
- ...config,
140
- chartsConfigArray: undefined // 移除可能导致循环引用的属性
141
- }))
142
-
143
- const sanitizedParams = JSON.parse(JSON.stringify({
144
- conditionParams: {},
145
- chartsConfigArray: undefined,
146
- ...requestParameters
147
- }))
148
-
149
- // 验证通过后进行数据请求和图表渲染
150
- queryChartsData({ config: sanitizedConfig, requestParameters: sanitizedParams, preview: true }, config.serviceName, props.isDev)
151
- .then((res) => {
152
- const xField =
153
- config.dataSource === 'curCrud'
154
- ? config.xField.replace('.', '_')
155
- : config.xField
156
-
157
- const yFieldConfig = config.yField?.[0]
158
- const yField =
159
- config.dataSource === 'curCrud'
160
- ? yFieldConfig?.field.replace('.', '_')
161
- : yFieldConfig?.field
162
-
163
- // 对数据进行排序
164
- const sortedData = sortData(res, {
165
- ...config,
166
- xField,
167
- yField,
168
- })
169
-
170
- const baseOptions = {
171
- data: sortedData,
172
- xField: xField,
173
- yField: 'value',
174
- meta: {
175
- [yField]: {
176
- alias: yFieldConfig?.label || yFieldConfig?.field
177
- }
178
- },
179
- seriesField: 'series',
180
- title: {
181
- visible: true,
182
- text: config.title,
183
- },
184
- description: {
185
- visible: true,
186
- text: config.description,
187
- },
188
- // 修改图表工具的配置方式
189
- label: config.chartsTools.includes('label')
190
- ? {
191
- visible: true,
192
- autoHide: true,
193
- style: {
194
- fontSize: 12,
195
- },
196
- }
197
- : false,
198
- point: config.chartsTools.includes('point')
199
- ? {
200
- visible: true,
201
- size: 4,
202
- }
203
- : false,
204
- xAxis: config.chartsTools.includes('xyVisible')
205
- ? {
206
- visible: true,
207
- label: {
208
- offset: 12,
209
- autoRotate: true,
210
- autoHide: true,
211
- rotate: 0.3
212
- },
213
- }
214
- : {
215
- visible: false,
216
- },
217
- yAxis: config.chartsTools.includes('xyVisible')
218
- ? {
219
- visible: true,
220
- }
221
- : {
222
- visible: false,
223
- },
224
- legend: config.chartsTools.includes('legend')
225
- ? {
226
- visible: true,
227
- position: 'top-left',
228
- marker: {
229
- symbol: 'circle',
230
- },
231
- itemName: {
232
- style: {
233
- fill: '#333',
234
- }
235
- }
236
- }
237
- : false,
238
- grid: config.chartsTools.includes('grid')
239
- ? {
240
- visible: true,
241
- }
242
- : {
243
- visible: false,
244
- },
245
- forceFit: true,
246
- padding: 'auto',
247
- // 添加主题色配置
248
- color: config.colorIndex !== undefined ? colorItems[config.colorIndex].map(item => item.color) : undefined,
249
-
250
- // 为饼图特别设置颜色
251
- pieStyle: config.type === 'pie' ? {
252
- stroke: 'white',
253
- lineWidth: 1,
254
- } : undefined,
255
- theme: {
256
- colors10: config.colorIndex !== undefined ? colorItems[config.colorIndex].map(item => item.color) : undefined,
257
- },
258
- }
259
- // 如果data 超过 50 增加缩略图
260
- if (sortedData.length > 500) {
261
- baseOptions.slider = {
262
- start: 0,
263
- end: 0.2,
264
- }
265
- } else if (sortedData.length > 200) {
266
- baseOptions.slider = {
267
- start: 0,
268
- end: 0.4,
269
- }
270
- } else if (sortedData.length > 100) {
271
- baseOptions.slider = {
272
- start: 0,
273
- end: 0.6,
274
- }
275
- } else if (sortedData.length > 50) {
276
- baseOptions.slider = {
277
- start: 0,
278
- end: 0.8,
279
- }
280
- }
281
- if (config.type !== 'pie') {
282
- baseOptions.isGroup = true
283
- }
284
- if (sortedData.length === 0) {
285
- empty.value = true
286
- return
287
- }
288
- // 如果实例存在且类型相同,只更新配置
289
- if (plot && plot.constructor.name.toLowerCase() === config.type) {
290
- try {
291
- plot.update({
292
- ...baseOptions,
293
- // 其他配置保持不变
294
- ...plot.options,
295
- // 需要更新的配置
296
- data: sortedData,
297
- xField,
298
- yField: 'value',
299
- meta: baseOptions.meta
300
- })
301
- } catch (error) {
302
- handleError(error)
303
- }
304
- } else {
305
- // 如果实例不存在或类型不同,需要重新创建
306
- if (plot) {
307
- plot.destroy()
308
- }
309
- plot = createPlot(
310
- config.type,
311
- document.getElementById(`container${props.chatsKey}`),
312
- baseOptions
313
- )
314
- plot.render()
315
- }
316
- })
317
- .catch(error => {
318
- handleError(error)
319
- })
320
- .finally(() => {
321
- loading.value = false
322
- })
323
- } catch (error) {
324
- handleError(error)
325
- }
326
- }
327
-
328
- // 组件卸载时清理图表实例
329
- onUnmounted(() => {
330
- if (plot) {
331
- plot.destroy()
332
- }
333
- })
334
-
335
- // 添加对 props 的监听
336
- watch(
337
- [() => props.config, () => props.requestParameters],
338
- ([newConfig, newRequestParameters]) => {
339
- init(newConfig, newRequestParameters)
340
- },
341
- {
342
- deep: true
343
- }
344
- )
345
-
346
- onMounted(() => {
347
- init(props.config, props.requestParameters)
348
- })
349
-
350
- defineExpose({ init })
351
- </script>
352
-
353
- <template>
354
- <div
355
- :id="`container${chatsKey}`"
356
- style="height: 100%"
357
- >
358
- <a-spin :spinning="loading">
359
- <a-result
360
- v-if="errorMsg.length > 0"
361
- status="warning"
362
- title="图表构建错误"
363
- sub-title="配置不完善或者数据源格式错误,请检查"
364
- >
365
- <div
366
- class="desc"
367
- style="text-align: center"
368
- >
369
- <p
370
- v-for="(item, index) in errorMsg"
371
- :key="index"
372
- >
373
- <a-icon
374
- :style="{ color: 'red' }"
375
- type="close-circle"
376
- />
377
- {{ item }}
378
- </p>
379
- </div>
380
- </a-result>
381
- <a-empty v-else-if="empty"/>
382
- </a-spin>
383
- </div>
384
- </template>
385
-
386
- <style scoped lang="less">
387
- .custom-chart-title {
388
- font-size: 16px;
389
- font-weight: 500;
390
- margin-bottom: 8px;
391
- }
392
-
393
- .custom-chart-desc {
394
- font-size: 12px;
395
- color: rgba(0, 0, 0, .45);
396
- margin-bottom: 16px;
397
- }</style>
1
+ <script setup>
2
+ import { Line, Column, Pie } from '@antv/g2plot'
3
+ import { queryChartsData } from '@vue2-client/services/api/common'
4
+ import { ref, onUnmounted, onMounted, watch } from 'vue'
5
+ import { colorItems } from './constants'
6
+ import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
7
+
8
+ const errorMsg = ref([])
9
+ const loading = ref(false)
10
+ const empty = ref(false)
11
+ let plot = null
12
+
13
+ // 接收props中的传参
14
+ const props = defineProps({
15
+ config: {
16
+ type: Object,
17
+ default: () => {}
18
+ },
19
+ requestParameters: {
20
+ type: Object,
21
+ default: () => {}
22
+ },
23
+ isDev: {
24
+ type: Boolean,
25
+ default: false
26
+ },
27
+ chatsKey: {
28
+ type: [String, Number],
29
+ default: ''
30
+ }
31
+ })
32
+ // 添加验证函数
33
+ const validateConfig = (config, requestParameters) => {
34
+ const errors = []
35
+ // 基础验证
36
+ if (!config.type || !config.dataSource) {
37
+ errors.push('图表类型或数据源未配置')
38
+ }
39
+ if (!config.xField) {
40
+ errors.push('请选择横轴字段')
41
+ }
42
+ // yFieldType 验证
43
+ if (config.yFieldType === 'sum') {
44
+ if (!config.yField || config.yField.length === 0) {
45
+ errors.push('请至少添加一个统计字段')
46
+ }
47
+ if (config.yField.some((field) => !field.field)) {
48
+ errors.push('存在未选择的统计字段')
49
+ }
50
+ }
51
+ if (errors.length === 0 && config?.customFunction) {
52
+ const result = executeStrFunctionByContext(this, config.customFunction, [config, requestParameters])
53
+ // 判断 result 是否为数组
54
+ if (Array.isArray(result)) {
55
+ errors.push(...result)
56
+ }
57
+ }
58
+ return errors
59
+ }
60
+
61
+ // 添加排序处理函数
62
+ const sortData = (data, config) => {
63
+ const { xFieldSortBy, xFieldSortType, xField, yField } = config
64
+
65
+ return [...data].sort((a, b) => {
66
+ let compareResult = 0
67
+
68
+ switch (xFieldSortBy) {
69
+ case 'xValue':
70
+ // 按横轴值排序
71
+ compareResult = a[xField] < b[xField] ? -1 : 1
72
+ break
73
+ case 'yValue':
74
+ // 按纵轴值排序
75
+ {
76
+ const yFieldName =
77
+ typeof yField === 'string' ? yField : yField?.[0]?.field
78
+ compareResult = parseFloat(a[yFieldName]) - parseFloat(b[yFieldName])
79
+ }
80
+ break
81
+ default:
82
+ compareResult = a[xField] < b[xField] ? -1 : 1
83
+ }
84
+
85
+ // 处理排序方向
86
+ return xFieldSortType === 'asc' ? compareResult : -compareResult
87
+ })
88
+ }
89
+
90
+ // 根据类型创建对应的图表实例
91
+ const createPlot = (type, container, options) => {
92
+ switch (type) {
93
+ case 'line':
94
+ return new Line(container, options)
95
+ case 'bar':
96
+ return new Column(container, options)
97
+ case 'pie':
98
+ return new Pie(container, {
99
+ ...options,
100
+ // 饼图特殊配置
101
+ angleField: options.yField,
102
+ colorField: options.xField,
103
+ })
104
+ default:
105
+ return new Line(container, options)
106
+ }
107
+ }
108
+
109
+ // 修改错误边界处理
110
+ const handleError = (error) => {
111
+ errorMsg.value = Array.isArray(error) ? error : ['图表渲染失败']
112
+ // 出错时销毁图表实例
113
+ if (plot) {
114
+ plot.destroy()
115
+ plot = null
116
+ }
117
+ loading.value = false
118
+ }
119
+
120
+ /**
121
+ * 初始化
122
+ * @param config 图表配置
123
+ * @param requestParameters 查询参数
124
+ */
125
+ const init = (config = {}, requestParameters = {}) => {
126
+ try {
127
+ loading.value = true
128
+ empty.value = false
129
+ errorMsg.value = []
130
+
131
+ const errors = validateConfig(config, requestParameters)
132
+ if (errors.length > 0) {
133
+ handleError(errors)
134
+ return
135
+ }
136
+
137
+ // 处理请求参数,移除循环引用
138
+ const sanitizedConfig = JSON.parse(JSON.stringify({
139
+ ...config,
140
+ chartsConfigArray: undefined // 移除可能导致循环引用的属性
141
+ }))
142
+
143
+ const sanitizedParams = JSON.parse(JSON.stringify({
144
+ conditionParams: {},
145
+ chartsConfigArray: undefined,
146
+ ...requestParameters
147
+ }))
148
+
149
+ // 验证通过后进行数据请求和图表渲染
150
+ queryChartsData({ config: sanitizedConfig, requestParameters: sanitizedParams, preview: true }, config.serviceName, props.isDev)
151
+ .then((res) => {
152
+ const xField =
153
+ config.dataSource === 'curCrud'
154
+ ? config.xField.replace('.', '_')
155
+ : config.xField
156
+
157
+ const yFieldConfig = config.yField?.[0]
158
+ const yField =
159
+ config.dataSource === 'curCrud'
160
+ ? yFieldConfig?.field.replace('.', '_')
161
+ : yFieldConfig?.field
162
+
163
+ // 对数据进行排序
164
+ const sortedData = sortData(res, {
165
+ ...config,
166
+ xField,
167
+ yField,
168
+ })
169
+
170
+ const baseOptions = {
171
+ data: sortedData,
172
+ xField: xField,
173
+ yField: 'value',
174
+ meta: {
175
+ [yField]: {
176
+ alias: yFieldConfig?.label || yFieldConfig?.field
177
+ }
178
+ },
179
+ seriesField: 'series',
180
+ title: {
181
+ visible: true,
182
+ text: config.title,
183
+ },
184
+ description: {
185
+ visible: true,
186
+ text: config.description,
187
+ },
188
+ // 修改图表工具的配置方式
189
+ label: config.chartsTools.includes('label')
190
+ ? {
191
+ visible: true,
192
+ autoHide: true,
193
+ style: {
194
+ fontSize: 12,
195
+ },
196
+ }
197
+ : false,
198
+ point: config.chartsTools.includes('point')
199
+ ? {
200
+ visible: true,
201
+ size: 4,
202
+ }
203
+ : false,
204
+ xAxis: config.chartsTools.includes('xyVisible')
205
+ ? {
206
+ visible: true,
207
+ label: {
208
+ offset: 12,
209
+ autoRotate: true,
210
+ autoHide: true,
211
+ rotate: 0.3
212
+ },
213
+ }
214
+ : {
215
+ visible: false,
216
+ },
217
+ yAxis: config.chartsTools.includes('xyVisible')
218
+ ? {
219
+ visible: true,
220
+ }
221
+ : {
222
+ visible: false,
223
+ },
224
+ legend: config.chartsTools.includes('legend')
225
+ ? {
226
+ visible: true,
227
+ position: 'top-left',
228
+ marker: {
229
+ symbol: 'circle',
230
+ },
231
+ itemName: {
232
+ style: {
233
+ fill: '#333',
234
+ }
235
+ }
236
+ }
237
+ : false,
238
+ grid: config.chartsTools.includes('grid')
239
+ ? {
240
+ visible: true,
241
+ }
242
+ : {
243
+ visible: false,
244
+ },
245
+ forceFit: true,
246
+ padding: 'auto',
247
+ // 添加主题色配置
248
+ color: config.colorIndex !== undefined ? colorItems[config.colorIndex].map(item => item.color) : undefined,
249
+
250
+ // 为饼图特别设置颜色
251
+ pieStyle: config.type === 'pie' ? {
252
+ stroke: 'white',
253
+ lineWidth: 1,
254
+ } : undefined,
255
+ theme: {
256
+ colors10: config.colorIndex !== undefined ? colorItems[config.colorIndex].map(item => item.color) : undefined,
257
+ },
258
+ }
259
+ // 如果data 超过 50 增加缩略图
260
+ if (sortedData.length > 500) {
261
+ baseOptions.slider = {
262
+ start: 0,
263
+ end: 0.2,
264
+ }
265
+ } else if (sortedData.length > 200) {
266
+ baseOptions.slider = {
267
+ start: 0,
268
+ end: 0.4,
269
+ }
270
+ } else if (sortedData.length > 100) {
271
+ baseOptions.slider = {
272
+ start: 0,
273
+ end: 0.6,
274
+ }
275
+ } else if (sortedData.length > 50) {
276
+ baseOptions.slider = {
277
+ start: 0,
278
+ end: 0.8,
279
+ }
280
+ }
281
+ if (config.type !== 'pie') {
282
+ baseOptions.isGroup = true
283
+ }
284
+ if (sortedData.length === 0) {
285
+ empty.value = true
286
+ return
287
+ }
288
+ // 如果实例存在且类型相同,只更新配置
289
+ if (plot && plot.constructor.name.toLowerCase() === config.type) {
290
+ try {
291
+ plot.update({
292
+ ...baseOptions,
293
+ // 其他配置保持不变
294
+ ...plot.options,
295
+ // 需要更新的配置
296
+ data: sortedData,
297
+ xField,
298
+ yField: 'value',
299
+ meta: baseOptions.meta
300
+ })
301
+ } catch (error) {
302
+ handleError(error)
303
+ }
304
+ } else {
305
+ // 如果实例不存在或类型不同,需要重新创建
306
+ if (plot) {
307
+ plot.destroy()
308
+ }
309
+ plot = createPlot(
310
+ config.type,
311
+ document.getElementById(`container${props.chatsKey}`),
312
+ baseOptions
313
+ )
314
+ plot.render()
315
+ }
316
+ })
317
+ .catch(error => {
318
+ handleError(error)
319
+ })
320
+ .finally(() => {
321
+ loading.value = false
322
+ })
323
+ } catch (error) {
324
+ handleError(error)
325
+ }
326
+ }
327
+
328
+ // 组件卸载时清理图表实例
329
+ onUnmounted(() => {
330
+ if (plot) {
331
+ plot.destroy()
332
+ }
333
+ })
334
+
335
+ // 添加对 props 的监听
336
+ watch(
337
+ [() => props.config, () => props.requestParameters],
338
+ ([newConfig, newRequestParameters]) => {
339
+ init(newConfig, newRequestParameters)
340
+ },
341
+ {
342
+ deep: true
343
+ }
344
+ )
345
+
346
+ onMounted(() => {
347
+ init(props.config, props.requestParameters)
348
+ })
349
+
350
+ defineExpose({ init })
351
+ </script>
352
+
353
+ <template>
354
+ <div
355
+ :id="`container${chatsKey}`"
356
+ style="height: 100%"
357
+ >
358
+ <a-spin :spinning="loading">
359
+ <a-result
360
+ v-if="errorMsg.length > 0"
361
+ status="warning"
362
+ title="图表构建错误"
363
+ sub-title="配置不完善或者数据源格式错误,请检查"
364
+ >
365
+ <div
366
+ class="desc"
367
+ style="text-align: center"
368
+ >
369
+ <p
370
+ v-for="(item, index) in errorMsg"
371
+ :key="index"
372
+ >
373
+ <a-icon
374
+ :style="{ color: 'red' }"
375
+ type="close-circle"
376
+ />
377
+ {{ item }}
378
+ </p>
379
+ </div>
380
+ </a-result>
381
+ <a-empty v-else-if="empty"/>
382
+ </a-spin>
383
+ </div>
384
+ </template>
385
+
386
+ <style scoped lang="less">
387
+ .custom-chart-title {
388
+ font-size: 16px;
389
+ font-weight: 500;
390
+ margin-bottom: 8px;
391
+ }
392
+
393
+ .custom-chart-desc {
394
+ font-size: 12px;
395
+ color: rgba(0, 0, 0, .45);
396
+ margin-bottom: 16px;
397
+ }</style>