Commit 0770fed53b58e356981c4b816bc35b36bcd06f62
1 parent
edad816c
feat: add dashboard chart component
Showing
5 changed files
with
472 additions
and
212 deletions
1.3 KB
| ... | ... | @@ -590,11 +590,7 @@ |
| 590 | 590 | </div> |
| 591 | 591 | <script> |
| 592 | 592 | var timeInterval = setInterval(() => { |
| 593 | - try { | |
| 594 | - if (!echarts) return | |
| 595 | - } catch (error) { | |
| 596 | - | |
| 597 | - } | |
| 593 | + if (!echarts) return | |
| 598 | 594 | clearInterval(timeInterval) |
| 599 | 595 | timeInterval = null |
| 600 | 596 | var chartDom | ... | ... |
| ... | ... | @@ -225,6 +225,11 @@ |
| 225 | 225 | LINE_CHART: 'lineChart', |
| 226 | 226 | |
| 227 | 227 | /** |
| 228 | + * @description 仪表盘 类型 | |
| 229 | + */ | |
| 230 | + DASHBOARD_CHART: 'dashboardChart', | |
| 231 | + | |
| 232 | + /** | |
| 228 | 233 | * @description 柱状图类型 |
| 229 | 234 | */ |
| 230 | 235 | BAR_CHART: 'barChart', |
| ... | ... | @@ -264,7 +269,7 @@ |
| 264 | 269 | SWITCH_STATE_ENABLED: 'enabled', |
| 265 | 270 | SWITCH_STATE_CLOSE: 'close', |
| 266 | 271 | SWITCH_STATE_NONE: 'none', |
| 267 | - } | |
| 272 | + } | |
| 268 | 273 | |
| 269 | 274 | /** |
| 270 | 275 | * @description 组件权限map |
| ... | ... | @@ -311,6 +316,11 @@ |
| 311 | 316 | BAR_CHART_EXPAND: 'barChartExpandDataSource', |
| 312 | 317 | |
| 313 | 318 | /** |
| 319 | + * @description 仪表图 | |
| 320 | + */ | |
| 321 | + DASHBOARD_CHART_EXPAND: 'dashboradChartExpand', | |
| 322 | + | |
| 323 | + /** | |
| 314 | 324 | * @descripton 交互 |
| 315 | 325 | */ |
| 316 | 326 | INTERACTION: 'interaction', |
| ... | ... | @@ -700,8 +710,8 @@ |
| 700 | 710 | //更多图形,显示出来的的标题跟id,同时包括图片 |
| 701 | 711 | |
| 702 | 712 | // TODO thingsKit 设置数据绑定展示面板 |
| 703 | - const { LINE_CHART_EXPAND, BAR_CHART_EXPAND, DYNAMIC_EFFECT, DATA_SOURCE, VAR_IMAGE, INTERACTION, VIDEO: VIDEO_PANEL, SWITCH_STATE_SETTING, ONLY_SINGLE_EVENT, RUNNING_AND_STOP } = this.enumPermissionPanel | |
| 704 | - const { LINE, LINE_CHART, REAL_TIME, TITLE, VARIABLE, DEFAULT, BAR_CHART, VIDEO, SWITCH, PARAMS_SETTING_BUTTON } = this.enumComponentType | |
| 713 | + const { LINE_CHART_EXPAND, BAR_CHART_EXPAND, DASHBOARD_CHART_EXPAND, DYNAMIC_EFFECT, DATA_SOURCE, VAR_IMAGE, INTERACTION, VIDEO: VIDEO_PANEL, SWITCH_STATE_SETTING, ONLY_SINGLE_EVENT, RUNNING_AND_STOP } = this.enumPermissionPanel | |
| 714 | + const { LINE, LINE_CHART, REAL_TIME, TITLE, VARIABLE, DEFAULT, BAR_CHART, VIDEO, SWITCH, PARAMS_SETTING_BUTTON, DASHBOARD_CHART } = this.enumComponentType | |
| 705 | 715 | this.setComponentPermission(LINE, [RUNNING_AND_STOP, DYNAMIC_EFFECT]) |
| 706 | 716 | this.setComponentPermission(DEFAULT, [DYNAMIC_EFFECT]) |
| 707 | 717 | this.setComponentPermission(REAL_TIME, [DYNAMIC_EFFECT]) |
| ... | ... | @@ -710,6 +720,7 @@ |
| 710 | 720 | this.setComponentPermission(VARIABLE, [DATA_SOURCE, INTERACTION, DYNAMIC_EFFECT]) |
| 711 | 721 | this.setComponentPermission(BAR_CHART, [DATA_SOURCE, BAR_CHART_EXPAND]) |
| 712 | 722 | this.setComponentPermission(LINE_CHART, [DATA_SOURCE, LINE_CHART_EXPAND]) |
| 723 | + this.setComponentPermission(DASHBOARD_CHART, [DATA_SOURCE, DASHBOARD_CHART_EXPAND]) | |
| 713 | 724 | this.setComponentPermission(VIDEO, [VIDEO_PANEL]) |
| 714 | 725 | this.setComponentPermission(SWITCH, [DATA_SOURCE, SWITCH_STATE_SETTING]) |
| 715 | 726 | this.setComponentPermission(PARAMS_SETTING_BUTTON, [DATA_SOURCE, ONLY_SINGLE_EVENT]) | ... | ... |
| ... | ... | @@ -70,6 +70,11 @@ |
| 70 | 70 | const cell = self.generatorCell(id, enumConst.CHART_IMG_PLACEHOLDER_SIZE, enumConst.CHART_IMG_PLACEHOLDER_SIZE, componentType.BAR_CHART, `${Proxy_Prefix}/images/thingskit/bar-chart.png`) |
| 71 | 71 | return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '柱状图'); |
| 72 | 72 | })), |
| 73 | + this.addEntry('dashboard chart', mxUtils.bind(this, function () { | |
| 74 | + const id = self.generatorChartsId() | |
| 75 | + const cell = self.generatorCell(id, enumConst.CHART_IMG_PLACEHOLDER_SIZE, enumConst.CHART_IMG_PLACEHOLDER_SIZE, componentType.DASHBOARD_CHART, `${Proxy_Prefix}/images/thingskit/dashboard-chart.png`) | |
| 76 | + return this.createVertexTemplateFromCells([cell], cell.geometry.width, cell.geometry.height, '仪表盘'); | |
| 77 | + })) | |
| 73 | 78 | ]; |
| 74 | 79 | |
| 75 | 80 | this.addPaletteFunctions('charts', '图表', false, fns); |
| ... | ... | @@ -89,42 +94,13 @@ |
| 89 | 94 | */ |
| 90 | 95 | Sidebar.prototype.chartOptionMapping = { |
| 91 | 96 | [Sidebar.prototype.enumComponentType.LINE_CHART]: function () { |
| 92 | - return { | |
| 93 | - xAxis: { | |
| 94 | - type: 'category', | |
| 95 | - data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], | |
| 96 | - }, | |
| 97 | - yAxis: { | |
| 98 | - type: 'value', | |
| 99 | - }, | |
| 100 | - series: [ | |
| 101 | - { | |
| 102 | - data: [150, 230, 224, 218, 135, 147, 260], | |
| 103 | - type: 'line', | |
| 104 | - }, | |
| 105 | - ], | |
| 106 | - } | |
| 97 | + return getLineChartDefaultOption() | |
| 107 | 98 | }, |
| 108 | 99 | [Sidebar.prototype.enumComponentType.BAR_CHART]: function () { |
| 109 | - return { | |
| 110 | - xAxis: { | |
| 111 | - type: 'category', | |
| 112 | - data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], | |
| 113 | - }, | |
| 114 | - yAxis: { | |
| 115 | - type: 'value', | |
| 116 | - }, | |
| 117 | - series: [ | |
| 118 | - { | |
| 119 | - data: [120, 200, 150, 80, 70, 110, 130], | |
| 120 | - type: 'bar', | |
| 121 | - showBackground: true, | |
| 122 | - backgroundStyle: { | |
| 123 | - color: 'rgba(180, 180, 180, 0.2)', | |
| 124 | - }, | |
| 125 | - }, | |
| 126 | - ], | |
| 127 | - }; | |
| 100 | + return getBarChartDefaultOption(); | |
| 101 | + }, | |
| 102 | + [Sidebar.prototype.enumComponentType.DASHBOARD_CHART]: function () { | |
| 103 | + return getDashboardDefaultOption() | |
| 128 | 104 | }, |
| 129 | 105 | } |
| 130 | 106 | |
| ... | ... | @@ -177,10 +153,11 @@ |
| 177 | 153 | * @returns {boolean} |
| 178 | 154 | */ |
| 179 | 155 | Sidebar.prototype.isChartCell = function (cell) { |
| 180 | - const basitAttr = this.enumCellBasicAttribute | |
| 156 | + const basicAttr = this.enumCellBasicAttribute | |
| 181 | 157 | const componentType = this.enumComponentType |
| 182 | - const currentType = cell.getAttribute(basitAttr.COMPONENT_TYPE) | |
| 183 | - return !!(currentType && (currentType === componentType.LINE_CHART || currentType === componentType.BAR_CHART)) | |
| 158 | + const { LINE_CHART, BAR_CHART, DASHBOARD_CHART } = componentType | |
| 159 | + const currentType = cell.getAttribute(basicAttr.COMPONENT_TYPE) | |
| 160 | + return !!(currentType && ([LINE_CHART, BAR_CHART, DASHBOARD_CHART].includes(currentType))) | |
| 184 | 161 | } |
| 185 | 162 | |
| 186 | 163 | /** |
| ... | ... | @@ -389,5 +366,157 @@ |
| 389 | 366 | // Sidebar.prototype.initChartInstance(graph) |
| 390 | 367 | // } |
| 391 | 368 | // } |
| 369 | + function getLineChartDefaultOption() { | |
| 370 | + return { | |
| 371 | + xAxis: { | |
| 372 | + type: 'category', | |
| 373 | + data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], | |
| 374 | + }, | |
| 375 | + yAxis: { | |
| 376 | + type: 'value', | |
| 377 | + }, | |
| 378 | + series: [ | |
| 379 | + { | |
| 380 | + data: [150, 230, 224, 218, 135, 147, 260], | |
| 381 | + type: 'line', | |
| 382 | + }, | |
| 383 | + ], | |
| 384 | + } | |
| 385 | + } | |
| 386 | + | |
| 387 | + function getBarChartDefaultOption() { | |
| 388 | + return { | |
| 389 | + xAxis: { | |
| 390 | + type: 'category', | |
| 391 | + data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], | |
| 392 | + }, | |
| 393 | + yAxis: { | |
| 394 | + type: 'value', | |
| 395 | + }, | |
| 396 | + series: [ | |
| 397 | + { | |
| 398 | + data: [120, 200, 150, 80, 70, 110, 130], | |
| 399 | + type: 'bar', | |
| 400 | + showBackground: true, | |
| 401 | + backgroundStyle: { | |
| 402 | + color: 'rgba(180, 180, 180, 0.2)', | |
| 403 | + }, | |
| 404 | + }, | |
| 405 | + ], | |
| 406 | + } | |
| 407 | + } | |
| 408 | + | |
| 409 | + function getDashboardDefaultOption() { | |
| 410 | + return { | |
| 411 | + series: [ | |
| 412 | + { | |
| 413 | + type: 'gauge', | |
| 414 | + center: ['50%', '60%'], | |
| 415 | + startAngle: 200, | |
| 416 | + endAngle: -20, | |
| 417 | + min: 0, | |
| 418 | + max: 60, | |
| 419 | + splitNumber: 12, | |
| 420 | + itemStyle: { | |
| 421 | + color: '#FFAB91' | |
| 422 | + }, | |
| 423 | + progress: { | |
| 424 | + show: true, | |
| 425 | + width: 30 | |
| 426 | + }, | |
| 427 | + pointer: { | |
| 428 | + show: false | |
| 429 | + }, | |
| 430 | + axisLine: { | |
| 431 | + lineStyle: { | |
| 432 | + width: 30 | |
| 433 | + } | |
| 434 | + }, | |
| 435 | + axisTick: { | |
| 436 | + distance: -45, | |
| 437 | + splitNumber: 5, | |
| 438 | + lineStyle: { | |
| 439 | + width: 2, | |
| 440 | + color: '#999' | |
| 441 | + } | |
| 442 | + }, | |
| 443 | + splitLine: { | |
| 444 | + distance: -52, | |
| 445 | + length: 14, | |
| 446 | + lineStyle: { | |
| 447 | + width: 3, | |
| 448 | + color: '#999' | |
| 449 | + } | |
| 450 | + }, | |
| 451 | + axisLabel: { | |
| 452 | + distance: -20, | |
| 453 | + color: '#999', | |
| 454 | + fontSize: 20 | |
| 455 | + }, | |
| 456 | + anchor: { | |
| 457 | + show: false | |
| 458 | + }, | |
| 459 | + title: { | |
| 460 | + show: false | |
| 461 | + }, | |
| 462 | + detail: { | |
| 463 | + valueAnimation: true, | |
| 464 | + width: '60%', | |
| 465 | + lineHeight: 40, | |
| 466 | + borderRadius: 8, | |
| 467 | + offsetCenter: [0, '-15%'], | |
| 468 | + fontSize: 25, | |
| 469 | + fontWeight: 'bolder', | |
| 470 | + formatter: '{value} °C', | |
| 471 | + color: 'auto' | |
| 472 | + }, | |
| 473 | + data: [ | |
| 474 | + { | |
| 475 | + value: 20 | |
| 476 | + } | |
| 477 | + ] | |
| 478 | + }, | |
| 479 | + { | |
| 480 | + type: 'gauge', | |
| 481 | + center: ['50%', '60%'], | |
| 482 | + startAngle: 200, | |
| 483 | + endAngle: -20, | |
| 484 | + min: 0, | |
| 485 | + max: 60, | |
| 486 | + itemStyle: { | |
| 487 | + color: '#FD7347' | |
| 488 | + }, | |
| 489 | + progress: { | |
| 490 | + show: true, | |
| 491 | + width: 8 | |
| 492 | + }, | |
| 493 | + pointer: { | |
| 494 | + show: false | |
| 495 | + }, | |
| 496 | + axisLine: { | |
| 497 | + show: false | |
| 498 | + }, | |
| 499 | + axisTick: { | |
| 500 | + show: false | |
| 501 | + }, | |
| 502 | + splitLine: { | |
| 503 | + show: false | |
| 504 | + }, | |
| 505 | + axisLabel: { | |
| 506 | + show: false | |
| 507 | + }, | |
| 508 | + detail: { | |
| 509 | + show: false | |
| 510 | + }, | |
| 511 | + data: [ | |
| 512 | + { | |
| 513 | + value: 20 | |
| 514 | + } | |
| 515 | + ] | |
| 516 | + } | |
| 517 | + ] | |
| 518 | + } | |
| 519 | + } | |
| 520 | + | |
| 392 | 521 | })(); |
| 393 | 522 | ... | ... |
| ... | ... | @@ -5123,12 +5123,13 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
| 5123 | 5123 | async function initNode() { |
| 5124 | 5124 | const basicAttr = sidebarInstance.enumCellBasicAttribute |
| 5125 | 5125 | const permissionKey = sidebarInstance.enumPermissionPanel |
| 5126 | - | |
| 5126 | + const { LINE_CHART, BAR_CHART, DASHBOARD_CHART } = Sidebar.prototype.enumComponentType | |
| 5127 | 5127 | |
| 5128 | 5128 | const renderMapping = { |
| 5129 | 5129 | [permissionKey.DATA_SOURCE]: createDataSourcePanel, |
| 5130 | - [permissionKey.LINE_CHART_EXPAND]: createLineChartPanel, | |
| 5131 | - [permissionKey.BAR_CHART_EXPAND]: createBarChartPanel, | |
| 5130 | + [permissionKey.LINE_CHART_EXPAND]: createChartBindPanel.bind(this, LINE_CHART), | |
| 5131 | + [permissionKey.BAR_CHART_EXPAND]: createChartBindPanel.bind(this, BAR_CHART), | |
| 5132 | + [permissionKey.DASHBOARD_CHART_EXPAND]: createChartBindPanel.bind(this, DASHBOARD_CHART), | |
| 5132 | 5133 | [permissionKey.INTERACTION]: createInteractionPanel, |
| 5133 | 5134 | [permissionKey.DYNAMIC_EFFECT]: createDynamicEffectPanel, |
| 5134 | 5135 | [permissionKey.VAR_IMAGE]: createVarImagePanel, |
| ... | ... | @@ -5259,13 +5260,20 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
| 5259 | 5260 | } |
| 5260 | 5261 | |
| 5261 | 5262 | function createLineChartPanel() { |
| 5263 | + const { LINE_CHART } = Sidebar.prototype.enumComponentType | |
| 5262 | 5264 | createChartBindPanel(true) |
| 5263 | 5265 | } |
| 5264 | 5266 | |
| 5265 | 5267 | function createBarChartPanel() { |
| 5268 | + const { LINE_CHART } = Sidebar.prototype.enumComponentType | |
| 5269 | + | |
| 5266 | 5270 | createChartBindPanel(false) |
| 5267 | 5271 | } |
| 5268 | 5272 | |
| 5273 | + function createDashboardPanel() { | |
| 5274 | + const { LINE_CHART } = Sidebar.prototype.enumComponentType | |
| 5275 | + | |
| 5276 | + } | |
| 5269 | 5277 | /** |
| 5270 | 5278 | * @description 创建视频绑定面板 |
| 5271 | 5279 | */ |
| ... | ... | @@ -5427,7 +5435,7 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
| 5427 | 5435 | * @description 是否是折线图 |
| 5428 | 5436 | * @param {boolean} isLineChart |
| 5429 | 5437 | */ |
| 5430 | - function createChartBindPanel(isLineChart) { | |
| 5438 | + function createChartBindPanel(chartType) { | |
| 5431 | 5439 | const fragment = document.createDocumentFragment() |
| 5432 | 5440 | const chartBindContainer = document.createElement('div') |
| 5433 | 5441 | chartBindContainer.setAttribute('class', 'chart-panel__style') |
| ... | ... | @@ -5705,14 +5713,27 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
| 5705 | 5713 | { id: 'NONE', name: '空' }, |
| 5706 | 5714 | ] |
| 5707 | 5715 | |
| 5716 | + function generateDataType() { | |
| 5717 | + const { LINE_CHART, BAR_CHART, DASHBOARD_CHART } = Sidebar.prototype.enumComponentType | |
| 5718 | + const realOption = (checked) => `<input type="radio" name="${enumConst.DATA_TYPE}" value="${enumConst.REAL}" title="实时" ${checked ? 'checked' : ''}>` | |
| 5719 | + const historyOption = (checked) => `<input type="radio" name="${enumConst.DATA_TYPE}" value="${enumConst.HISTORY}" title="历史" ${checked ? 'checked' : ''}>` | |
| 5720 | + | |
| 5721 | + if (chartType === LINE_CHART) { | |
| 5722 | + return realOption() + historyOption(true) | |
| 5723 | + } else if (chartType === BAR_CHART) { | |
| 5724 | + return historyOption(true) | |
| 5725 | + } else if (chartType === DASHBOARD_CHART) { | |
| 5726 | + return realOption(true) | |
| 5727 | + } | |
| 5728 | + return realOption() + historyOption(true) | |
| 5729 | + } | |
| 5730 | + | |
| 5708 | 5731 | function createSwitchBindTypeRadio() { |
| 5709 | - const realOption = `<input type="radio" name="${enumConst.DATA_TYPE}" value="${enumConst.REAL}" title="实时">` | |
| 5710 | 5732 | return ` |
| 5711 | 5733 | <div class="layui-form-item"> |
| 5712 | 5734 | <label class="layui-form-label">数据类型</label> |
| 5713 | 5735 | <div class="layui-input-block"> |
| 5714 | - ${isLineChart ? realOption : ''} | |
| 5715 | - <input type="radio" name="${enumConst.DATA_TYPE}" value="${enumConst.HISTORY}" title="历史" checked> | |
| 5736 | + ${generateDataType()} | |
| 5716 | 5737 | </div> |
| 5717 | 5738 | </div>` |
| 5718 | 5739 | } |
| ... | ... | @@ -5882,6 +5903,7 @@ DataFormatPanel.prototype.addDataFont = function (container) { |
| 5882 | 5903 | [componentType.REAL_TIME]: getSubmitValue, |
| 5883 | 5904 | [componentType.LINE_CHART]: getSubmitValue, |
| 5884 | 5905 | [componentType.BAR_CHART]: getSubmitValue, |
| 5906 | + [componentType.DASHBOARD_CHART]: getSubmitValue, | |
| 5885 | 5907 | [componentType.DEFAULT]: getSubmitValue, |
| 5886 | 5908 | [componentType.VIDEO]: getVideoSubmitValue, |
| 5887 | 5909 | [componentType.SWITCH]: getSwitchSubmitValue, |
| ... | ... | @@ -13462,139 +13484,21 @@ class HandleDataSource { |
| 13462 | 13484 | const instance = chartInstanceMap.get(chartInstanceId) |
| 13463 | 13485 | const { attr = [[]] } = this.getBindData(subscriptionId) |
| 13464 | 13486 | const realDataList = data[attr] || [] |
| 13465 | - const showNumberOf = 4 | |
| 13466 | - const action = agg === 'NONE' ? 'unshift' : 'push' | |
| 13467 | 13487 | |
| 13468 | - // const chartWidth = node.getAttribute('width') | |
| 13469 | - // const chartHeight = node.getAttribute('height') | |
| 13488 | + const action = agg === 'NONE' ? 'unshift' : 'push' | |
| 13470 | 13489 | |
| 13471 | 13490 | // chart insstance 是否已经接受过一次消息推送 |
| 13472 | 13491 | const isActive = instance.isActive |
| 13473 | 13492 | if (!isActive) { |
| 13474 | 13493 | instance.isActive = true |
| 13475 | - const xAxisData = [] | |
| 13476 | - const seriesValue = [] | |
| 13477 | - const chartOption = { | |
| 13478 | - title: { | |
| 13479 | - subtext: realDataList.length ? '' : '暂无数据', | |
| 13480 | - x: 'center', | |
| 13481 | - y: 'center', | |
| 13482 | - itemGap: -20, | |
| 13483 | - subtextStyle: { | |
| 13484 | - fontSize: 16 | |
| 13485 | - } | |
| 13486 | - }, | |
| 13487 | - tooltip: { | |
| 13488 | - trigger: 'axis', | |
| 13489 | - axisPointer: { | |
| 13490 | - type: 'shadow' | |
| 13491 | - } | |
| 13492 | - }, | |
| 13493 | - grid: { | |
| 13494 | - left: '3%', | |
| 13495 | - right: '3%', | |
| 13496 | - bottom: '3%', | |
| 13497 | - containLabel: true, | |
| 13498 | - }, | |
| 13499 | - xAxis: { | |
| 13500 | - type: 'category', | |
| 13501 | - data: xAxisData, | |
| 13502 | - boundaryGap: true, | |
| 13503 | - axisLabel: { | |
| 13504 | - rotate: 70 | |
| 13505 | - }, | |
| 13506 | - axisPointer: { | |
| 13507 | - label: { | |
| 13508 | - formatter() { | |
| 13509 | - return attr | |
| 13510 | - } | |
| 13511 | - } | |
| 13512 | - } | |
| 13513 | - }, | |
| 13514 | - yAxis: { | |
| 13515 | - type: 'value' | |
| 13516 | - }, | |
| 13517 | - series: [ | |
| 13518 | - { | |
| 13519 | - data: seriesValue, | |
| 13520 | - type: chartInstanceType.includes('bar') ? 'bar' : 'line' | |
| 13521 | - } | |
| 13522 | - ], | |
| 13523 | - dataZoom: [ | |
| 13524 | - { | |
| 13525 | - show: true, | |
| 13526 | - type: 'inside', | |
| 13527 | - // endValue: showNumberOf | |
| 13528 | - } | |
| 13529 | - ] | |
| 13530 | - } | |
| 13531 | - | |
| 13532 | - // for (let i = realDataList.length - 1; i >= 0; i--) { | |
| 13533 | - // const [timespan, value] = realDataList[i] | |
| 13534 | - // xAxisData.push(new Date(Number(timespan)).toLocaleTimeString()) | |
| 13535 | - // seriesValue.push(Number(value)) | |
| 13536 | - // } | |
| 13537 | - realDataList.forEach(item => { | |
| 13538 | - const [timespan, value] = item | |
| 13539 | - xAxisData[action](new Date(Number(timespan)).toLocaleTimeString()) | |
| 13540 | - seriesValue[action](Number(value)) | |
| 13541 | - }) | |
| 13542 | - | |
| 13494 | + const chartOption = this.getChartComponentOption(chartInstanceType, { chartType: chartInstanceType, attr, dataList: realDataList, action }) | |
| 13543 | 13495 | instance.setOption(chartOption) |
| 13544 | 13496 | |
| 13545 | 13497 | } else { |
| 13546 | 13498 | const oldOptions = instance.getOption() |
| 13547 | - const xAxisData = oldOptions.xAxis[0].data || [] | |
| 13548 | - const seriesValue = oldOptions.series[0].data || [] | |
| 13549 | - const oldEndValue = Number(oldOptions.dataZoom[0].endValue) || 0 | |
| 13550 | - const oldStartValue = Number(oldOptions.dataZoom[0].startValue) || 0 | |
| 13551 | - | |
| 13552 | - for (let i = realDataList.length - 1; i >= 0; i--) { | |
| 13553 | - const [timespan, value] = realDataList[i] | |
| 13554 | - xAxisData.push(new Date(Number(timespan)).toLocaleTimeString()) | |
| 13555 | - seriesValue.push(Number(value)) | |
| 13556 | - } | |
| 13557 | - | |
| 13558 | - if (Number(oldOptions.dataZoom[0].endValue) === seriesValue.length - 1) { | |
| 13559 | - oldOptions.dataZoom[0].endValue = showNumberOf | |
| 13560 | - oldOptions.dataZoom[0].startValue = 0 | |
| 13561 | - } else { | |
| 13562 | - oldOptions.dataZoom[0].endValue = oldOptions.dataZoom[0].endValue + 1 | |
| 13563 | - oldOptions.dataZoom[0].startValue = oldOptions.dataZoom[0].startValue + 1 | |
| 13564 | - } | |
| 13565 | - | |
| 13499 | + const options = this.getRealTimeUpdateChartOption(chartInstanceType, { oldOptions, dataList: realDataList }) | |
| 13566 | 13500 | if (!instance) clearInterval(interval) |
| 13567 | - instance && instance.setOption({ | |
| 13568 | - title: { | |
| 13569 | - subtext: '' | |
| 13570 | - }, | |
| 13571 | - xAxis: { | |
| 13572 | - data: xAxisData | |
| 13573 | - }, | |
| 13574 | - series: [ | |
| 13575 | - { | |
| 13576 | - data: seriesValue | |
| 13577 | - } | |
| 13578 | - ], | |
| 13579 | - dataZoom: [ | |
| 13580 | - { | |
| 13581 | - show: true, | |
| 13582 | - type: 'inside', | |
| 13583 | - } | |
| 13584 | - // { | |
| 13585 | - // startValue: seriesValue.length - 1 > showNumberOf | |
| 13586 | - // ? oldStartValue === seriesValue.length - 1 | |
| 13587 | - // ? 0 | |
| 13588 | - // : oldStartValue + 1 | |
| 13589 | - // : 0, | |
| 13590 | - // endValue: seriesValue.length - 1 > showNumberOf | |
| 13591 | - // ? oldEndValue === seriesValue.length - 1 | |
| 13592 | - // ? showNumberOf | |
| 13593 | - // : oldEndValue + 1 | |
| 13594 | - // : showNumberOf | |
| 13595 | - // } | |
| 13596 | - ] | |
| 13597 | - }) | |
| 13501 | + instance && instance.setOption(options) | |
| 13598 | 13502 | } |
| 13599 | 13503 | } |
| 13600 | 13504 | |
| ... | ... | @@ -13614,13 +13518,93 @@ class HandleDataSource { |
| 13614 | 13518 | const historyDataList = data[attr] || [] |
| 13615 | 13519 | const showNumberOf = 4 |
| 13616 | 13520 | const action = agg === 'NONE' ? 'unshift' : 'push' |
| 13521 | + const chartType = chartInstanceType.includes('bar') ? 'bar' : chartInstanceType.includes('line') ? 'line' : chartInstanceType.includes('dashboard') ? '' : '' | |
| 13617 | 13522 | |
| 13523 | + const chartOption = this.getChartComponentOption(chartInstanceType, { dataList: historyDataList, attr, chartType: chartInstanceType, action }) | |
| 13524 | + | |
| 13525 | + let interval | |
| 13526 | + // TODO 清除定时器 | |
| 13527 | + function autoMove() { | |
| 13528 | + if (seriesValue.length <= 5) return | |
| 13529 | + interval = setInterval(() => { | |
| 13530 | + if (Number(chartOption.dataZoom[0].endValue) === seriesValue.length - 1) { | |
| 13531 | + chartOption.dataZoom[0].endValue = showNumberOf | |
| 13532 | + chartOption.dataZoom[0].startValue = 0 | |
| 13533 | + } else { | |
| 13534 | + chartOption.dataZoom[0].endValue = chartOption.dataZoom[0].endValue + 1 | |
| 13535 | + chartOption.dataZoom[0].startValue = chartOption.dataZoom[0].startValue + 1 | |
| 13536 | + } | |
| 13537 | + if (!chartInstanceMap.has(chartInstanceId)) { | |
| 13538 | + clearInterval(interval) | |
| 13539 | + return | |
| 13540 | + } | |
| 13541 | + instance && instance.setOption(chartOption) | |
| 13542 | + | |
| 13543 | + }, 2000); | |
| 13544 | + } | |
| 13545 | + | |
| 13546 | + function stop() { | |
| 13547 | + clearInterval(interval) | |
| 13548 | + } | |
| 13549 | + | |
| 13550 | + function goMove() { | |
| 13551 | + autoMove() | |
| 13552 | + } | |
| 13553 | + | |
| 13554 | + instance.setOption(chartOption) | |
| 13555 | + // instance.on('mouseover', stop) | |
| 13556 | + // instance.on('mouseout', goMove) | |
| 13557 | + // autoMove() | |
| 13558 | + } | |
| 13559 | + | |
| 13560 | + getChartComponentOption(chartInstanceType, params) { | |
| 13561 | + const { LINE_CHART, BAR_CHART, DASHBOARD_CHART } = Sidebar.prototype.enumComponentType | |
| 13562 | + switch (chartInstanceType) { | |
| 13563 | + case LINE_CHART: | |
| 13564 | + return this.getBasicChartOption(Object.assign(params, { chartType: 'line' })) | |
| 13565 | + case BAR_CHART: | |
| 13566 | + return this.getBasicChartOption(Object.assign(params, { chartType: 'bar' })) | |
| 13567 | + case DASHBOARD_CHART: | |
| 13568 | + return this.getDashboardChartOption(params) | |
| 13569 | + default: | |
| 13570 | + return {} | |
| 13571 | + } | |
| 13572 | + } | |
| 13573 | + | |
| 13574 | + getRealTimeUpdateChartOption(chartInstanceType, params) { | |
| 13575 | + const { LINE_CHART, BAR_CHART, DASHBOARD_CHART } = Sidebar.prototype.enumComponentType | |
| 13576 | + switch (chartInstanceType) { | |
| 13577 | + case LINE_CHART: | |
| 13578 | + return this.getRealTimeUpdateBasicChartOption(params) | |
| 13579 | + case BAR_CHART: | |
| 13580 | + return this.getRealTimeUpdateBasicChartOption(params) | |
| 13581 | + case DASHBOARD_CHART: | |
| 13582 | + return this.getRealTimeUpdateDashboardChartOption(params) | |
| 13583 | + default: | |
| 13584 | + return {} | |
| 13585 | + } | |
| 13586 | + } | |
| 13587 | + | |
| 13588 | + /** | |
| 13589 | + * | |
| 13590 | + * @param {@} params | |
| 13591 | + * @returns | |
| 13592 | + */ | |
| 13593 | + getBasicChartOption(params = { dataList: [], attr: '', chartType: 'bar', action }) { | |
| 13594 | + const { dataList = [], attr = '', chartType = 'bar', action } = params | |
| 13618 | 13595 | |
| 13619 | 13596 | const xAxisData = [] |
| 13620 | 13597 | const seriesValue = [] |
| 13621 | - const chartOption = { | |
| 13598 | + | |
| 13599 | + dataList.forEach(item => { | |
| 13600 | + const [timespan, value] = item | |
| 13601 | + xAxisData[action](new Date(Number(timespan)).toLocaleTimeString()) | |
| 13602 | + seriesValue[action](Number(value)) | |
| 13603 | + }) | |
| 13604 | + | |
| 13605 | + return { | |
| 13622 | 13606 | title: { |
| 13623 | - subtext: historyDataList.length ? '' : '暂无数据', | |
| 13607 | + subtext: dataList.length ? '' : '暂无数据', | |
| 13624 | 13608 | x: 'center', |
| 13625 | 13609 | y: 'center', |
| 13626 | 13610 | itemGap: -20, |
| ... | ... | @@ -13662,59 +13646,199 @@ class HandleDataSource { |
| 13662 | 13646 | series: [ |
| 13663 | 13647 | { |
| 13664 | 13648 | data: seriesValue, |
| 13665 | - type: chartInstanceType.includes('bar') ? 'bar' : 'line', | |
| 13649 | + type: chartType, | |
| 13666 | 13650 | } |
| 13667 | 13651 | ], |
| 13668 | 13652 | dataZoom: [ |
| 13669 | 13653 | { |
| 13670 | - // xAxisIndex: 0, | |
| 13671 | 13654 | show: true, |
| 13672 | - type: 'inside', | |
| 13673 | - // startValue: 0, | |
| 13674 | - // endValue: showNumberOf | |
| 13655 | + type: 'inside' | |
| 13675 | 13656 | } |
| 13676 | 13657 | ] |
| 13677 | 13658 | } |
| 13659 | + } | |
| 13678 | 13660 | |
| 13679 | - historyDataList.forEach(item => { | |
| 13680 | - const [timespan, value] = item | |
| 13681 | - xAxisData[action](new Date(Number(timespan)).toLocaleTimeString()) | |
| 13682 | - seriesValue[action](Number(value)) | |
| 13683 | - }) | |
| 13661 | + getRealTimeUpdateBasicChartOption(params = { oldOptions: {}, dataList: [] }) { | |
| 13662 | + const { oldOptions, dataList } = params | |
| 13663 | + const xAxisData = oldOptions.xAxis[0].data || [] | |
| 13664 | + const seriesValue = oldOptions.series[0].data || [] | |
| 13665 | + const oldEndValue = Number(oldOptions.dataZoom[0].endValue) || 0 | |
| 13666 | + const oldStartValue = Number(oldOptions.dataZoom[0].startValue) || 0 | |
| 13667 | + const showNumberOf = 4 | |
| 13684 | 13668 | |
| 13685 | - let interval | |
| 13686 | - // TODO 清除定时器 | |
| 13687 | - function autoMove() { | |
| 13688 | - if (seriesValue.length <= 5) return | |
| 13689 | - interval = setInterval(() => { | |
| 13690 | - if (Number(chartOption.dataZoom[0].endValue) === seriesValue.length - 1) { | |
| 13691 | - chartOption.dataZoom[0].endValue = showNumberOf | |
| 13692 | - chartOption.dataZoom[0].startValue = 0 | |
| 13693 | - } else { | |
| 13694 | - chartOption.dataZoom[0].endValue = chartOption.dataZoom[0].endValue + 1 | |
| 13695 | - chartOption.dataZoom[0].startValue = chartOption.dataZoom[0].startValue + 1 | |
| 13696 | - } | |
| 13697 | - if (!chartInstanceMap.has(chartInstanceId)) { | |
| 13698 | - clearInterval(interval) | |
| 13699 | - return | |
| 13700 | - } | |
| 13701 | - instance && instance.setOption(chartOption) | |
| 13669 | + for (let i = dataList.length - 1; i >= 0; i--) { | |
| 13670 | + const [timespan, value] = dataList[i] | |
| 13671 | + xAxisData.push(new Date(Number(timespan)).toLocaleTimeString()) | |
| 13672 | + seriesValue.push(Number(value)) | |
| 13673 | + } | |
| 13702 | 13674 | |
| 13703 | - }, 2000); | |
| 13675 | + if (Number(oldOptions.dataZoom[0].endValue) === seriesValue.length - 1) { | |
| 13676 | + oldOptions.dataZoom[0].endValue = showNumberOf | |
| 13677 | + oldOptions.dataZoom[0].startValue = 0 | |
| 13678 | + } else { | |
| 13679 | + oldOptions.dataZoom[0].endValue = oldOptions.dataZoom[0].endValue + 1 | |
| 13680 | + oldOptions.dataZoom[0].startValue = oldOptions.dataZoom[0].startValue + 1 | |
| 13704 | 13681 | } |
| 13705 | 13682 | |
| 13706 | - function stop() { | |
| 13707 | - clearInterval(interval) | |
| 13683 | + return { | |
| 13684 | + title: { | |
| 13685 | + subtext: '' | |
| 13686 | + }, | |
| 13687 | + xAxis: { | |
| 13688 | + data: xAxisData | |
| 13689 | + }, | |
| 13690 | + series: [ | |
| 13691 | + { | |
| 13692 | + data: seriesValue | |
| 13693 | + } | |
| 13694 | + ], | |
| 13695 | + dataZoom: [ | |
| 13696 | + { | |
| 13697 | + show: true, | |
| 13698 | + type: 'inside', | |
| 13699 | + } | |
| 13700 | + ] | |
| 13708 | 13701 | } |
| 13702 | + } | |
| 13709 | 13703 | |
| 13710 | - function goMove() { | |
| 13711 | - autoMove() | |
| 13704 | + getDashboardChartOption(params = { dataList: [] }) { | |
| 13705 | + const { dataList = [] } = params | |
| 13706 | + const [timespan, value] = dataList[0] || [] | |
| 13707 | + return { | |
| 13708 | + series: [ | |
| 13709 | + { | |
| 13710 | + type: 'gauge', | |
| 13711 | + center: ['50%', '60%'], | |
| 13712 | + startAngle: 200, | |
| 13713 | + endAngle: -20, | |
| 13714 | + min: 0, | |
| 13715 | + max: 60, | |
| 13716 | + splitNumber: 12, | |
| 13717 | + itemStyle: { | |
| 13718 | + color: '#FFAB91' | |
| 13719 | + }, | |
| 13720 | + progress: { | |
| 13721 | + show: true, | |
| 13722 | + width: 30 | |
| 13723 | + }, | |
| 13724 | + pointer: { | |
| 13725 | + show: false | |
| 13726 | + }, | |
| 13727 | + axisLine: { | |
| 13728 | + lineStyle: { | |
| 13729 | + width: 30 | |
| 13730 | + } | |
| 13731 | + }, | |
| 13732 | + axisTick: { | |
| 13733 | + distance: -45, | |
| 13734 | + splitNumber: 5, | |
| 13735 | + lineStyle: { | |
| 13736 | + width: 2, | |
| 13737 | + color: '#999' | |
| 13738 | + } | |
| 13739 | + }, | |
| 13740 | + splitLine: { | |
| 13741 | + distance: -52, | |
| 13742 | + length: 14, | |
| 13743 | + lineStyle: { | |
| 13744 | + width: 3, | |
| 13745 | + color: '#999' | |
| 13746 | + } | |
| 13747 | + }, | |
| 13748 | + axisLabel: { | |
| 13749 | + distance: -20, | |
| 13750 | + color: '#999', | |
| 13751 | + fontSize: 20 | |
| 13752 | + }, | |
| 13753 | + anchor: { | |
| 13754 | + show: false | |
| 13755 | + }, | |
| 13756 | + title: { | |
| 13757 | + show: false | |
| 13758 | + }, | |
| 13759 | + detail: { | |
| 13760 | + valueAnimation: true, | |
| 13761 | + width: '60%', | |
| 13762 | + lineHeight: 40, | |
| 13763 | + borderRadius: 8, | |
| 13764 | + offsetCenter: [0, '-15%'], | |
| 13765 | + fontSize: 25, | |
| 13766 | + fontWeight: 'bolder', | |
| 13767 | + formatter: '{value} °C', | |
| 13768 | + color: 'auto' | |
| 13769 | + }, | |
| 13770 | + data: [ | |
| 13771 | + { | |
| 13772 | + value | |
| 13773 | + } | |
| 13774 | + ] | |
| 13775 | + }, | |
| 13776 | + { | |
| 13777 | + type: 'gauge', | |
| 13778 | + center: ['50%', '60%'], | |
| 13779 | + startAngle: 200, | |
| 13780 | + endAngle: -20, | |
| 13781 | + min: 0, | |
| 13782 | + max: 60, | |
| 13783 | + itemStyle: { | |
| 13784 | + color: '#FD7347' | |
| 13785 | + }, | |
| 13786 | + progress: { | |
| 13787 | + show: true, | |
| 13788 | + width: 8 | |
| 13789 | + }, | |
| 13790 | + pointer: { | |
| 13791 | + show: false | |
| 13792 | + }, | |
| 13793 | + axisLine: { | |
| 13794 | + show: false | |
| 13795 | + }, | |
| 13796 | + axisTick: { | |
| 13797 | + show: false | |
| 13798 | + }, | |
| 13799 | + splitLine: { | |
| 13800 | + show: false | |
| 13801 | + }, | |
| 13802 | + axisLabel: { | |
| 13803 | + show: false | |
| 13804 | + }, | |
| 13805 | + detail: { | |
| 13806 | + show: false | |
| 13807 | + }, | |
| 13808 | + data: [ | |
| 13809 | + { | |
| 13810 | + value | |
| 13811 | + } | |
| 13812 | + ] | |
| 13813 | + } | |
| 13814 | + ] | |
| 13712 | 13815 | } |
| 13816 | + } | |
| 13713 | 13817 | |
| 13714 | - instance.setOption(chartOption) | |
| 13715 | - // instance.on('mouseover', stop) | |
| 13716 | - // instance.on('mouseout', goMove) | |
| 13717 | - // autoMove() | |
| 13818 | + /** | |
| 13819 | + * @description 获取仪表盘配置 | |
| 13820 | + */ | |
| 13821 | + getRealTimeUpdateDashboardChartOption(params = { dataList: [] }) { | |
| 13822 | + const { dataList = [] } = params | |
| 13823 | + const [timespan, value] = dataList[0] || [] | |
| 13824 | + return { | |
| 13825 | + series: [ | |
| 13826 | + { | |
| 13827 | + data: [ | |
| 13828 | + { | |
| 13829 | + value | |
| 13830 | + } | |
| 13831 | + ] | |
| 13832 | + }, | |
| 13833 | + { | |
| 13834 | + data: [ | |
| 13835 | + { | |
| 13836 | + value | |
| 13837 | + } | |
| 13838 | + ] | |
| 13839 | + } | |
| 13840 | + ] | |
| 13841 | + } | |
| 13718 | 13842 | } |
| 13719 | 13843 | |
| 13720 | 13844 | /** | ... | ... |