forked from github/dataease
commit
cb88aed99c
@ -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
|
||||
|
@ -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())) {
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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")) {
|
||||
|
@ -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: {
|
||||
|
@ -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,
|
||||
|
@ -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"
|
||||
/>
|
||||
|
@ -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',
|
||||
|
@ -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)"
|
||||
|
@ -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>
|
||||
|
@ -19,6 +19,8 @@ public class ExtIndexField implements Serializable {
|
||||
|
||||
private List<ColumnSetting> columns;
|
||||
|
||||
private boolean removed;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
|
@ -25,6 +25,8 @@ public class ExtTableField implements Serializable {
|
||||
|
||||
private ExtTableFieldSetting settings;
|
||||
|
||||
private boolean removed;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user