diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java index 9c844309d9..22714474b7 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java @@ -22,6 +22,7 @@ import io.dataease.exception.DEException; import io.dataease.extensions.datasource.api.PluginManageApi; import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; +import io.dataease.extensions.datasource.dto.FieldGroupDTO; import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.view.dto.*; import io.dataease.extensions.view.filter.FilterTreeObj; @@ -42,7 +43,10 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.*; -import java.util.concurrent.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -141,13 +145,13 @@ public class ChartViewManege { List coreDatasetTableFields = coreDatasetTableFieldMapper.selectList(wp); Map> groupedByTableId = coreDatasetTableFields.stream() .collect(Collectors.groupingBy(CoreDatasetTableField::getDatasetGroupId)); - if(chartViewDTOS.size()<10){ + if (chartViewDTOS.size() < 10) { chartViewDTOS.forEach(dto -> { if (dto.getTableId() != null) { dto.setCalParams(Utils.getParams(datasetTableFieldManage.transDTO(groupedByTableId.get(dto.getTableId())))); } }); - }else{ + } else { ExecutorService executor = Executors.newFixedThreadPool(10); try { // 超过10个图表要处理启用多线程处理 @@ -208,11 +212,14 @@ public class ChartViewManege { TypeReference> typeToken = new TypeReference<>() { }; + TypeReference> groupTokenType = new TypeReference<>() { + }; List fields = coreDatasetTableFieldMapper.selectList(wrapper); List collect = fields.stream().map(ele -> { DatasetTableFieldDTO dto = new DatasetTableFieldDTO(); BeanUtils.copyBean(dto, ele); dto.setParams(JsonUtil.parseList(ele.getParams(), typeToken)); + dto.setGroupList(JsonUtil.parseList(ele.getGroupList(), groupTokenType)); return dto; }).collect(Collectors.toList()); // filter column disable field @@ -228,6 +235,7 @@ public class ChartViewManege { List chartFields = coreDatasetTableFieldMapper.selectList(wrapper).stream().map(ele -> { DatasetTableFieldDTO dto = new DatasetTableFieldDTO(); BeanUtils.copyBean(dto, ele); + dto.setGroupList(JsonUtil.parseList(ele.getGroupList(), groupTokenType)); return dto; }).collect(Collectors.toList()); list.addAll(transFieldDTO(chartFields)); @@ -381,11 +389,11 @@ public class ChartViewManege { record.setExtLabel(objectMapper.writeValueAsString(dto.getExtLabel())); record.setExtTooltip(objectMapper.writeValueAsString(dto.getExtTooltip())); record.setCustomAttr(objectMapper.writeValueAsString(dto.getCustomAttr())); - if(dto.getCustomAttrMobile() != null){ + if (dto.getCustomAttrMobile() != null) { record.setCustomAttrMobile(objectMapper.writeValueAsString(dto.getCustomAttrMobile())); } record.setCustomStyle(objectMapper.writeValueAsString(dto.getCustomStyle())); - if(dto.getCustomAttrMobile() != null) { + if (dto.getCustomAttrMobile() != null) { record.setCustomStyleMobile(objectMapper.writeValueAsString(dto.getCustomStyleMobile())); } record.setSenior(objectMapper.writeValueAsString(dto.getSenior())); @@ -415,11 +423,11 @@ public class ChartViewManege { dto.setExtLabel(JsonUtil.parseList(record.getExtLabel(), tokenType)); dto.setExtTooltip(JsonUtil.parseList(record.getExtTooltip(), tokenType)); dto.setCustomAttr(JsonUtil.parse(record.getCustomAttr(), Map.class)); - if(record.getCustomAttrMobile() != null){ + if (record.getCustomAttrMobile() != null) { dto.setCustomAttrMobile(JsonUtil.parse(record.getCustomAttrMobile(), Map.class)); } dto.setCustomStyle(JsonUtil.parse(record.getCustomStyle(), Map.class)); - if(record.getCustomStyleMobile() != null) { + if (record.getCustomStyleMobile() != null) { dto.setCustomStyleMobile(JsonUtil.parse(record.getCustomStyleMobile(), Map.class)); } dto.setSenior(JsonUtil.parse(record.getSenior(), Map.class)); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java index bea8a13949..a22b9d01c4 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java @@ -366,6 +366,14 @@ public class DatasetGroupManage { datasetTableFieldDTO.setFieldShortName(dataeaseName); datasetTableFieldDTO.setDeExtractType(datasetTableFieldDTO.getDeType()); } + if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String dataeaseName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); + datasetTableFieldDTO.setDataeaseName(dataeaseName); + datasetTableFieldDTO.setFieldShortName(dataeaseName); + datasetTableFieldDTO.setDeExtractType(0); + datasetTableFieldDTO.setDeType(0); + datasetTableFieldDTO.setGroupType("d"); + } datasetTableFieldDTO.setDatasetGroupId(datasetGroupId); } else { datasetTableFieldDTO.setDataeaseName(dto.getDataeaseName()); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java index 4a70d1627f..a09c4f0980 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java @@ -14,6 +14,7 @@ import io.dataease.extensions.datasource.api.PluginManageApi; import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; +import io.dataease.extensions.datasource.dto.FieldGroupDTO; import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.view.dto.ColumnPermissionItem; import io.dataease.i18n.Translator; @@ -290,8 +291,12 @@ public class DatasetTableFieldManage { if (StringUtils.isNotEmpty(ele.getParams())) { TypeReference> tokenType = new TypeReference<>() { }; + TypeReference> groupTokenType = new TypeReference<>() { + }; List calParams = JsonUtil.parseList(ele.getParams(), tokenType); + List fieldGroups = JsonUtil.parseList(ele.getGroupList(), groupTokenType); dto.setParams(calParams); + dto.setGroupList(fieldGroups); } return dto; }).collect(Collectors.toList()); @@ -307,6 +312,9 @@ public class DatasetTableFieldManage { if (ObjectUtils.isNotEmpty(dto.getParams())) { record.setParams(JsonUtil.toJSONString(dto.getParams()).toString()); } + if (ObjectUtils.isNotEmpty(dto.getGroupList())) { + record.setGroupList(JsonUtil.toJSONString(dto.getGroupList()).toString()); + } return record; } diff --git a/core/core-backend/src/main/java/io/dataease/engine/constant/ExtFieldConstant.java b/core/core-backend/src/main/java/io/dataease/engine/constant/ExtFieldConstant.java index 7285deaabc..9676eb7430 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/constant/ExtFieldConstant.java +++ b/core/core-backend/src/main/java/io/dataease/engine/constant/ExtFieldConstant.java @@ -9,4 +9,6 @@ public class ExtFieldConstant { public final static Integer EXT_COPY = 1; public final static Integer EXT_CALC = 2; + + public final static Integer EXT_GROUP = 3; } diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java index 40fd28ce29..6ec5dc8a9c 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java @@ -103,6 +103,14 @@ public class CustomWhere2Str { } else { originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 3) { + String groupFieldExp = Utils.transGroupFieldToSql(field, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); + fieldsDialect.put(originName, groupFieldExp); + if (isCross) { + originName = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java index 309b6fe97e..8fcd41c338 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java @@ -59,6 +59,14 @@ public class Dimension2SQLObj { } else { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String groupFieldExp = Utils.transGroupFieldToSql(x, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); + fieldsDialect.put(originField, groupFieldExp); + if (isCross) { + originField = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java index 02b28779bf..96de306163 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java @@ -73,6 +73,14 @@ public class ExtWhere2Str { } else { originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 3) { + String groupFieldExp = Utils.transGroupFieldToSql(field, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); + fieldsDialect.put(originName, groupFieldExp); + if (isCross) { + originName = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java index 7bae4d5cb7..777106bc5d 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java @@ -63,6 +63,14 @@ public class Field2SQLObj { } else { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String groupFieldExp = Utils.transGroupFieldToSql(x, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); + fieldsDialect.put(originField, groupFieldExp); + if (isCross) { + originField = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java index f2c72f100c..3b14c7139d 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java @@ -65,6 +65,14 @@ public class Order2SQLObj { } else { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String groupFieldExp = Utils.transGroupFieldToSql(f, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, f.getId()); + fieldsDialect.put(originField, groupFieldExp); + if (isCross) { + originField = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java index 9a4db6e9b1..6fa78e6510 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java @@ -59,6 +59,14 @@ public class Quota2SQLObj { } else { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && Objects.equals(y.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String groupFieldExp = Utils.transGroupFieldToSql(y, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, y.getId()); + fieldsDialect.put(originField, groupFieldExp); + if (isCross) { + originField = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java index 412bda87ed..4bab50cbb6 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java @@ -119,6 +119,14 @@ public class WhereTree2Str { } else { originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); } + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && Objects.equals(field.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String groupFieldExp = Utils.transGroupFieldToSql(field, originFields); + // 给计算字段处加一个占位符,后续SQL方言转换后再替换 + originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); + fieldsDialect.put(originName, groupFieldExp); + if (isCross) { + originName = groupFieldExp; + } } else { if (StringUtils.equalsIgnoreCase(dsType, "es")) { originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); diff --git a/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java b/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java index 6faac760e0..a366f7b617 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java +++ b/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java @@ -5,10 +5,7 @@ import io.dataease.engine.constant.SQLConstants; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.api.PluginManageApi; import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; -import io.dataease.extensions.datasource.dto.CalParam; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; -import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; -import io.dataease.extensions.datasource.dto.DsTypeDTO; +import io.dataease.extensions.datasource.dto.*; import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.extensions.datasource.vo.XpackPluginsDatasourceVO; @@ -498,4 +495,49 @@ public class Utils { } return null; } + + public static String transGroupFieldToSql(DatasetTableFieldDTO dto, List fields) { + // get origin field + String originField = null; + for (DatasetTableFieldDTO ele : fields) { + if (Objects.equals(ele.getId(), Long.valueOf(dto.getOriginName()))) { + originField = ele.getOriginName(); + break; + } + } + if (originField == null) { + DEException.throwException("Field not exists"); + } + + StringBuilder exp = new StringBuilder(); + exp.append(" (CASE WHEN "); + if (dto.getDeType() == 0) { + for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) { + for (int i = 0; i < fieldGroupDTO.getText().size(); i++) { + String value = fieldGroupDTO.getText().get(i); + exp.append(originField).append(" = ").append("'").append(value).append("'"); + if (i < fieldGroupDTO.getText().size() - 1) { + exp.append(" OR "); + } + } + exp.append(" THEN '").append(fieldGroupDTO.getName()).append("'"); + } + } else if (dto.getDeType() == 1) { + for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) { + exp.append(originField).append(" >= ").append("'").append(fieldGroupDTO.getStartTime()).append("'"); + exp.append(" AND "); + exp.append(originField).append(" <= ").append("'").append(fieldGroupDTO.getEndTime()).append("'"); + exp.append(" THEN '").append(fieldGroupDTO.getName()).append("'"); + } + } else if (dto.getDeType() == 2 || dto.getDeType() == 3 || dto.getDeType() == 4) { + for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) { + exp.append(originField).append(StringUtils.equalsIgnoreCase(fieldGroupDTO.getMinTerm(), "le") ? " >= " : " > ").append(fieldGroupDTO.getMin()); + exp.append(" AND "); + exp.append(originField).append(StringUtils.equalsIgnoreCase(fieldGroupDTO.getMaxTerm(), "le") ? " <= " : " < ").append(fieldGroupDTO.getMax()); + exp.append(" THEN '").append(fieldGroupDTO.getName()).append("'"); + } + } + exp.append(" ELSE ").append("'").append(dto.getOtherGroup()).append("'").append(" END) "); + return exp.toString(); + } } diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java index 3b644ab85f..cb777e7e93 100644 --- a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java @@ -123,6 +123,16 @@ public class DatasetTableFieldDTO implements Serializable { */ private String fieldShortName; + /** + * 分组设置 + */ + private List groupList; + + /** + * 未分组的值 + */ + private String otherGroup; + /** * 是否脱敏 */ diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/FieldGroupDTO.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/FieldGroupDTO.java new file mode 100644 index 0000000000..c3d3469eed --- /dev/null +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/FieldGroupDTO.java @@ -0,0 +1,27 @@ +package io.dataease.extensions.datasource.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Author Junjun + */ +@Data +public class FieldGroupDTO { + private String name; + + private List text; + + private String min; + + private String minTerm; + + private String max; + + private String maxTerm; + + private String startTime; + + private String endTime; +}