diff --git a/report-core/src/main/resources/db/migration/V1.0.8__add_dict_category.sql b/report-core/src/main/resources/db/migration/V1.0.8__add_dict_category.sql new file mode 100644 index 0000000000000000000000000000000000000000..883a8d052b3d3872aed7bdbcac3680f253eed6da --- /dev/null +++ b/report-core/src/main/resources/db/migration/V1.0.8__add_dict_category.sql @@ -0,0 +1,4 @@ +/* +字典更新 +*/ +INSERT INTO `aj_report`.`gaea_dict_item`(`dict_code`, `item_name`, `item_value`, `item_extend`, `enabled`, `locale`, `remark`, `sort`, `create_by`, `create_time`, `update_by`, `update_time`, `version`) VALUES ('CHART_PROPERTIES', '维度类别', 'category', NULL, 1, 'zh', NULL, 11, 'admin', now(), 'admin', now(), 1); diff --git a/report-ui/src/mixins/queryform.js b/report-ui/src/mixins/queryform.js index c368c32b268eb833f7cbe32f2c047613cc9d8841..c5dfd46a700f1b6a2532af20979662a6b319bce5 100644 --- a/report-ui/src/mixins/queryform.js +++ b/report-ui/src/mixins/queryform.js @@ -1,4 +1,5 @@ import miment from 'miment' +import _ from 'lodash' import {getData} from '@/api/bigscreen' export default { @@ -134,6 +135,41 @@ export default { const ananysicData = {}; const xAxisList = []; const series = []; + const types = Object.values(chartProperties) + + if (types.includes('category')) { + const categoryField = Object.keys(chartProperties)[types.indexOf('category')] + let xAxisListTmp = types.filter(item => item.startsWith('xAxis')) + if (xAxisListTmp.length === 0) { + // 未选择横坐标 + return { + xAxis: [], + series: [] + } + } + const xAxisField = Object.keys(chartProperties)[types.indexOf(xAxisListTmp[0])] + const xAxisList = _.sortBy(_.uniqWith(data.map(item => item[xAxisField]))) + const chartDatagroup = _.groupBy(data, categoryField) + for (let property in chartProperties) { + if (chartProperties[property] !== 'category' && !chartProperties[property].startsWith('xAxis')) { + Object.keys(chartDatagroup).forEach(groupKey => { + const data = new Array(xAxisList.length).fill(0); + chartDatagroup[groupKey].forEach(item => { + data[xAxisList.indexOf(item[xAxisField])]= item[property] + }) + series.push({ + name: groupKey, + type: chartProperties[property], + data, + }) + }) + } + } + ananysicData["xAxis"] = xAxisList; + ananysicData["series"] = series; + return ananysicData; + } + for (const key in chartProperties) { const obj = {}; const seriesData = []; diff --git a/report-ui/src/views/report/bigscreen/designer/tools.js b/report-ui/src/views/report/bigscreen/designer/tools.js index 77046c33a9fcc449e291bd81b83b85ef3cddf287..36c1188016fb36c8f2c1fa97d6a4fa14fd65e545 100644 --- a/report-ui/src/views/report/bigscreen/designer/tools.js +++ b/report-ui/src/views/report/bigscreen/designer/tools.js @@ -1276,6 +1276,14 @@ const widgetTools = [ placeholder: '', value: false, }, + { + type: 'el-switch', + label: '堆叠展示', + name: 'stackShow', + required: false, + placeholder: '', + value: false, + }, { type: 'vue-color', label: '背景颜色', diff --git a/report-ui/src/views/report/bigscreen/designer/widget/widgetBarchart.vue b/report-ui/src/views/report/bigscreen/designer/widget/widgetBarchart.vue index 60153910745fb2638cd3cb80e0a1de7262428edf..2ce79b23b9bb8be51d649ba42605fa0069763abd 100644 --- a/report-ui/src/views/report/bigscreen/designer/widget/widgetBarchart.vue +++ b/report-ui/src/views/report/bigscreen/designer/widget/widgetBarchart.vue @@ -210,6 +210,11 @@ export default { color: optionsCollapse.subTextColor, fontWeight: optionsCollapse.fontWeight }; + if (optionsCollapse.stackShow) { + series[key].stack = 'total' + } else { + delete series[key].stack; + } series[key].barWidth = optionsCollapse.maxWidth; series[key].barMinHeight = optionsCollapse.minHeight; } @@ -259,7 +264,7 @@ export default { legend.itemWidth = optionsCollapse.lengedWidth; }, // 图例颜色修改 - setOptionsColor() { + setOptionsColor(isCategory = false) { const optionsCollapse = this.optionsSetup; const customColor = optionsCollapse.customColor; if (!customColor) return; @@ -267,17 +272,40 @@ export default { for (let i = 0; i < customColor.length; i++) { arrColor.push(customColor[i].color); } - const itemStyle = { - normal: { - color: params => { - return arrColor[params.dataIndex]; - }, - barBorderRadius: optionsCollapse.radius - } - }; + + const optionsData = this.optionsData; + if (optionsData.dataType === 'dynamicData') { + isCategory = isCategory || Object.values(optionsData.dynamicData.chartProperties).includes('category') + } + + let itemStyle = isCategory ? [] : {} + if (isCategory) { + arrColor.forEach(color => { + itemStyle.push({ + normal: { + color, + barBorderRadius: optionsCollapse.radius + } + }) + }) + } else { + itemStyle = { + normal: { + color: params => { + return arrColor[params.dataIndex]; + }, + barBorderRadius: optionsCollapse.radius + } + }; + } + for (const key in this.options.series) { if (this.options.series[key].type == "bar") { - this.options.series[key].itemStyle = itemStyle; + if (isCategory) { + this.options.series[key].itemStyle = itemStyle[key % itemStyle.length]; + } else { + this.options.series[key].itemStyle = itemStyle; + } } } this.options = Object.assign({}, this.options); @@ -351,6 +379,11 @@ export default { // series const series = this.options.series; + if (val.series.filter(item => item.type === 'bar').length !== series.length) { + this.options.series = val.series; + this.setOptionsColor(true) + return; + } for (const i in series) { if (series[i].type == "bar") { series[i].data = val.series[i].data; diff --git a/report-ui/src/views/report/bigscreen/designer/widget/widgetLinechart.vue b/report-ui/src/views/report/bigscreen/designer/widget/widgetLinechart.vue index 12ff88fdbd3d743d4c2cdbb631a53c3e908c895a..fca42d4d2379ccf963c53e7588eb34fa4a075bf0 100644 --- a/report-ui/src/views/report/bigscreen/designer/widget/widgetLinechart.vue +++ b/report-ui/src/views/report/bigscreen/designer/widget/widgetLinechart.vue @@ -330,6 +330,11 @@ export default { this.options.xAxis.data = val.xAxis; // series const series = this.options.series; + if (val.series.filter(item => item.type === 'bar').length !== series.length) { + this.options.series = val.series; + this.setOptionsColor() + return; + } for (const i in series) { if (series[i].type == "line") { series[i].data = val.series[i].data;