Merge pull request #9696 from ulleo/dev

feat(X-Pack):【数据填报】支持编辑表单
This commit is contained in:
ulleo 2024-05-17 11:22:17 +08:00 committed by GitHub
commit cb88aed99c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 429 additions and 46 deletions

View File

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

View File

@ -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<ExtTableField> formFields) {
String modifyTableSql = "ALTER TABLE `$TABLE_NAME$` $Column_Fields$ ;";
List<ExtTableField.TableField> 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<ExtTableField> formFields) {
String modifyTableSql = "ALTER TABLE `$TABLE_NAME$` $Column_Fields$ ;";
List<ExtTableField.TableField> 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<TableField> formFields, String whereSql, long limit, long offset) {
@ -238,12 +262,19 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider {
}
private String convertTableFieldsString(String table, List<ExtTableField.TableField> fields) {
return convertTableFieldsString(table, fields, false);
}
private String convertTableFieldsString(String table, List<ExtTableField.TableField> 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<String> dropTableIndexSql(String table, List<ExtIndexField> indexFields) {
List<String> 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())) {

View File

@ -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<String, Object> 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<String, Object> 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<ExtTableField> fields = new ArrayList<>();
Map<String, String> dateRangeNameMap = new HashMap<>();
for (ExtTableField field : formFields) {
if (field.isRemoved()) {
continue;
}
if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) {
dateRangeNameMap.put(field.getId(), field.getSettings().getName());

View File

@ -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<ExtTableField> oldFields = gson.fromJson(oldForm.getForms(), new TypeToken<List<ExtTableField>>() {
}.getType());
List<String> oldFieldIds = oldFields.stream().map(ExtTableField::getId).collect(Collectors.toList());
List<String> oldIndexNames;
if (oldForm.getCreateIndex()) {
List<ExtIndexField> oldIndexes = gson.fromJson(oldForm.getTableIndexes(), new TypeToken<List<ExtIndexField>>() {
}.getType());
oldIndexNames = oldIndexes.stream().map(ExtIndexField::getName).collect(Collectors.toList());
} else {
oldIndexNames = new ArrayList<>();
}
List<ExtTableField> fields = gson.fromJson(dataFillForm.getForms(), new TypeToken<List<ExtTableField>>() {
}.getType());
List<ExtIndexField> indexes = new ArrayList<>();
if (dataFillForm.getCreateIndex()) {
indexes = gson.fromJson(dataFillForm.getTableIndexes(), new TypeToken<List<ExtIndexField>>() {
}.getType());
}
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());
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<ExtIndexField> successCreatedIndex = new ArrayList<>();
try {
List<String> 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<String> 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<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)) {
List<ExtTableField> 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<ExtTableField> 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<ExtTableField> fields = gson.fromJson(dataFillForm.getForms(), new TypeToken<List<ExtTableField>>() {
}.getType());
for (ExtTableField formField : fields) {
if (formField.isRemoved()) {
continue;
}
String name = formField.getSettings().getName();
if (StringUtils.equalsIgnoreCase(formField.getType(), "dateRange")) {

View File

@ -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: {

View File

@ -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,

View File

@ -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"
>
<el-option
v-for="(x) in inputTypes"
v-for="(x) in selectedComponentItemInputTypes"
:key="x.type"
:label="x.name"
:value="x.type"
@ -884,6 +921,7 @@ export default {
>
<el-checkbox
v-model="selectedComponentItem.settings.multiple"
:disabled="selectedComponentItem.old"
@change="changeSelectMultiple(selectedComponentItem, selectedComponentItem.settings.multiple)"
>
{{ $t('data_fill.form.set_multiple') }}
@ -891,7 +929,7 @@ export default {
</el-form-item>
<el-form-item
v-if="selectedComponentItem.type === 'date' || selectedComponentItem.type === 'dateRange'"
prop="multiple"
prop="enableTime"
class="form-item"
>
<el-checkbox
@ -1011,6 +1049,8 @@ export default {
>
<data-filling-form-save
v-if="showDrawer"
:is-edit="isEdit"
:disable-create-index="disableCreateIndex"
:form.sync="formSettings"
:show-drawer.sync="showDrawer"
/>

View File

@ -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',

View File

@ -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') }}
</el-dropdown-item>
<el-dropdown-item
icon="el-icon-edit-outline"
:command="beforeClickMore('edit', data, node)"
>
{{ $t('panel.edit') }}
</el-dropdown-item>
<el-dropdown-item
icon="el-icon-right"
:command="beforeClickMore('move',data,node)"

View File

@ -1,12 +1,20 @@
<script>
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 {
</el-form-item>
<el-form-item
v-if="!isEdit"
prop="datasource"
class="form-item"
:rules="[requiredRule]"
@ -461,6 +541,7 @@ export default {
</el-form-item>
<el-form-item
v-if="!isEdit"
prop="table"
class="form-item"
:rules="[requiredRule]"
@ -508,6 +589,7 @@ export default {
>
<el-input
v-model.trim="scope.row.settings.mapping.columnName"
:disabled="isEdit && scope.row.old"
:placeholder="$t('fu.search_bar.please_input')"
size="small"
maxlength="50"
@ -523,6 +605,7 @@ export default {
>
<el-input
v-model.trim="scope.row.settings.mapping.columnName1"
:disabled="isEdit && scope.row.old"
:placeholder="$t('data_fill.form.please_insert_start')"
size="small"
maxlength="50"
@ -537,6 +620,7 @@ export default {
>
<el-input
v-model.trim="scope.row.settings.mapping.columnName2"
:disabled="isEdit && scope.row.old"
:placeholder="$t('data_fill.form.please_insert_end')"
size="small"
maxlength="50"
@ -558,6 +642,7 @@ export default {
>
<el-select
v-model="scope.row.settings.mapping.type"
:disabled="isEdit && scope.row.old"
:placeholder="$t('data_fill.form.please_select')"
size="small"
required
@ -583,6 +668,7 @@ export default {
>
<el-checkbox
v-model="formData.createIndex"
:disabled="disableCreateIndex"
:label="$t('data_fill.form.create_index')"
size="small"
/>
@ -612,10 +698,12 @@ export default {
<el-form-item
:prop="'tableIndexes['+scope.$index+'].name'"
class="form-item"
:class="scope.row.columns.length === 1 && (isEdit && scope.row.old) ? 'no-margin-bottom' : ''"
:rules="[requiredRule, duplicateIndexRule]"
>
<el-input
v-model="scope.row.name"
:disabled="isEdit && scope.row.old"
:placeholder="$t('fu.search_bar.please_input')"
size="small"
maxlength="50"
@ -661,6 +749,7 @@ export default {
>
<el-select
v-model="indexRow.column"
:disabled="isEdit && scope.row.old"
:placeholder="$t('data_fill.form.please_select')"
size="small"
required
@ -683,6 +772,7 @@ export default {
>
<el-select
v-model="indexRow.order"
:disabled="isEdit && scope.row.old"
:placeholder="$t('data_fill.form.please_select')"
size="small"
required
@ -703,7 +793,7 @@ export default {
</el-select>
</el-form-item>
<div
v-if="scope.row.columns.length > 1"
v-if="scope.row.columns.length > 1 && !(isEdit && scope.row.old)"
class="btn-item"
@click="removeIndexColumn(scope.row.columns, $index)"
>
@ -711,7 +801,7 @@ export default {
</div>
</div>
<el-button
v-if="scope.row.columns.length < 5"
v-if="scope.row.columns.length < 5 && !(isEdit && scope.row.old)"
type="text"
@click="addColumn(scope.row.columns)"
>+ {{ $t('data_fill.form.add_column') }}
@ -722,6 +812,7 @@ export default {
<el-table-column width="50">
<template slot-scope="scope">
<div
v-if="!(isEdit && scope.row.old)"
class="btn-item"
@click="removeIndex(scope.$index)"
>
@ -737,10 +828,17 @@ export default {
<el-footer class="de-footer">
<el-button @click="closeSave">{{ $t("commons.cancel") }}</el-button>
<el-button
v-if="!isEdit"
type="primary"
@click="doSave"
>{{ $t("commons.confirm") }}
</el-button>
<el-button
v-else
type="primary"
@click="doEdit"
>{{ $t("commons.confirm") }}
</el-button>
</el-footer>
</el-container>
</template>

View File

@ -19,6 +19,8 @@ public class ExtIndexField implements Serializable {
private List<ColumnSetting> columns;
private boolean removed;
@Data
@Builder
@AllArgsConstructor

View File

@ -25,6 +25,8 @@ public class ExtTableField implements Serializable {
private ExtTableFieldSetting settings;
private boolean removed;
@Data
@Builder
@AllArgsConstructor

View File

@ -22,11 +22,26 @@ public class DefaultExtDDLProvider extends ExtDDLProvider {
return null;
}
@Override
public String addTableColumnSql(String table, List<ExtTableField> formFields) {
return null;
}
@Override
public String dropTableColumnSql(String table, List<ExtTableField> formFields) {
return null;
}
@Override
public List<String> createTableIndexSql(String table, List<ExtIndexField> indexFields) {
return null;
}
@Override
public List<String> dropTableIndexSql(String table, List<ExtIndexField> indexFields) {
return null;
}
@Override
public String dropTableSql(String table) {
return null;

View File

@ -15,6 +15,9 @@ 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 dropTableColumnSql(String table, List<ExtTableField> formFields);
public abstract String searchSql(String table, List<TableField> formFields, String whereSql, long limit, long offset);
public abstract String countSql(String table, List<TableField> formFields, String whereSql);
@ -22,6 +25,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);