diff --git a/backend/pom.xml b/backend/pom.xml index 624cc12ee6..321cd4ffcd 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -5,7 +5,7 @@ dataease-server io.dataease - 1.18.4 + ${dataease.version} 4.0.0 @@ -204,7 +204,7 @@ io.dataease dataease-plugin-interface - 1.18.4 + ${dataease.version} guava @@ -215,12 +215,12 @@ io.dataease dataease-plugin-view - 1.18.4 + ${dataease.version} io.dataease dataease-plugin-datasource - 1.18.4 + ${dataease.version} diff --git a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlDDLProvider.java b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlDDLProvider.java index 019da6d96e..259169b614 100644 --- a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlDDLProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlDDLProvider.java @@ -56,11 +56,7 @@ public class MysqlDDLProvider extends DDLProviderImpl { Integer size = datasetTableField.getSize() * 4; switch (datasetTableField.getDeExtractType()) { case 0: - if (size < 65533) { - Column_Fields.append("varchar(length)".replace("length", String.valueOf(datasetTableField.getSize()))).append(",`"); - }else { - Column_Fields.append("longtext").append(",`"); - } + Column_Fields.append("longtext").append(",`"); break; case 1: size = size < 50? 50 : size; 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 f504c372f4..559f63cfb6 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -71,6 +71,8 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.locks.ReentrantLock; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -1795,8 +1797,7 @@ public class ChartViewService { } private String handleVariable(String sql, ChartExtRequest requestList, QueryProvider qp, DataSetTableDTO table, Datasource ds) throws Exception { - List sqlVariables = new Gson().fromJson(table.getSqlVariableDetails(), new TypeToken>() { - }.getType()); + List sqlVariables = new Gson().fromJson(table.getSqlVariableDetails(), new TypeToken>() {}.getType()); if (requestList != null && CollectionUtils.isNotEmpty(requestList.getFilter())) { for (ChartExtFilterRequest chartExtFilterRequest : requestList.getFilter()) { if (CollectionUtils.isEmpty(chartExtFilterRequest.getValue())) { @@ -1845,7 +1846,7 @@ public class ChartViewService { } } } - sql = dataSetTableService.removeVariables(sql, ds.getType()); + sql = dataSetTableService.handleVariableDefaultValue(sql, null, ds.getType()); return sql; } diff --git a/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java b/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java index c77eba238c..cc2c25f6be 100644 --- a/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java +++ b/backend/src/main/java/io/dataease/service/chart/ViewPluginBaseServiceImpl.java @@ -123,7 +123,6 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService { case SQL: String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql(); tableName = dataSetTableService.handleVariableDefaultValue(sql, null, pluginViewSet.getDsType()); - tableName = "(" + sqlFix(tableName) + ")"; break; case CUSTOM: diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 2a6ba0f346..afa591b348 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -144,7 +144,7 @@ public class DataSetTableService { private static boolean isUpdatingDatasetTableStatus = false; private static final String lastUpdateTime = "${__last_update_time__}"; private static final String currentUpdateTime = "${__current_update_time__}"; - private static final String regex = "\\$\\{(.*?)\\}"; + public static final String regex = "\\$\\{(.*?)\\}"; private static final String SubstitutedParams = "DATAEASE_PATAMS_BI"; private static final String SubstitutedSql = " 'BI' = 'BI' "; @@ -701,7 +701,7 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfo = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); - sql = handleVariableDefaultValue(sql, null, ds.getType()); + sql = handleVariableDefaultValue(sql, datasetTable.getSqlVariableDetails(), ds.getType()); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); datasourceRequest.setQuery( qp.createQuerySQLWithPage(sql, fields, page, pageSize, realSize, false, null, rowPermissionsTree)); @@ -1058,15 +1058,15 @@ public class DataSetTableService { Matcher matcher = pattern.matcher(sql); while (matcher.find()) { SqlVariableDetails defaultsSqlVariableDetail = null; - List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() { - }.getType()); + List defaultsSqlVariableDetails = new Gson().fromJson(sqlVariableDetails, new TypeToken>() {}.getType()); for (SqlVariableDetails sqlVariableDetail : defaultsSqlVariableDetails) { if (matcher.group().substring(2, matcher.group().length() - 1).equalsIgnoreCase(sqlVariableDetail.getVariableName())) { defaultsSqlVariableDetail = sqlVariableDetail; break; } } - if (defaultsSqlVariableDetail != null && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) { + if (defaultsSqlVariableDetail != null && defaultsSqlVariableDetail.getDefaultValueScope() != null && + defaultsSqlVariableDetail.getDefaultValueScope().equals(SqlVariableDetails.DefaultValueScope.ALLSCOPE) && StringUtils.isNotEmpty(defaultsSqlVariableDetail.getDefaultValue())) { sql = sql.replace(matcher.group(), defaultsSqlVariableDetail.getDefaultValue()); } } @@ -2264,6 +2264,9 @@ public class DataSetTableService { } Set nameSet = new HashSet<>(); for (DataSetTableRequest table : datasetTable) { + if(StringUtils.isEmpty(table.getName())){ + throw new RuntimeException(Translator.get("I18n_name_cant_empty")); + } nameSet.add(table.getName()); } if (nameSet.size() != datasetTable.size()) { diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java index e539ae10c8..35651738da 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -70,6 +70,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -741,6 +742,39 @@ public class ExtractDataService { totalSheets = excelXlsxReader.totalSheets; } + if (StringUtils.equalsIgnoreCase(suffix, "csv")) { + List fields = new ArrayList<>(); + BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(excelSheetData.getPath()), StandardCharsets.UTF_8)); + String s = reader.readLine();// first line + String[] split = s.split(","); + for (String s1 : split) { + TableField tableFiled = new TableField(); + tableFiled.setFieldName(s1); + tableFiled.setRemarks(s1); + tableFiled.setFieldType("TEXT"); + fields.add(tableFiled); + } + List> csvData = new ArrayList<>(); + String line; + while ((line = reader.readLine()) != null) { + if(line.endsWith(",")){ + List list = new ArrayList<>(Arrays.asList(line.split(","))); + list.add(""); + csvData.add(list); + }else { + csvData.add(Arrays.asList(line.split(","))); + } + } + ExcelSheetData csvSheetData = new ExcelSheetData(); + String[] fieldArray = fields.stream().map(TableField::getFieldName).toArray(String[]::new); + csvSheetData.setFields(fields); + csvSheetData.setData(csvData); + csvSheetData.setExcelLabel(excelSheetData.getExcelLabel()); + csvSheetData.setFieldsMd5(Md5Utils.md5(StringUtils.join(fieldArray, ","))); + totalSheets = Arrays.asList(csvSheetData); + } + + for (ExcelSheetData sheet : totalSheets) { if (sheet.getExcelLabel().equalsIgnoreCase(excelSheetData.getExcelLabel())) { for (List dataItem : sheet.getData()) { 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 a06283d097..75c5001c82 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 @@ -171,7 +171,7 @@ public class DirectFieldService implements DataSetFieldService { if (dataTableInfoDTO.isBase64Encryption()) { sql = new String(java.util.Base64.getDecoder().decode(sql)); } - sql = dataSetTableService.removeVariables(sql, ds.getType()); + sql = dataSetTableService.handleVariableDefaultValue(sql, datasetTable.getSqlVariableDetails(), ds.getType()); datasourceRequest.setQuery(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); diff --git a/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java b/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java index bd0b44d568..8311ea5a7d 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelAppTemplateService.java @@ -363,7 +363,7 @@ public class PanelAppTemplateService { //替换datasetId chartViewField.setTableId(datasetsRealMap.get(chartViewField.getTableId())); //替换chartViewId - chartViewField.setChartId(chartViewsRealMap.get(chartViewField.getId())); + chartViewField.setChartId(chartViewsRealMap.get(chartViewField.getChartId())); //替换datasetFieldId datasetFieldsRealMap.forEach((k, v) -> { chartViewField.setOriginName(chartViewField.getOriginName().replaceAll(k, v)); diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index 3e0774c086..9f52ae39b0 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -272,3 +272,4 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=Default template only screenshot \u8FB9\u68468=Border 8 \u8FB9\u68469=Border 9 \u8FB9\u684610=Border 10 +I18n_name_cant_empty=Name can not be empty! \ No newline at end of file diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 4016b32f2f..7634ab45ad 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -262,4 +262,5 @@ I18N_LOG_FORMAT_PREFIX=\u4EE5%s\u3010%s\u3011\u6743\u9650 I18N_CRON_ERROR=cron\u8868\u8FBE\u5F0F\u9519\u8BEF I18N_PANEL_PDF_TEMPLATE_WITH_PARAMS=\u9ED8\u8BA4\u6A21\u677F(\u52A0\u53C2\u6570\u6837\u5F0F) I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=\u9ED8\u8BA4\u6A21\u677F(\u53EA\u622A\u56FE) +I18n_name_cant_empty=名称不能为空! diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index e9041808b6..fe4718a71d 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -268,3 +268,4 @@ I18N_PANEL_PDF_TEMPLATE_ONLY_PIC=\u9ED8\u8A8D\u6A21\u677F(\u53EA\u622A\u5716) \u8FB9\u68468=\u908A\u6846 8 \u8FB9\u68469=\u908A\u6846 9 \u8FB9\u684610=\u908A\u6846 10 +I18n_name_cant_empty=名稱不能為空! \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index d24e88ba55..9e1a52ee7c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "dataease", - "version": "1.18.4", + "version": "1.18.5", "description": "dataease front", "private": true, "scripts": { diff --git a/frontend/pom.xml b/frontend/pom.xml index 20bf7b361b..73f8cb5587 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -6,7 +6,7 @@ dataease-server io.dataease - 1.18.4 + ${dataease.version} 4.0.0 diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 765cc7595a..86623f3306 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1519,12 +1519,14 @@ export default { p_center: 'Center' }, dataset: { + scope_edit: 'Effective only when editing', + scope_all: 'Effect globally when the dataset is previewed', spend_time: 'Spend', sql: 'SQL', sql_result: 'Result', parse_filed: 'Parse Field', field_rename: 'Rename Field', - params_work: 'Effective only when editing SQL', + params_work: 'Effective only when editing: parameter values are effective only when editing data sets; Global Effective: It takes effect in dataset view, preview, and view where dataset is used.', sql_variable_limit_1: '1、SQL variables can only be used in where conditions', sql_variable_limit_2: '2、Example:select * from table_name where column_name1=\'${param_name1}\' and column_name2 in \'${param_name2}\'', select_year: 'Select Year', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 8c23dfbe84..83d8445394 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1513,12 +1513,14 @@ export default { p_center: '居中' }, dataset: { + scope_edit: '僅編輯時生效', + scope_all: '數据集預覽時全域生效', spend_time: '耗時', sql: 'SQL 語句', sql_result: '運行結果', parse_filed: '解析字段', field_rename: '字段重命名', - params_work: '僅在編輯 sql 時生效', + params_work: '僅編輯時生效:參數值僅在數据集編輯時生效; 全域生效:在數据集查看、預覽、以及用到數据集的視圖中均生效。', sql_variable_limit_1: '1、SQL變數只能在WHERE條件中使用', sql_variable_limit_2: '2、示例:select * from table_name where column_name1=\'${param_name1}\' and column_name2 in \'${param_name2}\'', selesql_variable_limit_2ct_year: '選擇年', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 767c2d7f44..d4851c1e17 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1512,12 +1512,14 @@ export default { p_center: '居中' }, dataset: { + scope_edit: '仅编辑时生效', + scope_all: '数据集预览时全局生效', spend_time: '耗时', sql: 'SQL 语句', sql_result: '运行结果', parse_filed: '解析字段', field_rename: '字段重命名', - params_work: '仅在编辑sql时生效', + params_work: '仅编辑时生效:参数值仅在数据集编辑时生效;全局生效:在数据集查看、预览、以及用到数据集的视图中均生效。', select_year: '选择年', sql_variable_limit_1: '1、SQL 变量只能在 WHERE 条件中使用', sql_variable_limit_2: '2、示例:select * from table_name where column_name1=\'${param_name1}\' and column_name2 in \'${param_name2}\'', diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index 8d085773ef..25c7b80365 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -478,8 +478,21 @@ v-model="scope.row.defaultValue" size="small" type="text" - :placeholder="$t('fu.search_bar.please_input')" - /> + :placeholder="$t('fu.search_bar.please_input')"> + + + + - + > + + + + +
+
+ + + +
+
@@ -653,6 +695,9 @@ export default { dialogTitle: '', variables: [], variablesTmp: [], + defaultValueScopeList: [ + { label: this.$t('dataset.scope_edit'), value: 'EDIT' }, + { label: this.$t('dataset.scope_all'), value: 'ALLSCOPE' }], fieldOptions: [ { label: this.$t('dataset.text'), value: 'TEXT' }, { label: this.$t('dataset.value'), value: 'LONG' }, @@ -1038,6 +1083,9 @@ export default { for (let i = 0; i < this.variables.length; i++) { if (this.variables[i].variableName === name) { obj = this.variables[i] + if(!obj.hasOwnProperty("defaultValueScope")){ + obj.defaultValueScope = 'EDIT' + } } } if (obj === undefined) { @@ -1047,7 +1095,8 @@ export default { type: [], required: false, defaultValue: '', - details: '' + details: '', + defaultValueScope: 'EDIT' } obj.type.push('TEXT') } @@ -1093,8 +1142,13 @@ export default { padding-bottom: 80px; } + .de-group__prepend { + width: 100%; + } + .el-date-editor { width: 100%; + display: inline-block; } .select-type { diff --git a/frontend/src/views/dataset/data/UpdateInfo.vue b/frontend/src/views/dataset/data/UpdateInfo.vue index 6cd42c83ed..0d13f46cd1 100644 --- a/frontend/src/views/dataset/data/UpdateInfo.vue +++ b/frontend/src/views/dataset/data/UpdateInfo.vue @@ -574,7 +574,7 @@ export default { startTime: '', rate: 'SIMPLE', cron: '', - endTime: '', + endTime: 0, end: '0', extraData: { simple_cron_type: 'hour', @@ -779,6 +779,7 @@ export default { this.taskForm.name = this.table.name + ' ' + this.$t('dataset.task_update') this.taskForm.startTime = new Date() + this.taskForm.endTime = new Date() this.update_task_dialog_title = this.$t('dataset.task_add_title') } else { // update @@ -908,6 +909,7 @@ export default { } this.incrementalConfig.tableId = this.table.id task.startTime = new Date(task.startTime).getTime() + console.log(task.endTime) task.endTime = new Date(task.endTime).getTime() task.tableId = this.table.id const form = JSON.parse(JSON.stringify(task)) @@ -1030,7 +1032,7 @@ export default { onRateChange() { if (this.taskForm.rate === 'SIMPLE') { this.taskForm.end = '0' - this.taskForm.endTime = '' + this.taskForm.endTime = 0 this.taskForm.cron = '' this.showCron = false } diff --git a/frontend/src/views/dataset/data/UpdateRecords.vue b/frontend/src/views/dataset/data/UpdateRecords.vue index 3e6fa82ebe..c3a0ed622d 100644 --- a/frontend/src/views/dataset/data/UpdateRecords.vue +++ b/frontend/src/views/dataset/data/UpdateRecords.vue @@ -530,7 +530,7 @@ export default { startTime: '', rate: 'SIMPLE', cron: '', - endTime: '', + endTime: 0, end: '0', extraData: { simple_cron_type: 'hour', @@ -707,6 +707,7 @@ export default { this.resetTaskForm() this.taskForm.name = this.table.name + ' ' + this.$t('dataset.task_update') this.taskForm.startTime = new Date() + this.taskForm.endTime = new Date() this.update_task_dialog_title = this.$t('dataset.task_add_title') } else { this.taskForm = JSON.parse(JSON.stringify(task)) @@ -854,7 +855,7 @@ export default { onRateChange() { if (this.taskForm.rate === 'SIMPLE') { this.taskForm.end = '0' - this.taskForm.endTime = '' + this.taskForm.endTime = 0 this.taskForm.cron = '' } if (this.taskForm.rate === 'SIMPLE_CRON') { diff --git a/frontend/src/views/system/task/Form.vue b/frontend/src/views/system/task/Form.vue index 82f3b62848..36d506bce0 100644 --- a/frontend/src/views/system/task/Form.vue +++ b/frontend/src/views/system/task/Form.vue @@ -295,7 +295,7 @@ export default { tableId: '', rate: 'SIMPLE', cron: '', - endTime: '', + endTime: 0, end: '0', extraData: { simple_cron_type: 'hour', @@ -391,6 +391,7 @@ export default { this.taskDetail = { datasetName, id, tableId } if (!id) { this.taskForm.startTime = new Date() + this.taskForm.endTime = new Date() return } this.getTaskDetail(id) @@ -418,7 +419,7 @@ export default { onRateChange() { if (this.taskForm.rate === 'SIMPLE') { this.taskForm.end = '0' - this.taskForm.endTime = '' + this.taskForm.endTime = 0 this.taskForm.cron = '' this.showCron = false } diff --git a/mobile/package.json b/mobile/package.json index 51f483e43b..7817f9bb01 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -1,6 +1,6 @@ { "name": "dataease-mobile", - "version": "1.18.4", + "version": "1.18.5", "private": true, "scripts": { "serve": "npm run dev:h5", diff --git a/mobile/pom.xml b/mobile/pom.xml index 3cfaae85d2..45b241d913 100644 --- a/mobile/pom.xml +++ b/mobile/pom.xml @@ -6,7 +6,7 @@ dataease-server io.dataease - 1.18.4 + ${dataease.version} 4.0.0 diff --git a/pom.xml b/pom.xml index c9eebe174c..690f74bc60 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 io.dataease dataease-server - 1.18.4 + ${dataease.version} pom @@ -15,6 +15,10 @@ + + 1.18.5 + + dataease