Merge pull request #9820 from ulleo/dev

feat(X-Pack): 数据填报>编辑表单>删除表单组建时,对应变更表内字段名称,且在创建索引时过滤掉该字段
This commit is contained in:
ulleo 2024-05-23 17:51:27 +08:00 committed by GitHub
commit 6488dd37a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 231 additions and 97 deletions

View File

@ -49,10 +49,11 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider {
}
@Override
public String addTableColumnSql(String table, List<ExtTableField> formFields) {
public String addTableColumnSql(String table, List<ExtTableField> formFieldsToCreate, List<ExtTableField> formFieldsToModify) {
String modifyTableSql = "ALTER TABLE `$TABLE_NAME$` $Column_Fields$ ;";
List<ExtTableField.TableField> fields = convertTableFields(false, formFields);
String fieldSql = convertTableFieldsString(table, fields, true);
List<ExtTableField.TableField> fields = convertTableFields(false, formFieldsToCreate);
List<ExtTableField.TableField> 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<ExtTableField.TableField> fields, boolean addColumn) {
private String convertTableFieldsString(String table, List<ExtTableField.TableField> fields, boolean notCreateTable) {
return convertTableFieldsString(table, fields, notCreateTable, null);
}
private String convertTableFieldsString(String table, List<ExtTableField.TableField> fields, boolean notCreateTable, List<ExtTableField.TableField> 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<String> createTableIndexSql(String table, List<ExtIndexField> indexFields) {
List<String> list = new ArrayList<>();

View File

@ -83,10 +83,30 @@ public class DataFillService {
List<ExtTableField> fields = gson.fromJson(dataFillForm.getForms(), new TypeToken<List<ExtTableField>>() {
}.getType());
List<ExtIndexField> indexes = new ArrayList<>();
List<ExtIndexField> indexesToCreate = new ArrayList<>();
if (dataFillForm.getCreateIndex()) {
indexes = gson.fromJson(dataFillForm.getTableIndexes(), new TypeToken<List<ExtIndexField>>() {
List<ExtIndexField> indexes = gson.fromJson(dataFillForm.getTableIndexes(), new TypeToken<List<ExtIndexField>>() {
}.getType());
Map<String, String> 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<String> sqls = extDDLProvider.createTableIndexSql(dataFillForm.getTableName(), indexes);
List<String> sqls = extDDLProvider.createTableIndexSql(dataFillForm.getTableName(), indexesToCreate);
for (String indexSql : sqls) {
datasourceRequest.setQuery(indexSql);
@ -202,9 +222,46 @@ public class DataFillService {
}
List<ExtTableField> fieldsToCreate = fields.stream().filter(f -> !oldFieldIds.contains(f.getId())).collect(Collectors.toList());
List<ExtIndexField> indexesToCreate = indexes.stream().filter(f -> !oldIndexNames.contains(f.getName())).collect(Collectors.toList());
//这里是表单中被删除的字段
List<String> fieldsIds = fields.stream().map(ExtTableField::getId).collect(Collectors.toList());
List<ExtTableField> removedFields = oldFields.stream().filter(f -> !fieldsIds.contains(f.getId()) && !f.isRemoved()).collect(Collectors.toList());
List<ExtTableField> alreadyRemovedFields = oldFields.stream().filter(ExtTableField::isRemoved).collect(Collectors.toList());
//需要修改列名的字段
List<ExtTableField> 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<String, String> 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<ExtIndexField> 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<String> fieldsIds = fields.stream().map(ExtTableField::getId).collect(Collectors.toList());
List<ExtTableField> 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<ExtTableField> finalFields = new ArrayList<>(fields);
finalFields.addAll(removedFields);
finalFields.addAll(fieldsToModify);
finalFields.addAll(alreadyRemovedFields);
dataFillForm.setForms(new Gson().toJson(finalFields));
}

View File

@ -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
})

View File

@ -1,5 +1,5 @@
<script>
import { filter, forEach, find, split, get, groupBy, keys, includes } from 'lodash-es'
import { filter, forEach, find, split, get, groupBy, keys, includes, cloneDeep } from 'lodash-es'
import { listDatasource } from '@/api/system/datasource'
import { listForm, saveForm, updateForm } from '@/views/dataFilling/form/dataFilling'
import { hasDataPermission } from '@/utils/permission'
@ -31,17 +31,21 @@ export default {
}
let count = 0
forEach(this.computedFormList, f => {
if (f.type === 'dateRange') {
if (f.settings.mapping.columnName1 === value) {
count++
}
if (f.settings.mapping.columnName2 === value) {
count++
if (!f.deleted) {
if (f.type === 'dateRange') {
if (f.settings.mapping.columnName1 === value) {
count++
}
if (f.settings.mapping.columnName2 === value) {
count++
}
} else {
if (f.settings.mapping.columnName === value) {
count++
}
}
} else {
if (f.settings.mapping.columnName === value) {
count++
}
// uuid
}
})
if (count > 1) {
@ -65,13 +69,19 @@ export default {
callback()
}
const checkInvalidColumnValidator = (rule, value, callback) => {
const f = split(rule.field, '.')[0]
const _index = get(this.formData, f)
if (_index.old) {
// index
callback()
}
if (!value) {
return callback(new Error(this.$t('commons.component.required')))
}
if (this.columnsList.length === 0) {
return callback(new Error(this.$t('data_fill.form.value_not_exists')))
}
if (find(this.columnsList, c => c === value) === undefined) {
if (find(this.columnsList, c => c.value === value) === undefined) {
callback(new Error(this.$t('data_fill.form.value_not_exists')))
}
callback()
@ -142,15 +152,16 @@ export default {
const _list = []
const columnIds = []
for (let i = 0; i < this.formData.forms.length; i++) {
const row = this.formData.forms[i]
const row = cloneDeep(this.formData.forms[i])
columnIds.push(row.id)
_list.push(row)
}
for (let i = 0; i < this.formData.oldForms.length; i++) {
const row = this.formData.oldForms[i]
const row = cloneDeep(this.formData.oldForms[i])
if (includes(columnIds, row.id)) {
continue
}
row.deleted = true
_list.push(row)
}
return _list
@ -180,25 +191,40 @@ export default {
return this.formData.tableIndexes
}
},
columnsList() {
allColumnsList() {
const _list = []
for (let i = 0; i < this.computedFormList.length; i++) {
const row = this.computedFormList[i]
if (row.type === 'dateRange') {
if (row.settings.mapping.columnName1 !== undefined && row.settings.mapping.columnName1 !== '') {
_list.push(row.settings.mapping.columnName1)
_list.push({
name: !row.deleted ? row.settings.mapping.columnName1 : row.id + '_1',
value: row.id + '_1',
deleted: !!row.deleted
})
}
if (row.settings.mapping.columnName2 !== undefined && row.settings.mapping.columnName2 !== '') {
_list.push(row.settings.mapping.columnName2)
_list.push({
name: !row.deleted ? row.settings.mapping.columnName2 : row.id + '_2',
value: row.id + '_2',
deleted: !!row.deleted
})
}
} else {
if (row.settings.mapping.columnName !== undefined && row.settings.mapping.columnName !== '' && row.settings.mapping.type !== 'text') {
_list.push(row.settings.mapping.columnName)
_list.push({
name: !row.deleted ? row.settings.mapping.columnName : row.id,
value: row.id,
deleted: !!row.deleted
})
}
}
}
return _list
},
columnsList() {
return filter(this.allColumnsList, c => !c.deleted)
}
},
watch: {
@ -756,12 +782,11 @@ export default {
style="width: 100%"
>
<el-option
v-for="(x, $index) in columnsList"
v-for="(x, $index) in (isEdit && scope.row.old ? allColumnsList : columnsList)"
:key="$index"
:value="x"
:label="x"
>{{ x }}
</el-option>
:value="x.value"
:label="x.name"
/>
</el-select>
</el-form-item>

View File

@ -81,6 +81,10 @@ public class ExtTableField implements Serializable {
private String columnName1;
private String columnName2;
private String oldColumnName;
private String oldColumnName1;
private String oldColumnName2;
private BaseType type;
//长度
@ -107,6 +111,8 @@ public class ExtTableField implements Serializable {
private String columnName;
private String oldColumnName;
private BaseType type;
private boolean required;

View File

@ -23,7 +23,7 @@ public class DefaultExtDDLProvider extends ExtDDLProvider {
}
@Override
public String addTableColumnSql(String table, List<ExtTableField> formFields) {
public String addTableColumnSql(String table, List<ExtTableField> formFieldsToCreate, List<ExtTableField> formFieldsToModify) {
return null;
}

View File

@ -15,7 +15,8 @@ public abstract class ExtDDLProvider {
public abstract String createTableSql(String table, List<ExtTableField> formFields);
public abstract String addTableColumnSql(String table, List<ExtTableField> formFields);
public abstract String addTableColumnSql(String table, List<ExtTableField> formFieldsToCreate, List<ExtTableField> formFieldsToModify);
public abstract String dropTableColumnSql(String table, List<ExtTableField> formFields);
public abstract String searchSql(String table, List<TableField> formFields, String whereSql, long limit, long offset);
@ -25,6 +26,7 @@ public abstract class ExtDDLProvider {
public abstract String dropTableSql(String table);
public abstract List<String> createTableIndexSql(String table, List<ExtIndexField> indexFields);
public abstract List<String> dropTableIndexSql(String table, List<ExtIndexField> indexFields);
public abstract String deleteDataByIdsSql(String table, List<DatasourceRequest.TableFieldWithValue> pks);