diff --git a/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 5f030fb51b..dee0a2fd4a 100644 --- a/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/core/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -214,7 +214,7 @@ public class DataSetTableFieldController { public List multFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { List results = new ArrayList<>(); for (String fieldId : multFieldValuesRequest.getFieldIds()) { - List fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false); + List fieldValues = dataSetFieldService.fieldValues(fieldId, multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, false, multFieldValuesRequest.getKeyword()); if (CollectionUtil.isNotEmpty(fieldValues)) { results.addAll(fieldValues); } @@ -233,13 +233,13 @@ public class DataSetTableFieldController { DecodedJWT jwt = JWT.decode(linkToken); Long userId = jwt.getClaim("userId").asLong(); multFieldValuesRequest.setUserId(userId); - return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false, multFieldValuesRequest.getKeyword()); } @ApiIgnore @PostMapping("mappingFieldValues") public List mappingFieldValues(@RequestBody MultFieldValuesRequest multFieldValuesRequest) throws Exception { - return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false); + return dataSetFieldService.fieldValues(multFieldValuesRequest.getFieldIds(), multFieldValuesRequest.getSort(), multFieldValuesRequest.getUserId(), true, true, false, multFieldValuesRequest.getKeyword()); } @ApiIgnore diff --git a/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java b/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java index 5c0bf52fa0..cd9b46b077 100644 --- a/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java +++ b/core/backend/src/main/java/io/dataease/controller/request/dataset/MultFieldValuesRequest.java @@ -13,4 +13,6 @@ public class MultFieldValuesRequest { private DeSortDTO sort; + private String keyword; + } diff --git a/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java b/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java index df8e1e5b02..cc433ec9bb 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/DataSetFieldService.java @@ -9,9 +9,9 @@ public interface DataSetFieldService { List fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception; - List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception; + List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm, String keyword) throws Exception; - List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception; + List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm, String keyword) throws Exception; List chineseSort(List list, DeSortDTO sortDTO) throws Exception; } diff --git a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java index e0f0031230..590854017d 100644 --- a/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java +++ b/core/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java @@ -58,14 +58,14 @@ public class DirectFieldService implements DataSetFieldService { public List fieldValues(String fieldId, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception { List fieldIds = new ArrayList<>(); fieldIds.add(fieldId); - return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm); + return fieldValues(fieldIds, null, userId, userPermissions, false, rowAndColumnMgm, null); } @Override - public List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm) throws Exception { + public List fieldValues(String fieldId, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean rowAndColumnMgm, String keyword) throws Exception { List fieldIds = new ArrayList<>(); fieldIds.add(fieldId); - return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm); + return fieldValues(fieldIds, sortDTO, userId, userPermissions, false, rowAndColumnMgm, keyword); } public List buildSorts(List allFields, DeSortDTO sortDTO) { @@ -98,8 +98,15 @@ public class DirectFieldService implements DataSetFieldService { return result; } + private String formatTableByKeyword(String keyword, String originTable, List fields) { + if (StringUtils.isBlank(keyword)) return originTable; + List fieldNames = fields.stream().map(DatasetTableField::getOriginName).collect(Collectors.toList()); + String whereSql = fieldNames.stream().map(fieldName -> " " + fieldName + " like '%" + keyword + "%'").collect(Collectors.joining(" or ")); + return "( select * from " + originTable + " where (" + whereSql + ") )"; + } + @Override - public List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm) throws Exception { + public List fieldValues(List fieldIds, DeSortDTO sortDTO, Long userId, Boolean userPermissions, Boolean needMapping, Boolean rowAndColumnMgm, String keyword) throws Exception { String fieldId = fieldIds.get(0); DatasetTableField field = dataSetTableFieldsService.selectByPrimaryKey(fieldId); if (field == null || StringUtils.isEmpty(field.getTableId())) return null; @@ -112,7 +119,7 @@ public class DirectFieldService implements DataSetFieldService { List deSortFields = buildSorts(fields, sortDTO); - Boolean needSort = CollectionUtils.isNotEmpty(deSortFields); + boolean needSort = CollectionUtils.isNotEmpty(deSortFields); final List allTableFieldIds = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList()); boolean multi = fieldIds.stream().anyMatch(item -> !allTableFieldIds.contains(item)); @@ -165,22 +172,32 @@ public class DirectFieldService implements DataSetFieldService { QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.DB.toString())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - createSQL = qp.createQuerySQL(dataTableInfoDTO.getTable(), permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields); + String formatSql = formatTableByKeyword(keyword, dataTableInfoDTO.getTable(), permissionFields); + createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, ds, customFilter, rowPermissionsTree, deSortFields); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.SQL.toString())) { String sql = dataTableInfoDTO.getSql(); if (dataTableInfoDTO.isBase64Encryption()) { sql = new String(java.util.Base64.getDecoder().decode(sql)); } sql = dataSetTableService.handleVariableDefaultValue(sql, null, ds.getType(), false); + if (StringUtils.isNotBlank(keyword)) { + sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields); + } createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.CUSTOM.toString())) { 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); + if (StringUtils.isNotBlank(keyword)) { + sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields); + } createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); } else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), DatasetType.UNION.toString())) { DataTableInfoDTO dt = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = (String) dataSetTableService.getUnionSQLDatasource(dt, ds).get("sql"); + if (StringUtils.isNotBlank(keyword)) { + sql = formatTableByKeyword(keyword, " (" + sql + ") " + "inner_like_temp ", permissionFields); + } createSQL = qp.createQuerySQLAsTmp(sql, permissionFields, !needSort, customFilter, rowPermissionsTree, deSortFields); } datasourceRequest.setQuery(qp.createSQLPreview(createSQL, null)); @@ -193,15 +210,16 @@ public class DirectFieldService implements DataSetFieldService { String tableName = "ds_" + datasetTable.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - createSQL = qp.createQuerySQL(tableName, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields); + String formatSql = formatTableByKeyword(keyword, tableName, permissionFields); + createSQL = qp.createQuerySQL(formatSql, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields); datasourceRequest.setQuery(qp.createSQLPreview(createSQL, null)); } LogUtil.info(datasourceRequest.getQuery()); datasourceRequest.setPermissionFields(permissionFields); + assert datasourceProvider != null; List rows = datasourceProvider.getData(datasourceRequest); if (!needMapping) { - List results = rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); - return results; + return rows.stream().map(row -> row[0]).distinct().collect(Collectors.toList()); } Set pkSet = new HashSet<>(); diff --git a/core/frontend/src/components/elVisualSelect/index.vue b/core/frontend/src/components/elVisualSelect/index.vue index 9778792549..633e6520a1 100644 --- a/core/frontend/src/components/elVisualSelect/index.vue +++ b/core/frontend/src/components/elVisualSelect/index.vue @@ -85,6 +85,10 @@ export default { clearable: { type: Boolean, default: true + }, + flag: { + type: String, + require: true } }, data() { @@ -124,14 +128,14 @@ export default { }, list() { this.resetList() - this.show = false this.$nextTick(() => { - this.show = true this.$nextTick(() => { this.init() }) }) - }, + } + /* + 模糊搜索改为后端检索,暂注释前端 keyWord(val, old) { if (val === old) return const results = val ? this.vagueFilter(val, this.list) : null @@ -141,6 +145,7 @@ export default { this.callback() }) } + */ }, mounted() { this.resetList() @@ -174,8 +179,10 @@ export default { this.$emit('handleShowNumber') }, addScrollDiv(selectDom) { + const baseClass = `${this.classId}-creator` this.maxHeightDom = document.createElement('div') this.maxHeightDom.className = 'el-select-height' + this.maxHeightDom.classList.add(baseClass) selectDom.insertBefore(this.maxHeightDom, this.domList) }, reCacularHeight() { @@ -206,6 +213,12 @@ export default { this.customInputStyle() return } + const baseClass = `.${this.classId}-creator` + if (document.querySelector(baseClass)) { + this.customInputStyle() + this.reCacularHeight() + return + } const selectDom = document.querySelector( `.${this.classId} .el-select-dropdown .el-select-dropdown__wrap` diff --git a/core/frontend/src/components/widget/deWidget/DeSelect.vue b/core/frontend/src/components/widget/deWidget/DeSelect.vue index ef2e33d5c8..970ec23773 100644 --- a/core/frontend/src/components/widget/deWidget/DeSelect.vue +++ b/core/frontend/src/components/widget/deWidget/DeSelect.vue @@ -18,6 +18,7 @@ popper-class="coustom-de-select" :class="{'disabled-close': !inDraw && selectFirst && element.options.attrs.multiple}" :list="data" + :flag="flag" :is-config="isConfig" :custom-style="customStyle" @resetKeyWords="filterMethod" @@ -52,7 +53,7 @@ import { isSameVueObj, mergeCustomSortOption } from '@/utils' import { getLinkToken, getToken } from '@/utils/auth' import customInput from '@/components/widget/deWidget/customInput' import { textSelectWidget } from '@/components/widget/deWidget/serviceNameFn.js' - +import { uuid } from 'vue-uuid' export default { components: { ElVisualSelect }, mixins: [customInput], @@ -94,7 +95,10 @@ export default { data: [], onFocus: false, keyWord: '', - separator: ',' + separator: ',', + timeMachine: null, + changeIndex: 0, + flag: uuid.v1() } }, computed: { @@ -292,8 +296,49 @@ export default { this.value = this.element.options.attrs.multiple ? [] : null this.$refs.deSelect && this.$refs.deSelect.resetSelectAll && this.$refs.deSelect.resetSelectAll() }, + + searchWithKey(index) { + this.timeMachine = setTimeout(() => { + if (index === this.changeIndex) { + this.refreshOptions() + } + this.destroyTimeMachine() + }, 1500) + }, + destroyTimeMachine() { + this.timeMachine && clearTimeout(this.timeMachine) + this.timeMachine = null + }, filterMethod(key) { + if (key === this.keyWord) { + return + } this.keyWord = key + this.destroyTimeMachine() + this.changeIndex++ + this.searchWithKey(this.changeIndex) + }, + refreshOptions() { + // this.data = [] + let method = multFieldValues + const token = this.$store.getters.token || getToken() + const linkToken = this.$store.getters.linkToken || getLinkToken() + if (!token && linkToken) { + method = linkMultFieldValues + } + if (!this.element.options.attrs.fieldId) { + return + } + const param = { fieldIds: this.element.options.attrs.fieldId.split(this.separator), sort: this.element.options.attrs.sort, keyword: this.keyWord } + if (this.panelInfo.proxy) { + param.userId = this.panelInfo.proxy + } + this.element.options.attrs.fieldId && + this.element.options.attrs.fieldId.length > 0 && + method(param).then(res => { + this.data = this.optionData(res.data) + this.flag = uuid.v1() + }) }, onScroll() { if (this.onFocus) {