From a0e6cbeabda7bb543ca505e80b2153b1cb66f84d Mon Sep 17 00:00:00 2001 From: ulleo Date: Fri, 17 May 2024 11:21:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(X-Pack):=E3=80=90=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A1=AB=E6=8A=A5=E3=80=91=E6=94=AF=E6=8C=81=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datafill/DataFillController.java | 8 +- .../provider/ext/MysqlExtDDLProvider.java | 75 +++++++++-- .../service/datafill/DataFillDataService.java | 27 ++++ .../service/datafill/DataFillService.java | 116 ++++++++++++++++++ .../views/dataFilling/form/EditFormData.vue | 32 ++--- .../src/views/dataFilling/form/ViewTable.vue | 2 +- .../src/views/dataFilling/form/create.vue | 54 ++++++-- .../src/views/dataFilling/form/dataFilling.js | 8 ++ .../src/views/dataFilling/form/index.vue | 16 ++- .../src/views/dataFilling/form/save.vue | 114 +++++++++++++++-- .../common/dto/datafill/ExtIndexField.java | 2 + .../common/dto/datafill/ExtTableField.java | 2 + .../provider/DefaultExtDDLProvider.java | 15 +++ .../datasource/provider/ExtDDLProvider.java | 4 + 14 files changed, 429 insertions(+), 46 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java index b8fd9d6217..5a0fbad32a 100644 --- a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java +++ b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java @@ -51,10 +51,16 @@ public class DataFillController { return dataFillService.saveForm(dataFillForm); } + @ApiIgnore + @PostMapping("/form/updateName") + public ResultHolder updateFormName(@RequestBody DataFillFormWithBLOBs dataFillForm) throws Exception { + return dataFillService.updateForm(dataFillForm, null); + } + @ApiIgnore @PostMapping("/form/update") public ResultHolder updateForm(@RequestBody DataFillFormWithBLOBs dataFillForm) throws Exception { - return dataFillService.updateForm(dataFillForm, null); + return dataFillService.updateForm(dataFillForm); } @ApiIgnore 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 78100e0879..44622a0122 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 @@ -48,6 +48,30 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { return creatTableSql.replace("TABLE_NAME", table).replace("Column_Fields", fieldSql); } + @Override + public String addTableColumnSql(String table, List formFields) { + String modifyTableSql = "ALTER TABLE `$TABLE_NAME$` $Column_Fields$ ;"; + List fields = convertTableFields(false, formFields); + String fieldSql = convertTableFieldsString(table, fields, true); + return modifyTableSql.replace("$TABLE_NAME$", table).replace("$Column_Fields$", fieldSql); + } + + @Override + public String dropTableColumnSql(String table, List formFields) { + String modifyTableSql = "ALTER TABLE `$TABLE_NAME$` $Column_Fields$ ;"; + List fields = convertTableFields(false, formFields); + StringBuilder str = new StringBuilder(); + str.append("\n"); + for (int i = 0; i < fields.size(); i++) { + ExtTableField.TableField field = fields.get(i); + str.append("drop column "); + str.append("`").append(field.getColumnName()).append("` "); + if (i != fields.size() - 1) { + str.append(",\n"); + } + } + return modifyTableSql.replace("$TABLE_NAME$", table).replace("$Column_Fields$", str.toString()); + } @Override public String searchSql(String table, List formFields, String whereSql, long limit, long offset) { @@ -238,12 +262,19 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { } private String convertTableFieldsString(String table, List fields) { + return convertTableFieldsString(table, fields, false); + } + + private String convertTableFieldsString(String table, List fields, boolean addColumn) { StringBuilder str = new StringBuilder(); - - str.append("(\n"); - + if (addColumn) { + str.append("\n"); + } else { + str.append("(\n"); + } ExtTableField.TableField primaryKeyField = null; - for (ExtTableField.TableField field : fields) { + for (int i = 0; i < fields.size(); i++) { + ExtTableField.TableField field = fields.get(i); if (field.isPrimaryKey()) { primaryKeyField = field; } @@ -252,6 +283,9 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { /*if (checkSqlInjection(field.getColumnName())) { throw new RuntimeException("包含SQL注入的参数,请检查参数!"); }*/ + if (addColumn) { + str.append("add "); + } //column name str.append("`").append(field.getColumnName()).append("` "); @@ -298,16 +332,22 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { break; } - //必填 - if (field.isRequired()) { + //必填 考虑到表单编辑的情况,调整为代码判断 + /*if (field.isRequired()) { str.append("NOT NULL "); - } + }*/ //comment str.append("COMMENT '").append(field.getComment()).append("' "); //换行 - str.append(",\n"); + if (i < fields.size() - 1) { + str.append(",\n"); + } else { + if (primaryKeyField != null) { + str.append(",\n"); + } + } } @@ -321,8 +361,9 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { .append("`)"); } - str.append("\n)\n"); - + if (!addColumn) { + str.append("\n)\n"); + } return str.toString(); } @@ -338,11 +379,21 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { return list; } + @Override + public List dropTableIndexSql(String table, List indexFields) { + List list = new ArrayList<>(); + for (ExtIndexField indexField : indexFields) { + String sql = "drop index `$INDEX_NAME$` on `$TABLE_NAME$`;"; + list.add(sql.replace("$TABLE_NAME$", table).replace("$INDEX_NAME$", indexField.getName())); + } + return list; + } + private String convertTableIndexSql(String table, ExtIndexField indexField) { StringBuilder column = new StringBuilder(); - if (CollectionUtils.isEmpty(indexField.getColumns())) { + /*if (CollectionUtils.isEmpty(indexField.getColumns())) { return null; - } + }*/ //check inject /*if (checkSqlInjection(table) || checkSqlInjection(indexField.getName())) { diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java index 52610e000e..c0c532d9f0 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java @@ -185,6 +185,10 @@ public class DataFillDataService { //核对一下字段 for (ExtTableField field : fields) { + if (field.isRemoved()) { + continue; + } + if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { String name1 = field.getSettings().getMapping().getColumnName1(); extTableFieldTypeMap.put(name1, field.getSettings().getMapping().getType()); @@ -427,6 +431,10 @@ public class DataFillDataService { Map data = row.getData(); for (ExtTableField field : fields) { + if (field.isRemoved()) { + continue; + } + String name = field.getSettings().getMapping().getColumnName(); if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { @@ -464,7 +472,17 @@ public class DataFillDataService { Map data = row.getData(); //一条条去判断 for (ExtTableField field : fields) { + if (field.isRemoved()) { + continue; + } String name = field.getSettings().getMapping().getColumnName(); + + if (data.get(name) == null) { + if (field.getSettings().isRequired()) { + DataEaseException.throwException("[" + field.getSettings().getName() + "] 不能为空"); + } + } + if (StringUtils.equalsIgnoreCase(field.getType(), "input")) { //input框支持unique if (field.getSettings().isUnique() && data.get(name) != null) { DatasourceRequest.TableFieldWithValue uniqueField = new DatasourceRequest.TableFieldWithValue() @@ -532,6 +550,9 @@ public class DataFillDataService { searchFields.add(pk); for (ExtTableField field : fields) { + if (field.isRemoved()) { + continue; + } if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { String name1 = field.getSettings().getMapping().getColumnName1(); String name2 = field.getSettings().getMapping().getColumnName2(); @@ -598,6 +619,9 @@ public class DataFillDataService { DatasourceRequest.TableFieldWithValue pk = gson.fromJson(gson.toJson(pkField), DatasourceRequest.TableFieldWithValue.class).setValue(rowId); for (ExtTableField field : fields) { + if (field.isRemoved()) { + continue; + } if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { String name1 = field.getSettings().getMapping().getColumnName1(); String name2 = field.getSettings().getMapping().getColumnName2(); @@ -719,6 +743,9 @@ public class DataFillDataService { List fields = new ArrayList<>(); Map dateRangeNameMap = new HashMap<>(); for (ExtTableField field : formFields) { + if (field.isRemoved()) { + continue; + } if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { dateRangeNameMap.put(field.getId(), field.getSettings().getName()); 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 7afcb9808f..ad4f01d847 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 @@ -171,6 +171,116 @@ public class DataFillService { return ResultHolder.success(dataFillForm.getId()); } + @DeCleaner(value = DePermissionType.DATA_FILL, key = "pid") + public ResultHolder updateForm(DataFillFormWithBLOBs dataFillForm) throws Exception { + if (!CommonBeanFactory.getBean(AuthUserService.class).pluginLoaded()) { + DataEaseException.throwException("invalid"); + } + + Assert.notNull(dataFillForm.getId(), "id cannot be null"); + + checkName(dataFillForm.getId(), dataFillForm.getName(), dataFillForm.getPid(), dataFillForm.getNodeType(), DataFillConstants.OPT_TYPE_UPDATE); + + DataFillFormWithBLOBs oldForm = dataFillFormMapper.selectByPrimaryKey(dataFillForm.getId()); + List oldFields = gson.fromJson(oldForm.getForms(), new TypeToken>() { + }.getType()); + List oldFieldIds = oldFields.stream().map(ExtTableField::getId).collect(Collectors.toList()); + List oldIndexNames; + if (oldForm.getCreateIndex()) { + List oldIndexes = gson.fromJson(oldForm.getTableIndexes(), new TypeToken>() { + }.getType()); + oldIndexNames = oldIndexes.stream().map(ExtIndexField::getName).collect(Collectors.toList()); + } else { + oldIndexNames = new ArrayList<>(); + } + List fields = gson.fromJson(dataFillForm.getForms(), new TypeToken>() { + }.getType()); + List indexes = new ArrayList<>(); + if (dataFillForm.getCreateIndex()) { + indexes = gson.fromJson(dataFillForm.getTableIndexes(), new TypeToken>() { + }.getType()); + } + + 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()); + + if (CollectionUtils.isNotEmpty(fieldsToCreate) || CollectionUtils.isNotEmpty(indexesToCreate)) { + + Datasource ds = dataFillDataService.getDataSource(dataFillForm.getDatasource()); + + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setDatasource(ds); + datasourceRequest.setQuery("SELECT VERSION()"); + + JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class); + String version = jdbcProvider.getData(datasourceRequest).get(0)[0]; + + //拼sql + ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType()); + + if (CollectionUtils.isNotEmpty(fieldsToCreate)) { + String sql = extDDLProvider.addTableColumnSql(dataFillForm.getTableName(), fieldsToCreate); + //创建 + datasourceRequest.setQuery(sql); + jdbcProvider.exec(datasourceRequest); + } + + if (CollectionUtils.isNotEmpty(indexesToCreate)) { + List successCreatedIndex = new ArrayList<>(); + try { + List sqls = extDDLProvider.createTableIndexSql(dataFillForm.getTableName(), indexesToCreate); + + for (int i = 0; i < sqls.size(); i++) { + String indexSql = sqls.get(i); + datasourceRequest.setQuery(indexSql); + jdbcProvider.exec(datasourceRequest); + successCreatedIndex.add(indexesToCreate.get(i)); + } + } catch (Exception e) { + if (CollectionUtils.isNotEmpty(successCreatedIndex)) { + List sqls = extDDLProvider.dropTableIndexSql(dataFillForm.getTableName(), indexesToCreate); + for (String sql : sqls) { + try { + datasourceRequest.setQuery(sql); + jdbcProvider.exec(datasourceRequest); + } catch (Exception e1) { + //e1.printStackTrace(); + } + } + } + + if (CollectionUtils.isNotEmpty(fieldsToCreate)) { + // 执行到这里说明表已经建成功了,创建index出错,那就需要回滚删除创建的字段 + datasourceRequest.setQuery(extDDLProvider.dropTableColumnSql(dataFillForm.getTableName(), fields)); + jdbcProvider.exec(datasourceRequest); + } + + throw e; + } + + } + + } + + //处理被删除的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)) { + List finalFields = new ArrayList<>(fields); + finalFields.addAll(removedFields); + dataFillForm.setForms(new Gson().toJson(finalFields)); + } + + dataFillForm.setUpdateTime(new Date()); + dataFillFormMapper.updateByPrimaryKeySelective(dataFillForm); + + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, SysLogConstants.SOURCE_TYPE.DATA_FILL_FORM, dataFillForm.getId(), dataFillForm.getPid(), null, null); + + return ResultHolder.success(dataFillForm.getId()); + } + + private void checkName(String id, String name, String pid, String nodeType, String optType) { DataFillFormExample example = new DataFillFormExample(); if (DataFillConstants.OPT_TYPE_INSERT.equalsIgnoreCase(optType)) { @@ -351,6 +461,9 @@ public class DataFillService { List fields = new ArrayList<>(); for (ExtTableField field : formFields) { + if (field.isRemoved()) { + continue; + } if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { ExtTableField start = gson.fromJson(gson.toJson(field), ExtTableField.class); start.getSettings().getMapping().setColumnName(start.getSettings().getMapping().getColumnName1()); @@ -375,6 +488,9 @@ public class DataFillService { List fields = gson.fromJson(dataFillForm.getForms(), new TypeToken>() { }.getType()); for (ExtTableField formField : fields) { + if (formField.isRemoved()) { + continue; + } String name = formField.getSettings().getName(); if (StringUtils.equalsIgnoreCase(formField.getType(), "dateRange")) { diff --git a/core/frontend/src/views/dataFilling/form/EditFormData.vue b/core/frontend/src/views/dataFilling/form/EditFormData.vue index 52d12bc197..dd0e64f264 100644 --- a/core/frontend/src/views/dataFilling/form/EditFormData.vue +++ b/core/frontend/src/views/dataFilling/form/EditFormData.vue @@ -89,24 +89,26 @@ export default { mounted() { this.formData = [] forEach(this.forms, v => { - const f = cloneDeep(v) - if (f.type === 'dateRange') { - const _start = this.data[f.settings.mapping.columnName1] - const _end = this.data[f.settings.mapping.columnName2] - f.value = [_start, _end] - } else { - const _value = this.data[f.settings.mapping.columnName] - if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') { - if (_value) { - f.value = JSON.parse(_value) - } else { - f.value = [] - } + if (!v.removed) { + const f = cloneDeep(v) + if (f.type === 'dateRange') { + const _start = this.data[f.settings.mapping.columnName1] + const _end = this.data[f.settings.mapping.columnName2] + f.value = [_start, _end] } else { - f.value = _value + const _value = this.data[f.settings.mapping.columnName] + if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') { + if (_value) { + f.value = JSON.parse(_value) + } else { + f.value = [] + } + } else { + f.value = _value + } } + this.formData.push(f) } - this.formData.push(f) }) }, methods: { diff --git a/core/frontend/src/views/dataFilling/form/ViewTable.vue b/core/frontend/src/views/dataFilling/form/ViewTable.vue index 06fe739f00..7558b216dc 100644 --- a/core/frontend/src/views/dataFilling/form/ViewTable.vue +++ b/core/frontend/src/views/dataFilling/form/ViewTable.vue @@ -612,7 +612,7 @@ export default { }, columns: function() { const _list = [] - forEach(this.forms, f => { + forEach(filter(this.forms, f => !f.removed), f => { if (f.type === 'dateRange') { _list.push({ props: f.settings?.mapping?.columnName1, diff --git a/core/frontend/src/views/dataFilling/form/create.vue b/core/frontend/src/views/dataFilling/form/create.vue index 07d3521539..2984e22093 100644 --- a/core/frontend/src/views/dataFilling/form/create.vue +++ b/core/frontend/src/views/dataFilling/form/create.vue @@ -2,7 +2,7 @@ import DeContainer from '@/components/dataease/DeContainer.vue' import DataFillingFormSave from './save.vue' import clickoutside from 'element-ui/src/utils/clickoutside.js' -import { filter, cloneDeep, find, concat } from 'lodash-es' +import { filter, cloneDeep, find, concat, forEach } from 'lodash-es' import { v4 as uuidv4 } from 'uuid' import { EMAIL_REGEX, PHONE_REGEX } from '@/utils/validate' import { getWithPrivileges } from '@/views/dataFilling/form/dataFilling' @@ -25,8 +25,9 @@ export default { callback() } return { - moveId: undefined, showDrawer: false, + isEdit: false, + disableCreateIndex: false, requiredRule: { required: true, message: this.$t('commons.required'), trigger: ['blur', 'change'] }, duplicateOptionRule: { validator: checkDuplicateOptionValidator, trigger: ['blur', 'change'] }, inputTypes: [ @@ -222,12 +223,26 @@ export default { return find(this.formSettings.forms, f => f.id === this.selectedItemId) } return undefined + }, + selectedComponentItemInputTypes() { + if (this.selectedComponentItem && this.selectedComponentItem.type === 'input') { + if (this.isEdit && this.selectedComponentItem.old) { + if (this.selectedComponentItem.settings.inputType === 'number') { + return filter(this.inputTypes, t => t.type === 'number') + } else { + return filter(this.inputTypes, t => t.type !== 'number') + } + } + } + return this.inputTypes } }, beforeDestroy() { }, created() { + this.isEdit = false + this.disableCreateIndex = false if (this.$route.query.folder !== undefined) { this.formSettings.folder = this.$route.query.folder } @@ -242,6 +257,27 @@ export default { this.formSettings.level = tempData.level this.formSettings.forms = JSON.parse(tempData.forms) }) + } else if (this.$route.query.id !== undefined) { + const id = this.$route.query.id + getWithPrivileges(id).then(res => { + this.isEdit = true + const tempData = cloneDeep(res.data) + this.formSettings = tempData + this.formSettings.table = tempData.tableName + this.formSettings.folder = tempData.pid + this.formSettings.forms = filter(JSON.parse(res.data.forms), f => !f.removed) + forEach(this.formSettings.forms, f => { + f.old = true + }) + 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) + + this.disableCreateIndex = res.data.createIndex + }) } }, methods: { @@ -255,9 +291,6 @@ export default { } return false }, - addInComponentList(e) { - console.log(e) - }, addComponent(e) { this.formSettings.forms = cloneDeep(this.formSettings.forms) @@ -297,6 +330,10 @@ export default { copyItem(item, index) { const copyItem = cloneDeep(item) copyItem.id = uuidv4() + delete copyItem.old + delete copyItem.settings.mapping.columnName + delete copyItem.settings.mapping.columnName1 + delete copyItem.settings.mapping.columnName2 this.formSettings.forms.splice(index + 1, 0, copyItem) this.selectedItemId = copyItem.id @@ -844,7 +881,7 @@ export default { @change="selectedComponentItem.settings.mapping.type = undefined" > {{ $t('data_fill.form.set_multiple') }} @@ -891,7 +929,7 @@ export default { diff --git a/core/frontend/src/views/dataFilling/form/dataFilling.js b/core/frontend/src/views/dataFilling/form/dataFilling.js index 32baf92135..ac8107d692 100644 --- a/core/frontend/src/views/dataFilling/form/dataFilling.js +++ b/core/frontend/src/views/dataFilling/form/dataFilling.js @@ -16,6 +16,14 @@ export function updateForm(data) { data }) } +export function updateFormName(data) { + return request({ + url: 'dataFilling/form/updateName', + method: 'post', + loading: true, + data + }) +} export function moveForm(data) { return request({ url: 'dataFilling/form/move', diff --git a/core/frontend/src/views/dataFilling/form/index.vue b/core/frontend/src/views/dataFilling/form/index.vue index fff78f0653..dedf1d6514 100644 --- a/core/frontend/src/views/dataFilling/form/index.vue +++ b/core/frontend/src/views/dataFilling/form/index.vue @@ -3,7 +3,7 @@ import DeContainer from '@/components/dataease/DeContainer.vue' import DeAsideContainer from '@/components/dataease/DeAsideContainer.vue' import NoSelect from './NoSelect.vue' import ViewTable from './ViewTable.vue' -import { listForm, saveForm, updateForm, deleteForm, getWithPrivileges } from '@/views/dataFilling/form/dataFilling' +import { listForm, saveForm, updateFormName, deleteForm, getWithPrivileges } from '@/views/dataFilling/form/dataFilling' import { forEach, cloneDeep, find } from 'lodash-es' import { hasPermission } from '@/directive/Permission' import DataFillingFormMoveSelector from './MoveSelector.vue' @@ -108,6 +108,9 @@ export default { case 'rename': this.openUpdateForm(param) break + case 'edit': + this.editForm(param.data) + break case 'delete': this.delete(param.data) break @@ -138,7 +141,7 @@ export default { id: this.updateFormData.id, name: this.updateFormData.name } - updateForm(data).then(res => { + updateFormName(data).then(res => { this.closeUpdateForm() listForm({}).then(res => { this.formList = res.data || [] @@ -176,6 +179,9 @@ export default { copyForm(data) { this.$router.push({ name: 'data-filling-form-create', query: { copy: data.id }}) }, + editForm(data) { + this.$router.push({ name: 'data-filling-form-create', query: { id: data.id }}) + }, onMoveSuccess() { this.moveGroup = false listForm({}).then(res => { @@ -403,6 +409,12 @@ export default { > {{ $t('panel.rename') }} + + {{ $t('panel.edit') }} + -import { filter, forEach, find, split, get, groupBy, keys } from 'lodash-es' +import { filter, forEach, find, split, get, groupBy, keys, includes } from 'lodash-es' import { listDatasource } from '@/api/system/datasource' -import { listForm, saveForm } from '@/views/dataFilling/form/dataFilling' +import { listForm, saveForm, updateForm } from '@/views/dataFilling/form/dataFilling' import { hasDataPermission } from '@/utils/permission' export default { name: 'DataFillingFormSave', props: { + isEdit: { + type: Boolean, + default: false + }, + disableCreateIndex: { + type: Boolean, + default: false + }, form: { type: Object, required: true @@ -22,7 +30,7 @@ export default { return callback(new Error(this.$t('commons.component.required'))) } let count = 0 - forEach(this.formData.forms, f => { + forEach(this.computedFormList, f => { if (f.type === 'dateRange') { if (f.settings.mapping.columnName1 === value) { count++ @@ -46,7 +54,7 @@ export default { return callback(new Error(this.$t('commons.component.required'))) } let count = 0 - forEach(this.formData.tableIndexes, f => { + forEach(this.computedTableIndexList, f => { if (f.name === value) { count++ } @@ -129,10 +137,53 @@ export default { this.flattenFolder(this.folders, result) return result }, + computedFormList() { + if (this.isEdit) { + const _list = [] + const columnIds = [] + for (let i = 0; i < this.formData.forms.length; i++) { + const row = 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] + if (includes(columnIds, row.id)) { + continue + } + _list.push(row) + } + return _list + } else { + return this.formData.forms + } + }, + computedTableIndexList() { + if (this.isEdit) { + const _list = [] + const columnIds = [] + for (let i = 0; i < this.formData.tableIndexes.length; i++) { + const row = this.formData.tableIndexes[i] + columnIds.push(row.id) + _list.push(row) + } + for (let i = 0; i < this.formData.oldTableIndexes.length; i++) { + const row = this.formData.oldTableIndexes[i] + if (includes(columnIds, row.id)) { + continue + } + columnIds.push(row.id) + _list.push(row) + } + return _list + } else { + return this.formData.tableIndexes + } + }, columnsList() { const _list = [] - for (let i = 0; i < this.formData.forms.length; i++) { - const row = this.formData.forms[i] + 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) @@ -279,6 +330,34 @@ export default { if (!value) return true return data.name.indexOf(value) !== -1 }, + doEdit() { + this.loading = true + this.$refs['mRightForm'].validate((valid) => { + if (valid) { + const data = { + id: this.formData.id, + name: this.formData.name, + tableName: this.formData.table, + datasource: this.formData.datasource, + pid: this.formData.folder, + level: this.formData.level, + forms: JSON.stringify(this.formData.forms), + createIndex: this.formData.createIndex, + tableIndexes: JSON.stringify(this.formData.tableIndexes), + nodeType: 'form' + } + updateForm(data).then(res => { + this.closeSave() + this.$router.replace({ name: 'data-filling-form', query: { id: res.data }}) + }).finally(() => { + this.loading = false + }) + } else { + this.loading = false + return false + } + }) + }, doSave() { this.loading = true this.$refs['mRightForm'].validate((valid) => { @@ -428,6 +507,7 @@ export default { @@ -612,10 +698,12 @@ export default {
@@ -711,7 +801,7 @@ export default {
+ {{ $t('data_fill.form.add_column') }} @@ -722,6 +812,7 @@ export default { diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtIndexField.java b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtIndexField.java index 12ae053f4d..201eb691af 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtIndexField.java +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtIndexField.java @@ -19,6 +19,8 @@ public class ExtIndexField implements Serializable { private List columns; + private boolean removed; + @Data @Builder @AllArgsConstructor diff --git a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java index d4b836790f..8c5964b108 100644 --- a/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java +++ b/sdk/dataease-plugin-common/src/main/java/io/dataease/plugins/common/dto/datafill/ExtTableField.java @@ -25,6 +25,8 @@ public class ExtTableField implements Serializable { private ExtTableFieldSetting settings; + private boolean removed; + @Data @Builder @AllArgsConstructor diff --git a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/DefaultExtDDLProvider.java b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/DefaultExtDDLProvider.java index b6feb2ceea..e3ea19bf8b 100644 --- a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/DefaultExtDDLProvider.java +++ b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/DefaultExtDDLProvider.java @@ -22,11 +22,26 @@ public class DefaultExtDDLProvider extends ExtDDLProvider { return null; } + @Override + public String addTableColumnSql(String table, List formFields) { + return null; + } + + @Override + public String dropTableColumnSql(String table, List formFields) { + return null; + } + @Override public List createTableIndexSql(String table, List indexFields) { return null; } + @Override + public List dropTableIndexSql(String table, List indexFields) { + return null; + } + @Override public String dropTableSql(String table) { return null; diff --git a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/ExtDDLProvider.java b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/ExtDDLProvider.java index 97a4ed46fa..5d63c2a0e5 100644 --- a/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/ExtDDLProvider.java +++ b/sdk/dataease-plugin-datasource/src/main/java/io/dataease/plugins/datasource/provider/ExtDDLProvider.java @@ -15,6 +15,9 @@ public abstract class ExtDDLProvider { public abstract String createTableSql(String table, List formFields); + public abstract String addTableColumnSql(String table, List formFields); + public abstract String dropTableColumnSql(String table, List formFields); + public abstract String searchSql(String table, List formFields, String whereSql, long limit, long offset); public abstract String countSql(String table, List formFields, String whereSql); @@ -22,6 +25,7 @@ public abstract class ExtDDLProvider { public abstract String dropTableSql(String table); public abstract List createTableIndexSql(String table, List indexFields); + public abstract List dropTableIndexSql(String table, List indexFields); public abstract String deleteDataByIdsSql(String table, List pks);