vue2-client 1.18.4 → 1.18.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 (243) 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 +46 -51
  133. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  134. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  135. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  136. package/src/base-client/components/common/XTree/index.js +3 -3
  137. package/src/base-client/components/common/XTree/index.md +36 -36
  138. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  139. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  140. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  141. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  142. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -145
  143. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  144. package/src/base-client/components/index.js +51 -51
  145. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  146. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  147. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  148. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  149. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  150. package/src/base-client/plugins/Recording.js +258 -258
  151. package/src/base-client/plugins/index.js +23 -23
  152. package/src/components/CodeMirror/inedx.vue +118 -118
  153. package/src/components/CodeMirror/setting.js +40 -40
  154. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  155. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  156. package/src/components/checkbox/index.js +9 -9
  157. package/src/components/exception/ExceptionPage.vue +70 -70
  158. package/src/components/g2Charts/constants.js +202 -202
  159. package/src/components/g2Charts/demo.vue +808 -808
  160. package/src/components/g2Charts/designer.vue +228 -228
  161. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  162. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  163. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  164. package/src/components/g2Charts/index.vue +397 -397
  165. package/src/components/setting/Setting.vue +234 -234
  166. package/src/config/CreateQueryConfig.js +325 -325
  167. package/src/config/default/antd.config.js +89 -89
  168. package/src/config/default/setting.config.js +55 -55
  169. package/src/font-style/font.css +60 -60
  170. package/src/layouts/PageLayout.vue +151 -151
  171. package/src/layouts/SinglePageView.vue +136 -136
  172. package/src/layouts/header/AdminHeader.vue +132 -132
  173. package/src/layouts/header/InstitutionDetail.vue +181 -181
  174. package/src/layouts/tabs/TabsHead.vue +189 -189
  175. package/src/pages/DefaultExample/index.vue +77 -77
  176. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  177. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  178. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  179. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  180. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  181. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  182. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  183. package/src/pages/DynamicStatistics/index.vue +282 -282
  184. package/src/pages/Example/childIndex.vue +15 -15
  185. package/src/pages/Example/index.vue +30 -30
  186. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  187. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  188. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  189. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  190. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  191. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  192. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  193. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  194. package/src/pages/Recording/index.vue +77 -77
  195. package/src/pages/ServiceReview/index.vue +284 -284
  196. package/src/pages/SubExample/index.vue +26 -26
  197. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  198. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1815 -1815
  199. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1014 -1014
  200. package/src/pages/XReportView/index.vue +64 -64
  201. package/src/pages/XTreeOneProExample/index.vue +67 -67
  202. package/src/pages/login/Login.vue +379 -379
  203. package/src/pages/login/LoginV3.vue +389 -389
  204. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  205. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  206. package/src/pages/report/ReportTable.js +124 -124
  207. package/src/pages/resourceManage/orgListManage.vue +98 -98
  208. package/src/pages/system/settings/modifyPassword.vue +117 -117
  209. package/src/pages/system/ticket/index.vue +480 -480
  210. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  211. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  212. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  213. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  214. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  215. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  216. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  217. package/src/plugins/EventLogPlugin.js +33 -33
  218. package/src/plugins/FindParentsData.js +17 -17
  219. package/src/services/DataModel.js +30 -30
  220. package/src/services/LodopFuncs.js +137 -137
  221. package/src/services/api/TicketDetailsViewApi.js +46 -46
  222. package/src/services/api/entity.js +18 -18
  223. package/src/services/api/index.js +17 -17
  224. package/src/store/modules/account.js +121 -121
  225. package/src/store/modules/index.js +5 -5
  226. package/src/store/modules/lowCode.js +33 -33
  227. package/src/theme/default/style.less +58 -58
  228. package/src/theme/global.less +313 -313
  229. package/src/utils/formatter.js +74 -74
  230. package/src/utils/htmlToPDF.js +108 -108
  231. package/src/utils/htmlToPDFApi.js +5 -5
  232. package/src/utils/login.js +188 -188
  233. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  234. package/src/utils/lowcode/lowcodeLog.js +29 -29
  235. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  236. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  237. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  238. package/src/utils/map-utils.js +47 -47
  239. package/src/utils/reg.js +95 -95
  240. package/src/utils/runEvalFunction.js +14 -14
  241. package/src/utils/theme-color-replacer-extend.js +92 -92
  242. package/src/utils/util.js +329 -329
  243. 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>