diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 3f75355a5d..3947f2acac 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -34,6 +34,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Author gin @@ -159,13 +160,14 @@ public class DataSetTableFieldController { public List multFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { List results = new ArrayList<>(); for (String fieldId : multFieldValuesRequest.getFieldIds()) { - List fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getUserId(), true, false); + List fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false); if (CollectionUtil.isNotEmpty(fieldValues)) { results.addAll(fieldValues); } } - ArrayList list = results.stream().collect( + List list = results.stream().distinct().collect(Collectors.toList()); + /*ArrayList list = results.stream().collect( Collectors.collectingAndThen( Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(t -> { @@ -173,7 +175,7 @@ public class DataSetTableFieldController { return ""; return t.toString(); }))), - ArrayList::new)); + ArrayList::new));*/ return list; } @@ -185,13 +187,13 @@ public class DataSetTableFieldController { DecodedJWT jwt = JWT.decode(linkToken); Long userId = jwt.getClaim("userId").asLong(); multFieldValuesRequest.setUserId(userId); - return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getUserId(), true, true,false); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true,false); } @ApiIgnore @PostMapping("mappingFieldValues") public List mappingFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { - return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getUserId(), true, true, false); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false); } @ApiIgnore diff --git a/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java b/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java index c5e98eb02b..5c0bf52fa0 100644 --- a/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java @@ -1,5 +1,6 @@ package io.dataease.controller.request.dataset; +import io.dataease.dto.dataset.DeSortDTO; import lombok.Data; import java.util.ArrayList; @@ -9,4 +10,7 @@ import java.util.List; public class MultFieldValuesRequest { List fieldIds = new ArrayList<>(); Long userId= null; + + private DeSortDTO sort; + } diff --git a/backend/src/main/java/io/dataease/dto/dataset/DeSortDTO.java b/backend/src/main/java/io/dataease/dto/dataset/DeSortDTO.java new file mode 100644 index 0000000000..e4aee3cca9 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/dataset/DeSortDTO.java @@ -0,0 +1,18 @@ +package io.dataease.dto.dataset; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class DeSortDTO implements Serializable { + + private String id; + + private String name; + + private String sort; + + private List custom; +} diff --git a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index fb12a9a628..7c2e7ec3e0 100644 --- a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -10,6 +10,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -83,6 +84,11 @@ public class DorisQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(DorisConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -149,9 +155,71 @@ public class DorisQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getDataeaseName()); + } else { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == 1) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(DorisConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + fieldName = String.format(DorisConstants.CAST, originField, DorisConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(DorisConstants.CAST, originField, DorisConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == 1) { + fieldName = String.format(DorisConstants.STR_TO_DATE, originField, DorisConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == 1) { + String cast = String.format(DorisConstants.CAST, originField, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(DorisConstants.CAST, originField, DorisConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(DorisConstants.CAST, originField, DorisConstants.DEFAULT_FLOAT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sql + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sql + ")", fields, isGroup, null, fieldCustomFilter); 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 359e5e822c..cc32f18c29 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 @@ -10,6 +10,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -83,6 +84,11 @@ public class MysqlQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MysqlConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -149,9 +155,71 @@ public class MysqlQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getDataeaseName()); + } else { + originField = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == 1) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(MysqlConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + fieldName = String.format(MysqlConstants.CAST, originField, MysqlConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(MysqlConstants.CAST, originField, MysqlConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == 1) { + fieldName = String.format(MysqlConstants.STR_TO_DATE, originField, MysqlConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == 1) { + String cast = String.format(MysqlConstants.CAST, originField, MysqlConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(MysqlConstants.FROM_UNIXTIME, cast, MysqlConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(MysqlConstants.CAST, originField, MysqlConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(MysqlConstants.CAST, originField, MysqlConstants.DEFAULT_FLOAT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sql + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sql + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java b/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java index 14db648d88..debc16ff46 100644 --- a/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/api/ApiProvider.java @@ -5,6 +5,7 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; import org.springframework.stereotype.Service; @@ -71,6 +72,16 @@ public class ApiProvider extends QueryProvider { return null; } + @Override + public String createQuerySQL(String s, List list, boolean b, Datasource datasource, List list1, List list2) { + return null; + } + + @Override + public String createQuerySQLAsTmp(String s, List list, boolean b, List list1, List list2) { + return null; + } + @Override public String getSQLAsTmp(String s, List list, List list1, List list2, List list3, ChartViewWithBLOBs chartViewWithBLOBs) { return null; 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 ded1e721e2..903a93fb51 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 @@ -12,6 +12,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -113,6 +114,11 @@ public class CKQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -179,9 +185,75 @@ public class CKQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + if (f.getType().equalsIgnoreCase("DATE")) { + fieldName = String.format(CKConstants.toInt32, String.format(CKConstants.toDateTime, originField)) + "*1000"; + } else { + fieldName = String.format(CKConstants.toInt32, originField) + "*1000"; + } + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(CKConstants.toInt64, originField); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(CKConstants.toFloat64, originField); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(CKConstants.toDateTime, originField); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(CKConstants.toFloat64, originField); + fieldName = String.format(CKConstants.toDateTime, cast); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(CKConstants.toInt64, originField); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index ea6217e585..0a64fdf0a3 100644 --- a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -14,6 +14,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -84,6 +85,11 @@ public class Db2QueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(Db2Constants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -153,9 +159,74 @@ public class Db2QueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(Db2Constants.UNIX_TIMESTAMP, originField); + } else { + if(f.getType().equalsIgnoreCase("TIME")){ + fieldName = String.format(Db2Constants.FORMAT_TIME, originField, Db2Constants.DEFAULT_DATE_FORMAT); + }else { + fieldName = originField; + } + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(Db2Constants.CAST, originField, Db2Constants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(Db2Constants.CAST, originField, Db2Constants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(Db2Constants.DATE_FORMAT, originField, Db2Constants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(Db2Constants.CAST, originField, Db2Constants.DEFAULT_INT_FORMAT); + fieldName = String.format(Db2Constants.FROM_UNIXTIME, cast, Db2Constants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(Db2Constants.CAST, originField, Db2Constants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index a2ec6771ad..f2b562252b 100644 --- a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -12,6 +12,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -116,6 +117,11 @@ public class EsQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(EsSqlLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -180,9 +186,71 @@ public class EsQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == DeTypeConstants.DE_INT) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == DeTypeConstants.DE_TIME) { + originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(EsSqlLConstants.CAST, originField, "bigint"); + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(EsSqlLConstants.CAST, originField, "bigint"); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(EsSqlLConstants.CAST, originField, "double"); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(EsSqlLConstants.CAST, originField, "timestamp"); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(EsSqlLConstants.CAST, originField, "timestamp"); + fieldName = String.format(EsSqlLConstants.DATETIME_FORMAT, cast, EsSqlLConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(EsSqlLConstants.CAST, originField, "bigint"); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java index 0e655fa419..0dae80e83d 100644 --- a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -12,6 +12,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -77,6 +78,11 @@ public class HiveQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -139,9 +145,71 @@ public class HiveQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(HiveConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(HiveConstants.STR_TO_DATE, originField, HiveConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index c970b1aade..24530afa3f 100644 --- a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -12,6 +12,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -74,6 +75,11 @@ public class ImpalaQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(ImpalaConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -136,14 +142,76 @@ public class ImpalaQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { //时间转数值 + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(ImpalaConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { //字符串转时间 + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(ImpalaConstants.CAST, originField, ImpalaConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(ImpalaConstants.CAST, originField, ImpalaConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(ImpalaConstants.DATE_FORMAT, originField, ImpalaConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) {//数值转时间 + String cast = String.format(ImpalaConstants.CAST, originField, ImpalaConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(ImpalaConstants.FROM_UNIXTIME, cast, ImpalaConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(ImpalaConstants.CAST, originField, ImpalaConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + @Override public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + realSize; diff --git a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 26b7a40a40..f81eeb5125 100644 --- a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -12,6 +12,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -86,6 +87,11 @@ public class MongoQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MongoConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -125,14 +131,50 @@ public class MongoQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == DeTypeConstants.DE_INT) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == DeTypeConstants.DE_TIME) { + originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index); + String fieldName = ""; + fieldName = originField; + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + @Override public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds, List fieldCustomFilter) { return createQuerySQL(table, fields, isGroup, null, fieldCustomFilter) + " LIMIT " + (page - 1) * pageSize + "," + realSize; 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 3c146fb8d9..a26dd57464 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 @@ -11,6 +11,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.query.QueryProvider; @@ -84,6 +85,60 @@ public class MysqlQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, null); + } + + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == 1) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(MySQLConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = String.format(MySQLConstants.DATE_FORMAT, originField, MySQLConstants.DEFAULT_DATE_FORMAT); + } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + fieldName = String.format(MySQLConstants.CAST, originField, MySQLConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(MySQLConstants.CAST, originField, MySQLConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == 1) { + fieldName = String.format(MySQLConstants.STR_TO_DATE, originField, MySQLConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == 1) { + String cast = String.format(MySQLConstants.CAST, originField, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(MySQLConstants.CAST, originField, MySQLConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MySQLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -137,6 +192,8 @@ public class MysqlQueryProvider extends QueryProvider { } } + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); ST st_sql = stg.getInstanceOf("previewSql"); st_sql.add("isGroup", isGroup); @@ -148,12 +205,25 @@ public class MysqlQueryProvider extends QueryProvider { if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } + return st_sql.render(); } @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index db13639ff6..cdbc5ba4a1 100644 --- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -13,6 +13,7 @@ import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.entity.JdbcConfiguration; @@ -98,7 +99,7 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(OracleConstants.ALIAS_FIX, String.format(TABLE_ALIAS_PREFIX, 0))) @@ -107,6 +108,8 @@ public class OracleQueryProvider extends QueryProvider { setSchema(tableObj, ds); List xFields = xFields(table, fields); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); ST st_sql = stg.getInstanceOf("previewSql"); st_sql.add("isGroup", isGroup); @@ -116,9 +119,34 @@ public class OracleQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } return st_sql.render(); } + + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + public void setSchema(SQLObj tableObj, Datasource ds) { if (ds != null && !tableObj.getTableName().startsWith("(") && !tableObj.getTableName().endsWith(")")) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); @@ -127,6 +155,49 @@ public class OracleQueryProvider extends QueryProvider { } } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index)); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == 1) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(OracleConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + fieldName = String.format(OracleConstants.CAST, originField, OracleConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == 3) { + fieldName = String.format(OracleConstants.CAST, originField, OracleConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == 1) { + fieldName = String.format(OracleConstants.DATE_FORMAT, originField, OracleConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == 1) { + String cast = String.format(OracleConstants.CAST, originField, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(OracleConstants.CAST, originField, OracleConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + private List xFields(String table, List fields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) diff --git a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index d85dffa89e..c54c2a761e 100644 --- a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -10,6 +10,7 @@ import io.dataease.plugins.common.constants.*; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.entity.JdbcConfiguration; @@ -99,6 +100,11 @@ public class PgQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -163,9 +169,70 @@ public class PgQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(PgConstants.UNIX_TIMESTAMP, originField); + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(PgConstants.CAST, originField, "timestamp"); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(PgConstants.CAST, originField, "bigint"); + fieldName = String.format(PgConstants.FROM_UNIXTIME, cast); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 42c340eea4..49a78170ac 100644 --- a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -10,6 +10,7 @@ import io.dataease.plugins.common.constants.*; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.entity.JdbcConfiguration; @@ -107,6 +108,11 @@ public class RedshiftQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -171,9 +177,71 @@ public class RedshiftQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + + + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } return st_sql.render(); } + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(PgConstants.UNIX_TIMESTAMP, originField); + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(PgConstants.CAST, originField, "timestamp"); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(PgConstants.CAST, originField, "bigint"); + fieldName = String.format(PgConstants.FROM_UNIXTIME, cast); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + @Override public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); diff --git a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index 05bed2ccd3..191ce6d589 100644 --- a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -13,6 +13,7 @@ import io.dataease.plugins.common.constants.SqlServerSQLConstants; import io.dataease.plugins.common.dto.chart.ChartCustomFilterItemDTO; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.datasource.entity.JdbcConfiguration; @@ -93,6 +94,21 @@ public class SqlserverQueryProvider extends QueryProvider { @Override public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter) { + return createQuerySQL(table, fields, isGroup, ds, fieldCustomFilter, null); + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter, List sortFields) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter, sortFields); + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds, List fieldCustomFilter, List sortFields) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(SqlServerSQLConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -157,12 +173,62 @@ public class SqlserverQueryProvider extends QueryProvider { List wheres = new ArrayList<>(); if (customWheres != null) wheres.add(customWheres); if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(sortFields)) { + int step = fields.size(); + for (int i = step; i < (step + sortFields.size()); i++) { + DeSortField deSortField = sortFields.get(i - step); + SQLObj order = buildSortField(deSortField, tableObj, i); + xOrders.add(order); + } + } + if (ObjectUtils.isNotEmpty(xOrders)) { + st_sql.add("orders", xOrders); + } return st_sql.render(); } - @Override - public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup, List fieldCustomFilter) { - return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null, fieldCustomFilter); + private SQLObj buildSortField(DeSortField f, SQLObj tableObj, int index) { + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, index); + String fieldName; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { // 时间 转为 数值 + if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originField); + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_INT_FORMAT, originField); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originField); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { //字符串转时间 + fieldName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originField); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { // 数值转时间 + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originField + "/1000"); + fieldName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); + } else if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_INT_FORMAT, originField); + } else { + fieldName = originField; + } + } + SQLObj result = SQLObj.builder().orderField(originField).orderAlias(originField).orderDirection(f.getOrderDirection()).build(); + return result; } @Override diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java index e2b580dbe3..b73cf5b5f3 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java @@ -1,11 +1,17 @@ package io.dataease.service.dataset; + + +import io.dataease.dto.dataset.DeSortDTO; + import java.util.List; public interface DataSetFieldService { List fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception; - List fieldValues(List fieldIds, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception; + List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception; + + List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception; } diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index f210427e65..f2157cd321 100644 --- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -3,13 +3,16 @@ package io.dataease.service.dataset.impl.direct; import com.google.gson.Gson; import io.dataease.commons.exception.DEException; import io.dataease.commons.model.BaseTreeNode; +import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.TreeUtils; +import io.dataease.dto.dataset.DeSortDTO; import io.dataease.plugins.common.base.domain.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.commons.constants.ColumnPermissionConstants; import io.dataease.i18n.Translator; import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO; +import io.dataease.plugins.common.dto.datasource.DeSortField; import io.dataease.plugins.common.request.datasource.DatasourceRequest; import io.dataease.plugins.datasource.provider.Provider; import io.dataease.plugins.datasource.query.QueryProvider; @@ -48,11 +51,28 @@ public class DirectFieldService implements DataSetFieldService { public List fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception { List filedIds = new ArrayList<>(); filedIds.add(fieldId); - return fieldValues(filedIds, userId, userPermissions, false, rowAndColumnMgm); + return fieldValues(filedIds, null, userId, userPermissions, false, rowAndColumnMgm); } @Override - public List fieldValues(List fieldIds, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception { + public List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception { + List filedIds = new ArrayList<>(); + filedIds.add(fieldId); + return fieldValues(filedIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm); + } + + public List buildSorts(List allFields, DeSortDTO sortDTO) { + if (ObjectUtils.isEmpty(sortDTO) || StringUtils.isBlank(sortDTO.getId()) || StringUtils.isBlank(sortDTO.getSort())) + return null; + return allFields.stream().filter(field -> StringUtils.equals(sortDTO.getId(), field.getId())).map(field -> { + DeSortField deSortField = BeanUtils.copyBean(new DeSortField(), field); + deSortField.setOrderDirection(sortDTO.getSort()); + return deSortField; + }).collect(Collectors.toList()); + } + + @Override + public List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception { String fieldId = fieldIds.get(0); DatasetTableField field = dataSetTableFieldsService.selectByPrimaryKey(fieldId); if (field == null || StringUtils.isEmpty(field.getTableId())) return null; @@ -62,6 +82,9 @@ public class DirectFieldService implements DataSetFieldService { DatasetTableField datasetTableField = DatasetTableField.builder().tableId(field.getTableId()).checked(Boolean.TRUE).build(); List fields = dataSetTableFieldsService.list(datasetTableField); + + List deSortFields = buildSorts(fields, sortDTO); + final List allTableFieldIds = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()); boolean multi = fieldIds.stream().anyMatch(item -> !allTableFieldIds.contains(item)); if (multi && needMapping) { @@ -95,6 +118,8 @@ public class DirectFieldService implements DataSetFieldService { } } + + DatasourceRequest datasourceRequest = new DatasourceRequest(); Provider datasourceProvider = null; if (datasetTable.getMode() == 0) {// 直连 @@ -110,18 +135,18 @@ public class DirectFieldService implements DataSetFieldService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - datasourceRequest.setQuery(qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, true, ds, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, true, ds, customFilter, deSortFields)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), permissionFields, true, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), permissionFields, true, customFilter, deSortFields)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); List listUnion = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, listUnion, ds); - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "union")) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql"); - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter, deSortFields)); } } else if (datasetTable.getMode() == 1) {// 抽取 // 连接doris,构建doris数据源查询 diff --git a/frontend/src/components/DragItem/index.vue b/frontend/src/components/DragItem/index.vue index f0629e54d4..b0694772f8 100644 --- a/frontend/src/components/DragItem/index.vue +++ b/frontend/src/components/DragItem/index.vue @@ -6,8 +6,82 @@ {{ item.name }} - - {{ $t('chart.delete') }} + + + {{ $t('chart.none') }} + + + + + + + {{ $t('chart.asc') }} + + + + +
    + +
  • + {{ node.name }} +
  • + +
+ +
+
+ + + + + {{ $t('chart.desc') }} + + + + +
    + +
  • + {{ node.name }} +
  • + +
+ +
+
+ + + {{ $t('chart.delete') }}
@@ -27,22 +101,59 @@ export default { index: { type: Number, required: true + }, + allFields: { + type: Array, + default: () => [] + }, + sort: { + type: Object, + default: () => null + }, + isSortWidget: { + type: Boolean, + default: false } }, data() { return { + radio: 0, + ascFieldsShow: false, + descFieldsShow: false, + defaultSortProp: { + + sort: 'none' + }, + sortNode: null + } + }, + computed: { + disabledSort() { + return this.index > 0 } }, mounted() { }, + created() { + if (!this.sortNode) { + this.sortNode = this.sort && this.sort.id ? JSON.parse(JSON.stringify(this.sort)) : JSON.parse(JSON.stringify(this.defaultSortProp)) + // this.sortChange('none') + } + }, methods: { clickItem(param) { if (!param) { return } switch (param.type) { - case 'rename': - this.showRename() + case 'none': + this.sortChange('none') + break + case 'asc': + this.sortChange('asc') + break + case 'desc': + this.sortChange('desc') break case 'remove': this.removeItem() @@ -56,20 +167,38 @@ export default { type: type } }, - showRename() { - this.item.index = this.index - this.item.renameType = 'dimension' - this.$emit('onNameEdit', this.item) - }, + removeItem() { this.item.index = this.index this.$emit('closeItem', this.item) + }, + + saveAscField({ id, name }) { + this.ascFieldsShow = false + const sort = 'asc' + this.sortNode = { id, name, sort } + this.$emit('sort-change', this.sortNode) + }, + + saveDescField({ id, name }) { + this.descFieldsShow = false + const sort = 'desc' + this.sortNode = { id, name, sort } + this.$emit('sort-change', this.sortNode) + }, + sortChange(type) { + this.sortNode.sort = type + if (type === 'none') { + this.sortNode = { sort: 'none' } + } + this.$emit('sort-change', this.sortNode) } + } } - diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index 62d4853d03..6904f89bb4 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -100,7 +100,7 @@ export default { if (!token && linkToken) { method = linkMultFieldValues } - const param = { fieldIds: this.element.options.attrs.fieldId.split(',') } + const param = { fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort } if (this.panelInfo.proxy) { param.userId = this.panelInfo.proxy } @@ -121,10 +121,33 @@ export default { this.$nextTick(() => { this.show = true }) + }, + 'element.options.attrs.sort': function(value, old) { + if (value === null || typeof value === 'undefined' || value === old) return + this.datas = [] + + let method = multFieldValues + const token = this.$store.getters.token || getToken() + const linkToken = this.$store.getters.linkToken || getLinkToken() + if (!token && linkToken) { + method = linkMultFieldValues + } + const param = { fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort } + if (this.panelInfo.proxy) { + param.userId = this.panelInfo.proxy + } + this.element.options.attrs.fieldId && + this.element.options.attrs.fieldId.length > 0 && + method(param).then(res => { + this.datas = this.optionDatas(res.data) + }) || (this.element.options.value = '') } }, created() { + if (!this.element.options.attrs.sort) { + this.element.options.attrs.sort = {} + } this.initLoad() }, mounted() { @@ -155,7 +178,7 @@ export default { if (!token && linkToken) { method = linkMultFieldValues } - method({ fieldIds: this.element.options.attrs.fieldId.split(',') }).then(res => { + method({ fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort }).then(res => { this.datas = this.optionDatas(res.data) }) } diff --git a/frontend/src/components/widget/DeWidget/DeSelectGrid.vue b/frontend/src/components/widget/DeWidget/DeSelectGrid.vue index ef372e2c24..1ca3012362 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectGrid.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectGrid.vue @@ -122,7 +122,7 @@ export default { if (!token && linkToken) { method = linkMultFieldValues } - const param = { fieldIds: this.element.options.attrs.fieldId.split(',') } + const param = { fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort } if (this.panelInfo.proxy) { param.userId = this.panelInfo.proxy } @@ -149,9 +149,31 @@ export default { this.isIndeterminate = this.value.length > 0 && this.value.length < this.datas.length } }) + }, + 'element.options.attrs.sort': function(value, old) { + if (typeof value === 'undefined' || value === old) return + this.datas = [] + let method = multFieldValues + const token = this.$store.getters.token || getToken() + const linkToken = this.$store.getters.linkToken || getLinkToken() + if (!token && linkToken) { + method = linkMultFieldValues + } + const param = { fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort } + if (this.panelInfo.proxy) { + param.userId = this.panelInfo.proxy + } + this.element.options.attrs.fieldId && + this.element.options.attrs.fieldId.length > 0 && + method(param).then(res => { + this.datas = this.optionDatas(res.data) + }) || (this.element.options.value = '') } }, created() { + if (!this.element.options.attrs.sort) { + this.element.options.attrs.sort = {} + } this.initLoad() }, mounted() { @@ -178,7 +200,7 @@ export default { if (!token && linkToken) { method = linkMultFieldValues } - method({ fieldIds: this.element.options.attrs.fieldId.split(',') }).then(res => { + method({ fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort }).then(res => { this.datas = this.optionDatas(res.data) if (this.element.options.attrs.multiple) { this.checkAll = this.value.length === this.datas.length diff --git a/frontend/src/components/widget/DeWidget/DeSelectTree.vue b/frontend/src/components/widget/DeWidget/DeSelectTree.vue index f1559bba25..a7f29ed2d7 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectTree.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectTree.vue @@ -118,7 +118,7 @@ export default { if (!token && linkToken) { method = linkMappingFieldValues } - const param = { fieldIds: this.element.options.attrs.fieldId.split(',') } + const param = { fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort } if (this.panelInfo.proxy) { param.userId = this.panelInfo.proxy } @@ -162,10 +162,37 @@ export default { this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas) }) }) + }, + 'element.options.attrs.sort': function(value, old) { + if (value === null || typeof value === 'undefined' || value === old) return + this.datas = [] + + let method = mappingFieldValues + const token = this.$store.getters.token || getToken() + const linkToken = this.$store.getters.linkToken || getLinkToken() + if (!token && linkToken) { + method = linkMappingFieldValues + } + const param = { fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort } + if (this.panelInfo.proxy) { + param.userId = this.panelInfo.proxy + } + this.element.options.attrs.fieldId && + this.element.options.attrs.fieldId.length > 0 && + method(param).then(res => { + this.datas = this.optionDatas(res.data) + this.$nextTick(() => { + this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas) + }) + }) + this.element.options.value = '' } }, created() { + if (!this.element.options.attrs.sort) { + this.element.options.attrs.sort = {} + } this.initLoad() }, mounted() { @@ -206,7 +233,7 @@ export default { if (!token && linkToken) { method = linkMappingFieldValues } - method({ fieldIds: this.element.options.attrs.fieldId.split(',') }).then(res => { + method({ fieldIds: this.element.options.attrs.fieldId.split(','), sort: this.element.options.attrs.sort }).then(res => { this.datas = this.optionDatas(res.data) this.$nextTick(() => { this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas) diff --git a/frontend/src/components/widget/serviceImpl/NumberSelectGridServiceImpl.js b/frontend/src/components/widget/serviceImpl/NumberSelectGridServiceImpl.js index e328fdbaf8..1dbb4319e2 100644 --- a/frontend/src/components/widget/serviceImpl/NumberSelectGridServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/NumberSelectGridServiceImpl.js @@ -18,7 +18,8 @@ const dialogPanel = { label: 'text', value: 'id', fieldId: '', - dragItems: [] + dragItems: [], + sort: {} }, value: '', manualModify: false @@ -90,6 +91,10 @@ class NumberSelectGridServiceImpl extends WidgetService { } return param } + + isSortWidget() { + return true + } fillValueDerfault(element) { const defaultV = element.options.value === null ? '' : element.options.value.toString() if (element.options.attrs.multiple) { diff --git a/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js b/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js index f561847147..e2e64eacb3 100644 --- a/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js @@ -18,7 +18,8 @@ const dialogPanel = { label: 'text', value: 'id', fieldId: '', - dragItems: [] + dragItems: [], + sort: {} }, value: '', manualModify: false @@ -91,6 +92,10 @@ class NumberSelectServiceImpl extends WidgetService { } return param } + + isSortWidget() { + return true + } fillValueDerfault(element) { const defaultV = element.options.value === null ? '' : element.options.value.toString() if (element.options.attrs.multiple) { diff --git a/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js index f65b223c05..19c32f870a 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectGridServiceImpl.js @@ -18,7 +18,8 @@ const dialogPanel = { label: 'text', value: 'id', fieldId: '', - dragItems: [] + dragItems: [], + sort: {} }, value: '', manualModify: false @@ -90,6 +91,10 @@ class TextSelectGridServiceImpl extends WidgetService { } return param } + + isSortWidget() { + return true + } fillValueDerfault(element) { const defaultV = element.options.value === null ? '' : element.options.value.toString() if (element.options.attrs.multiple) { diff --git a/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js index 88ffa9679b..65f6c53ffb 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js @@ -17,7 +17,8 @@ const dialogPanel = { label: 'text', value: 'id', fieldId: '', - dragItems: [] + dragItems: [], + sort: {} }, value: '', manualModify: false @@ -92,6 +93,9 @@ class TextSelectServiceImpl extends WidgetService { } return param } + isSortWidget() { + return true + } fillValueDerfault(element) { const defaultV = element.options.value === null ? '' : element.options.value.toString() diff --git a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js index 23674de94f..7dbe3d9f72 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js @@ -17,7 +17,8 @@ const dialogPanel = { label: 'text', value: 'id', fieldId: '', - dragItems: [] + dragItems: [], + sort: {} }, value: '', manualModify: false @@ -96,6 +97,9 @@ class TextSelectTreeServiceImpl extends WidgetService { } return param } + isSortWidget() { + return true + } fillValueDerfault(element) { const defaultV = element.options.value === null ? '' : element.options.value.toString() diff --git a/frontend/src/views/panel/filter/filterDialog.vue b/frontend/src/views/panel/filter/filterDialog.vue index 2acc5d44c2..8dd498f2b8 100644 --- a/frontend/src/views/panel/filter/filterDialog.vue +++ b/frontend/src/views/panel/filter/filterDialog.vue @@ -181,7 +181,7 @@
- + @@ -294,7 +294,8 @@ export default { childViews: { viewInfos: [] }, - currentElement: null + currentElement: null, + allFields: [] } }, computed: { @@ -318,6 +319,7 @@ export default { } this.enableSureButton() }, + keyWord(val) { this.expandedArray = [] if (this.showDomType === 'field') { @@ -546,6 +548,7 @@ export default { loadField(tableId) { fieldListWithPermission(tableId).then(res => { let datas = res.data + this.allFields = JSON.parse(JSON.stringify(datas)) if (this.widget && this.widget.filterFieldMethod) { datas = this.widget.filterFieldMethod(datas) } @@ -556,6 +559,7 @@ export default { comLoadField(tableId) { fieldListWithPermission(tableId).then(res => { let datas = res.data + this.allFields = JSON.parse(JSON.stringify(datas)) if (this.widget && this.widget.filterFieldMethod) { datas = this.widget.filterFieldMethod(datas) } diff --git a/frontend/src/views/panel/filter/filterMain/FilterHead.vue b/frontend/src/views/panel/filter/filterMain/FilterHead.vue index c981702641..5b947aa841 100644 --- a/frontend/src/views/panel/filter/filterMain/FilterHead.vue +++ b/frontend/src/views/panel/filter/filterMain/FilterHead.vue @@ -16,28 +16,12 @@ style="width:100%;height: 100%;margin:0 10px;border-radius: 4px;overflow-x: auto;display: flex;align-items: center;" @end="end2" > - + - + - + {{ $t('panel.drag_here') }} @@ -61,6 +45,14 @@ export default { element: { type: Object, default: () => {} + }, + allFields: { + type: Array, + default: () => [] + }, + widget: { + type: Object, + default: null } }, data() { @@ -68,11 +60,17 @@ export default { targets: [] } }, + computed: { + isSortWidget() { + return this.widget && this.widget.isSortWidget && this.widget.isSortWidget() + } + }, watch: { }, created() { + }, methods: { onMove(e, originalEvent) { @@ -84,6 +82,13 @@ export default { closeItem(tag) { const index = tag.index this.element.options.attrs.dragItems.splice(index, 1) + if (!index) { + this.element.options.attrs.sort = null + } + }, + sortChange(param) { + this.element.options.attrs.sort = param + // this.$emit('sort-change', param) } } }