From 4bafcaeb972eee0d8c0d97877ad44603ed9e7c26 Mon Sep 17 00:00:00 2001 From: ulleo Date: Thu, 14 Dec 2023 11:24:26 +0800 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20AntV=E6=97=B6=E9=97=B4=E6=9D=A1?= =?UTF-8?q?=E5=BD=A2=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/chart/ChartViewService.java | 6 +- .../service/chart/util/ChartDataBuild.java | 115 ++++++++++++++++ .../frontend/src/icons/svg/bar-time-range.svg | 8 ++ core/frontend/src/lang/en.js | 1 + core/frontend/src/lang/tw.js | 1 + core/frontend/src/lang/zh.js | 1 + .../src/views/chart/chart/bar/bar_antv.js | 124 ++++++++++++++++++ .../views/chart/chart/common/common_antv.js | 11 +- core/frontend/src/views/chart/chart/util.js | 81 +++++++++++- .../chart/components/ChartComponentG2.vue | 12 +- .../componentStyle/XAxisSelectorAntV.vue | 16 ++- .../componentStyle/YAxisSelectorAntV.vue | 16 ++- .../components/dragItem/DimensionExtItem.vue | 4 +- .../src/views/chart/view/ChartEdit.vue | 22 +++- .../src/views/chart/view/ChartStyle.vue | 4 +- 15 files changed, 393 insertions(+), 29 deletions(-) create mode 100644 core/frontend/src/icons/svg/bar-time-range.svg diff --git a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 414025dfac..2e9d20e30c 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -636,7 +636,9 @@ public class ChartViewService { if (StringUtils.equalsIgnoreCase(view.getType(), "table-pivot") || StringUtils.containsIgnoreCase(view.getType(), "group") || ("antv".equalsIgnoreCase(view.getRender()) && "line".equalsIgnoreCase(view.getType())) - || StringUtils.equalsIgnoreCase(view.getType(), "flow-map")) { + || StringUtils.equalsIgnoreCase(view.getType(), "flow-map") + || StringUtils.equalsIgnoreCase(view.getType(), "bar-time-range") + ) { xAxis.addAll(xAxisExt); } List yAxis = gson.fromJson(view.getYAxis(), tokenType); @@ -1421,6 +1423,8 @@ public class ChartViewService { mapChart = ChartDataBuild.transBaseGroupDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); } else if (StringUtils.equalsIgnoreCase(view.getType(), "bar-group-stack")) { mapChart = ChartDataBuild.transGroupStackDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); + } else if (StringUtils.equalsIgnoreCase(view.getType(), "bar-time-range")) { + mapChart = ChartDataBuild.transTimeBarDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); } else if (StringUtils.containsIgnoreCase(view.getType(), "bar-stack")) { mapChart = ChartDataBuild.transStackChartDataAntV(xAxis, yAxis, view, data, extStack, isDrill); } else if (StringUtils.containsIgnoreCase(view.getType(), "line-stack")) { diff --git a/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java b/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java index 786ef57552..239b8cdd07 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java +++ b/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -1282,6 +1283,120 @@ public class ChartDataBuild { } } + private static String getDateFormat(String dateStyle, String datePattern) { + String split; + if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) { + split = "/"; + } else { + split = "-"; + } + switch (dateStyle) { + case "y": + return "yyyy"; + case "y_M": + return "yyyy" + split + "MM"; + case "y_M_d": + return "yyyy" + split + "MM" + split + "dd"; + case "H_m_s": + return "HH:mm:ss"; + case "y_M_d_H": + return "yyyy" + split + "MM" + split + "dd" + " HH"; + case "y_M_d_H_m": + return "yyyy" + split + "MM" + split + "dd" + " HH:mm"; + case "y_M_d_H_m_s": + return "yyyy" + split + "MM" + split + "dd" + " HH:mm:ss"; + default: + return "yyyy-MM-dd HH:mm:ss"; + } + } + + public static Map transTimeBarDataAntV(List xAxisBase, List xAxis, List xAxisExt, List yAxis, List extStack, List data, ChartViewWithBLOBs view, boolean isDrill) { + + Map map = new HashMap<>(); + if (CollectionUtils.isEmpty(xAxisBase) || CollectionUtils.isEmpty(xAxisExt) || xAxisExt.size() < 2) { + map.put("data", new ArrayList<>()); + return map; + } + if (xAxisExt.stream().filter(ext -> !ext.isDrill()).count() != 2) { + map.put("data", new ArrayList<>()); + return map; + } + + List dates = new ArrayList<>(); + + ChartViewFieldDTO xAxis1 = xAxis.get(xAxisBase.size()); + SimpleDateFormat sdf = new SimpleDateFormat(getDateFormat(xAxis1.getDateStyle(), xAxis1.getDatePattern())); + + List dataList = new ArrayList<>(); + for (int i1 = 0; i1 < data.size(); i1++) { + String[] row = data.get(i1); + + StringBuilder xField = new StringBuilder(); + if (isDrill) { + xField.append(row[xAxis.size() - 1]); + } else { + for (int i = 0; i < xAxisBase.size(); i++) { + if (i == xAxisBase.size() - 1) { + xField.append(row[i]); + } else { + xField.append(row[i]).append("\n"); + } + } + } + Map obj = new HashMap<>(); + obj.put("field", xField.toString()); + obj.put("category", xField.toString()); + + List dimensionList = new ArrayList<>(); + + for (int j = 0; j < xAxis.size(); j++) { + ChartDimensionDTO chartDimensionDTO = new ChartDimensionDTO(); + chartDimensionDTO.setId(xAxis.get(j).getId()); + chartDimensionDTO.setValue(row[j]); + dimensionList.add(chartDimensionDTO); + } + + obj.put("dimensionList", dimensionList); + + List values = new ArrayList<>(); + + if (row[xAxisBase.size()] == null || row[xAxisBase.size() + 1] == null) { + continue; + } + + values.add(row[xAxisBase.size()]); + values.add(row[xAxisBase.size() + 1]); + obj.put("values", values); + + + try { + Date date = sdf.parse(row[xAxisBase.size()]); + if (date != null) { + dates.add(date); + } + } catch (Exception ignore) { + } + try { + Date date = sdf.parse(row[xAxisBase.size() + 1]); + if (date != null) { + dates.add(date); + } + } catch (Exception ignore) { + } + + dataList.add(obj); + } + + map.put("minTime", sdf.format(dates.stream().min(Date::compareTo).orElse(null))); + + + map.put("maxTime", sdf.format(dates.stream().max(Date::compareTo).orElse(null))); + + map.put("data", dataList); + return map; + + } + public static Map transBidirectionalBarData(List xAxis, List yAxis, ChartViewDTO view, List data, boolean isDrill) { Map map = new HashMap<>(); diff --git a/core/frontend/src/icons/svg/bar-time-range.svg b/core/frontend/src/icons/svg/bar-time-range.svg new file mode 100644 index 0000000000..6ba83faae7 --- /dev/null +++ b/core/frontend/src/icons/svg/bar-time-range.svg @@ -0,0 +1,8 @@ + + + + Layer 1 + + + + \ No newline at end of file diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 5285b8d42d..4b22d36616 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1184,6 +1184,7 @@ export default { chart_bar_stack: 'Stack Bar', chart_percentage_bar_stack: 'Percentage Stack Bar', chart_bar_horizontal: 'Horizontal Bar', + chart_bar_time_range: 'Time Bar', chart_bar_stack_horizontal: 'Stack Horizontal Bar', chart_percentage_bar_stack_horizontal: 'Horizontal Percentage Stack Bar', chart_bidirectional_bar: 'Bidirectional Bar', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index fdf817d615..b00f86292b 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1182,6 +1182,7 @@ export default { chart_bar_stack: '堆疊柱狀圖', chart_percentage_bar_stack: '百分比柱狀圖', chart_bar_horizontal: '橫嚮柱狀圖', + chart_bar_time_range: '時間條形圖', chart_bar_stack_horizontal: '橫嚮堆疊柱狀圖', chart_percentage_bar_stack_horizontal: '橫嚮百分比柱狀圖', chart_bidirectional_bar: '對稱柱狀圖', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index 5c6a995209..f86c8ef86a 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1182,6 +1182,7 @@ export default { chart_bar_stack: '堆叠柱状图', chart_percentage_bar_stack: '百分比柱状图', chart_bar_horizontal: '横向柱状图', + chart_bar_time_range: '时间条形图', chart_bar_stack_horizontal: '横向堆叠柱状图', chart_percentage_bar_stack_horizontal: '横向百分比柱状图', chart_bidirectional_bar: '对称柱状图', diff --git a/core/frontend/src/views/chart/chart/bar/bar_antv.js b/core/frontend/src/views/chart/chart/bar/bar_antv.js index 97b30a42d1..ee531aff15 100644 --- a/core/frontend/src/views/chart/chart/bar/bar_antv.js +++ b/core/frontend/src/views/chart/chart/bar/bar_antv.js @@ -262,6 +262,130 @@ export function hBaseBarOptionAntV(plot, container, chart, action, isGroup, isSt return plot } +export function timeRangeBarOptionAntV(plot, container, chart, action) { + // theme + const theme = getTheme(chart) + // attr + const label = getLabel(chart) + const tooltip = getTooltip(chart) + // style + const legend = getLegend(chart) + const yAxis = getXAxis(chart) + const xAxis = getYAxis(chart) + // data + const data = _.cloneDeep(chart.data.data) + + const minTime = chart.data.minTime + const maxTime = chart.data.maxTime + + // config + const slider = getSlider(chart) + const analyse = getAnalyse(chart) + // options + const options = { + theme: theme, + data: data, + xField: 'values', + yField: 'field', + seriesField: 'category', + appendPadding: getPadding(chart), + label: label, + tooltip: tooltip, + legend: legend, + xAxis: xAxis, + yAxis: yAxis, + slider: slider, + annotations: analyse, + isRange: true, + meta: { + values: { + type: 'time', + min: minTime, + max: maxTime + } + }, + brush: { + enabled: true, + isStartEnable: (context) => { + // 按住 shift 键,才能开启交互 + if (context.event.gEvent.originalEvent?.shiftKey) { + return true + } + return false + } + }, + interactions: [ + { + type: 'legend-active', cfg: { + start: [{ trigger: 'legend-item:mouseenter', action: ['element-active:reset'] }], + end: [{ trigger: 'legend-item:mouseleave', action: ['element-active:reset'] }] + } + }, + { + type: 'legend-filter', cfg: { + start: [{ trigger: 'legend-item:click', action: ['list-unchecked:toggle', 'data-filter:filter', 'element-active:reset', 'element-highlight:reset'] }] + } + }, + { + type: 'tooltip', cfg: { + start: [{ trigger: 'interval:mousemove', action: 'tooltip:show' }], + end: [{ trigger: 'interval:mouseleave', action: 'tooltip:hide' }] + } + }, + { + type: 'active-region', cfg: { + start: [{ trigger: 'interval:mousemove', action: 'active-region:show' }], + end: [{ trigger: 'interval:mouseleave', action: 'active-region:hide' }] + } + } + ] + } + // size + let customAttr = {} + if (chart.customAttr) { + customAttr = JSON.parse(chart.customAttr) + if (customAttr.size) { + const s = JSON.parse(JSON.stringify(customAttr.size)) + if (s.barDefault) { + delete options.marginRatio + } else { + options.marginRatio = s.barGap + } + } + } + + delete options.isGroup + delete options.isStack + + options.isPercent = chart.type.includes('percentage') + // custom color + options.color = antVCustomColor(chart) + if (customAttr.color.gradient) { + options.color = options.color.map((ele) => { + return setGradientColor(ele, customAttr.color.gradient) + }) + } + // 处理空值 + if (chart.senior) { + let emptyDataStrategy = JSON.parse(chart.senior)?.functionCfg?.emptyDataStrategy + if (!emptyDataStrategy) { + emptyDataStrategy = 'breakLine' + } + handleEmptyDataStrategy(emptyDataStrategy, chart, data, options) + } + + // 开始渲染 + if (plot) { + plot.destroy() + } + plot = new Bar(container, options) + + plot.off('interval:click') + plot.on('interval:click', action) + + return plot +} + export function baseBidirectionalBarOptionAntV(plot, container, chart, action, isGroup, isStack) { // theme const theme = getTheme(chart) diff --git a/core/frontend/src/views/chart/chart/common/common_antv.js b/core/frontend/src/views/chart/chart/common/common_antv.js index 32436edad7..44bf308322 100644 --- a/core/frontend/src/views/chart/chart/common/common_antv.js +++ b/core/frontend/src/views/chart/chart/common/common_antv.js @@ -422,7 +422,7 @@ export function getTooltip(chart) { res = valueFormatter(param.value, formatterItem) } } - } else if (includesAny(chart.type, 'bar', 'scatter', 'radar', 'area') && !chart.type.includes('group')) { + } else if (includesAny(chart.type, 'bar', 'scatter', 'radar', 'area') && !chart.type.includes('group') && chart.type !== 'bar-time-range') { obj = { name: param.category, value: param.value } for (let i = 0; i < yAxis.length; i++) { const f = yAxis[i] @@ -470,6 +470,9 @@ export function getTooltip(chart) { res = valueFormatter(param.value, formatterItem) } } + } else if (chart.type === 'bar-time-range') { + obj = { values: param.values, name: param.category } + res = param.values[0] + ' - ' + param.values[1] } else { res = param.value } @@ -724,7 +727,7 @@ export function getXAxis(chart) { delete axis.maxLimit delete axis.tickCount const axisValue = a.axisValue - if (chart.type.includes('horizontal')) { + if (chart.type.includes('horizontal') || chart.type === 'bar-time-range') { if (axisValue && !axisValue.auto) { const yAxisSeriesMaxList = [] const maxList = [] @@ -814,7 +817,7 @@ export function getYAxis(chart) { if (chart.type === 'waterfall') { return value } else { - if (!chart.type.includes('horizontal')) { + if (!(chart.type.includes('horizontal') || chart.type === 'bar-time-range')) { if (!a.axisLabelFormatter) { return valueFormatter(value, formatterItem) } else { @@ -841,7 +844,7 @@ export function getYAxis(chart) { delete axis.maxLimit delete axis.tickCount const axisValue = a.axisValue - if (!chart.type.includes('horizontal')) { + if (!chart.type.includes('horizontal') || chart.type === 'bar-time-range') { if (axisValue && !axisValue.auto) { const yAxisSeriesMaxList = [] const maxList = [] diff --git a/core/frontend/src/views/chart/chart/util.js b/core/frontend/src/views/chart/chart/util.js index 68b309c8f9..03f5f97c8b 100644 --- a/core/frontend/src/views/chart/chart/util.js +++ b/core/frontend/src/views/chart/chart/util.js @@ -1100,6 +1100,85 @@ export const TYPE_CONFIGS = [ ] } }, + { + render: 'antv', + category: 'chart.chart_type_compare', + value: 'bar-time-range', + title: 'chart.chart_bar_time_range', + icon: 'bar-time-range', + properties: [ + 'color-selector', + + 'label-selector-ant-v', + 'tooltip-selector-ant-v', + 'x-axis-selector-ant-v', + 'y-axis-selector-ant-v', + 'title-selector-ant-v', + 'legend-selector-ant-v' + ], + propertyInner: { + 'color-selector': [ + 'value', + 'colorPanel', + 'customColor', + 'gradient', + 'alpha' + ], + 'size-selector-ant-v': [ + 'barDefault', + 'barGap' + ], + 'label-selector-ant-v': [ + 'show', + 'fontSize', + 'color', + 'position-h' + ], + 'tooltip-selector-ant-v': [ + 'show', + 'textStyle' + ], + 'x-axis-selector-ant-v': [ + 'show', + 'position', + 'name', + 'nameTextStyle', + 'splitLine', + 'axisForm', + 'axisLabel' + ], + 'y-axis-selector-ant-v': [ + 'show', + 'position', + 'name', + 'nameTextStyle', + 'splitLine', + 'axisForm', + 'axisLabel' + ], + 'title-selector-ant-v': [ + 'show', + 'title', + 'fontSize', + 'color', + 'hPosition', + 'isItalic', + 'isBolder', + 'remarkShow', + 'fontFamily', + 'letterSpace', + 'fontShadow' + ], + 'legend-selector-ant-v': [ + 'show', + 'icon', + 'orient', + 'textStyle', + 'hPosition', + 'vPosition' + ] + } + }, { render: 'antv', category: 'chart.chart_type_compare', @@ -3517,7 +3596,7 @@ export function getColors(chart, colors, reset) { } } } - } else if ((includesAny(chart.type, 'bar', 'radar', 'area')) && !chart.type.includes('group')) { + } else if ((includesAny(chart.type, 'bar', 'radar', 'area')) && !chart.type.includes('group') && chart.type !== 'bar-time-range') { if (Object.prototype.toString.call(chart.yaxis) === '[object Array]') { series = JSON.parse(JSON.stringify(chart.yaxis)) } else { diff --git a/core/frontend/src/views/chart/components/ChartComponentG2.vue b/core/frontend/src/views/chart/components/ChartComponentG2.vue index 28f940d251..23f8ae5569 100644 --- a/core/frontend/src/views/chart/components/ChartComponentG2.vue +++ b/core/frontend/src/views/chart/components/ChartComponentG2.vue @@ -45,7 +45,7 @@ import { baseLiquid } from '@/views/chart/chart/liquid/liquid' import { uuid } from 'vue-uuid' import ViewTrackBar from '@/components/canvas/components/editor/ViewTrackBar' import { getRemark, hexColorToRGBA } from '@/views/chart/chart/util' -import { baseBarOptionAntV, hBaseBarOptionAntV, baseBidirectionalBarOptionAntV } from '@/views/chart/chart/bar/bar_antv' +import { baseBarOptionAntV, hBaseBarOptionAntV, baseBidirectionalBarOptionAntV, timeRangeBarOptionAntV } from '@/views/chart/chart/bar/bar_antv' import { baseAreaOptionAntV, baseLineOptionAntV } from '@/views/chart/chart/line/line_antv' import { basePieOptionAntV, basePieRoseOptionAntV } from '@/views/chart/chart/pie/pie_antv' import { baseScatterOptionAntV } from '@/views/chart/chart/scatter/scatter_antv' @@ -273,6 +273,8 @@ export default { this.myChart = hBaseBarOptionAntV(this.myChart, this.chartId, chart, this.antVAction, true, false) } else if (equalsAny(chart.type, 'bar-stack-horizontal', 'percentage-bar-stack-horizontal')) { this.myChart = hBaseBarOptionAntV(this.myChart, this.chartId, chart, this.antVAction, false, true) + } else if (equalsAny(chart.type, 'bar-time-range')) { + this.myChart = timeRangeBarOptionAntV(this.myChart, this.chartId, chart, this.antVAction) } else if (chart.type === 'line') { this.myChart = baseLineOptionAntV(this.myChart, this.chartId, chart, this.antVAction) } else if (chart.type === 'area') { @@ -389,8 +391,12 @@ export default { } return } - const quotaList = this.pointParam.data.quotaList - quotaList[0]['value'] = this.pointParam.data.value + let quotaList = this.pointParam.data.quotaList + if (this.chart.type === 'bar-time-range') { + quotaList = this.pointParam.data.dimensionList + } else { + quotaList[0]['value'] = this.pointParam.data.value + } const linkageParam = { option: 'linkage', name: this.pointParam.data.name, diff --git a/core/frontend/src/views/chart/components/componentStyle/XAxisSelectorAntV.vue b/core/frontend/src/views/chart/components/componentStyle/XAxisSelectorAntV.vue index b658e8cc66..11c66de5ce 100644 --- a/core/frontend/src/views/chart/components/componentStyle/XAxisSelectorAntV.vue +++ b/core/frontend/src/views/chart/components/componentStyle/XAxisSelectorAntV.vue @@ -28,14 +28,18 @@ size="mini" @change="changeXAxisStyle('position')" > -
- {{ $t('chart.text_pos_top') }} - {{ $t('chart.text_pos_bottom') }} -
-
+
{{ $t('chart.text_pos_left') }} {{ $t('chart.text_pos_center') }}
+
+ {{ $t('chart.text_pos_left') }} + {{ $t('chart.text_pos_right') }} +
+
+ {{ $t('chart.text_pos_top') }} + {{ $t('chart.text_pos_bottom') }} +
diff --git a/core/frontend/src/views/chart/components/componentStyle/YAxisSelectorAntV.vue b/core/frontend/src/views/chart/components/componentStyle/YAxisSelectorAntV.vue index acfede6f0f..4bbcbe7199 100644 --- a/core/frontend/src/views/chart/components/componentStyle/YAxisSelectorAntV.vue +++ b/core/frontend/src/views/chart/components/componentStyle/YAxisSelectorAntV.vue @@ -28,14 +28,18 @@ size="mini" @change="changeYAxisStyle('position')" > -
- {{ $t('chart.text_pos_left') }} - {{ $t('chart.text_pos_right') }} -
-
+
{{ $t('chart.text_pos_top') }} {{ $t('chart.text_pos_bottom') }}
+
+ {{ $t('chart.text_pos_top') }} + {{ $t('chart.text_pos_bottom') }} +
+
+ {{ $t('chart.text_pos_left') }} + {{ $t('chart.text_pos_right') }} +
- + @@ -755,7 +756,7 @@ @@ -2122,7 +2123,7 @@ export default { return equalsAny(this.view.type, 'table-normal', 'table-info') }, showAnalyseCfg() { - if (this.view.type === 'bidirectional-bar') { + if (this.view.type === 'bidirectional-bar' || this.view.type === 'bar-time-range') { return false } return includesAny(this.view.type, 'bar', 'line', 'area', 'gauge', 'liquid') || @@ -2502,7 +2503,7 @@ export default { } }) if (equalsAny(view.type, 'table-pivot', 'bar-group', 'bar-group-stack', 'flow-map', 'race-bar') || - (view.render === 'antv' && (view.type === 'line' || view.type === 'scatter'))) { + (view.render === 'antv' && (view.type === 'line' || view.type === 'scatter' || view.type === 'bar-time-range'))) { view.xaxisExt.forEach(function(ele) { if (!ele.dateStyle || ele.dateStyle === '') { ele.dateStyle = 'y_M_d' @@ -3310,6 +3311,19 @@ export default { if (this.view.type !== 'table-info') { this.dragCheckType(this.view.xaxisExt, 'd') } + if (this.view.type === 'bar-time-range') { + // 针对时间条形图,需要限定类型为时间类型 + if (this.view.xaxisExt && this.view.xaxisExt.length > 0) { + for (let i = this.view.xaxisExt.length - 1; i >= 0; i--) { + if (this.view.xaxisExt[i].deType !== 1) { + this.view.xaxisExt.splice(i, 1) + } + } + } + if (this.view.xaxisExt.length > 2) { + this.view.xaxisExt = [this.view.xaxisExt[0], this.view.xaxisExt[1]] + } + } if ((this.view.type === 'map' || this.view.type === 'word-cloud' || this.view.type === 'scatter') && this.view.xaxisExt.length > 1) { this.view.xaxisExt = [this.view.xaxisExt[0]] } diff --git a/core/frontend/src/views/chart/view/ChartStyle.vue b/core/frontend/src/views/chart/view/ChartStyle.vue index 696b1f4580..ad750844b7 100644 --- a/core/frontend/src/views/chart/view/ChartStyle.vue +++ b/core/frontend/src/views/chart/view/ChartStyle.vue @@ -471,13 +471,13 @@ export default { return false }, xAisTitle() { - if (this.chart.type === 'bidirectional-bar') { + if (this.chart.type === 'bidirectional-bar' || this.chart.type === 'bar-time-range') { return this.$t('chart.yAxis') } return this.$t('chart.xAxis') }, yAxisTitle() { - if (this.chart.type === 'bidirectional-bar') { + if (this.chart.type === 'bidirectional-bar' || this.chart.type === 'bar-time-range') { return this.$t('chart.xAxis') } if (this.chart.type === 'chart-mix') { From a79b95a2d8e57328cadf995be32bb756e2d43be6 Mon Sep 17 00:00:00 2001 From: ulleo Date: Thu, 14 Dec 2023 11:44:06 +0800 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20AntV=E6=97=B6=E9=97=B4=E6=9D=A1?= =?UTF-8?q?=E5=BD=A2=E5=9B=BE=20=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/lang/en.js | 2 ++ core/frontend/src/lang/tw.js | 2 ++ core/frontend/src/lang/zh.js | 2 ++ core/frontend/src/views/chart/view/ChartEdit.vue | 10 ++++++++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 85f2df9401..5631595692 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1495,6 +1495,7 @@ export default { dynamic: 'Dynamic', gauge_size_field_delete: 'Dynamic field changed,please edit again', chart_group: 'Sub Type', + chart_bar_time: 'Times', chart_bar_group: 'Bar Group', chart_bar_group_stack: 'Group Stack Bar', field_dynamic: 'Dynamic', @@ -1522,6 +1523,7 @@ export default { set_zero: 'Set Zero', ignore_data: 'Hide Data', sub_dimension_tip: 'This field is required, and cannot be included in the type axis, you should choose non-group chart if you don\'t need it, or you will get unexpected chart.', + time_bar_tip: 'This field is required, and axis type must be time', drill_dimension_tip: 'Only fields in the dataset can be drilled', table_scroll_tip: 'The detail table is only effective when the pagination mode is "Drop-down".', table_threshold_tip: 'Tip: Do not select fields repeatedly. If the same field is configured repeatedly, only the last field will take effect.', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index d52d3f0218..cc4c76a526 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1492,6 +1492,7 @@ export default { dynamic: '動態值', gauge_size_field_delete: '動態值中字段發生變更,請重新編輯', chart_group: '子類別', + chart_bar_time: '起止時間', chart_bar_group: '分組柱狀圖', chart_bar_group_stack: '分組堆疊柱狀圖', field_dynamic: '動態值', @@ -1519,6 +1520,7 @@ export default { ignore_data: '隱藏空值', empty_data_field_ctrl: '字段設置', sub_dimension_tip: '該字段為必填項,且不應使用類別軸中的字段,若無需該字段,請選擇基礎圖表進行展示,否則展示效果不理想', + time_bar_tip: '該字段為必填項,且需要兩個時間類型字段', drill_dimension_tip: '鑽取字段僅支持數據集中的字段', table_scroll_tip: '明細表僅在分頁模式為"下拉"時生效。', table_threshold_tip: '提示:請勿重複選擇字段,若同一字段重複配置,則只有最後的字段配置生效。', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index 8217e9d27a..edd8f65329 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1492,6 +1492,7 @@ export default { dynamic: '动态值', gauge_size_field_delete: '动态值中字段发生变更,请重新编辑', chart_group: '子类别', + chart_bar_time: '起止时间', chart_bar_group: '分组柱状图', chart_bar_group_stack: '分组堆叠柱状图', field_dynamic: '动态值', @@ -1519,6 +1520,7 @@ export default { set_zero: '置为0', ignore_data: '隐藏空值', sub_dimension_tip: '该字段为必填项,且不应使用类别轴中的字段,若无需该字段,请选择基础图表进行展示,否则展示效果不理想。', + time_bar_tip: '该字段为必填项,且需要两个时间类型字段', drill_dimension_tip: '钻取字段仅支持数据集中的字段', table_scroll_tip: '明细表仅在分页模式为"下拉"时生效。', table_threshold_tip: '提示:请勿重复选择字段,若同一字段重复配置,则只有最后的字段配置生效', diff --git a/core/frontend/src/views/chart/view/ChartEdit.vue b/core/frontend/src/views/chart/view/ChartEdit.vue index 3b8e33329e..6189126090 100644 --- a/core/frontend/src/views/chart/view/ChartEdit.vue +++ b/core/frontend/src/views/chart/view/ChartEdit.vue @@ -693,7 +693,8 @@ > - {{ $t('chart.chart_group') }} + {{ $t('chart.chart_bar_time') }} + {{ $t('chart.chart_group') }} {{ $t('chart.end_point') }}
- {{ $t('chart.sub_dimension_tip') }} + +
Date: Thu, 14 Dec 2023 12:04:11 +0800 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20AntV=E6=97=B6=E9=97=B4=E6=9D=A1?= =?UTF-8?q?=E5=BD=A2=E5=9B=BE=20=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/dragItem/DimensionExtItem.vue | 16 ++++++++++++++-- core/frontend/src/views/chart/view/ChartEdit.vue | 12 +++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue b/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue index 1a00946fe6..5cd9903258 100644 --- a/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue +++ b/core/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue @@ -119,11 +119,18 @@ >{{ $t('chart.y_W') }} {{ $t('chart.y_M_d') }} {{ $t('chart.H_m_s') }} - {{ $t('chart.y_M_d_H') }} - {{ $t('chart.y_M_d_H_m') }} + {{ $t('chart.y_M_d_H') }} + {{ $t('chart.y_M_d_H_m') }} {{ $t('chart.y_M_d_H_m_s') }} @@ -210,6 +217,11 @@ export default { showDateExt: false } }, + computed: { + hideSpecial() { + return this.chart.type === 'bar-time-range' + } + }, watch: { dimensionData: function() { this.getItemTagType() diff --git a/core/frontend/src/views/chart/view/ChartEdit.vue b/core/frontend/src/views/chart/view/ChartEdit.vue index 6189126090..8e219fff94 100644 --- a/core/frontend/src/views/chart/view/ChartEdit.vue +++ b/core/frontend/src/views/chart/view/ChartEdit.vue @@ -746,7 +746,7 @@ :dimension-data="dimension" :quota-data="quota" :chart="chart" - @onDimensionItemChange="dimensionItemChange" + @onDimensionItemChange="dimensionExtItemChange" @onDimensionItemRemove="dimensionItemRemove" @editItemFilter="showDimensionEditFilter" @onNameEdit="showRename" @@ -2853,6 +2853,16 @@ export default { this.calcData(true) }, + dimensionExtItemChange(item) { + if (this.view.type === 'bar-time-range') { + this.view.xaxisExt.forEach(ext => { + ext.dateStyle = item.dateStyle + ext.datePattern = item.datePattern + }) + } + this.calcData(true) + }, + dimensionItemRemove(item) { if (item.removeType === 'dimension') { this.view.xaxis.splice(item.index, 1) From f28f9d830f32eaea68fd7827ba5b92ef4ef394b0 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Dec 2023 13:39:49 +0800 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E5=8F=91=E9=80=81=E8=87=B3=E8=A7=92=E8=89=B2=E3=80=81?= =?UTF-8?q?=E7=BB=84=E7=BB=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../job/sechedule/strategy/impl/EmailTaskHandler.java | 6 ++++++ .../xpack/email/dto/request/XpackEmailTaskRequest.java | 4 ++++ .../xpack/email/dto/response/XpackEmailTemplateDTO.java | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/core/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/core/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index 0297af8bf4..70020dc919 100644 --- a/core/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/core/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -157,6 +157,11 @@ public class EmailTaskHandler extends TaskHandler implements Job { emailXpackService.saveInstance(taskInstance); } + private void formatReci(XpackEmailTemplateDTO emailTemplateDTO) { + String roleList = emailTemplateDTO.getRoleList(); + String orgList = emailTemplateDTO.getOrgList(); + } + @Async("priorityExecutor") public void sendReport(GlobalTaskInstance taskInstance, SysUserEntity user, Boolean isTempTask) { @@ -177,6 +182,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { token = tokenByUser(user); XpackPixelEntity xpackPixelEntity = buildPixel(emailTemplateDTO); // 下面继续执行发送邮件的 + formatReci(emailTemplateDTO); String recipients = emailTemplateDTO.getRecipients(); String reciUsers = emailTemplateDTO.getReciUsers(); Integer extWaitTime = emailTemplateDTO.getExtWaitTime(); diff --git a/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/request/XpackEmailTaskRequest.java b/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/request/XpackEmailTaskRequest.java index 324c825449..efd9db4f14 100644 --- a/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/request/XpackEmailTaskRequest.java +++ b/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/request/XpackEmailTaskRequest.java @@ -36,4 +36,8 @@ public class XpackEmailTaskRequest extends XpackTaskCreateRequest { private String groups; private Integer extWaitTime = 0; + + private String roleList; + + private String orgList; } diff --git a/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/response/XpackEmailTemplateDTO.java b/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/response/XpackEmailTemplateDTO.java index 2b21ada273..46a7824ef9 100644 --- a/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/response/XpackEmailTemplateDTO.java +++ b/sdk/dataease-plugin-interface/src/main/java/io/dataease/plugins/xpack/email/dto/response/XpackEmailTemplateDTO.java @@ -39,4 +39,8 @@ public class XpackEmailTemplateDTO implements Serializable { private Integer extWaitTime = 0; + private String roleList; + + private String orgList; + } From a4b2ca7b5f88e5e930056237276d6a2bb0a29360 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Dec 2023 13:43:28 +0800 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E5=8F=91=E9=80=81=E8=87=B3=E8=A7=92=E8=89=B2=E3=80=81?= =?UTF-8?q?=E7=BB=84=E7=BB=87flyway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/db/migration/V59__1.18.14.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/backend/src/main/resources/db/migration/V59__1.18.14.sql b/core/backend/src/main/resources/db/migration/V59__1.18.14.sql index 0214c7b010..2639adf594 100644 --- a/core/backend/src/main/resources/db/migration/V59__1.18.14.sql +++ b/core/backend/src/main/resources/db/migration/V59__1.18.14.sql @@ -6,4 +6,8 @@ ALTER TABLE `sys_task_email` ADD COLUMN `groups` varchar(255) NULL COMMENT '群聊' AFTER `view_data_range`; ALTER TABLE `sys_task_email` - ADD COLUMN `ext_wait_time` int(0) NOT NULL DEFAULT 0 COMMENT '加载仪表板额外等待时间(s)' AFTER `groups`; \ No newline at end of file + ADD COLUMN `ext_wait_time` int(0) NOT NULL DEFAULT 0 COMMENT '加载仪表板额外等待时间(s)' AFTER `groups`; + +ALTER TABLE `sys_task_email` + ADD COLUMN `role_list` varchar(255) NULL COMMENT '收件角色' AFTER `ext_wait_time`, + ADD COLUMN `org_list` varchar(255) NULL COMMENT '收件组织' AFTER `role_list`; \ No newline at end of file From 91b8feeb5011cbac7c61f053329b48a6a4231fd5 Mon Sep 17 00:00:00 2001 From: xuwei-fit2cloud Date: Thu, 14 Dec 2023 16:15:51 +0800 Subject: [PATCH 06/11] =?UTF-8?q?chore=20:=20=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E8=87=B31.18.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/package.json | 2 +- core/mobile/package.json | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/frontend/package.json b/core/frontend/package.json index 4881da3038..89d45c3b37 100644 --- a/core/frontend/package.json +++ b/core/frontend/package.json @@ -1,6 +1,6 @@ { "name": "dataease", - "version": "1.18.13", + "version": "1.18.14", "description": "dataease front", "private": true, "scripts": { diff --git a/core/mobile/package.json b/core/mobile/package.json index 9b74d91c5e..ee4d5e5e02 100644 --- a/core/mobile/package.json +++ b/core/mobile/package.json @@ -1,6 +1,6 @@ { "name": "dataease-mobile", - "version": "1.18.13", + "version": "1.18.14", "private": true, "scripts": { "serve": "npm run dev:h5", diff --git a/pom.xml b/pom.xml index 67a9394db0..63bf490c2e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ pom - 1.18.13 + 1.18.14 dataease From 5d373c147b8d3cb5554e298ed34347eef2f87ded Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 14 Dec 2023 17:09:31 +0800 Subject: [PATCH 07/11] =?UTF-8?q?perf:=20=E5=AE=9A=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E5=8F=91=E9=80=81=E7=BB=84=E7=BB=87=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataease/auth/service/ExtAuthService.java | 2 ++ .../auth/service/impl/ExtAuthServiceImpl.java | 15 +++++++++++ .../io/dataease/commons/utils/AuthUtils.java | 4 +++ .../java/io/dataease/ext/ExtAuthMapper.java | 2 ++ .../java/io/dataease/ext/ExtAuthMapper.xml | 19 ++++++++++++++ .../strategy/impl/EmailTaskHandler.java | 26 +++++++++++++++---- 6 files changed, 63 insertions(+), 5 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/auth/service/ExtAuthService.java b/core/backend/src/main/java/io/dataease/auth/service/ExtAuthService.java index 3e035deb8a..10bdaeda3c 100644 --- a/core/backend/src/main/java/io/dataease/auth/service/ExtAuthService.java +++ b/core/backend/src/main/java/io/dataease/auth/service/ExtAuthService.java @@ -10,6 +10,8 @@ public interface ExtAuthService { Set userIdsByRD(AuthURD request); + Set userNamesByRD(AuthURD request); + AuthURD resourceTarget(String resourceId); List dataSourceIdByUser(Long userId); diff --git a/core/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java b/core/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java index 9be75d50aa..1926f6e513 100644 --- a/core/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java +++ b/core/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java @@ -43,6 +43,21 @@ public class ExtAuthServiceImpl implements ExtAuthService { return result; } + @Override + public Set userNamesByRD(AuthURD request) { + Set result = new HashSet<>(); + List roleIds = request.getRoleIds(); + List deptIds = request.getDeptIds(); + if (!CollectionUtils.isEmpty(roleIds)) { + result.addAll(extAuthMapper.queryUserNameWithRoleIds(roleIds)); + } + if (!CollectionUtils.isEmpty(deptIds)) { + result.addAll(extAuthMapper.queryUserNameWithDeptIds(deptIds)); + } + + return result; + } + @Override public AuthURD resourceTarget(String resourceId) { AuthURD authURD = new AuthURD(); diff --git a/core/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java b/core/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java index 5b45d27765..b151519d8c 100644 --- a/core/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java +++ b/core/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java @@ -71,6 +71,10 @@ public class AuthUtils { return userIds; } + public static Set accountByURD(AuthURD request) { + return extAuthService.userNamesByRD(request); + } + public static List parentResources(String resourceId, String type) { return extAuthService.parentResource(resourceId, type); } diff --git a/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.java b/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.java index 0e35cccd6e..d33fccb443 100644 --- a/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.java +++ b/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.java @@ -11,8 +11,10 @@ import java.util.List; public interface ExtAuthMapper { List queryUserIdWithRoleIds(@Param("roleIds") List roleIds); + List queryUserNameWithRoleIds(@Param("roleIds") List roleIds); List queryUserIdWithDeptIds(@Param("deptIds") List deptIds); + List queryUserNameWithDeptIds(@Param("deptIds") List deptIds); List queryByResource(@Param("resourceId") String resourceId); diff --git a/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.xml b/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.xml index 1f81c468ff..405b928cf0 100644 --- a/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.xml +++ b/core/backend/src/main/java/io/dataease/ext/ExtAuthMapper.xml @@ -16,6 +16,16 @@ + + + +