From 72ad660a39b92e54401a7b9c6c0943ffcd6af946 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 26 May 2022 11:47:04 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20=E5=A4=8D=E7=94=A8=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E9=A2=84=E8=A7=88=E8=A7=86=E5=9B=BE=E6=97=B6?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/panel/ViewSelect/multiplexing.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/panel/ViewSelect/multiplexing.vue b/frontend/src/views/panel/ViewSelect/multiplexing.vue index 93b2dc8ec8..b4e2f097ec 100644 --- a/frontend/src/views/panel/ViewSelect/multiplexing.vue +++ b/frontend/src/views/panel/ViewSelect/multiplexing.vue @@ -67,7 +67,7 @@ export default { showDetails(params) { this.$store.commit('initCurMultiplexingComponents') const _this = this - _this.selectedPanel = params + _this.selectedPanel = null if (params.showType === 'panel') { _this.showPosition = 'multiplexing' _this.panelLoading = true @@ -76,6 +76,7 @@ export default { panelDataPrepare(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle), function(rsp) { _this.componentData = rsp.componentData _this.canvasStyleData = rsp.componentStyle + _this.selectedPanel = params }) }) } else if (params.showType === 'view') { @@ -95,6 +96,7 @@ export default { } _this.$nextTick(() => { _this.componentData.push(userView) + _this.selectedPanel = params }) } } From ca41d05200495c8e33979b940ed10ab64c8f544e Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 26 May 2022 12:08:40 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20=E6=89=B9=E9=87=8F=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E8=A7=86=E5=9B=BE=E6=A0=B7=E5=BC=8F=E6=97=B6=EF=BC=8C=E8=8B=A5?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=8F=9C=E5=8D=95=E8=BF=87=E9=95=BF=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E6=97=A0=E6=B3=95=E6=BB=9A=E5=8A=A8=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=88=B0=E5=BA=95=E9=83=A8=E7=9A=84=E6=A0=B7=E5=BC=8F=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/chart/view/ChartStyleBatchSet.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/views/chart/view/ChartStyleBatchSet.vue b/frontend/src/views/chart/view/ChartStyleBatchSet.vue index 626094ed1a..f55d02c9a5 100644 --- a/frontend/src/views/chart/view/ChartStyleBatchSet.vue +++ b/frontend/src/views/chart/view/ChartStyleBatchSet.vue @@ -5,6 +5,7 @@ Date: Thu, 26 May 2022 12:38:06 +0800 Subject: [PATCH 3/8] =?UTF-8?q?test:=20=E6=A0=91=E5=BD=A2=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8sql=E6=8B=BC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/mysql/MysqlQueryProvider.java | 82 +++++++++------- .../query/mysql/MysqlQueryProvider.java | 95 +++++++++++-------- .../service/chart/ChartViewService.java | 58 ++++++++--- 3 files changed, 149 insertions(+), 86 deletions(-) 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 2b00456caf..359e5e822c 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 @@ -848,48 +848,66 @@ public class MysqlQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; - } - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getOperator()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); } else { - originName = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); + fieldList.add(request.getDatasetTableField()); } - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { - whereName = String.format(MysqlConstants.STR_TO_DATE, originName, MysqlConstants.DEFAULT_DATE_FORMAT); + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(MysqlConstants.CAST, originName, MysqlConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(MysqlConstants.FROM_UNIXTIME, cast, MysqlConstants.DEFAULT_DATE_FORMAT); + String whereName = ""; + + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); + } else { + originName = String.format(MysqlConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); } - } else if (field.getDeType() == 0 && field.getDeExtractType() == 0) { - whereName = String.format(MysqlConstants.CAST, originName, MysqlConstants.CHAR); - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(MysqlConstants.CAST, originName, MysqlConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(MysqlConstants.UNIX_TIMESTAMP, originName) + "*1000"; - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { + whereName = String.format(MysqlConstants.STR_TO_DATE, originName, MysqlConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(MysqlConstants.CAST, originName, MysqlConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(MysqlConstants.FROM_UNIXTIME, cast, MysqlConstants.DEFAULT_DATE_FORMAT); + } + } else if (field.getDeType() == 0 && field.getDeExtractType() == 0) { + whereName = String.format(MysqlConstants.CAST, originName, MysqlConstants.CHAR); + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(MysqlConstants.CAST, originName, MysqlConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(MysqlConstants.UNIX_TIMESTAMP, originName) + "*1000"; + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + whereNameList.add(whereName); } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } + String whereTerm = transMysqlFilterTerm(request.getOperator()); + String whereValue = ""; if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; 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 b091838562..112892e331 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 @@ -829,50 +829,67 @@ public class MysqlQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(MySQLConstants.STR_TO_DATE, originName, MySQLConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(MySQLConstants.UNIX_TIMESTAMP, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(MySQLConstants.STR_TO_DATE, originName, MySQLConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(MySQLConstants.FROM_UNIXTIME, cast, MySQLConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(MySQLConstants.CAST, originName, MySQLConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(MySQLConstants.UNIX_TIMESTAMP, originName); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index d4ec1cfd96..b3c6aad78b 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -542,8 +542,10 @@ public class ChartViewService { if (ObjectUtils.isEmpty(view)) { throw new RuntimeException(Translator.get("i18n_chart_delete")); } - Type tokenType = new TypeToken>() {}.getType(); - Type filterTokenType = new TypeToken>() {}.getType(); + Type tokenType = new TypeToken>() { + }.getType(); + Type filterTokenType = new TypeToken>() { + }.getType(); List viewFields = gson.fromJson(view.getViewFields(), tokenType); Map> extFieldsMap = null; @@ -640,24 +642,50 @@ public class ChartViewService { String fieldId = request.getFieldId(); if (StringUtils.isNotEmpty(fieldId)) { String[] fieldIds = fieldId.split(","); - for (String fId : fieldIds) { + if (request.getIsTree()) { ChartExtFilterRequest filterRequest = new ChartExtFilterRequest(); BeanUtils.copyBean(filterRequest, request); - filterRequest.setFieldId(fId); - - DatasetTableField datasetTableField = dataSetTableFieldsService.get(fId); - if (datasetTableField == null) { - continue; + filterRequest.setDatasetTableFieldList(new ArrayList<>()); + for (String fId : fieldIds) { + DatasetTableField datasetTableField = dataSetTableFieldsService.get(fId); + if (datasetTableField == null) { + continue; + } + if (!desensitizationList.contains(datasetTableField.getDataeaseName()) && dataeaseNames.contains(datasetTableField.getDataeaseName())) { + if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) { + if (CollectionUtils.isNotEmpty(filterRequest.getViewIds())) { + if (filterRequest.getViewIds().contains(view.getId())) { + filterRequest.getDatasetTableFieldList().add(datasetTableField); + } + } else { + filterRequest.getDatasetTableFieldList().add(datasetTableField); + } + } + } } - if (!desensitizationList.contains(datasetTableField.getDataeaseName()) && dataeaseNames.contains(datasetTableField.getDataeaseName())) { - filterRequest.setDatasetTableField(datasetTableField); - if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) { - if (CollectionUtils.isNotEmpty(filterRequest.getViewIds())) { - if (filterRequest.getViewIds().contains(view.getId())) { + if (CollectionUtils.isNotEmpty(filterRequest.getDatasetTableFieldList())) { + extFilterList.add(filterRequest); + } + } else { + for (String fId : fieldIds) { + ChartExtFilterRequest filterRequest = new ChartExtFilterRequest(); + BeanUtils.copyBean(filterRequest, request); + filterRequest.setFieldId(fId); + + DatasetTableField datasetTableField = dataSetTableFieldsService.get(fId); + if (datasetTableField == null) { + continue; + } + if (!desensitizationList.contains(datasetTableField.getDataeaseName()) && dataeaseNames.contains(datasetTableField.getDataeaseName())) { + filterRequest.setDatasetTableField(datasetTableField); + if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) { + if (CollectionUtils.isNotEmpty(filterRequest.getViewIds())) { + if (filterRequest.getViewIds().contains(view.getId())) { + extFilterList.add(filterRequest); + } + } else { extFilterList.add(filterRequest); } - } else { - extFilterList.add(filterRequest); } } } From 2cf026edcf279fb48582273b3b0e37c752872f60 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 26 May 2022 12:53:18 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=E8=BF=87=E6=BB=A4=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E5=A2=9E=E5=8A=A0=E4=B8=8B=E6=8B=89=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/impl/ShiroServiceImpl.java | 2 +- .../dataease/commons/model/BaseTreeNode.java | 28 + .../io/dataease/commons/utils/TreeUtils.java | 41 ++ .../dataset/DataSetTableFieldController.java | 17 + .../service/dataset/DataSetFieldService.java | 2 + .../impl/direct/DirectFieldService.java | 68 +- frontend/src/api/dataset/dataset.js | 16 +- frontend/src/components/ElTreeSelect/dom.js | 37 ++ .../src/components/ElTreeSelect/index.vue | 594 ++++++++++++++++++ frontend/src/components/ElTreeSelect/utils.js | 78 +++ .../widget/DeWidget/DeSelectTree.vue | 331 ++++++++++ .../serviceImpl/TextSelectTreeServiceImpl.js | 108 ++++ frontend/src/lang/en.js | 4 + frontend/src/lang/tw.js | 4 + frontend/src/lang/zh.js | 6 +- frontend/src/views/panel/filter/index.vue | 3 +- frontend/src/views/system/test/MyTree.vue | 150 +++++ frontend/src/views/system/test/index.vue | 69 ++ 18 files changed, 1540 insertions(+), 18 deletions(-) create mode 100644 backend/src/main/java/io/dataease/commons/model/BaseTreeNode.java create mode 100644 frontend/src/components/ElTreeSelect/dom.js create mode 100644 frontend/src/components/ElTreeSelect/index.vue create mode 100644 frontend/src/components/ElTreeSelect/utils.js create mode 100644 frontend/src/components/widget/DeWidget/DeSelectTree.vue create mode 100644 frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js create mode 100644 frontend/src/views/system/test/MyTree.vue create mode 100644 frontend/src/views/system/test/index.vue diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index 90d1f55baa..6d226ef715 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -54,7 +54,6 @@ public class ShiroServiceImpl implements ShiroService { // 验证链接 filterChainDefinitionMap.put("/api/link/validate**", ANON); filterChainDefinitionMap.put("/api/map/areaEntitys/**", ANON); - filterChainDefinitionMap.put("/dataset/field/fieldValues/**", ANON); filterChainDefinitionMap.put("/linkJump/queryPanelJumpInfo/**", ANON); filterChainDefinitionMap.put("/linkJump/queryTargetPanelJumpInfo", ANON); @@ -98,6 +97,7 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/api/link/viewDetail/**", "link"); filterChainDefinitionMap.put("/panel/group/exportDetails", ANON); filterChainDefinitionMap.put("/dataset/field/linkMultFieldValues", "link"); + filterChainDefinitionMap.put("/dataset/field/linkMappingFieldValues", "link"); filterChainDefinitionMap.put("/**", "authc"); diff --git a/backend/src/main/java/io/dataease/commons/model/BaseTreeNode.java b/backend/src/main/java/io/dataease/commons/model/BaseTreeNode.java new file mode 100644 index 0000000000..f08e4024bb --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/model/BaseTreeNode.java @@ -0,0 +1,28 @@ +package io.dataease.commons.model; + +import io.dataease.plugins.common.model.ITreeBase; +import lombok.Data; + +import java.util.List; + +@Data +public class BaseTreeNode implements ITreeBase { + + private String id; + + private String pid; + + private String text; + + private String nodeType; + + private List children; + + public BaseTreeNode(String id, String pid, String text, String nodeType) { + this.id = id; + this.pid = pid; + this.text = text; + this.nodeType = nodeType; + } + +} diff --git a/backend/src/main/java/io/dataease/commons/utils/TreeUtils.java b/backend/src/main/java/io/dataease/commons/utils/TreeUtils.java index 7447487ae3..38ed95c37b 100644 --- a/backend/src/main/java/io/dataease/commons/utils/TreeUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/TreeUtils.java @@ -1,6 +1,7 @@ package io.dataease.commons.utils; import io.dataease.plugins.common.model.ITreeBase; +import org.apache.commons.lang3.StringUtils; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -14,6 +15,9 @@ import java.util.stream.Collectors; */ public class TreeUtils{ + public final static String DEFAULT_ROOT = "root"; + public final static String SEPARATOR = "-de-"; + /** * Description: rootPid 是根节点PID */ @@ -53,4 +57,41 @@ public class TreeUtils{ return mergeTree(tree,"0"); } + + public static List mergeDuplicateTree(List tree, String ... rootPid) { + Assert.notNull(rootPid, "Root Pid cannot be null"); + if(CollectionUtils.isEmpty(tree)){ + return null; + } + List result = new ArrayList<>(); + // 构建id-节点map映射 + Map treePidMap = tree.stream().collect(Collectors.toMap(node -> node.getNodeType(), t -> t)); + tree.stream().filter(item -> StringUtils.isNotBlank(item.getId())).forEach(node -> { + + String nodeType = node.getNodeType(); + String[] links = nodeType.split(SEPARATOR); + int length = links.length; + int level = Integer.parseInt(links[length - 1]); + // 判断根节点 + if (Arrays.asList(rootPid).contains(node.getPid()) && 0 == level) { + result.add(node); + } else { + //找到父元素 + String[] pLinks = new String[level]; + System.arraycopy(links, 0, pLinks, 0, level); + String parentType = Arrays.stream(pLinks).collect(Collectors.joining(SEPARATOR)) + TreeUtils.SEPARATOR + (level-1); + T parentNode = treePidMap.get(parentType); + if(parentNode==null){ + // 可能出现 rootPid 更高的节点 这个操作相当于截断 + return; + } + if (parentNode.getChildren() == null) { + parentNode.setChildren(new ArrayList()); + } + parentNode.getChildren().add(node); + } + }); + return result; + } + } 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 4654d270dd..dcf6bc6c74 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -177,6 +177,23 @@ public class DataSetTableFieldController { return list; } + @ApiIgnore + @PostMapping("linkMappingFieldValues") + public List linkMappingFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String linkToken = request.getHeader(F2CLinkFilter.LINK_TOKEN_KEY); + DecodedJWT jwt = JWT.decode(linkToken); + Long userId = jwt.getClaim("userId").asLong(); + multFieldValuesRequest.setUserId(userId); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getUserId(), true, true); + } + + @ApiIgnore + @PostMapping("mappingFieldValues") + public List mappingFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getUserId(), true, true); + } + @ApiIgnore @PostMapping("multFieldValuesForPermissions") public List multFieldValuesForPermissions(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { 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 1f59651366..4e5e59449b 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java @@ -6,4 +6,6 @@ import java.util.List; public interface DataSetFieldService { List fieldValues(String fieldId, Long userId, Boolean userPermissions) throws Exception; + + List fieldValues(List fieldIds, Long userId, Boolean userPermissions, Boolean needMapping) 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 d3a9e26a07..b0044def58 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 @@ -1,6 +1,8 @@ package io.dataease.service.dataset.impl.direct; import com.google.gson.Gson; +import io.dataease.commons.model.BaseTreeNode; +import io.dataease.commons.utils.TreeUtils; import io.dataease.plugins.common.base.domain.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.Datasource; @@ -22,9 +24,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @@ -45,6 +45,14 @@ public class DirectFieldService implements DataSetFieldService { @Override public List fieldValues(String fieldId, Long userId, Boolean userPermissions) throws Exception { + List filedIds = new ArrayList<>(); + filedIds.add(fieldId); + return fieldValues(filedIds, userId, userPermissions, false); + } + + @Override + public List fieldValues(List fieldIds, Long userId, Boolean userPermissions, Boolean needMapping) throws Exception { + String fieldId = fieldIds.get(0); DatasetTableField field = dataSetTableFieldsService.selectByPrimaryKey(fieldId); if (field == null || StringUtils.isEmpty(field.getTableId())) return null; @@ -54,15 +62,23 @@ public class DirectFieldService implements DataSetFieldService { DatasetTableField datasetTableField = DatasetTableField.builder().tableId(field.getTableId()).checked(Boolean.TRUE).build(); List fields = dataSetTableFieldsService.list(datasetTableField); + List permissionFields = fields; List customFilter = new ArrayList<>(); if(userPermissions){ //列权限 List desensitizationList = new ArrayList<>(); fields = permissionService.filterColumnPermissons(fields, desensitizationList, datasetTable.getId(), userId); - //禁用的 - if(!fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()).contains(fieldId)){ + + + permissionFields = fields.stream().filter(node -> fieldIds.stream().anyMatch(item -> StringUtils.equals(node.getId(), item))).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(permissionFields)) { return new ArrayList<>(); } + //禁用的 + /*if(!fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()).contains(fieldId)){ + return new ArrayList<>(); + }*/ if (CollectionUtils.isNotEmpty(desensitizationList) && desensitizationList.contains(field.getDataeaseName())) { List results = new ArrayList<>(); results.add(ColumnPermissionConstants.Desensitization_desc); @@ -87,18 +103,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(), Collections.singletonList(field), true, ds, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, true, ds, customFilter)); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) { - datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), Collections.singletonList(field), true, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(dataTableInfoDTO.getSql(), permissionFields, true, customFilter)); } 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, Collections.singletonList(field), true, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter)); } 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, Collections.singletonList(field), true, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQLAsTmp(sql, permissionFields, true, customFilter)); } } else if (datasetTable.getMode() == 1) {// 抽取 // 连接doris,构建doris数据源查询 @@ -109,11 +125,39 @@ public class DirectFieldService implements DataSetFieldService { String tableName = "ds_" + datasetTable.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - datasourceRequest.setQuery(qp.createQuerySQL(tableName, Collections.singletonList(field), true, null, customFilter)); + datasourceRequest.setQuery(qp.createQuerySQL(tableName, permissionFields, true, null, customFilter)); } List rows = datasourceProvider.getData(datasourceRequest); - List results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); - return results; + if (!needMapping) { + List results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); + return results; + } + Set pkSet = new HashSet<>(); + + List treeNodes = rows.stream().map(row -> buildTreeNode(row, pkSet)).flatMap(Collection::stream).collect(Collectors.toList()); + List tree = TreeUtils.mergeDuplicateTree(treeNodes, TreeUtils.DEFAULT_ROOT); + return tree; + } + + private List buildTreeNode(String [] row, Set pkSet) { + List nodes = new ArrayList<>(); + List parentPkList = new ArrayList<>(); + for (int i = 0; i < row.length; i++) { + String text = row[i]; + + parentPkList.add(text); + String val = parentPkList.stream().collect(Collectors.joining(TreeUtils.SEPARATOR)); + String parentVal = i == 0 ? TreeUtils.DEFAULT_ROOT : row[i - 1]; + String pk = parentPkList.stream().collect(Collectors.joining(TreeUtils.SEPARATOR)); + if (pkSet.contains(pk)) continue; + pkSet.add(pk); + BaseTreeNode node = new BaseTreeNode(val, parentVal, text, pk + TreeUtils.SEPARATOR + i); + nodes.add(node); + } + return nodes; + + } + } diff --git a/frontend/src/api/dataset/dataset.js b/frontend/src/api/dataset/dataset.js index 50ed906bbc..0a18529a89 100644 --- a/frontend/src/api/dataset/dataset.js +++ b/frontend/src/api/dataset/dataset.js @@ -146,11 +146,21 @@ export function post(url, data, showLoading = true, timeout = 60000) { }) } -export function fieldValues(fieldId) { +export function mappingFieldValues(data) { return request({ - url: '/dataset/field/fieldValues/' + fieldId, + url: '/dataset/field/mappingFieldValues', method: 'post', - loading: true + loading: true, + data + }) +} + +export function linkMappingFieldValues(data) { + return request({ + url: '/dataset/field/linkMappingFieldValues', + method: 'post', + loading: true, + data }) } diff --git a/frontend/src/components/ElTreeSelect/dom.js b/frontend/src/components/ElTreeSelect/dom.js new file mode 100644 index 0000000000..b3cbc47776 --- /dev/null +++ b/frontend/src/components/ElTreeSelect/dom.js @@ -0,0 +1,37 @@ +/* + * @moduleName: + * @Author: dawdler + * @LastModifiedBy: dawdler + * @Date: 2019-03-22 14:47:35 + * @LastEditTime: 2019-03-22 16:31:38 + */ +export const on = (function() { + if (document.addEventListener) { + return function(element, event, handler) { + if (element && event && handler) { + element.addEventListener(event, handler, false) + } + } + } else { + return function(element, event, handler) { + if (element && event && handler) { + element.attachEvent('on' + event, handler) + } + } + } +})() +export const off = (function() { + if (document.removeEventListener) { + return function(element, event, handler) { + if (element && event) { + element.removeEventListener(event, handler, false) + } + } + } else { + return function(element, event, handler) { + if (element && event) { + element.detachEvent('on' + event, handler) + } + } + } +})() diff --git a/frontend/src/components/ElTreeSelect/index.vue b/frontend/src/components/ElTreeSelect/index.vue new file mode 100644 index 0000000000..7dea1fd05c --- /dev/null +++ b/frontend/src/components/ElTreeSelect/index.vue @@ -0,0 +1,594 @@ + + + + + diff --git a/frontend/src/components/ElTreeSelect/utils.js b/frontend/src/components/ElTreeSelect/utils.js new file mode 100644 index 0000000000..6a2cde783e --- /dev/null +++ b/frontend/src/components/ElTreeSelect/utils.js @@ -0,0 +1,78 @@ +/* + * @moduleName:通用工具类 + * @Author: dawdler + * @Date: 2019-01-09 15:30:18 + * @LastModifiedBy: dawdler + * @LastEditTime: 2020-12-26 14:06:09 + */ +export default { + getTreeData, + each +} +/* +each(arr, (item, children) => { + item.value = xx; + // 该item 包含children,因此直接赋值,不需要单独处理children里面的值 +}); + * [_each description] 倒查、展平、数据回调返回回当前一条数据和子集 + * @param {[Array]} data [description] + * @param {Function} callback [description] + * @param {String} childName[description] + * @return {[Array]} [description] + * 默认使用副本,在callback处理数据,如果不使用副本,那么需要重新对treeData赋值 + treeData = each(treeData, (item, children) => { + item.value = xx; + }); + */ +export function each(data, callback, childName = 'children') { + let current + let children + for (let i = 0, len = data.length; i < len; i++) { + current = data[i] + children = [] + if (current[childName] && current[childName].length > 0) { + children = current[childName] + } + callback && callback(current, children) + if (children.length > 0) { + each(children, callback, childName) + } + } +} + +/** + * @Author yihuang", + * @param data 数据 + * @param id 要比对的名称 + * @param val 要比对的值 + * @param name 要返回的名称 + * @param children 子集名称 + * @param isRow 是否返回这一行的数据 + * @注 迭代判断多层 + * //======================= + * 返回这一条数据的中文名 + * let name=utils.getTreeData(arr, 'flowId', item.decategoryId, 'name'); + * //======================= + * 返回所有匹配的数据 + * let arr=utils.getTreeData(arr, 'flowId', item.decategoryId, 'name','children',true); + */ +export function getTreeData(data, id = 'id', val = '', name = 'name', children = 'children', isRow = false) { + const arr = [] + each( + data, + item => { + if (item[id] === val) { + arr.push(item) + } + }, + children + ) + return arr.length > 0 ? (isRow ? arr : arr[0][name]) : null +} +export function guid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = (Math.random() * 16) | 0 + const v = c === 'x' ? r : (r & 0x3) | 0x8 + return v.toString(16) + }) +} diff --git a/frontend/src/components/widget/DeWidget/DeSelectTree.vue b/frontend/src/components/widget/DeWidget/DeSelectTree.vue new file mode 100644 index 0000000000..30bbf4edc9 --- /dev/null +++ b/frontend/src/components/widget/DeWidget/DeSelectTree.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js new file mode 100644 index 0000000000..9180883558 --- /dev/null +++ b/frontend/src/components/widget/serviceImpl/TextSelectTreeServiceImpl.js @@ -0,0 +1,108 @@ + +import { WidgetService } from '../service/WidgetService' +const leftPanel = { + icon: 'iconfont icon-xialashu', + label: 'detextselectTree.label', + defaultClass: 'text-filter' +} + +const dialogPanel = { + options: { + attrs: { + multiple: false, + placeholder: 'detextselectTree.placeholder', + viewIds: [], + datas: [], + key: 'id', + label: 'text', + value: 'id', + fieldId: '', + dragItems: [] + }, + value: '', + manualModify: false + }, + defaultClass: 'text-filter', + component: 'de-select-tree', + miniSizex: 1, + miniSizey: 1 +} +const drawPanel = { + type: 'custom', + style: { + width: 300, + height: 90, + fontSize: 14, + fontWeight: 500, + lineHeight: '', + letterSpacing: 0, + textAlign: '', + color: '', + hPosition: 'left', + vPosition: 'center' + }, + component: 'de-select-tree' +} + +class TextSelectTreeServiceImpl extends WidgetService { + constructor(options = {}) { + Object.assign(options, { name: 'textSelectTreeWidget' }) + super(options) + this.filterDialog = true + this.showSwitch = true + } + + initLeftPanel() { + const value = JSON.parse(JSON.stringify(leftPanel)) + return value + } + + initFilterDialog() { + const value = JSON.parse(JSON.stringify(dialogPanel)) + return value + } + + initDrawPanel() { + const value = JSON.parse(JSON.stringify(drawPanel)) + return value + } + + filterFieldMethod(fields) { + return fields.filter(field => { + return field['deType'] === 0 + }) + } + + optionDatas(datas) { + if (!datas) return null + return datas.filter(item => !!item).map(item => { + return { + id: item, + text: item + } + }) + } + + getParam(element) { + const value = this.fillValueDerfault(element) + const param = { + component: element, + value: !value ? [] : Array.isArray(value) ? value : value.toString().split(','), + operator: element.options.attrs.multiple ? 'in' : 'eq' + } + return param + } + + fillValueDerfault(element) { + const defaultV = element.options.value === null ? '' : element.options.value.toString() + if (element.options.attrs.multiple) { + if (defaultV === null || typeof defaultV === 'undefined' || defaultV === '' || defaultV === '[object Object]') return [] + return defaultV.split(',') + } else { + if (defaultV === null || typeof defaultV === 'undefined' || defaultV === '' || defaultV === '[object Object]') return null + return defaultV.split(',')[0] + } + } +} +const textSelectTreeServiceImpl = new TextSelectTreeServiceImpl() +export default textSelectTreeServiceImpl diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 48f589bf53..8f7a34fa0c 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1885,6 +1885,10 @@ export default { label: 'Text selector', placeholder: 'Please select' }, + detextselectTree: { + label: 'Tree selector', + placeholder: 'Please select' + }, detextgridselect: { label: 'Text list', placeholder: 'Please select' diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index b93f7f1f10..50388ce030 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1897,6 +1897,10 @@ export default { label: '文本下拉', placeholder: '請選擇' }, + detextselectTree: { + label: '下拉树', + placeholder: '請選擇' + }, detextgridselect: { label: '文本列錶', placeholder: '請選擇' diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 29e7e200fe..fd7a7ac7ca 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1331,7 +1331,7 @@ export default { sql_ds_union_error: '直连模式下SQL数据集,不支持关联', api_data: 'API 数据集' }, - driver:{ + driver: { driver: '驱动', please_choose_driver: '请选择驱动', mgm: '驱动管理', @@ -1905,6 +1905,10 @@ export default { label: '文本下拉', placeholder: '请选择' }, + detextselectTree: { + label: '下拉树', + placeholder: '请选择' + }, detextgridselect: { label: '文本列表', placeholder: '请选择' diff --git a/frontend/src/views/panel/filter/index.vue b/frontend/src/views/panel/filter/index.vue index 756014ede5..30a92b0949 100644 --- a/frontend/src/views/panel/filter/index.vue +++ b/frontend/src/views/panel/filter/index.vue @@ -55,7 +55,8 @@ export default { '文本过滤组件': [ 'textSelectWidget', 'textSelectGridWidget', - 'textInputWidget' + 'textInputWidget', + 'textSelectTreeWidget' ], '数字过滤组件': [ 'numberSelectWidget', diff --git a/frontend/src/views/system/test/MyTree.vue b/frontend/src/views/system/test/MyTree.vue new file mode 100644 index 0000000000..12ae1d25dc --- /dev/null +++ b/frontend/src/views/system/test/MyTree.vue @@ -0,0 +1,150 @@ + + + + diff --git a/frontend/src/views/system/test/index.vue b/frontend/src/views/system/test/index.vue new file mode 100644 index 0000000000..0e6f81a882 --- /dev/null +++ b/frontend/src/views/system/test/index.vue @@ -0,0 +1,69 @@ + + + + From a0fb3a62adda3fcffbd987c83750f4e10bb0f26c Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 26 May 2022 13:15:50 +0800 Subject: [PATCH 5/8] =?UTF-8?q?perf:=20=E6=A0=91=E5=BD=A2=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E5=9F=BA=E6=9C=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/widget/DeWidget/DeSelectTree.vue | 7 ++++--- frontend/src/components/widget/bean/Condition.js | 3 ++- frontend/src/utils/conditionUtil.js | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/widget/DeWidget/DeSelectTree.vue b/frontend/src/components/widget/DeWidget/DeSelectTree.vue index 30bbf4edc9..0c73552eda 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectTree.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectTree.vue @@ -129,7 +129,7 @@ export default { method(param).then(res => { this.datas = this.optionDatas(res.data) this.$nextTick(() => { - this.$refs.deSelectTree.treeDataUpdateFun(this.datas) + this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas) }) }) || (this.element.options.value = '') }, @@ -191,7 +191,7 @@ export default { method({ fieldIds: this.element.options.attrs.fieldId.split(',') }).then(res => { this.datas = this.optionDatas(res.data) this.$nextTick(() => { - this.$refs.deSelectTree.treeDataUpdateFun(this.datas) + this.$refs.deSelectTree && this.$refs.deSelectTree.treeDataUpdateFun(this.datas) }) }) } @@ -231,7 +231,8 @@ export default { const param = { component: this.element, value: this.formatFilterValue(), - operator: this.operator + operator: this.operator, + isTree: true } this.inDraw && this.$store.commit('addViewFilter', param) }, diff --git a/frontend/src/components/widget/bean/Condition.js b/frontend/src/components/widget/bean/Condition.js index 566a2e1a82..ad3c1dc985 100644 --- a/frontend/src/components/widget/bean/Condition.js +++ b/frontend/src/components/widget/bean/Condition.js @@ -5,11 +5,12 @@ * viewIds 过滤视图范围 */ export class Condition { - constructor(componentId, fieldId, operator, value, viewIds) { + constructor(componentId, fieldId, operator, value, viewIds, isTree) { this.componentId = componentId this.fieldId = fieldId this.operator = operator || 'eq' this.value = value this.viewIds = viewIds + this.isTree = isTree || false } } diff --git a/frontend/src/utils/conditionUtil.js b/frontend/src/utils/conditionUtil.js index f557d516c6..4416b25f4c 100644 --- a/frontend/src/utils/conditionUtil.js +++ b/frontend/src/utils/conditionUtil.js @@ -26,10 +26,10 @@ export const valueValid = condition => { } export const formatCondition = obj => { - const { component, value, operator } = obj + const { component, value, operator, isTree } = obj const fieldId = component.options.attrs.fieldId const viewIds = component.options.attrs.viewIds - const condition = new Condition(component.id, fieldId, operator, value, viewIds) + const condition = new Condition(component.id, fieldId, operator, value, viewIds, isTree) return condition } From 9068d80516dd6ea43436c3fc6101dfcf2b313d39 Mon Sep 17 00:00:00 2001 From: junjun Date: Thu, 26 May 2022 13:18:20 +0800 Subject: [PATCH 6/8] =?UTF-8?q?test:=20=E6=A0=91=E5=BD=A2=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8sql=E6=8B=BC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/dataease/service/chart/ChartViewService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index b3c6aad78b..a7b80de8b2 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -640,6 +640,9 @@ public class ChartViewService { for (ChartExtFilterRequest request : requestList.getFilter()) { // 解析多个fieldId,fieldId是一个逗号分隔的字符串 String fieldId = request.getFieldId(); + if (request.getIsTree() == null) { + request.setIsTree(false); + } if (StringUtils.isNotEmpty(fieldId)) { String[] fieldIds = fieldId.split(","); if (request.getIsTree()) { From b0b46fd4c1a49932d310bc34d35bc85b24a93aa5 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 26 May 2022 14:15:48 +0800 Subject: [PATCH 7/8] =?UTF-8?q?refator:=20=E6=89=B9=E9=87=8F=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E8=AE=BE=E7=BD=AE=E6=98=BE=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../canvas/components/Editor/Preview.vue | 14 ++++--- frontend/src/views/chart/chart/util.js | 42 +++++++++---------- .../components/shape-attr/LabelSelector.vue | 14 ++++++- .../shape-attr/LabelSelectorAntV.vue | 14 ++++++- .../views/chart/view/ChartStyleBatchSet.vue | 4 +- 5 files changed, 56 insertions(+), 32 deletions(-) diff --git a/frontend/src/components/canvas/components/Editor/Preview.vue b/frontend/src/components/canvas/components/Editor/Preview.vue index ab6e59fbfc..d77573d5dd 100644 --- a/frontend/src/components/canvas/components/Editor/Preview.vue +++ b/frontend/src/components/canvas/components/Editor/Preview.vue @@ -82,6 +82,7 @@ import CanvasOptBar from '@/components/canvas/components/Editor/CanvasOptBar' import UserViewMobileDialog from '@/components/canvas/custom-component/UserViewMobileDialog' import bus from '@/utils/bus' import { buildFilterMap } from '@/utils/conditionUtil' +import { hasDataPermission } from '@/utils/permission' export default { components: { UserViewMobileDialog, ComponentWrapper, UserViewDialog, CanvasOptBar }, model: { @@ -176,7 +177,7 @@ export default { showUnpublishedArea() { // return this.panelInfo.status === 'unpublished' if (this.mainActiveName === 'PanelMain' && this.activeTab === 'PanelList') { - return this.panelInfo.status === 'unpublished' && this.panelInfo.privileges.indexOf('manage') === -1 + return this.panelInfo.status === 'unpublished' && !hasDataPermission('manage', this.panelInfo.privileges) } else { return this.panelInfo.status === 'unpublished' } @@ -270,12 +271,15 @@ export default { this._isMobile() const _this = this const erd = elementResizeDetectorMaker() + const canvasMain = document.getElementById('canvasInfoMain') // 监听主div变动事件 - erd.listenTo(document.getElementById('canvasInfoMain'), element => { - _this.$nextTick(() => { - _this.restore() + if (canvasMain) { + erd.listenTo(canvasMain, element => { + _this.$nextTick(() => { + _this.restore() + }) }) - }) + } // 监听画布div变动事件 const tempCanvas = document.getElementById('canvasInfoTemp') if (tempCanvas) { diff --git a/frontend/src/views/chart/chart/util.js b/frontend/src/views/chart/chart/util.js index a0ce5881e3..45621bf8bb 100644 --- a/frontend/src/views/chart/chart/util.js +++ b/frontend/src/views/chart/chart/util.js @@ -468,7 +468,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-v' ], 'tooltip-selector-ant-v': [ 'show', @@ -540,7 +540,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-v' ], 'tooltip-selector-ant-v': [ 'show', @@ -605,7 +605,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-v' ], 'tooltip-selector-ant-v': [ 'show', @@ -670,7 +670,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-h' ], 'tooltip-selector-ant-v': [ 'show', @@ -743,7 +743,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-h' ], 'tooltip-selector-ant-v': [ 'show', @@ -815,7 +815,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-pie' ], 'tooltip-selector-ant-v': [ 'show', @@ -866,7 +866,8 @@ export const TYPE_CONFIGS = [ 'label-selector-ant-v': [ 'show', 'fontSize', - 'color' + 'color', + 'position-pie' ], 'tooltip-selector-ant-v': [ 'show', @@ -919,7 +920,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-v' ], 'tooltip-selector-ant-v': [ 'show', @@ -1113,7 +1114,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position' + 'position-h' ], 'tooltip-selector-ant-v': [ 'show', @@ -1308,7 +1309,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-v', 'formatter', 'gaugeFormatter' ], @@ -1512,7 +1513,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-v', 'formatter' ], 'tooltip-selector': [ @@ -1594,7 +1595,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-v', 'formatter' ], 'tooltip-selector': [ @@ -1668,7 +1669,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-v', 'formatter' ], 'tooltip-selector': [ @@ -1742,7 +1743,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-h', 'formatter' ], 'tooltip-selector': [ @@ -1817,7 +1818,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-h', 'formatter' ], 'tooltip-selector': [ @@ -1892,7 +1893,7 @@ export const TYPE_CONFIGS = [ 'labelLine', 'fontSize', 'color', - 'position', + 'position-v', 'formatter' ], 'tooltip-selector': [ @@ -1951,7 +1952,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-pie', 'formatter' ], 'tooltip-selector': [ @@ -2009,7 +2010,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-v', 'formatter' ], 'tooltip-selector': [ @@ -2123,7 +2124,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-v', 'formatter' ], 'tooltip-selector': [ @@ -2193,7 +2194,7 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', + 'position-h', 'formatter' ], 'tooltip-selector': [ @@ -2249,7 +2250,6 @@ export const TYPE_CONFIGS = [ 'show', 'fontSize', 'color', - 'position', 'formatter' ], 'tooltip-selector': [ diff --git a/frontend/src/views/chart/components/shape-attr/LabelSelector.vue b/frontend/src/views/chart/components/shape-attr/LabelSelector.vue index e0b280c850..21a95a608b 100644 --- a/frontend/src/views/chart/components/shape-attr/LabelSelector.vue +++ b/frontend/src/views/chart/components/shape-attr/LabelSelector.vue @@ -17,9 +17,19 @@ - + - + + + + + + + + + + + diff --git a/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue b/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue index cf1405838c..81ed7e57ff 100644 --- a/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue +++ b/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue @@ -14,9 +14,19 @@ - + - + + + + + + + + + + + diff --git a/frontend/src/views/chart/view/ChartStyleBatchSet.vue b/frontend/src/views/chart/view/ChartStyleBatchSet.vue index f55d02c9a5..e4f081d59f 100644 --- a/frontend/src/views/chart/view/ChartStyleBatchSet.vue +++ b/frontend/src/views/chart/view/ChartStyleBatchSet.vue @@ -82,10 +82,10 @@ export default { this.batchOptChange('customStyle', 'xAxis', val) }, onChangeYAxisForm(val) { - this.batchOptChange('customStyle', 'xAxis', val) + this.batchOptChange('customStyle', 'yAxis', val) }, onChangeYAxisExtForm(val) { - this.batchOptChange('customStyle', 'yAxis', val) + this.batchOptChange('customStyle', 'yAxisExt', val) }, onChangeSplitForm(val) { this.batchOptChange('customStyle', 'split', val) From 1d8e2658bf3c1e528e331da9a72033cc02b71996 Mon Sep 17 00:00:00 2001 From: junjun Date: Thu, 26 May 2022 14:30:03 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=A0=91?= =?UTF-8?q?=E5=BD=A2=E8=BF=87=E6=BB=A4=E5=99=A8sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/doris/DorisQueryProvider.java | 81 +++++++++------ .../provider/query/ck/CKQueryProvider.java | 99 +++++++++++-------- .../provider/query/db2/Db2QueryProvider.java | 97 ++++++++++-------- .../provider/query/es/EsQueryProvider.java | 95 ++++++++++-------- .../query/hive/HiveQueryProvider.java | 95 ++++++++++-------- .../query/impala/ImpalaQueryProvider.java | 99 +++++++++++-------- .../query/mongodb/MongoQueryProvider.java | 49 ++++++--- .../query/oracle/OracleQueryProvider.java | 94 +++++++++++------- .../provider/query/pg/PgQueryProvider.java | 95 ++++++++++-------- .../query/redshift/RedshiftQueryProvider.java | 94 +++++++++++------- .../sqlserver/SqlserverQueryProvider.java | 97 ++++++++++-------- 11 files changed, 592 insertions(+), 403 deletions(-) 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 562ca31414..fb12a9a628 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 @@ -844,48 +844,65 @@ public class DorisQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; - } - String whereName = ""; - String whereTerm = transMysqlFilterTerm(request.getOperator()); - String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); } else { - originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); + fieldList.add(request.getDatasetTableField()); } - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { - whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT); + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); + } else { + originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName()); } - } else if (field.getDeType() == 0) { - whereName = String.format(DorisConstants.CAST, originName, DorisConstants.VARCHAR); - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(DorisConstants.UNIX_TIMESTAMP, originName) + "*1000"; - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) { + whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT); + } + } else if (field.getDeType() == 0) { + whereName = String.format(DorisConstants.CAST, originName, DorisConstants.VARCHAR); + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(DorisConstants.UNIX_TIMESTAMP, originName) + "*1000"; + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { whereName = originName; } - } else { - whereName = originName; + whereNameList.add(whereName); } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } + String whereTerm = transMysqlFilterTerm(request.getOperator()); + String whereValue = ""; if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; 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 5cda3f93ca..b545be38ea 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 @@ -879,50 +879,67 @@ public class CKQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(CKConstants.toDateTime, originName); + } + if (field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { + String cast = String.format(CKConstants.toFloat64, originName); + whereName = String.format(CKConstants.toDateTime, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(CKConstants.toFloat64, originName); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(CKConstants.toInt32, String.format(CKConstants.toDateTime, originName)) + "*1000"; + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - whereName = String.format(CKConstants.toDateTime, originName); - } - if (field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { - String cast = String.format(CKConstants.toFloat64, originName); - whereName = String.format(CKConstants.toDateTime, cast); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(CKConstants.toFloat64, originName); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(CKConstants.toInt32, String.format(CKConstants.toDateTime, originName)) + "*1000"; - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { @@ -940,12 +957,12 @@ public class CKQueryProvider extends QueryProvider { whereValue = String.format(CKConstants.WHERE_VALUE_VALUE, value.get(0)); } - if (field.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getOperator(), "null")) { + if (!request.getIsTree() && fieldList.get(0).getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getOperator(), "null")) { list.add(SQLObj.builder() .whereField(whereName) .whereTermAndValue("is null") .build()); - } else if (field.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getOperator(), "not_null")) { + } else if (!request.getIsTree() && fieldList.get(0).getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getOperator(), "not_null")) { list.add(SQLObj.builder() .whereField(whereName) .whereTermAndValue("is not null") 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 b06ee4cf4c..3d4f9d5a31 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 @@ -848,51 +848,68 @@ public class Db2QueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + originName = String.format(Db2Constants.STR_TO_DATE, originName); + whereName = String.format(Db2Constants.DATE_FORMAT, originName, Db2Constants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_INT_FORMAT); + whereName = String.format(Db2Constants.FROM_UNIXTIME, cast, Db2Constants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(Db2Constants.UNIX_TIMESTAMP, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(Db2Constants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - originName = String.format(Db2Constants.STR_TO_DATE, originName); - whereName = String.format(Db2Constants.DATE_FORMAT, originName, Db2Constants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_INT_FORMAT); - whereName = String.format(Db2Constants.FROM_UNIXTIME, cast, Db2Constants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(Db2Constants.CAST, originName, Db2Constants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(Db2Constants.UNIX_TIMESTAMP, originName); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { 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 fc9d63e4c1..d73281b1b9 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 @@ -888,50 +888,67 @@ public class EsQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(EsSqlLConstants.CAST, originName, "timestamp"); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(EsSqlLConstants.CAST, originName, "timestamp"); + whereName = String.format(EsSqlLConstants.DATETIME_FORMAT, cast, EsSqlLConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(EsSqlLConstants.CAST, originName, "double"); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(EsSqlLConstants.CAST, originName, "bigint"); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(EsSqlLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(EsSqlLConstants.CAST, originName, "timestamp"); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(EsSqlLConstants.CAST, originName, "timestamp"); - whereName = String.format(EsSqlLConstants.DATETIME_FORMAT, cast, EsSqlLConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(EsSqlLConstants.CAST, originName, "double"); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(EsSqlLConstants.CAST, originName, "bigint"); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { 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 e9236be0ad..ef866ac70e 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 @@ -825,50 +825,67 @@ public class HiveQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(HiveConstants.STR_TO_DATE, originName, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(HiveConstants.UNIX_TIMESTAMP, originName) + "*1000"; + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - whereName = String.format(HiveConstants.STR_TO_DATE, originName, HiveConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(HiveConstants.UNIX_TIMESTAMP, originName) + "*1000"; - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { 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 7a08da8c67..79c8b5a45b 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 @@ -5,7 +5,6 @@ import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; - import io.dataease.plugins.common.constants.DeTypeConstants; import io.dataease.plugins.common.constants.ImpalaConstants; import io.dataease.plugins.common.constants.SQLConstants; @@ -827,50 +826,67 @@ public class ImpalaQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(ImpalaConstants.DATE_FORMAT, originName, ImpalaConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(ImpalaConstants.CAST, originName, ImpalaConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(ImpalaConstants.FROM_UNIXTIME, cast, ImpalaConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(ImpalaConstants.CAST, originName, ImpalaConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(ImpalaConstants.UNIX_TIMESTAMP, originName) + "*1000"; + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(ImpalaConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == DeTypeConstants.DE_TIME) { - if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { - whereName = String.format(ImpalaConstants.DATE_FORMAT, originName, ImpalaConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(ImpalaConstants.CAST, originName, ImpalaConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(ImpalaConstants.FROM_UNIXTIME, cast, ImpalaConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(ImpalaConstants.CAST, originName, ImpalaConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(ImpalaConstants.UNIX_TIMESTAMP, originName) + "*1000"; - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { @@ -885,7 +901,8 @@ public class ImpalaQueryProvider extends QueryProvider { whereValue = String.format(ImpalaConstants.WHERE_BETWEEN, value.get(0), value.get(1)); } } else { - if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_BOOL) { + DatasetTableField field = fieldList.get(0); + if (!request.getIsTree() && (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_BOOL)) { whereValue = String.format(ImpalaConstants.WHERE_NUMBER_VALUE_VALUE, value.get(0)); } else { whereValue = String.format(ImpalaConstants.WHERE_VALUE_VALUE, value.get(0)); 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 ce319b908b..fe3d57abe1 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 @@ -810,26 +810,43 @@ public class MongoQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_INT) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_TIME) { + originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + whereName = originName; + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_INT) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == DeTypeConstants.DE_TIME) { - originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - whereName = originName; - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { @@ -844,7 +861,7 @@ public class MongoQueryProvider extends QueryProvider { whereValue = String.format(MongoConstants.WHERE_BETWEEN, value.get(0), value.get(1)); } } else { - if (field.getDeType() == DeTypeConstants.DE_STRING) { + if (!request.getIsTree() && fieldList.get(0).getDeType() == DeTypeConstants.DE_STRING) { whereValue = String.format(MongoConstants.WHERE_VALUE_VALUE, value.get(0)); } else { whereValue = value.get(0); 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 7198f9e14c..5ea4c263ef 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 @@ -886,49 +886,67 @@ public class OracleQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(OracleConstants.TO_DATE, originName, OracleConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(OracleConstants.UNIX_TIMESTAMP, originName) + "*1000"; + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(OracleConstants.TO_DATE, originName, OracleConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_INT_FORMAT) + "/1000"; - whereName = String.format(OracleConstants.FROM_UNIXTIME, cast, OracleConstants.DEFAULT_DATE_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(OracleConstants.CAST, originName, OracleConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(OracleConstants.UNIX_TIMESTAMP, originName) + "*1000"; - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { 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 ec339ccb49..7f2bd2f7e1 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,7 +10,6 @@ import io.dataease.plugins.common.constants.DeTypeConstants; import io.dataease.plugins.common.constants.PgConstants; import io.dataease.plugins.common.constants.SQLConstants; import io.dataease.plugins.common.constants.SqlServerSQLConstants; -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; @@ -858,49 +857,67 @@ public class PgQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.CAST, originName, "timestamp"); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(PgConstants.CAST, originName, "bigint"); + whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.CAST, originName, PgConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(PgConstants.UNIX_TIMESTAMP, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.CAST, originName, "timestamp"); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(PgConstants.CAST, originName, "bigint"); - whereName = String.format(PgConstants.FROM_UNIXTIME, cast); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.CAST, originName, PgConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(PgConstants.UNIX_TIMESTAMP, originName); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { 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 f443f49e94..6f2e1fc8f6 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 @@ -786,49 +786,67 @@ public class RedshiftQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.CAST, originName, "timestamp"); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(PgConstants.CAST, originName, "bigint"); + whereName = String.format(PgConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(PgConstants.CAST, originName, PgConstants.DEFAULT_FLOAT_FORMAT); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(PgConstants.UNIX_TIMESTAMP, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(PgConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.CAST, originName, "timestamp"); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(PgConstants.CAST, originName, "bigint"); - whereName = String.format(PgConstants.FROM_UNIXTIME, cast); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.CAST, originName, PgConstants.DEFAULT_FLOAT_FORMAT); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(PgConstants.UNIX_TIMESTAMP, originName); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { 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 21dceda382..8c54d8d267 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 @@ -7,8 +7,8 @@ import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; import io.dataease.plugins.common.base.domain.Datasource; import io.dataease.plugins.common.base.mapper.DatasetTableFieldMapper; import io.dataease.plugins.common.constants.DeTypeConstants; -import io.dataease.plugins.common.constants.SqlServerSQLConstants; import io.dataease.plugins.common.constants.SQLConstants; +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; @@ -891,50 +891,67 @@ public class SqlserverQueryProvider extends QueryProvider { List list = new ArrayList<>(); for (ChartExtFilterRequest request : requestList) { List value = request.getValue(); - DatasetTableField field = request.getDatasetTableField(); - if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { - continue; + + List whereNameList = new ArrayList<>(); + List fieldList = new ArrayList<>(); + if (request.getIsTree()) { + fieldList.addAll(request.getDatasetTableFieldList()); + } else { + fieldList.add(request.getDatasetTableField()); } + + for (DatasetTableField field : fieldList) { + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == 1) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); + whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); + } + if (field.getDeExtractType() == 1) { + whereName = originName; + } + } else if (field.getDeType() == 2 || field.getDeType() == 3) { + if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { + whereName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originName); + } + if (field.getDeExtractType() == 1) { + whereName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originName); + } + if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + whereName = originName; + } + } else { + whereName = originName; + } + whereNameList.add(whereName); + } + String whereName = ""; + if (request.getIsTree()) { + whereName = "CONCAT(" + StringUtils.join(whereNameList, ",',',") + ")"; + } else { + whereName = whereNameList.get(0); + } String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName; - if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { - // 解析origin name中有关联的字段生成sql表达式 - originName = calcFieldRegex(field.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { - originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } else { - originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - } - - if (field.getDeType() == 1) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - String cast = String.format(SqlServerSQLConstants.LONG_TO_DATE, originName + "/1000"); - whereName = String.format(SqlServerSQLConstants.FROM_UNIXTIME, cast); - } - if (field.getDeExtractType() == 1) { - whereName = originName; - } - } else if (field.getDeType() == 2 || field.getDeType() == 3) { - if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(SqlServerSQLConstants.CONVERT, SqlServerSQLConstants.DEFAULT_FLOAT_FORMAT, originName); - } - if (field.getDeExtractType() == 1) { - whereName = String.format(SqlServerSQLConstants.UNIX_TIMESTAMP, originName); - } - if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { - whereName = originName; - } - } else { - whereName = originName; - } - - if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) {