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 55696b6b12..484ba4c14f 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 @@ -269,7 +269,8 @@ public class MysqlQueryProvider extends QueryProvider { ChartViewFieldDTO x = xAxis.get(i); String originField; if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 +// 计算字段和视图字段,规则为 函数([原始字段id]),这边把[原始字段id] 换成 表名.原始字段id +// 解析origin name中有关联的字段生成sql表达式 originField = calcFieldRegex(x.getOriginName(), tableObj); } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { originField = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); @@ -1058,12 +1059,13 @@ public class MysqlQueryProvider extends QueryProvider { } if (field.getDeType() == 1) { + String format = transDateFormat(request.getDateStyle(), request.getDatePattern()); if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { - whereName = String.format(MysqlConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT); + whereName = String.format(MysqlConstants.DATE_FORMAT, originName, format); } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(MysqlConstants.CAST, originName, MysqlConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(MysqlConstants.FROM_UNIXTIME, cast, MysqlConstants.DEFAULT_DATE_FORMAT); + whereName = String.format(MysqlConstants.FROM_UNIXTIME, cast, format); } } else if (field.getDeType() == 0 && field.getDeExtractType() == 0) { whereName = String.format(MysqlConstants.CAST, originName, MysqlConstants.CHAR); diff --git a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index 71c0b6ba97..f4559e383f 100644 --- a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -31,6 +31,7 @@ import org.stringtemplate.v4.STGroup; import org.stringtemplate.v4.STGroupFile; import javax.annotation.Resource; +import java.text.Format; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; @@ -1141,15 +1142,16 @@ public class CKQueryProvider extends QueryProvider { } if (field.getDeType() == DeTypeConstants.DE_TIME) { + String format = transDateFormat(request.getDateStyle(), request.getDatePattern()); if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - whereName = String.format(CKConstants.toDateTime, originName); + whereName = String.format(CKConstants.formatDateTime, String.format(CKConstants.toDateTime, originName), format); } if (field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { String cast = String.format(CKConstants.toFloat64, originName); - whereName = String.format(CKConstants.toDateTime, cast); + whereName = String.format(CKConstants.formatDateTime, String.format(CKConstants.toDateTime, cast), format); } if (field.getDeExtractType() == 1) { - whereName = originName; + whereName = String.format(CKConstants.formatDateTime, originName, format); } } else if (field.getDeType() == 2 || field.getDeType() == 3) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { 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 f11c668189..9db871adb5 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 @@ -1062,15 +1062,25 @@ public class MysqlQueryProvider extends QueryProvider { } if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(MySQLConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : MysqlConstants.DEFAULT_DATE_FORMAT); + String format = transDateFormat(request.getDateStyle(), request.getDatePattern()); + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { + if (StringUtils.equalsIgnoreCase(request.getDateStyle(),"y_Q")){ + whereName = String.format(format, + String.format(MysqlConstants.DATE_FORMAT, originName, "%Y"), + String.format(MysqlConstants.QUARTER, String.format(MysqlConstants.DATE_FORMAT, originName, MysqlConstants.DEFAULT_DATE_FORMAT))); + } else { + whereName = String.format(MySQLConstants.DATE_FORMAT, originName, format); + } } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = originName; + if (StringUtils.equalsIgnoreCase(request.getDateStyle(),"y_Q")){ + whereName = String.format(format, + String.format(MysqlConstants.DATE_FORMAT, cast, "%Y"), + String.format(MysqlConstants.QUARTER, String.format(MysqlConstants.DATE_FORMAT, field, MysqlConstants.DEFAULT_DATE_FORMAT))); + } else { + whereName = String.format(MySQLConstants.DATE_FORMAT, cast, format); + } } } else if (field.getDeType() == 2 || field.getDeType() == 3) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 0612c5f440..31ddcdaa1e 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -71,8 +71,6 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.locks.ReentrantLock; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -848,21 +846,31 @@ public class ChartViewService { boolean isDrill = false; List drillRequestList = chartExtRequest.getDrill(); if (CollectionUtils.isNotEmpty(drillRequestList) && (drill.size() > drillRequestList.size())) { -// 如果是从子维度开始下钻,那么先把主维度的条件先加上去 - if (CollectionUtils.isNotEmpty(xAxisExt) && StringUtils.equalsIgnoreCase(drill.get(0).getId(), xAxisExt.get(0).getId())) { - ChartDrillRequest head = drillRequestList.get(0); - for (int i = 0; i < xAxisBase.size(); i++) { - ChartDimensionDTO dimensionDTO = head.getDimensionList().get(i); - DatasetTableField datasetTableField = dataSetTableFieldsService.get(dimensionDTO.getId()); - ChartExtFilterRequest tmp = new ChartExtFilterRequest(); - tmp.setFieldId(tmp.getFieldId()); - tmp.setValue(Collections.singletonList(dimensionDTO.getValue())); - tmp.setOperator("in"); - tmp.setDatasetTableField(datasetTableField); - extFilterList.add(tmp); - drillFilters.add(tmp); + ArrayList fieldsToFilter = new ArrayList<>(); +// 如果是从子维度开始下钻,那么其他维度的条件要先加上去 +// 分组和堆叠 + if (StringUtils.containsIgnoreCase(view.getType(), "group")) { + fieldsToFilter.addAll(xAxisBase); +// 分组堆叠 + if (StringUtils.containsIgnoreCase(view.getType(),"stack")){ +// 分组和堆叠字段都有才有效 + if (CollectionUtils.isNotEmpty(xAxisExt) && CollectionUtils.isNotEmpty(extStack)) { +// 从分组字段下钻,就加上堆叠字段的条件 + if (StringUtils.equalsIgnoreCase(drill.get(0).getId(), xAxisExt.get(0).getId())) { + fieldsToFilter.addAll(extStack); + } +// 从堆叠字段下钻,就加上分组字段的条件 + if (StringUtils.equalsIgnoreCase(drill.get(0).getId(), extStack.get(0).getId())) { + fieldsToFilter.addAll(xAxisExt); + } + } } + }else if (StringUtils.containsIgnoreCase(view.getType(),"stack")){ +// 堆叠 + fieldsToFilter.addAll(xAxisBase); } + ChartDrillRequest head = drillRequestList.get(0); + Map dimMap = head.getDimensionList().stream().collect(Collectors.toMap(ChartDimensionDTO::getId, ChartDimensionDTO::getValue)); for (int i = 0; i < drillRequestList.size(); i++) { ChartDrillRequest request = drillRequestList.get(i); ChartViewFieldDTO chartViewFieldDTO = drill.get(i); @@ -870,26 +878,15 @@ public class ChartViewService { // 将钻取值作为条件传递,将所有钻取字段作为xAxis并加上下一个钻取字段 if (StringUtils.equalsIgnoreCase(requestDimension.getId(), chartViewFieldDTO.getId())) { isDrill = true; - DatasetTableField datasetTableField = dataSetTableFieldsService.get(requestDimension.getId()); - ChartViewFieldDTO d = new ChartViewFieldDTO(); - BeanUtils.copyBean(d, datasetTableField); - - ChartExtFilterRequest drillFilter = new ChartExtFilterRequest(); - drillFilter.setFieldId(requestDimension.getId()); - drillFilter.setValue(Collections.singletonList(requestDimension.getValue())); - drillFilter.setOperator("in"); - drillFilter.setDatasetTableField(datasetTableField); - extFilterList.add(drillFilter); - - drillFilters.add(drillFilter); - - if (!checkDrillExist(xAxis, extStack, d, view)) { - xAxis.add(d); + fieldsToFilter.add(chartViewFieldDTO); + dimMap.put(requestDimension.getId(), requestDimension.getValue()); + if (!checkDrillExist(xAxis, extStack, requestDimension.getId(), view)) { + xAxis.add(chartViewFieldDTO); } // if (i == drillRequestList.size() - 1) { ChartViewFieldDTO nextDrillField = drill.get(i + 1); - if (!checkDrillExist(xAxis, extStack, nextDrillField, view)) { + if (!checkDrillExist(xAxis, extStack, nextDrillField.getId(), view)) { // get drill list first element's sort,then assign to nextDrillField nextDrillField.setSort(getDrillSort(xAxis, drill.get(0))); xAxis.add(nextDrillField); @@ -898,6 +895,19 @@ public class ChartViewService { } } } + for (int i = 0; i < fieldsToFilter.size(); i++) { + ChartViewFieldDTO tmpField = fieldsToFilter.get(i); + ChartExtFilterRequest tmpFilter = new ChartExtFilterRequest(); + DatasetTableField datasetTableField = dataSetTableFieldsService.get(tmpField.getId()); + tmpFilter.setDatasetTableField(datasetTableField); + tmpFilter.setOperator("in"); + tmpFilter.setDateStyle(tmpField.getDateStyle()); + tmpFilter.setDatePattern(tmpField.getDatePattern()); + tmpFilter.setFieldId(tmpField.getId()); + tmpFilter.setValue(Collections.singletonList(dimMap.get(tmpField.getId()))); + extFilterList.add(tmpFilter); + drillFilters.add(tmpFilter); + } } // 判断连接方式,直连或者定时抽取 table.mode @@ -1540,17 +1550,17 @@ public class ChartViewService { } } - private boolean checkDrillExist(List xAxis, List extStack, ChartViewFieldDTO dto, ChartViewWithBLOBs view) { + private boolean checkDrillExist(List xAxis, List extStack, String fieldId, ChartViewWithBLOBs view) { if (CollectionUtils.isNotEmpty(xAxis)) { for (ChartViewFieldDTO x : xAxis) { - if (StringUtils.equalsIgnoreCase(x.getId(), dto.getId())) { + if (StringUtils.equalsIgnoreCase(x.getId(), fieldId)) { return true; } } } if (StringUtils.containsIgnoreCase(view.getType(), "stack") && CollectionUtils.isNotEmpty(extStack)) { for (ChartViewFieldDTO x : extStack) { - if (StringUtils.equalsIgnoreCase(x.getId(), dto.getId())) { + if (StringUtils.equalsIgnoreCase(x.getId(), fieldId)) { return true; } }