Merge pull request #10611 from ulleo/dev

feat(X-Pack): [数据填报]表单提交方式增加:表单更新
This commit is contained in:
ulleo 2024-06-28 18:55:50 +08:00 committed by GitHub
commit 53bb42777b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 871 additions and 276 deletions

View File

@ -79,7 +79,7 @@ public class DataFillController {
@ApiIgnore
@PostMapping("/form/delete/{id}")
public void saveForm(@PathVariable String id) throws Exception {
public void deleteForm(@PathVariable String id) throws Exception {
dataFillService.deleteForm(id);
}
@ -184,7 +184,7 @@ public class DataFillController {
@ApiIgnore
@PostMapping("/myTask/fill/{taskId}")
public void userFillData(@PathVariable String taskId, @RequestBody Map<String, Object> data) throws Exception {
public void userFillData(@PathVariable String taskId, @RequestBody List<Map<String, Object>> data) throws Exception {
dataFillService.fillFormData(taskId, data);
}

View File

@ -3,9 +3,11 @@ package io.dataease.controller.request.datafill;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain=true)
@Accessors(chain = true)
public class DataFillFormTableDataRequest extends DataFillFormRequest {
private static final long serialVersionUID = -314618516232771747L;
@ -16,4 +18,6 @@ public class DataFillFormTableDataRequest extends DataFillFormRequest {
private String primaryKeyValue;
private List<String> primaryKeyValueList;
}

View File

@ -25,6 +25,6 @@ public interface ExtDataFillFormMapper {
List<DataFillTask> selectActiveDataFillTasks();
List<DataFillUserTaskDTO> listTodoUserTask(long userId, Date current, String taskName);
List<DataFillUserTaskDTO> listFinishedUserTask(long userId, String taskName);
List<DataFillUserTaskDTO> listFinishedUserTask(long userId, Date current, String taskName);
List<DataFillUserTaskDTO> listExpiredUserTask(long userId, Date current, String taskName);
}

View File

@ -231,7 +231,8 @@
<include refid="io.dataease.plugins.common.base.mapper.DataFillUserTaskMapper.Base_Column_List" />
FROM data_fill_user_task
WHERE user = #{userId}
AND finish_time IS NOT NULL) t1
AND finish_time IS NOT NULL
AND (end_time IS NULL OR end_time &gt;= #{current})) t1
LEFT JOIN (SELECT id, `name` FROM data_fill_form) t2 ON t1.form_id = t2.id
LEFT JOIN (SELECT id, `name`, `creator` FROM data_fill_task) t3 ON t1.task_id = t3.id
LEFT JOIN (SELECT user_id, nick_name FROM sys_user) t4 ON t3.creator = t4.user_id

View File

@ -76,7 +76,10 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider {
@Override
public String searchSql(String table, List<TableField> formFields, String whereSql, long limit, long offset) {
String baseSql = "SELECT $Column_Fields$ FROM `$TABLE_NAME$` $WHERE_SQL$ LIMIT $OFFSET_COUNT$, $LIMIT_COUNT$ ;";
String baseSql = "SELECT $Column_Fields$ FROM `$TABLE_NAME$` $WHERE_SQL$ ;";
if (limit > 0) {
baseSql = "SELECT $Column_Fields$ FROM `$TABLE_NAME$` $WHERE_SQL$ LIMIT $OFFSET_COUNT$, $LIMIT_COUNT$ ;";
}
baseSql = baseSql.replace("$TABLE_NAME$", table)
.replace("$OFFSET_COUNT$", Long.toString(offset))
.replace("$LIMIT_COUNT$", Long.toString(limit));

View File

@ -6,8 +6,8 @@ import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.dataease.auth.service.AuthUserService;
import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.controller.request.datafill.DataFillFormTableDataRequest;
@ -32,6 +32,7 @@ import io.dataease.service.datasource.DatasourceService;
import io.dataease.service.sys.SysAuthService;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.pentaho.di.core.util.UUIDUtil;
@ -145,6 +146,10 @@ public class DataFillDataService {
}
public DataFillFormTableDataResponse listData(DataFillFormTableDataRequest searchRequest) throws Exception {
return listData(searchRequest, true);
}
public DataFillFormTableDataResponse listData(DataFillFormTableDataRequest searchRequest, boolean withLogs) throws Exception {
DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(searchRequest.getId());
@ -220,12 +225,12 @@ public class DataFillDataService {
String whereSql = "";
if (StringUtils.isNoneBlank(searchRequest.getPrimaryKeyValue())) {
if (StringUtils.isNotBlank(searchRequest.getPrimaryKeyValue())) {
whereSql = extDDLProvider.whereSql(dataFillForm.getTableName(), List.of(pk));
}
String countSql = extDDLProvider.countSql(dataFillForm.getTableName(), searchFields, whereSql);
if (StringUtils.isNoneBlank(searchRequest.getPrimaryKeyValue())) {
if (StringUtils.isNotBlank(searchRequest.getPrimaryKeyValue())) {
datasourceRequest.setTableFieldWithValues(List.of(new DatasourceRequest.TableFieldWithValue()
.setValue(searchRequest.getPrimaryKeyValue())
.setFiledName(pk.getFieldName())
@ -236,7 +241,7 @@ public class DataFillDataService {
List<String[]> countData = datasourceProvider.getData(datasourceRequest);
long count = NumberUtils.toLong(countData.get(0)[0]);
long totalPage = new BigDecimal(count).divide(new BigDecimal(searchRequest.getPageSize()), 0, RoundingMode.CEILING).longValue();
long totalPage = searchRequest.getPageSize() <= 0 ? 1L : new BigDecimal(count).divide(new BigDecimal(searchRequest.getPageSize()), 0, RoundingMode.CEILING).longValue();
long currentPage = totalPage < searchRequest.getCurrentPage() ? totalPage - 1 : searchRequest.getCurrentPage();
@ -294,23 +299,28 @@ public class DataFillDataService {
List<DataFillCommitLogDTO> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(ids)) {
if (CollectionUtils.isNotEmpty(ids) && withLogs) {
list = extDataFillFormMapper.selectLatestLogByFormDataIds(dataFillForm.getId(), ids);
}
Map<String, DataFillCommitLogDTO> logMap = list.stream().collect(Collectors.toMap(log -> log.getFormId() + "__" + log.getDataId(), log -> log));
Map<String, DataFillCommitLogDTO> logMap = new HashMap<>();
for (DataFillCommitLogDTO log : list) {
logMap.put(log.getFormId() + "__" + log.getDataId(), log);
}
for (Map<String, Object> object : result) {
Map<String, Object> temp = new HashMap<>();
temp.put("data", object);
temp.put("logInfo", logMap.get(dataFillForm.getId() + "__" + object.get(key)));
if (withLogs) {
for (Map<String, Object> object : result) {
Map<String, Object> temp = new HashMap<>();
temp.put("data", object);
temp.put("logInfo", logMap.get(dataFillForm.getId() + "__" + object.get(key)));
resultList.add(temp);
resultList.add(temp);
}
}
return new DataFillFormTableDataResponse()
.setKey(key)
.setData(resultList)
.setData(withLogs ? resultList : result)
.setFields(fields)
.setTotal(count)
.setPageSize(searchRequest.getPageSize())
@ -979,14 +989,143 @@ public class DataFillDataService {
dataList.add(new RowDataDatum().setData(rowData));
}
List<RowDataDatum> valueList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(dataList)) {
updateOrInsertRowData(formId, dataList);
//表单提交模式为更新时需要根据条件加上主键id
boolean updateMode = false;
List<ExtTableField> fieldsForCheck = new ArrayList<>();
if (BooleanUtils.isTrue(dataFillForm.getCommitNewUpdate())) {
//这里把所有数据都拿出来遍历真的合适吗
for (ExtTableField field : fields) {
if (field.getSettings().isUpdateRuleCheck()) {
updateMode = true;
fieldsForCheck.add(field);
}
}
}
if (!updateMode) {
valueList = new ArrayList<>(dataList);
} else {
DataFillFormTableDataRequest req = new DataFillFormTableDataRequest();
req.setId(dataFillForm.getId());
DataFillFormTableDataResponse res = listData(req, false);
List<Map<String, Object>> searchData = new ArrayList<>();
String key = "";
if (res != null && res.getData() != null) {
searchData = (List<Map<String, Object>>) res.getData();
Datasource ds = getDataSource(dataFillForm.getDatasource());
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(ds);
datasourceRequest.setTable(dataFillForm.getTableName());
Provider datasourceProvider = ProviderFactory.getProvider(ds.getType());
List<TableField> tableFields = datasourceProvider.getTableFields(datasourceRequest);
for (TableField tableField : tableFields) {
if (tableField.isPrimaryKey()) {
//先把ID放进来
key = tableField.getFieldName();
}
}
}
for (RowDataDatum datum : dataList) {
boolean hasUpdate = false;
for (Map<String, Object> searchDatum : searchData) {
if (processValueList(valueList, key, datum, searchDatum, fieldsForCheck)) {
hasUpdate = true;
}
}
if (!hasUpdate) {
RowDataDatum row = new RowDataDatum()
.setInsert(true)
.setData(new HashMap<>(datum.getData()));
valueList.add(row);
}
}
}
updateOrInsertRowData(formId, valueList);
}
}
public static boolean processValueList(List<RowDataDatum> valueList, String key, RowDataDatum datum, Map<String, Object> searchDatum, List<ExtTableField> fieldsForCheck) {
int count = 0;
for (ExtTableField field : fieldsForCheck) {
if (StringUtils.equalsIgnoreCase(field.getType(), "checkbox") ||
StringUtils.equalsIgnoreCase(field.getType(), "select") && field.getSettings().isMultiple()) {
List<String> data1 = gson.fromJson((String) datum.getData().get(field.getSettings().getMapping().getColumnName()), new TypeToken<List<String>>() {
}.getType());
List<String> data2 = gson.fromJson((String) searchDatum.get(field.getSettings().getMapping().getColumnName()), new TypeToken<List<String>>() {
}.getType());
if (data1 == data2) {
count++;
continue;
}
if (data1 != null && data2 != null) {
if (data1.size() != data2.size()) {
continue;
}
if (CollectionUtils.isEqualCollection(data1, data2)) {
count++;
}
}
} else {
if (datum.getData() != null && searchDatum != null) {
Object data1 = datum.getData().get(field.getSettings().getMapping().getColumnName());
Object data2 = searchDatum.get(field.getSettings().getMapping().getColumnName());
if (data1 == data2) {
count++;
continue;
}
if (data1 != null && data2 != null) {
if (data1.equals(data2)) {
count++;
continue;
}
switch (field.getSettings().getMapping().getType()) {
case number:
if (((Long) data1).longValue() == ((Long) data2).longValue()) {
count++;
}
continue;
case decimal:
if (((BigDecimal) data1).compareTo((BigDecimal) data2) == 0) {
count++;
}
continue;
case datetime:
if ((Long) data1 == ((Date) data2).getTime()) {
count++;
}
continue;
default:
if (((String) data1).equals((String) data2)) {
count++;
}
}
}
}
}
}
if (count == fieldsForCheck.size()) {
RowDataDatum row = new RowDataDatum()
.setId((String) searchDatum.get(key))
.setInsert(datum.isInsert())
.setData(new HashMap<>(datum.getData()));
valueList.add(row);
return true;
}
return false;
}
private static Date getDate(ExtTableField field, String excelRowData) throws ParseException {
if (StringUtils.isBlank(excelRowData)) {
return null;

View File

@ -1,7 +1,7 @@
package io.dataease.service.datafill;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.dataease.auth.annotation.DeCleaner;
import io.dataease.auth.service.AuthUserService;
import io.dataease.commons.constants.DataFillConstants;
@ -11,6 +11,8 @@ import io.dataease.commons.constants.SysLogConstants;
import io.dataease.commons.utils.*;
import io.dataease.controller.ResultHolder;
import io.dataease.controller.request.datafill.DataFillFormRequest;
import io.dataease.controller.request.datafill.DataFillFormTableDataRequest;
import io.dataease.controller.response.datafill.DataFillFormTableDataResponse;
import io.dataease.dto.datafill.DataFillFormDTO;
import io.dataease.ext.ExtDataFillFormMapper;
import io.dataease.i18n.Translator;
@ -29,6 +31,7 @@ import io.dataease.plugins.datasource.provider.ProviderFactory;
import io.dataease.provider.datasource.JdbcProvider;
import io.dataease.service.sys.SysAuthService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.pentaho.di.core.util.UUIDUtil;
import org.springframework.core.env.Environment;
@ -452,7 +455,7 @@ public class DataFillService {
}
public void fillFormData(String userTaskId, Map<String, Object> data) throws Exception {
public void fillFormData(String userTaskId, List<Map<String, Object>> data) throws Exception {
if (!CommonBeanFactory.getBean(AuthUserService.class).pluginLoaded()) {
DataEaseException.throwException("invalid");
}
@ -475,35 +478,116 @@ public class DataFillService {
String formId = task.getFormId();
String rowId = null;
if (StringUtils.isNotBlank(task.getValueId())) {
rowId = task.getValueId();
} else {
DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(formId);
Datasource ds = dataFillDataService.getDataSource(dataFillForm.getDatasource());
Provider datasourceProvider = ProviderFactory.getProvider(ds.getType());
ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType());
DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(formId);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(ds);
datasourceRequest.setTable(dataFillForm.getTableName());
Datasource ds = dataFillDataService.getDataSource(dataFillForm.getDatasource());
Provider datasourceProvider = ProviderFactory.getProvider(ds.getType());
ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType());
DataFillDataService.setLowerCaseRequest(ds, datasourceProvider, extDDLProvider, datasourceRequest);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(ds);
datasourceRequest.setTable(dataFillForm.getTableName());
List<TableField> tableFields = datasourceProvider.getTableFields(datasourceRequest);
DataFillDataService.setLowerCaseRequest(ds, datasourceProvider, extDDLProvider, datasourceRequest);
for (TableField tableField : tableFields) {
if (tableField.isPrimaryKey()) {
rowId = (String) data.get(tableField.getFieldName());
break;
}
List<TableField> tableFields = datasourceProvider.getTableFields(datasourceRequest);
String pk = "";
for (TableField tableField : tableFields) {
if (tableField.isPrimaryKey()) {
pk = tableField.getFieldName();
break;
}
}
rowId = dataFillDataService.updateOrInsertRowData(formId, Collections.singletonList(new RowDataDatum().setId(rowId).setData(data))).get(0);
List<RowDataDatum> updateDatumList = new ArrayList<>();
List<RowDataDatum> insertDatumList = new ArrayList<>();
task.setValueId(rowId);
List<RowDataDatum> valueList = new ArrayList<>();
for (Map<String, Object> datum : data) {
String pkv = (String) datum.get(pk);
if (pkv == null) {
insertDatumList.add(new RowDataDatum().setData(datum));
} else {
updateDatumList.add(new RowDataDatum().setId(pkv).setData(datum));
}
}
//针对没有id的数据即第一次提交的新数据需要根据表单提交模式进行判断
if (CollectionUtils.isNotEmpty(insertDatumList)) {
//表单提交模式为更新时需要根据条件加上主键id
List<ExtTableField> formFields = gson.fromJson(dataFillForm.getForms(), new TypeToken<List<ExtTableField>>() {
}.getType());
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());
start.getSettings().setName(start.getSettings().getName() + "(开始)");
fields.add(start);
ExtTableField end = gson.fromJson(gson.toJson(field), ExtTableField.class);
end.getSettings().setName(end.getSettings().getName() + "(结束)");
end.getSettings().getMapping().setColumnName(end.getSettings().getMapping().getColumnName2());
fields.add(end);
} else {
fields.add(field);
}
}
boolean updateMode = false;
List<ExtTableField> fieldsForCheck = new ArrayList<>();
if (BooleanUtils.isTrue(dataFillForm.getCommitNewUpdate())) {
//这里把所有数据都拿出来遍历真的合适吗
for (ExtTableField field : fields) {
if (field.getSettings().isUpdateRuleCheck()) {
updateMode = true;
fieldsForCheck.add(field);
}
}
}
if (!updateMode) {
valueList = new ArrayList<>(insertDatumList);
} else {
DataFillFormTableDataRequest req = new DataFillFormTableDataRequest();
req.setId(dataFillForm.getId());
DataFillFormTableDataResponse res = dataFillDataService.listData(req, false);
List<Map<String, Object>> searchData = new ArrayList<>();
if (res != null && res.getData() != null) {
searchData = (List<Map<String, Object>>) res.getData();
}
for (RowDataDatum datum : insertDatumList) {
boolean hasUpdate = false;
for (Map<String, Object> searchDatum : searchData) {
if (DataFillDataService.processValueList(valueList, pk, datum, searchDatum, fieldsForCheck)) {
hasUpdate = true;
}
}
if (!hasUpdate) {
RowDataDatum row = new RowDataDatum()
.setInsert(true)
.setData(new HashMap<>(datum.getData()));
valueList.add(row);
}
}
}
}
valueList.addAll(updateDatumList);
List<String> rowIds = dataFillDataService.updateOrInsertRowData(formId, valueList);
task.setValueId(String.join(",", rowIds));
task.setFinishTime(new Date());
dataFillUserTaskMapper.updateByPrimaryKeySelective(task);

View File

@ -269,7 +269,7 @@ public class DataFillTaskService {
String taskName = StringUtils.isNotBlank(request.getTaskName()) ? request.getTaskName() : null;
if (StringUtils.equalsIgnoreCase(type, "finished")) {
list = extDataFillFormMapper.listFinishedUserTask(userId, taskName);
list = extDataFillFormMapper.listFinishedUserTask(userId, new Date(), taskName);
} else if (StringUtils.equalsIgnoreCase(type, "expired")) {
list = extDataFillFormMapper.listExpiredUserTask(userId, new Date(), taskName);
} else {

View File

@ -0,0 +1,5 @@
alter table data_fill_form
add commit_new_update tinyint(1) default 0 null;
alter table data_fill_user_task
modify value_id text null comment '表内值ID';

View File

@ -626,6 +626,13 @@ export default {
record: 'Fill Record',
task_manage: 'Task Manage',
form_name: 'Form Name',
commit_type: 'Form Commit Type',
commit_type_append: 'Append',
commit_type_update: 'Update',
commit_rule: 'Update Rules',
commit_rule_add: 'Add Update Rule',
commit_rule_settings: 'Update Rule Settings',
commit_rule_set: 'Set',
folder: 'Folder',
datasource: 'Datasource',
table: 'Table',
@ -661,6 +668,7 @@ export default {
option_value: 'Options',
add_option: 'Add Option',
form_name_cannot_none: 'Form name cannot be null',
form_update_rule_none: 'Update Rules cannot be null',
form_components_cannot_null: 'Form components cannot be null',
option_list_cannot_empty: 'Option list cannot be empty',
component_setting_error: 'Component setting error',

View File

@ -626,6 +626,13 @@ export default {
record: '提交記錄',
task_manage: '任務管理',
form_name: '表單名稱',
commit_type: '表單提交方式',
commit_type_append: '數據追加',
commit_type_update: '數據更新',
commit_rule: '更新條件',
commit_rule_add: '添加更新規則',
commit_rule_settings: '更新規則設置',
commit_rule_set: '已設置',
folder: '所屬文件夾',
datasource: '數據源',
table: '數據庫表',
@ -661,6 +668,7 @@ export default {
option_value: '選項值',
add_option: '添加選項值',
form_name_cannot_none: '表單名稱不能為空',
form_update_rule_none: '請配置更新規則',
form_components_cannot_null: '請添加表單組件',
option_list_cannot_empty: '選項值不能為空',
component_setting_error: '組件設置錯誤',

View File

@ -624,6 +624,13 @@ export default {
record: '提交记录',
task_manage: '任务管理',
form_name: '表单名称',
commit_type: '表单提交方式',
commit_type_append: '数据追加',
commit_type_update: '数据更新',
commit_rule: '更新条件',
commit_rule_add: '添加更新规则',
commit_rule_settings: '更新规则设置',
commit_rule_set: '已设置',
folder: '所属文件夹',
datasource: '数据源',
table: '数据库表',
@ -659,6 +666,7 @@ export default {
option_value: '选项值',
add_option: '添加选项值',
form_name_cannot_none: '表单名称不能为空',
form_update_rule_none: '请配置更新规则',
form_components_cannot_null: '请添加表单组件',
option_list_cannot_empty: '选项值不能为空',
component_setting_error: '组件设置错误',

View File

@ -1,5 +1,5 @@
<script>
import { forEach, find, concat, cloneDeep, floor, map, filter, includes } from 'lodash-es'
import { forEach, find, concat, cloneDeep, floor, map, filter, includes, split, keys, parseInt } from 'lodash-es'
import { PHONE_REGEX, EMAIL_REGEX } from '@/utils/validate'
import {
getTableColumnData,
@ -11,6 +11,10 @@ import {
export default {
name: 'EditFormData',
props: {
keyName: {
type: String,
required: false
},
id: {
type: String,
required: false
@ -39,6 +43,10 @@ export default {
type: Object,
required: false
},
dataList: {
type: Object,
required: false
},
showDrawer: {
type: Boolean,
required: true
@ -65,9 +73,10 @@ export default {
callback()
}
return {
currentPage: 1,
loading: false,
asyncOptions: {},
formData: {},
formData: [],
requiredRule: { required: true, message: this.$t('commons.required'), trigger: ['blur', 'change'] },
dateRangeRequiredRule: { validator: checkDateRangeRequireValidator, message: this.$t('commons.required'), trigger: ['blur', 'change'] },
inputTypes: [
@ -91,69 +100,89 @@ export default {
}
}
},
computed: {
allData() {
if (this.dataList && this.dataList.length > 0) {
return this.dataList
}
if (this.data) {
return [this.data]
}
return [{}]
}
},
watch: {},
mounted() {
const _tempForms = []
this.formData = []
this.asyncOptions = {}
forEach(this.forms, v => {
if (!v.removed) {
const f = cloneDeep(v)
if (f.type === 'date' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetime' : 'date'
this.currentPage = 1
forEach(this.allData, _data => {
const _tempFormRow = []
forEach(this.forms, v => {
if (!v.removed) {
const f = cloneDeep(v)
if (f.type === 'date' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetime' : 'date'
}
if (f.type === 'dateRange' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange'
}
if (f.type === 'dateRange') {
const _start = _data[f.settings.mapping.columnName1]
const _end = _data[f.settings.mapping.columnName2]
f.value = [_start, _end]
} else {
const _value = _data[f.settings.mapping.columnName]
//
f.value = _value
}
_tempFormRow.push(f)
}
if (f.type === 'dateRange' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange'
}
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]
//
f.value = _value
}
_tempForms.push(f)
}
})
_tempForms.push(_tempFormRow)
})
this.loading = true
this.initFormOptionsData(_tempForms, () => {
//
_tempForms.forEach(f => {
if (f.type !== 'dateRange') {
const _value = this.data[f.settings.mapping.columnName]
if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') {
if (_value) {
for (let i = 0; i < _tempForms.length; i++) {
const row = _tempForms[i]
row.forEach(f => {
if (f.type !== 'dateRange') {
const _value = this.allData[i][f.settings.mapping.columnName]
if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') {
if (_value) {
//
if (this.readonly) {
f.value = JSON.parse(_value)
if (this.readonly) {
f.value = JSON.parse(_value)
} else {
const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
const options = map(f.settings.optionSourceType === 1 ? f.settings.options : (this.asyncOptions[tempId] ? this.asyncOptions[tempId] : []), f => f.value)
f.value = filter(JSON.parse(_value), v => includes(options, v))
}
} else {
const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
const options = map(f.settings.optionSourceType === 1 ? f.settings.options : (this.asyncOptions[tempId] ? this.asyncOptions[tempId] : []), f => f.value)
f.value = filter(JSON.parse(_value), v => includes(options, v))
f.value = []
}
} else {
f.value = []
}
} else if (f.type === 'select' && !f.settings.multiple || f.type === 'radio') {
if (_value) {
if (!this.readonly) {
const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
const options = map(f.settings.optionSourceType === 1 ? f.settings.options : (this.asyncOptions[tempId] ? this.asyncOptions[tempId] : []), f => f.value)
if (!includes(options, _value)) {
f.value = undefined
} else if (f.type === 'select' && !f.settings.multiple || f.type === 'radio') {
if (_value) {
if (!this.readonly) {
const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
const options = map(f.settings.optionSourceType === 1 ? f.settings.options : (this.asyncOptions[tempId] ? this.asyncOptions[tempId] : []), f => f.value)
if (!includes(options, _value)) {
f.value = undefined
} else {
f.value = _value
}
} else {
f.value = _value
}
} else {
f.value = _value
}
}
}
}
})
f.tempId = f.settings ? f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder : 'unset'
})
}
//
this.formData = _tempForms
this.loading = false
@ -163,7 +192,8 @@ export default {
initFormOptionsData(forms, callback) {
const queries = []
const queryIds = []
forEach(forms, f => {
//
forEach(forms[0], f => {
if (f.type === 'checkbox' || f.type === 'select' || f.type === 'radio') {
if (f.settings && f.settings.optionSourceType === 2 && f.settings.optionDatasource && f.settings.optionTable && f.settings.optionColumn && f.settings.optionOrder) {
const id = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
@ -222,54 +252,69 @@ export default {
item.value = value
})
},
onPageChange(page) {
this.currentPage = page
},
doSave() {
this.loading = true
this.$refs['mForm'].validate((valid) => {
this.$refs['mForm'].validate((valid, invalidFields) => {
if (valid) {
const _data = {}
forEach(this.formData, f => {
if (f.type === 'dateRange') {
const _start = f.settings.mapping.columnName1
const _end = f.settings.mapping.columnName2
if (f.value) {
if (f.value[0]) {
_data[_start] = f.value[0].getTime()
}
if (f.value[1]) {
_data[_end] = f.value[1].getTime()
}
}
} else {
const name = f.settings.mapping.columnName
if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') {
const req = []
for (let i = 0; i < this.formData.length; i++) {
const row = this.formData[i]
const _data = {}
forEach(row, f => {
if (f.type === 'dateRange') {
const _start = f.settings.mapping.columnName1
const _end = f.settings.mapping.columnName2
if (f.value) {
_data[name] = JSON.stringify(f.value)
if (f.value[0]) {
_data[_start] = f.value[0].getTime()
}
if (f.value[1]) {
_data[_end] = f.value[1].getTime()
}
}
} else if (f.type === 'date' && f.value) {
_data[name] = f.value.getTime()
} else {
_data[name] = f.value
const name = f.settings.mapping.columnName
if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') {
if (f.value) {
_data[name] = JSON.stringify(f.value)
}
} else if (f.type === 'date' && f.value) {
_data[name] = f.value.getTime()
} else {
_data[name] = f.value
}
}
})
if (this.keyName) {
_data[this.keyName] = this.allData[i][this.keyName]
}
})
req.push(_data)
}
if (this.userTaskId) {
userFillFormData(this.userTaskId, _data).then(res => {
userFillFormData(this.userTaskId, req).then(res => {
this.$emit('save-success')
}).finally(() => {
this.loading = false
})
} else {
//
if (this.id !== undefined) {
// update
saveFormRowData(this.formId, this.id, _data).then(res => {
saveFormRowData(this.formId, this.id, req[0]).then(res => {
this.$emit('save-success')
}).finally(() => {
this.loading = false
})
} else {
// insert
newFormRowData(this.formId, _data).then(res => {
newFormRowData(this.formId, req[0]).then(res => {
this.$emit('save-success')
}).finally(() => {
this.loading = false
@ -277,6 +322,11 @@ export default {
}
}
} else {
//
const _key = keys(invalidFields)[0]
const index = split(_key, ']')[0].replace('[', '')
this.currentPage = parseInt(index) + 1
this.loading = false
}
})
@ -319,142 +369,157 @@ export default {
@submit.native.prevent
>
<div
v-for="(item, $index) in formData"
:key="item.id"
:data-var="tempId = item.settings ? item.settings.optionDatasource + '_' + item.settings.optionTable + '_' + item.settings.optionColumn + '_' + item.settings.optionOrder : 'unset'"
class="m-item m-form-item"
v-for="(row, $index1) in formData"
v-show="currentPage === $index1 + 1"
:key="$index1"
>
<div class="m-label-container">
<span style="width: unset">
{{ item.settings.name }}
<span
v-if="item.settings.required"
style="color: red"
>*</span>
</span>
</div>
<el-form-item
:prop="'['+ $index +'].value'"
class="form-item"
:readonly="readonly"
:rules="getRules(item)"
<div
v-for="(item, $index2) in row"
:key="item.id"
class="m-item m-form-item"
>
<el-input
v-if="item.type === 'input' && item.settings.inputType !== 'number'"
v-model="item.value"
:type="item.settings.inputType"
:required="item.settings.required"
:readonly="readonly"
:placeholder="item.settings.placeholder"
size="small"
:show-word-limit="item.value !== undefined && item.value !== null && item.value.length > 250"
maxlength="255"
/>
<el-input-number
v-if="item.type === 'input' && item.settings.inputType === 'number'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
:placeholder="item.settings.placeholder"
style="width: 100%"
controls-position="right"
:precision="item.settings.mapping.type === 'number' ? 0 : undefined"
size="small"
:min="-999999999999"
:max="999999999999"
@change="onNumberChange(item)"
@blur="onNumberChange(item)"
@keyup.enter.native="onNumberChange(item)"
/>
<el-input
v-else-if="item.type === 'textarea'"
v-model="item.value"
type="textarea"
:required="item.settings.required"
:readonly="readonly"
:placeholder="item.settings.placeholder"
size="small"
/>
<el-select
v-else-if="item.type === 'select'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
:multiple="item.settings.multiple"
clearable
>
<el-option
v-for="(x, $index) in item.settings.optionSourceType === 1 ? item.settings.options : (asyncOptions[tempId] ? asyncOptions[tempId] : [])"
:key="$index"
:label="x.name"
:value="x.value"
/>
</el-select>
<el-radio-group
v-else-if="item.type === 'radio'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
style="width: 100%"
size="small"
>
<el-radio
v-for="(x, $index) in item.settings.optionSourceType === 1 ? item.settings.options : (asyncOptions[tempId] ? asyncOptions[tempId] : [])"
:key="$index"
:label="x.value"
>{{ x.name }}
</el-radio>
</el-radio-group>
<el-checkbox-group
v-else-if="item.type === 'checkbox'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
size="small"
>
<el-checkbox
v-for="(x, $index) in item.settings.optionSourceType === 1 ? item.settings.options : (asyncOptions[tempId] ? asyncOptions[tempId] : [])"
:key="$index"
:label="x.value"
>{{ x.name }}
</el-checkbox>
</el-checkbox-group>
<el-date-picker
v-else-if="item.type === 'date'"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
:type="item.settings.dateType"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
<el-date-picker
v-else-if="item.type === 'dateRange'"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
:type="item.settings.dateType"
:range-separator="item.settings.rangeSeparator"
:start-placeholder="item.settings.startPlaceholder"
:end-placeholder="item.settings.endPlaceholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
</el-form-item>
<div class="m-label-container">
<span style="width: unset">
{{ item.settings.name }}
<span
v-if="item.settings.required"
style="color: red"
>*</span>
</span>
</div>
<el-form-item
:prop="'['+ $index1 +']['+ $index2 +'].value'"
class="form-item"
:readonly="readonly"
:rules="getRules(item)"
>
<el-input
v-if="item.type === 'input' && item.settings.inputType !== 'number'"
v-model="item.value"
:type="item.settings.inputType"
:required="item.settings.required"
:readonly="readonly"
:placeholder="item.settings.placeholder"
size="small"
:show-word-limit="item.value !== undefined && item.value !== null && item.value.length > 250"
maxlength="255"
/>
<el-input-number
v-if="item.type === 'input' && item.settings.inputType === 'number'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
:placeholder="item.settings.placeholder"
style="width: 100%"
controls-position="right"
:precision="item.settings.mapping.type === 'number' ? 0 : undefined"
size="small"
:min="-999999999999"
:max="999999999999"
@change="onNumberChange(item)"
@blur="onNumberChange(item)"
@keyup.enter.native="onNumberChange(item)"
/>
<el-input
v-else-if="item.type === 'textarea'"
v-model="item.value"
type="textarea"
:required="item.settings.required"
:readonly="readonly"
:placeholder="item.settings.placeholder"
size="small"
/>
<el-select
v-else-if="item.type === 'select'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
:multiple="item.settings.multiple"
clearable
>
<el-option
v-for="(x, $index) in item.settings.optionSourceType === 1 ? item.settings.options : (asyncOptions[item.tempId] ? asyncOptions[item.tempId] : [])"
:key="$index"
:label="x.name"
:value="x.value"
/>
</el-select>
<el-radio-group
v-else-if="item.type === 'radio'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
style="width: 100%"
size="small"
>
<el-radio
v-for="(x, $index) in item.settings.optionSourceType === 1 ? item.settings.options : (asyncOptions[item.tempId] ? asyncOptions[item.tempId] : [])"
:key="$index"
:label="x.value"
>{{ x.name }}
</el-radio>
</el-radio-group>
<el-checkbox-group
v-else-if="item.type === 'checkbox'"
v-model="item.value"
:required="item.settings.required"
:disabled="readonly"
size="small"
>
<el-checkbox
v-for="(x, $index) in item.settings.optionSourceType === 1 ? item.settings.options : (asyncOptions[item.tempId] ? asyncOptions[item.tempId] : [])"
:key="$index"
:label="x.value"
>{{ x.name }}
</el-checkbox>
</el-checkbox-group>
<el-date-picker
v-else-if="item.type === 'date'"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
:type="item.settings.dateType"
:placeholder="item.settings.placeholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
<el-date-picker
v-else-if="item.type === 'dateRange'"
v-model="item.value"
:required="item.settings.required"
:readonly="readonly"
:type="item.settings.dateType"
:range-separator="item.settings.rangeSeparator"
:start-placeholder="item.settings.startPlaceholder"
:end-placeholder="item.settings.endPlaceholder"
style="width: 100%"
size="small"
:picker-options="pickerOptions"
/>
</el-form-item>
</div>
</div>
</el-form>
</el-main>
<el-footer
class="de-footer"
>
<div class="de-footer-container">
<el-pagination
v-if="allData.length > 1"
ref="mPagerRef"
layout="prev, pager, next"
page-size="1"
:total="allData.length"
:current-page="currentPage"
@current-change="onPageChange"
/>
</div>
<el-button @click="closeDrawer">{{ $t("commons.cancel") }}</el-button>
<el-button
v-if="!readonly"
@ -487,7 +552,15 @@ export default {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end
justify-content: flex-end;
.de-footer-container{
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
}
}
.panel-info-area {

View File

@ -2,16 +2,17 @@
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, forEach, groupBy, keys } from 'lodash-es'
import { filter, cloneDeep, find, concat, forEach, groupBy, keys, map, join } from 'lodash-es'
import { v4 as uuidv4 } from 'uuid'
import { EMAIL_REGEX, PHONE_REGEX } from '@/utils/validate'
import { getTableColumnData, getWithPrivileges } from '@/views/dataFilling/form/dataFilling'
import { getColumnList, listDatasource } from '@/api/dataset/dataset'
import { getTableList } from '@/api/system/datasource'
import GridTable from '@/components/gridTable/index.vue'
export default {
name: 'DataFillingFormCreate',
components: { DeContainer, DataFillingFormSave },
components: { GridTable, DeContainer, DataFillingFormSave },
directives: {
clickoutside
},
@ -72,6 +73,7 @@ export default {
}
],
showEditBindColumn: false,
showCommitUpdateRule: false,
asyncOptions: {},
componentList: [
{
@ -249,12 +251,21 @@ export default {
createIndex: false,
tableIndexes: [],
folder: undefined,
level: undefined
level: undefined,
commitNewUpdate: false
},
selectedItemId: undefined
selectedItemId: undefined,
tempForms: []
}
},
computed: {
ruleUpdateFormList() {
const filterList = filter(this.formSettings?.forms, f => !!f.settings?.updateRuleCheck)
return map(filterList, f => { return f.settings?.name })
},
ruleUpdateFormListNames() {
return join(this.ruleUpdateFormList, ', ')
},
datasourceList() {
const dsMap = groupBy(this.allDatasourceList, d => d.type)
const _types = []
@ -312,6 +323,7 @@ export default {
const id = this.$route.query.copy
getWithPrivileges(id).then(res => {
const tempData = res.data
this.formSettings.commitNewUpdate = !!tempData.commitNewUpdate
this.formSettings.folder = tempData.pid
this.formSettings.level = tempData.level
this.baseLoading = true
@ -325,6 +337,7 @@ export default {
this.isEdit = true
const tempData = cloneDeep(res.data)
this.formSettings = tempData
this.formSettings.commitNewUpdate = !!tempData.commitNewUpdate
this.formSettings.table = tempData.tableName
this.formSettings.folder = tempData.pid
this.baseLoading = true
@ -362,6 +375,7 @@ export default {
if (f.type === 'dateRange' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange'
}
f.settings.updateRuleCheck = !!f.settings.updateRuleCheck
})
this.initFormOptionsData(tempForms, () => {
this.formSettings.forms = tempForms
@ -654,6 +668,15 @@ export default {
this.lostFocus()
return
}
if (this.formSettings.commitNewUpdate && this.ruleUpdateFormList.length === 0) {
this.$message({
message: this.$t('data_fill.form.form_update_rule_none'),
type: 'error',
showClose: true
})
this.lostFocus()
return
}
if (this.formSettings.forms.length === 0) {
this.$message({
message: this.$t('data_fill.form.form_components_cannot_null'),
@ -704,6 +727,29 @@ export default {
}
this.showDrawer = true
},
openEditCommitRule() {
this.tempForms = map(this.formSettings.forms, f => {
return {
id: f.id,
updateRuleCheck: !!f.settings?.updateRuleCheck,
typeName: f.typeName,
name: f.settings?.name
}
})
this.showCommitUpdateRule = true
},
closeEditCommitRule() {
this.showCommitUpdateRule = false
},
confirmEditCommitRule() {
forEach(this.formSettings.forms, f => {
const temp = find(this.tempForms, tf => tf.id === f.id)
if (temp) {
f.settings.updateRuleCheck = temp.updateRuleCheck
}
})
this.closeEditCommitRule()
}
}
@ -1325,6 +1371,55 @@ export default {
/>
</el-form-item>
<el-divider class="m-divider" />
<el-form-item
prop="commitNewUpdate"
class="form-item"
:rules="[requiredRule]"
>
<template #label>
{{ $t('data_fill.form.commit_type') }}
</template>
<el-radio-group
v-model="formSettings.commitNewUpdate"
size="small"
>
<el-radio :label="false">
{{ $t('data_fill.form.commit_type_append') }}
</el-radio>
<el-radio :label="true">
{{ $t('data_fill.form.commit_type_update') }}
</el-radio>
</el-radio-group>
</el-form-item>
<template v-if="formSettings.commitNewUpdate">
<el-button
v-if="ruleUpdateFormList.length === 0"
type="text"
@click="openEditCommitRule"
>+ {{ $t('data_fill.form.commit_rule_add') }}
</el-button>
<template v-else>
<div
style="display: flex; flex-direction: row; align-items: center; font-size: 14px;"
>
<div style="width: 28px;" />
<div style="flex:2">
{{ $t('data_fill.form.commit_rule_settings') }}
</div>
<div style="flex:1; color: #8F959E;">{{ $t('data_fill.form.commit_rule_set') }}</div>
<el-button
:title="$t('chart.edit')"
icon="el-icon-edit"
type="text"
@click="openEditCommitRule"
/>
</div>
<div style="padding-left: 28px; font-size: 14px;">{{ $t('data_fill.form.commit_rule') }}:&nbsp; {{ ruleUpdateFormListNames }}</div>
</template>
</template>
</el-form>
</el-main>
</template>
@ -1465,15 +1560,83 @@ export default {
</el-form-item>
</el-main>
</el-form>
<el-footer class="de-footer">
<el-button @click="closeEditBindColumn">{{ $t("commons.cancel") }}</el-button>
<el-button
type="primary"
@click="doEditBindColumn"
>{{ $t("commons.confirm") }}
</el-button>
</el-footer>
</el-container>
<el-footer class="de-footer">
<el-button @click="closeEditBindColumn">{{ $t("commons.cancel") }}</el-button>
<el-button
type="primary"
@click="doEditBindColumn"
>{{ $t("commons.confirm") }}
</el-button>
</el-footer>
</el-dialog>
<el-dialog
v-dialogDrag
append-to-body
:title="$t('data_fill.form.commit_rule_settings')"
:visible.sync="showCommitUpdateRule"
:show-close="true"
width="600px"
class="m-dialog"
>
<el-container
v-if="showCommitUpdateRule"
v-loading="loading"
style="width: 100%"
direction="vertical"
>
<div style="padding: 10px 18px;display: flex;flex-direction: row; background: #c0cef3; margin-bottom: 12px; margin-top: -20px;">
<i
class="el-icon-info"
style="color: #0049e0; margin-right: 4px;"
/>
<div>
提交数据时将选择的组件作为更新条件对表单中的已有数据进行匹配更新更新规则如下<br>
1当组件值与表单字段值同时匹配时则更新表单数据<br>
2当组件值与表单字段值不同时匹配时将数据插入表单
</div>
</div>
<el-table
ref="dataTable"
style="width: 100%; height: 100%"
height="600"
stripe
:data="tempForms"
:columns="[]"
>
<el-table-column
:label="$t('data_fill.data.recent_committer')"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.updateRuleCheck" />
</template>
</el-table-column>
<el-table-column
:label="$t('data_fill.data.recent_committer')"
>
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column
:label="$t('data_fill.data.recent_committer')"
>
<template slot-scope="scope">
{{ scope.row.typeName }}
</template>
</el-table-column>
</el-table>
</el-container>
<el-footer class="de-footer">
<el-button @click="closeEditCommitRule">{{ $t("commons.cancel") }}</el-button>
<el-button
type="primary"
@click="confirmEditCommitRule"
>{{ $t("commons.confirm") }}
</el-button>
</el-footer>
</el-dialog>
</div>
@ -1481,6 +1644,10 @@ export default {
<style lang="scss" scoped>
.data-filling-form {
.m-divider {
width: 320px;
margin: 24px -20px;
}
::v-deep .el-form-item__error {
position: relative;
}

View File

@ -370,6 +370,7 @@ export default {
forms: JSON.stringify(this.formData.forms),
createIndex: this.formData.createIndex,
tableIndexes: JSON.stringify(this.formData.tableIndexes),
commitNewUpdate: this.formData.commitNewUpdate,
nodeType: 'form'
}
updateForm(data).then(res => {
@ -397,6 +398,7 @@ export default {
forms: JSON.stringify(this.formData.forms),
createIndex: this.formData.createIndex,
tableIndexes: JSON.stringify(this.formData.tableIndexes),
commitNewUpdate: this.formData.commitNewUpdate,
nodeType: 'form'
}
saveForm(data).then(res => {

View File

@ -5,7 +5,7 @@ import DeAsideContainer from '@/components/dataease/DeAsideContainer.vue'
import GridTable from '@/components/gridTable/index.vue'
import { getForm, searchFormMyTasks, searchTable } from '@/views/dataFilling/form/dataFilling'
import EditFormData from '@/views/dataFilling/form/EditFormData.vue'
import { forIn, includes, map, filter, forEach } from 'lodash-es'
import { forIn, includes, split, filter, forEach } from 'lodash-es'
import { hasPermission } from '@/directive/Permission'
export default {
@ -23,6 +23,7 @@ export default {
showDrawer: false,
selectedDataId: undefined,
selectedData: undefined,
selectedKeyName: undefined,
selectedTaskId: undefined,
selectedFormTitle: '',
selectedFormId: undefined,
@ -206,7 +207,8 @@ export default {
this.selectedTaskId = row.id
this.selectedDataId = row.valueId
this.selectedData = {}
this.selectedData = [{}]
this.selectedKeyName = undefined
if (row.valueId) {
getForm(row.formId).then(res => {
this.selectedFormTitle = res.data.name
@ -225,12 +227,11 @@ export default {
})
searchTable(row.formId, {
primaryKeyValue: row.valueId,
primaryKeyValueList: split(row.valueId, ','),
currentPage: 1,
pageSize: 10
pageSize: 0
}).then(res => {
if (res.data) {
const obj = {}
if (res.data.data.length === 0) {
this.$message({
message: this.$t('data_fill.data.id_is') + row.valueId + this.$t('data_fill.data.data_not_found'),
@ -239,19 +240,25 @@ export default {
})
return
}
forIn(res.data.data[0].data, (value, key) => {
if (includes(dateFormatColumns, key)) {
if (value) {
obj[key] = new Date(value)
this.selectedKeyName = res.data.key
const _list = []
for (let i = 0; i < res.data.data.length; i++) {
const obj = {}
forIn(res.data.data[i].data, (value, key) => {
if (includes(dateFormatColumns, key)) {
if (value) {
obj[key] = new Date(value)
} else {
obj[key] = undefined
}
} else {
obj[key] = undefined
obj[key] = value === null ? undefined : value
}
} else {
obj[key] = value === null ? undefined : value
}
})
})
_list.push(obj)
}
this.selectedData = obj
this.selectedData = _list
this.showDrawer = true
}
@ -602,7 +609,8 @@ export default {
<edit-form-data
v-if="showDrawer"
:id="selectedDataId"
:data.sync="selectedData"
:data-list.sync="selectedData"
:key-name.sync="selectedKeyName"
:user-task-id="selectedTaskId"
:form-title.sync="selectedFormTitle"
:form-id="selectedFormId"

View File

@ -30,5 +30,7 @@ public class DataFillForm implements Serializable {
private Date updateTime;
private Boolean commitNewUpdate;
private static final long serialVersionUID = 1L;
}

View File

@ -904,6 +904,66 @@ public class DataFillFormExample {
addCriterion("update_time not between", value1, value2, "updateTime");
return (Criteria) this;
}
public Criteria andCommitNewUpdateIsNull() {
addCriterion("commit_new_update is null");
return (Criteria) this;
}
public Criteria andCommitNewUpdateIsNotNull() {
addCriterion("commit_new_update is not null");
return (Criteria) this;
}
public Criteria andCommitNewUpdateEqualTo(Boolean value) {
addCriterion("commit_new_update =", value, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateNotEqualTo(Boolean value) {
addCriterion("commit_new_update <>", value, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateGreaterThan(Boolean value) {
addCriterion("commit_new_update >", value, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateGreaterThanOrEqualTo(Boolean value) {
addCriterion("commit_new_update >=", value, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateLessThan(Boolean value) {
addCriterion("commit_new_update <", value, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateLessThanOrEqualTo(Boolean value) {
addCriterion("commit_new_update <=", value, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateIn(List<Boolean> values) {
addCriterion("commit_new_update in", values, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateNotIn(List<Boolean> values) {
addCriterion("commit_new_update not in", values, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateBetween(Boolean value1, Boolean value2) {
addCriterion("commit_new_update between", value1, value2, "commitNewUpdate");
return (Criteria) this;
}
public Criteria andCommitNewUpdateNotBetween(Boolean value1, Boolean value2) {
addCriterion("commit_new_update not between", value1, value2, "commitNewUpdate");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -14,6 +14,7 @@
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="commit_new_update" jdbcType="BIT" property="commitNewUpdate" />
</resultMap>
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="io.dataease.plugins.common.base.domain.DataFillFormWithBLOBs">
<result column="forms" jdbcType="LONGVARCHAR" property="forms" />
@ -79,7 +80,7 @@
</sql>
<sql id="Base_Column_List">
id, `name`, pid, `level`, node_type, `table_name`, datasource, create_index, create_by,
create_time, update_by, update_time
create_time, update_by, update_time, commit_new_update
</sql>
<sql id="Blob_Column_List">
forms, table_indexes
@ -137,12 +138,14 @@
`level`, node_type, `table_name`,
datasource, create_index, create_by,
create_time, update_by, update_time,
forms, table_indexes)
commit_new_update, forms, table_indexes
)
values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{pid,jdbcType=VARCHAR},
#{level,jdbcType=INTEGER}, #{nodeType,jdbcType=VARCHAR}, #{tableName,jdbcType=VARCHAR},
#{datasource,jdbcType=VARCHAR}, #{createIndex,jdbcType=BIT}, #{createBy,jdbcType=VARCHAR},
#{createTime,jdbcType=TIMESTAMP}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP},
#{forms,jdbcType=LONGVARCHAR}, #{tableIndexes,jdbcType=LONGVARCHAR})
#{commitNewUpdate,jdbcType=BIT}, #{forms,jdbcType=LONGVARCHAR}, #{tableIndexes,jdbcType=LONGVARCHAR}
)
</insert>
<insert id="insertSelective" parameterType="io.dataease.plugins.common.base.domain.DataFillFormWithBLOBs">
insert into data_fill_form
@ -183,6 +186,9 @@
<if test="updateTime != null">
update_time,
</if>
<if test="commitNewUpdate != null">
commit_new_update,
</if>
<if test="forms != null">
forms,
</if>
@ -227,6 +233,9 @@
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
<if test="commitNewUpdate != null">
#{commitNewUpdate,jdbcType=BIT},
</if>
<if test="forms != null">
#{forms,jdbcType=LONGVARCHAR},
</if>
@ -280,6 +289,9 @@
<if test="record.updateTime != null">
update_time = #{record.updateTime,jdbcType=TIMESTAMP},
</if>
<if test="record.commitNewUpdate != null">
commit_new_update = #{record.commitNewUpdate,jdbcType=BIT},
</if>
<if test="record.forms != null">
forms = #{record.forms,jdbcType=LONGVARCHAR},
</if>
@ -305,6 +317,7 @@
create_time = #{record.createTime,jdbcType=TIMESTAMP},
update_by = #{record.updateBy,jdbcType=VARCHAR},
update_time = #{record.updateTime,jdbcType=TIMESTAMP},
commit_new_update = #{record.commitNewUpdate,jdbcType=BIT},
forms = #{record.forms,jdbcType=LONGVARCHAR},
table_indexes = #{record.tableIndexes,jdbcType=LONGVARCHAR}
<if test="_parameter != null">
@ -324,7 +337,8 @@
create_by = #{record.createBy,jdbcType=VARCHAR},
create_time = #{record.createTime,jdbcType=TIMESTAMP},
update_by = #{record.updateBy,jdbcType=VARCHAR},
update_time = #{record.updateTime,jdbcType=TIMESTAMP}
update_time = #{record.updateTime,jdbcType=TIMESTAMP},
commit_new_update = #{record.commitNewUpdate,jdbcType=BIT}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -365,6 +379,9 @@
<if test="updateTime != null">
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
<if test="commitNewUpdate != null">
commit_new_update = #{commitNewUpdate,jdbcType=BIT},
</if>
<if test="forms != null">
forms = #{forms,jdbcType=LONGVARCHAR},
</if>
@ -387,6 +404,7 @@
create_time = #{createTime,jdbcType=TIMESTAMP},
update_by = #{updateBy,jdbcType=VARCHAR},
update_time = #{updateTime,jdbcType=TIMESTAMP},
commit_new_update = #{commitNewUpdate,jdbcType=BIT},
forms = #{forms,jdbcType=LONGVARCHAR},
table_indexes = #{tableIndexes,jdbcType=LONGVARCHAR}
where id = #{id,jdbcType=VARCHAR}
@ -403,7 +421,8 @@
create_by = #{createBy,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_by = #{updateBy,jdbcType=VARCHAR},
update_time = #{updateTime,jdbcType=TIMESTAMP}
update_time = #{updateTime,jdbcType=TIMESTAMP},
commit_new_update = #{commitNewUpdate,jdbcType=BIT}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -63,6 +63,8 @@ public class ExtTableField implements Serializable {
private boolean multiple;
private boolean updateRuleCheck;
private List<Option> options;
}

View File

@ -17,4 +17,6 @@ public class TableField {
//java.sql.Types
private Integer type;
private int inCount;
}

View File

@ -64,8 +64,8 @@
<table tableName="export_task">
<columnOverride column="msg" jdbcType="VARCHAR"/>
<table tableName="data_fill_form">
<!--<columnOverride column="forms" jdbcType="VARCHAR"/>-->
</table>