diff --git a/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java b/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java index 44622a0122..694204a2b2 100644 --- a/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java @@ -49,10 +49,11 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { } @Override - public String addTableColumnSql(String table, List formFields) { + public String addTableColumnSql(String table, List formFieldsToCreate, List formFieldsToModify) { String modifyTableSql = "ALTER TABLE `$TABLE_NAME$` $Column_Fields$ ;"; - List fields = convertTableFields(false, formFields); - String fieldSql = convertTableFieldsString(table, fields, true); + List fields = convertTableFields(false, formFieldsToCreate); + List fieldsToModify = convertTableFields(false, formFieldsToModify); + String fieldSql = convertTableFieldsString(table, fields, true, fieldsToModify); return modifyTableSql.replace("$TABLE_NAME$", table).replace("$Column_Fields$", fieldSql); } @@ -144,18 +145,21 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { for (ExtTableField formField : formFields) { ExtTableField.TableField.TableFieldBuilder fieldBuilder = ExtTableField.TableField.builder() .columnName(formField.getSettings().getMapping().getColumnName()) + .oldColumnName(formField.getSettings().getMapping().getOldColumnName()) .type(formField.getSettings().getMapping().getType()) .comment(formField.getSettings().getName()) .required(formField.getSettings().isRequired()); if (StringUtils.equalsIgnoreCase(formField.getType(), "dateRange")) { ExtTableField.TableField f1 = fieldBuilder .columnName(formField.getSettings().getMapping().getColumnName1()) + .oldColumnName(formField.getSettings().getMapping().getOldColumnName1()) .comment(formField.getSettings().getName() + " start") .build(); list.add(f1); ExtTableField.TableField f2 = BeanUtils.copyBean(new ExtTableField.TableField(), f1); f2.setColumnName(formField.getSettings().getMapping().getColumnName2()); + f2.setOldColumnName(formField.getSettings().getMapping().getOldColumnName2()); f2.setComment(formField.getSettings().getName() + " end"); list.add(f2); } else { @@ -265,13 +269,42 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { return convertTableFieldsString(table, fields, false); } - private String convertTableFieldsString(String table, List fields, boolean addColumn) { + private String convertTableFieldsString(String table, List fields, boolean notCreateTable) { + return convertTableFieldsString(table, fields, notCreateTable, null); + } + + private String convertTableFieldsString(String table, List fields, boolean notCreateTable, List fieldsToModify) { StringBuilder str = new StringBuilder(); - if (addColumn) { + if (notCreateTable) { str.append("\n"); } else { str.append("(\n"); } + + if (notCreateTable && CollectionUtils.isNotEmpty(fieldsToModify)) { + for (int i = 0; i < fieldsToModify.size(); i++) { + ExtTableField.TableField field = fieldsToModify.get(i); + + str.append("change "); + + //column name + str.append("`").append(field.getOldColumnName()).append("` "); + str.append("`").append(field.getColumnName()).append("` "); + + appendTypes(str, field); + + //换行 + if (i < fieldsToModify.size() - 1) { + str.append(",\n"); + } + } + + if (CollectionUtils.isNotEmpty(fields)) { + str.append(",\n"); + } + } + + ExtTableField.TableField primaryKeyField = null; for (int i = 0; i < fields.size(); i++) { ExtTableField.TableField field = fields.get(i); @@ -283,62 +316,14 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { /*if (checkSqlInjection(field.getColumnName())) { throw new RuntimeException("包含SQL注入的参数,请检查参数!"); }*/ - if (addColumn) { + if (notCreateTable) { str.append("add "); } //column name str.append("`").append(field.getColumnName()).append("` "); - //type - switch (field.getType()) { - case nvarchar: - str.append("NVARCHAR("); - if (field.getSize() != null && field.getSize() > 0) { - str.append(field.getSize()); - } else { - str.append(256); - } - str.append(") "); - break; - case number: - str.append("BIGINT("); - if (field.getSize() != null && field.getSize() > 0) { - str.append(field.getSize()); - } else { - str.append(20); - } - str.append(") "); - break; - case decimal: - str.append("DECIMAL("); - if (field.getSize() != null && field.getSize() > 0) { - str.append(field.getSize()); - } else { - str.append(20); - } - str.append(","); - if (field.getAccuracy() != null && field.getAccuracy() >= 0) { - str.append(field.getAccuracy()); - } else { - str.append(8); - } - str.append(") "); - break; - case datetime: - str.append("DATETIME "); - break; - default: - str.append("LONGTEXT "); - break; - } - //必填 考虑到表单编辑的情况,调整为代码判断 - /*if (field.isRequired()) { - str.append("NOT NULL "); - }*/ - - //comment - str.append("COMMENT '").append(field.getComment()).append("' "); + appendTypes(str, field); //换行 if (i < fields.size() - 1) { @@ -351,7 +336,7 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { } - if (primaryKeyField != null) { + if (!notCreateTable && primaryKeyField != null) { str.append("constraint `") .append(table) .append("_pk` ") @@ -361,12 +346,65 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { .append("`)"); } - if (!addColumn) { + if (!notCreateTable) { str.append("\n)\n"); } return str.toString(); } + private static void appendTypes(StringBuilder str, ExtTableField.TableField field) { + //type + switch (field.getType()) { + case nvarchar: + str.append("NVARCHAR("); + if (field.getSize() != null && field.getSize() > 0) { + str.append(field.getSize()); + } else { + str.append(256); + } + str.append(") "); + break; + case number: + str.append("BIGINT("); + if (field.getSize() != null && field.getSize() > 0) { + str.append(field.getSize()); + } else { + str.append(20); + } + str.append(") "); + break; + case decimal: + str.append("DECIMAL("); + if (field.getSize() != null && field.getSize() > 0) { + str.append(field.getSize()); + } else { + str.append(20); + } + str.append(","); + if (field.getAccuracy() != null && field.getAccuracy() >= 0) { + str.append(field.getAccuracy()); + } else { + str.append(8); + } + str.append(") "); + break; + case datetime: + str.append("DATETIME "); + break; + default: + str.append("LONGTEXT "); + break; + } + + //必填 考虑到表单编辑的情况,调整为代码判断 + /*if (field.isRequired()) { + str.append("NOT NULL "); + }*/ + + //comment + str.append("COMMENT '").append(field.getComment()).append("' "); + } + @Override public List createTableIndexSql(String table, List indexFields) { List list = new ArrayList<>(); diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java index ad4f01d847..0cef1c1548 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java @@ -83,10 +83,30 @@ public class DataFillService { List fields = gson.fromJson(dataFillForm.getForms(), new TypeToken>() { }.getType()); - List indexes = new ArrayList<>(); + List indexesToCreate = new ArrayList<>(); if (dataFillForm.getCreateIndex()) { - indexes = gson.fromJson(dataFillForm.getTableIndexes(), new TypeToken>() { + List indexes = gson.fromJson(dataFillForm.getTableIndexes(), new TypeToken>() { }.getType()); + + Map indexColumnItems = new HashMap<>(); + fields.forEach(f -> { + if (StringUtils.equalsIgnoreCase(f.getType(), "dateRange")) { + indexColumnItems.put(f.getId() + "_1", f.getSettings().getMapping().getColumnName1()); + indexColumnItems.put(f.getId() + "_2", f.getSettings().getMapping().getColumnName2()); + } else { + indexColumnItems.put(f.getId(), f.getSettings().getMapping().getColumnName()); + } + }); + + indexes.forEach(f -> { + ExtIndexField index = gson.fromJson(gson.toJson(f), ExtIndexField.class); + index.getColumns().forEach(c -> { + //根据id获取实际的column名 + c.setColumn(indexColumnItems.get(c.getColumn())); + }); + indexesToCreate.add(index); + }); + } Datasource ds = dataFillDataService.getDataSource(dataFillForm.getDatasource(), true); @@ -107,7 +127,7 @@ public class DataFillService { if (dataFillForm.getCreateIndex()) { try { - List sqls = extDDLProvider.createTableIndexSql(dataFillForm.getTableName(), indexes); + List sqls = extDDLProvider.createTableIndexSql(dataFillForm.getTableName(), indexesToCreate); for (String indexSql : sqls) { datasourceRequest.setQuery(indexSql); @@ -202,9 +222,46 @@ public class DataFillService { } List fieldsToCreate = fields.stream().filter(f -> !oldFieldIds.contains(f.getId())).collect(Collectors.toList()); - List indexesToCreate = indexes.stream().filter(f -> !oldIndexNames.contains(f.getName())).collect(Collectors.toList()); + //这里是表单中被删除的字段 + List fieldsIds = fields.stream().map(ExtTableField::getId).collect(Collectors.toList()); + List removedFields = oldFields.stream().filter(f -> !fieldsIds.contains(f.getId()) && !f.isRemoved()).collect(Collectors.toList()); + List alreadyRemovedFields = oldFields.stream().filter(ExtTableField::isRemoved).collect(Collectors.toList()); + //需要修改列名的字段 + List fieldsToModify = removedFields.stream().filter(f -> !f.isRemoved()).collect(Collectors.toList()); + fieldsToModify.forEach(f -> { + f.setRemoved(true); + if (StringUtils.equalsIgnoreCase(f.getType(), "dateRange")) { + f.getSettings().getMapping().setOldColumnName1(f.getSettings().getMapping().getColumnName1()); + f.getSettings().getMapping().setOldColumnName2(f.getSettings().getMapping().getColumnName2()); + f.getSettings().getMapping().setColumnName1(f.getId() + "_1"); + f.getSettings().getMapping().setColumnName2(f.getId() + "_2"); + } else { + f.getSettings().getMapping().setOldColumnName(f.getSettings().getMapping().getColumnName()); + f.getSettings().getMapping().setColumnName(f.getId()); + } + }); + Map indexColumnItems = new HashMap<>(); + fields.forEach(f -> { + if (StringUtils.equalsIgnoreCase(f.getType(), "dateRange")) { + indexColumnItems.put(f.getId() + "_1", f.getSettings().getMapping().getColumnName1()); + indexColumnItems.put(f.getId() + "_2", f.getSettings().getMapping().getColumnName2()); + } else { + indexColumnItems.put(f.getId(), f.getSettings().getMapping().getColumnName()); + } + }); + List indexesToCreate = new ArrayList<>(); + indexes.stream() + .filter(f -> !oldIndexNames.contains(f.getName())).collect(Collectors.toList()) + .forEach(f -> { + ExtIndexField index = gson.fromJson(gson.toJson(f), ExtIndexField.class); + index.getColumns().forEach(c -> { + //根据id获取实际的column名 + c.setColumn(indexColumnItems.get(c.getColumn())); + }); + indexesToCreate.add(index); + }); - if (CollectionUtils.isNotEmpty(fieldsToCreate) || CollectionUtils.isNotEmpty(indexesToCreate)) { + if (CollectionUtils.isNotEmpty(fieldsToCreate) || CollectionUtils.isNotEmpty(indexesToCreate) || CollectionUtils.isNotEmpty(fieldsToModify)) { Datasource ds = dataFillDataService.getDataSource(dataFillForm.getDatasource()); @@ -218,8 +275,8 @@ public class DataFillService { //拼sql ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType()); - if (CollectionUtils.isNotEmpty(fieldsToCreate)) { - String sql = extDDLProvider.addTableColumnSql(dataFillForm.getTableName(), fieldsToCreate); + if (CollectionUtils.isNotEmpty(fieldsToCreate) || CollectionUtils.isNotEmpty(fieldsToModify)) { + String sql = extDDLProvider.addTableColumnSql(dataFillForm.getTableName(), fieldsToCreate, fieldsToModify); //创建 datasourceRequest.setQuery(sql); jdbcProvider.exec(datasourceRequest); @@ -263,12 +320,10 @@ public class DataFillService { } //处理被删除的form - List fieldsIds = fields.stream().map(ExtTableField::getId).collect(Collectors.toList()); - List removedFields = oldFields.stream().filter(f -> !fieldsIds.contains(f.getId())).collect(Collectors.toList()); - removedFields.forEach(f -> f.setRemoved(true)); - if (CollectionUtils.isNotEmpty(removedFields)) { + if (CollectionUtils.isNotEmpty(fieldsToModify) || CollectionUtils.isNotEmpty(alreadyRemovedFields)) { List finalFields = new ArrayList<>(fields); - finalFields.addAll(removedFields); + finalFields.addAll(fieldsToModify); + finalFields.addAll(alreadyRemovedFields); dataFillForm.setForms(new Gson().toJson(finalFields)); } diff --git a/core/frontend/src/views/dataFilling/form/create.vue b/core/frontend/src/views/dataFilling/form/create.vue index 6f9c9da46c..6d0c1bd029 100644 --- a/core/frontend/src/views/dataFilling/form/create.vue +++ b/core/frontend/src/views/dataFilling/form/create.vue @@ -268,13 +268,21 @@ export default { this.formSettings.forms = filter(JSON.parse(res.data.forms), f => !f.removed) forEach(this.formSettings.forms, f => { f.old = true + if (f.type === 'checkbox' || f.type === 'select' && f.settings.multiple) { + f.value = [] + } }) this.formSettings.oldForms = JSON.parse(res.data.forms) this.formSettings.tableIndexes = JSON.parse(res.data.tableIndexes) - forEach(this.formSettings.tableIndexes, f => { - f.old = true - }) - this.formSettings.oldTableIndexes = JSON.parse(res.data.tableIndexes) + + if (res.data.createIndex) { + forEach(this.formSettings.tableIndexes, f => { + f.old = true + }) + this.formSettings.oldTableIndexes = JSON.parse(res.data.tableIndexes) + } else { + this.formSettings.oldTableIndexes = [] + } this.disableCreateIndex = res.data.createIndex }) diff --git a/core/frontend/src/views/dataFilling/form/save.vue b/core/frontend/src/views/dataFilling/form/save.vue index 2252977ad8..a92c548635 100644 --- a/core/frontend/src/views/dataFilling/form/save.vue +++ b/core/frontend/src/views/dataFilling/form/save.vue @@ -1,5 +1,5 @@