diff --git a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index e072cba02a..7a703ae880 100644 --- a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -1,6 +1,7 @@ package io.dataease.provider.engine.mysql; import com.alibaba.fastjson.JSONArray; +import com.sun.javafx.binding.StringFormatter; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -1141,8 +1142,12 @@ public class MysqlQueryProvider extends QueryProvider { switch (dateStyle) { case "y": return "%Y"; + case "y_Q": + return "CONCAT(%s,'" + split + "',%s)"; case "y_M": return "%Y" + split + "%m"; + case "y_W": + return "%Y" + split + "%u"; case "y_M_d": return "%Y" + split + "%m" + split + "%d"; case "H_m_s": @@ -1163,7 +1168,13 @@ public class MysqlQueryProvider extends QueryProvider { fieldName = String.format(MysqlConstants.UNIX_TIMESTAMP, originField) + "*1000"; } else if (x.getDeType() == 1) { String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); - fieldName = String.format(MysqlConstants.DATE_FORMAT, originField, format); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MysqlConstants.DATE_FORMAT, originField, "%Y"), + String.format(MysqlConstants.QUARTER, originField)); + } else { + fieldName = String.format(MysqlConstants.DATE_FORMAT, originField, format); + } } else { fieldName = originField; } @@ -1171,11 +1182,23 @@ public class MysqlQueryProvider extends QueryProvider { if (x.getDeType() == 1) { String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); if (x.getDeExtractType() == 0) { - fieldName = String.format(MysqlConstants.DATE_FORMAT, originField, format); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MysqlConstants.DATE_FORMAT, String.format(MysqlConstants.STR_TO_DATE, originField, MysqlConstants.DEFAULT_DATE_FORMAT), "%Y"), + String.format(MysqlConstants.QUARTER, String.format(MysqlConstants.STR_TO_DATE, originField, MysqlConstants.DEFAULT_DATE_FORMAT))); + } else { + fieldName = String.format(MysqlConstants.DATE_FORMAT, originField, format); + } } else { String cast = String.format(MysqlConstants.CAST, originField, MysqlConstants.DEFAULT_INT_FORMAT) + "/1000"; String from_unixtime = String.format(MysqlConstants.FROM_UNIXTIME, cast, MysqlConstants.DEFAULT_DATE_FORMAT); - fieldName = String.format(MysqlConstants.DATE_FORMAT, from_unixtime, format); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MysqlConstants.DATE_FORMAT, from_unixtime, "%Y"), + String.format(MysqlConstants.QUARTER, from_unixtime)); + } else { + fieldName = String.format(MysqlConstants.DATE_FORMAT, from_unixtime, format); + } } } else if (x.getDeType() == 0 && x.getDeExtractType() == 0) { fieldName = String.format(MysqlConstants.CAST, originField, MysqlConstants.CHAR); diff --git a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java index 3a4bd7d406..566488b0c2 100644 --- a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java @@ -18,8 +18,8 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; -import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.entity.Dateformat; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -1138,8 +1138,12 @@ public class MysqlQueryProvider extends QueryProvider { switch (dateStyle) { case "y": return "%Y"; + case "y_Q": + return "CONCAT(%s,'" + split + "',%s)"; case "y_M": return "%Y" + split + "%m"; + case "y_W": + return "%Y" + split + "%u"; case "y_M_d": return "%Y" + split + "%m" + split + "%d"; case "H_m_s": @@ -1159,13 +1163,25 @@ public class MysqlQueryProvider extends QueryProvider { if (x.getDeType() == 2 || x.getDeType() == 3) { fieldName = String.format(MySQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; } else if (x.getDeType() == 1) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); if (x.getType().equalsIgnoreCase("YEAR")) { - fieldName = String.format(MySQLConstants.DATE_FORMAT, "CONCAT(" + originField + ",'-01-01')", transDateFormat(x.getDateStyle(), x.getDatePattern())); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MySQLConstants.DATE_FORMAT, "CONCAT(" + originField + ",'-01-01')", "%Y"), + String.format(MySQLConstants.QUARTER, "CONCAT(" + originField + ",'-01-01')")); + } else { + fieldName = String.format(MySQLConstants.DATE_FORMAT, "CONCAT(" + originField + ",'-01-01')", format); + } } else if (x.getType().equalsIgnoreCase("TIME")) { fieldName = String.format(MySQLConstants.DATE_FORMAT, "CONCAT('1970-01-01', " + originField + ")", MySQLConstants.DEFAULT_DATE_FORMAT); } else { - String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); - fieldName = String.format(MySQLConstants.DATE_FORMAT, originField, format); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MySQLConstants.DATE_FORMAT, originField, "%Y"), + String.format(MySQLConstants.QUARTER, originField)); + } else { + fieldName = String.format(MySQLConstants.DATE_FORMAT, originField, format); + } } } else { fieldName = originField; @@ -1174,11 +1190,23 @@ public class MysqlQueryProvider extends QueryProvider { if (x.getDeType() == 1) { String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); if (x.getDeExtractType() == 0) { - fieldName = String.format(MySQLConstants.DATE_FORMAT, String.format(MySQLConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(x.getDateFormat()) ? x.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT), format); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MysqlConstants.DATE_FORMAT, String.format(MySQLConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(x.getDateFormat()) ? x.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT), "%Y"), + String.format(MysqlConstants.QUARTER, String.format(MySQLConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(x.getDateFormat()) ? x.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT))); + } else { + fieldName = String.format(MySQLConstants.DATE_FORMAT, String.format(MySQLConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(x.getDateFormat()) ? x.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT), format); + } } else { String cast = String.format(MySQLConstants.CAST, originField, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; String from_unixtime = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); - fieldName = String.format(MySQLConstants.DATE_FORMAT, from_unixtime, format); + if (StringUtils.equalsIgnoreCase(x.getDateStyle(), "y_Q")) { + fieldName = String.format(format, + String.format(MySQLConstants.DATE_FORMAT, from_unixtime, "%Y"), + String.format(MySQLConstants.QUARTER, from_unixtime)); + } else { + fieldName = String.format(MySQLConstants.DATE_FORMAT, from_unixtime, format); + } } } else { if (x.getDeType() == DeTypeConstants.DE_INT) { diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 601aabdfed..85afce9cbd 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1179,6 +1179,8 @@ export default { datePattern: 'Date Format', y: 'Year', y_M: 'Year Month', + y_Q: 'Year Quarter', + y_W: 'Year Week', y_M_d: 'Year Month Day', H_m_s: 'Hour Minute Second', y_M_d_H_m: 'Year Month Day Hour Minute', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 86904cd527..a42e5e77b3 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1178,6 +1178,8 @@ export default { datePattern: '日期格式', y: '年', y_M: '年月', + y_Q: '年季度', + y_W: '年周', y_M_d: '年月日', H_m_s: '時分秒', y_M_d_H_m: '年月日時分', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 9255752a76..0bc79e37fc 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1177,6 +1177,8 @@ export default { datePattern: '日期格式', y: '年', y_M: '年月', + y_Q: '年季度', + y_W: '年周', y_M_d: '年月日', H_m_s: '时分秒', y_M_d_H_m: '年月日时分', diff --git a/frontend/src/views/chart/chart/chart.js b/frontend/src/views/chart/chart/chart.js index 47101d2a47..afece4b1fe 100644 --- a/frontend/src/views/chart/chart/chart.js +++ b/frontend/src/views/chart/chart/chart.js @@ -1133,3 +1133,5 @@ export const CHART_FONT_LETTER_SPACE = [ ] export const NOT_SUPPORT_PAGE_DATASET = ['kylin', 'sqlServer', 'es', 'presto', 'ds_doris', 'StarRocks'] + +export const SUPPORT_Y_M = ['y', 'y_M', 'y_M_d'] diff --git a/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue b/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue index 209acf49bb..d042757e50 100644 --- a/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue +++ b/frontend/src/views/chart/components/dragItem/DimensionExtItem.vue @@ -108,7 +108,15 @@ {{ $t('chart.y') }} + {{ $t('chart.y_Q') }} {{ $t('chart.y_M') }} + {{ $t('chart.y_W') }} {{ $t('chart.y_M_d') }} {{ $t('chart.y') }} + {{ $t('chart.y_Q') }} {{ $t('chart.y_M') }} + {{ $t('chart.y_W') }} {{ $t('chart.y_M_d') }} { - return ele.deType === 1 + return ele.deType === 1 && SUPPORT_Y_M.includes(ele.dateStyle) }) // 暂时只支持类别轴/维度的时间类型字段 if (t1.length > 0 && this.chart.type !== 'text' && this.chart.type !== 'label' && this.chart.type !== 'gauge' && this.chart.type !== 'liquid') { diff --git a/frontend/src/views/chart/components/dragItem/QuotaItem.vue b/frontend/src/views/chart/components/dragItem/QuotaItem.vue index bda5a3ec84..3145bd92e3 100644 --- a/frontend/src/views/chart/components/dragItem/QuotaItem.vue +++ b/frontend/src/views/chart/components/dragItem/QuotaItem.vue @@ -246,6 +246,7 @@ import FieldErrorTips from '@/views/chart/components/dragItem/components/FieldEr import bus from '@/utils/bus' import { formatterItem } from '@/views/chart/chart/formatter' import { quotaViews } from '@/views/chart/chart/util' +import { SUPPORT_Y_M } from '@/views/chart/chart/chart' export default { name: 'QuotaItem', @@ -321,7 +322,7 @@ export default { xAxis = JSON.parse(this.chart.xaxis) } const t1 = xAxis.filter(ele => { - return ele.deType === 1 + return ele.deType === 1 && SUPPORT_Y_M.includes(ele.dateStyle) }) // 暂时只支持类别轴/维度的时间类型字段 if (t1.length > 0 && this.chart.type !== 'text' && this.chart.type !== 'label' && this.chart.type !== 'gauge' && this.chart.type !== 'liquid') { diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 1fb3e092a3..1005804c3e 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -192,7 +192,7 @@ @command="chartFieldEdit" > - + - + {{ $t('chart.change_chart_type') }} - + @@ -435,7 +435,7 @@ v-model="view.refreshViewEnable" class="el-input-refresh-loading" @change="refreshAttrChange" - > + /> {{ $t('panel.enable_refresh_view') }} @@ -531,6 +531,7 @@ :item="item" :dimension-data="dimension" :quota-data="quota" + :chart="chart" @onDimensionItemChange="dimensionItemChange" @onDimensionItemRemove="dimensionItemRemove" @editItemFilter="showDimensionEditFilter" @@ -552,8 +553,8 @@ > {{ - $t('chart.drag_block_table_data_column') - }} + $t('chart.drag_block_table_data_column') + }} {{ $t('chart.drag_block_type_axis') }} @@ -561,18 +562,18 @@ v-else-if="view.type && view.type.includes('pie')" >{{ $t('chart.drag_block_pie_label') }} {{ - $t('chart.drag_block_funnel_split') - }} + $t('chart.drag_block_funnel_split') + }} {{ - $t('chart.drag_block_radar_label') - }} + $t('chart.drag_block_radar_label') + }} {{ $t('chart.area') }} {{ - $t('chart.drag_block_treemap_label') - }} + $t('chart.drag_block_treemap_label') + }} {{ - $t('chart.drag_block_word_cloud_label') - }} + $t('chart.drag_block_word_cloud_label') + }} {{ $t('chart.drag_block_label') }} / {{ $t('chart.dimension') }} @@ -673,6 +674,7 @@ :item="item" :dimension-data="dimension" :quota-data="quota" + :chart="chart" @onDimensionItemChange="dimensionItemChange" @onDimensionItemRemove="dimensionItemRemove" @editItemFilter="showDimensionEditFilter" @@ -695,8 +697,8 @@ > {{ - $t('chart.drag_block_table_data_column') - }} + $t('chart.drag_block_table_data_column') + }} {{ $t('chart.drag_block_value_axis') }} @@ -704,30 +706,30 @@ v-else-if="view.type && view.type.includes('pie')" >{{ $t('chart.drag_block_pie_angel') }} {{ - $t('chart.drag_block_funnel_width') - }} + $t('chart.drag_block_funnel_width') + }} {{ - $t('chart.drag_block_radar_length') - }} + $t('chart.drag_block_radar_length') + }} {{ - $t('chart.drag_block_gauge_angel') - }} + $t('chart.drag_block_gauge_angel') + }} {{ $t('chart.drag_block_label_value') }} {{ $t('chart.chart_data') }} {{ - $t('chart.drag_block_treemap_size') - }} + $t('chart.drag_block_treemap_size') + }} {{ - $t('chart.drag_block_value_axis_main') - }} + $t('chart.drag_block_value_axis_main') + }} {{ $t('chart.drag_block_progress') }} {{ - $t('chart.drag_block_word_cloud_size') - }} + $t('chart.drag_block_word_cloud_size') + }} / {{ $t('chart.quota') }} - + @@ -1355,7 +1357,7 @@ width="800px" class="dialog-css" > - +