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 @ApiIgnore
@PostMapping("/form/delete/{id}") @PostMapping("/form/delete/{id}")
public void saveForm(@PathVariable String id) throws Exception { public void deleteForm(@PathVariable String id) throws Exception {
dataFillService.deleteForm(id); dataFillService.deleteForm(id);
} }
@ -184,7 +184,7 @@ public class DataFillController {
@ApiIgnore @ApiIgnore
@PostMapping("/myTask/fill/{taskId}") @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); dataFillService.fillFormData(taskId, data);
} }

View File

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

View File

@ -25,6 +25,6 @@ public interface ExtDataFillFormMapper {
List<DataFillTask> selectActiveDataFillTasks(); List<DataFillTask> selectActiveDataFillTasks();
List<DataFillUserTaskDTO> listTodoUserTask(long userId, Date current, String taskName); 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); 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" /> <include refid="io.dataease.plugins.common.base.mapper.DataFillUserTaskMapper.Base_Column_List" />
FROM data_fill_user_task FROM data_fill_user_task
WHERE user = #{userId} 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` 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 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 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 @Override
public String searchSql(String table, List<TableField> formFields, String whereSql, long limit, long offset) { 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) baseSql = baseSql.replace("$TABLE_NAME$", table)
.replace("$OFFSET_COUNT$", Long.toString(offset)) .replace("$OFFSET_COUNT$", Long.toString(offset))
.replace("$LIMIT_COUNT$", Long.toString(limit)); .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.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadSheet;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.AuthUserService;
import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.controller.request.datafill.DataFillFormTableDataRequest; import io.dataease.controller.request.datafill.DataFillFormTableDataRequest;
@ -32,6 +32,7 @@ import io.dataease.service.datasource.DatasourceService;
import io.dataease.service.sys.SysAuthService; import io.dataease.service.sys.SysAuthService;
import lombok.Data; import lombok.Data;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
import org.pentaho.di.core.util.UUIDUtil; import org.pentaho.di.core.util.UUIDUtil;
@ -145,6 +146,10 @@ public class DataFillDataService {
} }
public DataFillFormTableDataResponse listData(DataFillFormTableDataRequest searchRequest) throws Exception { 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()); DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(searchRequest.getId());
@ -220,12 +225,12 @@ public class DataFillDataService {
String whereSql = ""; String whereSql = "";
if (StringUtils.isNoneBlank(searchRequest.getPrimaryKeyValue())) { if (StringUtils.isNotBlank(searchRequest.getPrimaryKeyValue())) {
whereSql = extDDLProvider.whereSql(dataFillForm.getTableName(), List.of(pk)); whereSql = extDDLProvider.whereSql(dataFillForm.getTableName(), List.of(pk));
} }
String countSql = extDDLProvider.countSql(dataFillForm.getTableName(), searchFields, whereSql); 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() datasourceRequest.setTableFieldWithValues(List.of(new DatasourceRequest.TableFieldWithValue()
.setValue(searchRequest.getPrimaryKeyValue()) .setValue(searchRequest.getPrimaryKeyValue())
.setFiledName(pk.getFieldName()) .setFiledName(pk.getFieldName())
@ -236,7 +241,7 @@ public class DataFillDataService {
List<String[]> countData = datasourceProvider.getData(datasourceRequest); List<String[]> countData = datasourceProvider.getData(datasourceRequest);
long count = NumberUtils.toLong(countData.get(0)[0]); 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(); long currentPage = totalPage < searchRequest.getCurrentPage() ? totalPage - 1 : searchRequest.getCurrentPage();
@ -294,23 +299,28 @@ public class DataFillDataService {
List<DataFillCommitLogDTO> list = new ArrayList<>(); List<DataFillCommitLogDTO> list = new ArrayList<>();
if (CollectionUtils.isNotEmpty(ids)) { if (CollectionUtils.isNotEmpty(ids) && withLogs) {
list = extDataFillFormMapper.selectLatestLogByFormDataIds(dataFillForm.getId(), ids); 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) { if (withLogs) {
Map<String, Object> temp = new HashMap<>(); for (Map<String, Object> object : result) {
temp.put("data", object); Map<String, Object> temp = new HashMap<>();
temp.put("logInfo", logMap.get(dataFillForm.getId() + "__" + object.get(key))); temp.put("data", object);
temp.put("logInfo", logMap.get(dataFillForm.getId() + "__" + object.get(key)));
resultList.add(temp); resultList.add(temp);
}
} }
return new DataFillFormTableDataResponse() return new DataFillFormTableDataResponse()
.setKey(key) .setKey(key)
.setData(resultList) .setData(withLogs ? resultList : result)
.setFields(fields) .setFields(fields)
.setTotal(count) .setTotal(count)
.setPageSize(searchRequest.getPageSize()) .setPageSize(searchRequest.getPageSize())
@ -979,14 +989,143 @@ public class DataFillDataService {
dataList.add(new RowDataDatum().setData(rowData)); dataList.add(new RowDataDatum().setData(rowData));
} }
List<RowDataDatum> valueList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(dataList)) { 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 { private static Date getDate(ExtTableField field, String excelRowData) throws ParseException {
if (StringUtils.isBlank(excelRowData)) { if (StringUtils.isBlank(excelRowData)) {
return null; return null;

View File

@ -1,7 +1,7 @@
package io.dataease.service.datafill; package io.dataease.service.datafill;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.dataease.auth.annotation.DeCleaner; import io.dataease.auth.annotation.DeCleaner;
import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.AuthUserService;
import io.dataease.commons.constants.DataFillConstants; import io.dataease.commons.constants.DataFillConstants;
@ -11,6 +11,8 @@ import io.dataease.commons.constants.SysLogConstants;
import io.dataease.commons.utils.*; import io.dataease.commons.utils.*;
import io.dataease.controller.ResultHolder; import io.dataease.controller.ResultHolder;
import io.dataease.controller.request.datafill.DataFillFormRequest; 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.dto.datafill.DataFillFormDTO;
import io.dataease.ext.ExtDataFillFormMapper; import io.dataease.ext.ExtDataFillFormMapper;
import io.dataease.i18n.Translator; 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.provider.datasource.JdbcProvider;
import io.dataease.service.sys.SysAuthService; import io.dataease.service.sys.SysAuthService;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.pentaho.di.core.util.UUIDUtil; import org.pentaho.di.core.util.UUIDUtil;
import org.springframework.core.env.Environment; 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()) { if (!CommonBeanFactory.getBean(AuthUserService.class).pluginLoaded()) {
DataEaseException.throwException("invalid"); DataEaseException.throwException("invalid");
} }
@ -475,35 +478,116 @@ public class DataFillService {
String formId = task.getFormId(); 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()); DataFillFormWithBLOBs dataFillForm = dataFillFormMapper.selectByPrimaryKey(formId);
Provider datasourceProvider = ProviderFactory.getProvider(ds.getType());
ExtDDLProvider extDDLProvider = ProviderFactory.gerExtDDLProvider(ds.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); Datasource ds = dataFillDataService.getDataSource(dataFillForm.getDatasource());
datasourceRequest.setDatasource(ds); Provider datasourceProvider = ProviderFactory.getProvider(ds.getType());
datasourceRequest.setTable(dataFillForm.getTableName()); 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) { List<TableField> tableFields = datasourceProvider.getTableFields(datasourceRequest);
if (tableField.isPrimaryKey()) {
rowId = (String) data.get(tableField.getFieldName()); String pk = "";
break; 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()); task.setFinishTime(new Date());
dataFillUserTaskMapper.updateByPrimaryKeySelective(task); dataFillUserTaskMapper.updateByPrimaryKeySelective(task);

View File

@ -269,7 +269,7 @@ public class DataFillTaskService {
String taskName = StringUtils.isNotBlank(request.getTaskName()) ? request.getTaskName() : null; String taskName = StringUtils.isNotBlank(request.getTaskName()) ? request.getTaskName() : null;
if (StringUtils.equalsIgnoreCase(type, "finished")) { if (StringUtils.equalsIgnoreCase(type, "finished")) {
list = extDataFillFormMapper.listFinishedUserTask(userId, taskName); list = extDataFillFormMapper.listFinishedUserTask(userId, new Date(), taskName);
} else if (StringUtils.equalsIgnoreCase(type, "expired")) { } else if (StringUtils.equalsIgnoreCase(type, "expired")) {
list = extDataFillFormMapper.listExpiredUserTask(userId, new Date(), taskName); list = extDataFillFormMapper.listExpiredUserTask(userId, new Date(), taskName);
} else { } 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', record: 'Fill Record',
task_manage: 'Task Manage', task_manage: 'Task Manage',
form_name: 'Form Name', 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', folder: 'Folder',
datasource: 'Datasource', datasource: 'Datasource',
table: 'Table', table: 'Table',
@ -661,6 +668,7 @@ export default {
option_value: 'Options', option_value: 'Options',
add_option: 'Add Option', add_option: 'Add Option',
form_name_cannot_none: 'Form name cannot be null', 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', form_components_cannot_null: 'Form components cannot be null',
option_list_cannot_empty: 'Option list cannot be empty', option_list_cannot_empty: 'Option list cannot be empty',
component_setting_error: 'Component setting error', component_setting_error: 'Component setting error',

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<script> <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 { PHONE_REGEX, EMAIL_REGEX } from '@/utils/validate'
import { import {
getTableColumnData, getTableColumnData,
@ -11,6 +11,10 @@ import {
export default { export default {
name: 'EditFormData', name: 'EditFormData',
props: { props: {
keyName: {
type: String,
required: false
},
id: { id: {
type: String, type: String,
required: false required: false
@ -39,6 +43,10 @@ export default {
type: Object, type: Object,
required: false required: false
}, },
dataList: {
type: Object,
required: false
},
showDrawer: { showDrawer: {
type: Boolean, type: Boolean,
required: true required: true
@ -65,9 +73,10 @@ export default {
callback() callback()
} }
return { return {
currentPage: 1,
loading: false, loading: false,
asyncOptions: {}, asyncOptions: {},
formData: {}, formData: [],
requiredRule: { required: true, message: this.$t('commons.required'), trigger: ['blur', 'change'] }, requiredRule: { required: true, message: this.$t('commons.required'), trigger: ['blur', 'change'] },
dateRangeRequiredRule: { validator: checkDateRangeRequireValidator, message: this.$t('commons.required'), trigger: ['blur', 'change'] }, dateRangeRequiredRule: { validator: checkDateRangeRequireValidator, message: this.$t('commons.required'), trigger: ['blur', 'change'] },
inputTypes: [ 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: {}, watch: {},
mounted() { mounted() {
const _tempForms = [] const _tempForms = []
this.formData = [] this.formData = []
this.asyncOptions = {} this.asyncOptions = {}
forEach(this.forms, v => { this.currentPage = 1
if (!v.removed) { forEach(this.allData, _data => {
const f = cloneDeep(v) const _tempFormRow = []
if (f.type === 'date' && f.settings.dateType === undefined) { // forEach(this.forms, v => {
f.settings.dateType = f.settings.enableTime ? 'datetime' : 'date' 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' _tempForms.push(_tempFormRow)
}
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)
}
}) })
this.loading = true this.loading = true
this.initFormOptionsData(_tempForms, () => { this.initFormOptionsData(_tempForms, () => {
// //
_tempForms.forEach(f => { for (let i = 0; i < _tempForms.length; i++) {
if (f.type !== 'dateRange') { const row = _tempForms[i]
const _value = this.data[f.settings.mapping.columnName] row.forEach(f => {
if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') { if (f.type !== 'dateRange') {
if (_value) { const _value = this.allData[i][f.settings.mapping.columnName]
if (f.type === 'select' && f.settings.multiple || f.type === 'checkbox') {
if (_value) {
// //
if (this.readonly) { if (this.readonly) {
f.value = JSON.parse(_value) 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 { } else {
const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder f.value = []
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 { } else if (f.type === 'select' && !f.settings.multiple || f.type === 'radio') {
f.value = [] if (_value) {
} if (!this.readonly) {
} else if (f.type === 'select' && !f.settings.multiple || f.type === 'radio') { const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
if (_value) { const options = map(f.settings.optionSourceType === 1 ? f.settings.options : (this.asyncOptions[tempId] ? this.asyncOptions[tempId] : []), f => f.value)
if (!this.readonly) { if (!includes(options, _value)) {
const tempId = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder f.value = undefined
const options = map(f.settings.optionSourceType === 1 ? f.settings.options : (this.asyncOptions[tempId] ? this.asyncOptions[tempId] : []), f => f.value) } else {
if (!includes(options, _value)) { f.value = _value
f.value = undefined }
} else { } else {
f.value = _value 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.formData = _tempForms
this.loading = false this.loading = false
@ -163,7 +192,8 @@ export default {
initFormOptionsData(forms, callback) { initFormOptionsData(forms, callback) {
const queries = [] const queries = []
const queryIds = [] const queryIds = []
forEach(forms, f => { //
forEach(forms[0], f => {
if (f.type === 'checkbox' || f.type === 'select' || f.type === 'radio') { 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) { 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 const id = f.settings.optionDatasource + '_' + f.settings.optionTable + '_' + f.settings.optionColumn + '_' + f.settings.optionOrder
@ -222,54 +252,69 @@ export default {
item.value = value item.value = value
}) })
}, },
onPageChange(page) {
this.currentPage = page
},
doSave() { doSave() {
this.loading = true this.loading = true
this.$refs['mForm'].validate((valid) => { this.$refs['mForm'].validate((valid, invalidFields) => {
if (valid) { if (valid) {
const _data = {} const req = []
forEach(this.formData, f => {
if (f.type === 'dateRange') { for (let i = 0; i < this.formData.length; i++) {
const _start = f.settings.mapping.columnName1 const row = this.formData[i]
const _end = f.settings.mapping.columnName2 const _data = {}
if (f.value) { forEach(row, f => {
if (f.value[0]) { if (f.type === 'dateRange') {
_data[_start] = f.value[0].getTime() const _start = f.settings.mapping.columnName1
} const _end = f.settings.mapping.columnName2
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') {
if (f.value) { 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 { } 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) { if (this.userTaskId) {
userFillFormData(this.userTaskId, _data).then(res => { userFillFormData(this.userTaskId, req).then(res => {
this.$emit('save-success') this.$emit('save-success')
}).finally(() => { }).finally(() => {
this.loading = false this.loading = false
}) })
} else { } else {
//
if (this.id !== undefined) { if (this.id !== undefined) {
// update // update
saveFormRowData(this.formId, this.id, _data).then(res => { saveFormRowData(this.formId, this.id, req[0]).then(res => {
this.$emit('save-success') this.$emit('save-success')
}).finally(() => { }).finally(() => {
this.loading = false this.loading = false
}) })
} else { } else {
// insert // insert
newFormRowData(this.formId, _data).then(res => { newFormRowData(this.formId, req[0]).then(res => {
this.$emit('save-success') this.$emit('save-success')
}).finally(() => { }).finally(() => {
this.loading = false this.loading = false
@ -277,6 +322,11 @@ export default {
} }
} }
} else { } else {
//
const _key = keys(invalidFields)[0]
const index = split(_key, ']')[0].replace('[', '')
this.currentPage = parseInt(index) + 1
this.loading = false this.loading = false
} }
}) })
@ -319,142 +369,157 @@ export default {
@submit.native.prevent @submit.native.prevent
> >
<div <div
v-for="(item, $index) in formData" v-for="(row, $index1) in formData"
:key="item.id" v-show="currentPage === $index1 + 1"
:data-var="tempId = item.settings ? item.settings.optionDatasource + '_' + item.settings.optionTable + '_' + item.settings.optionColumn + '_' + item.settings.optionOrder : 'unset'" :key="$index1"
class="m-item m-form-item"
> >
<div
<div class="m-label-container"> v-for="(item, $index2) in row"
<span style="width: unset"> :key="item.id"
{{ item.settings.name }} class="m-item m-form-item"
<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)"
> >
<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> </div>
</el-form> </el-form>
</el-main> </el-main>
<el-footer <el-footer
class="de-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 @click="closeDrawer">{{ $t("commons.cancel") }}</el-button>
<el-button <el-button
v-if="!readonly" v-if="!readonly"
@ -487,7 +552,15 @@ export default {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; 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 { .panel-info-area {

View File

@ -2,16 +2,17 @@
import DeContainer from '@/components/dataease/DeContainer.vue' import DeContainer from '@/components/dataease/DeContainer.vue'
import DataFillingFormSave from './save.vue' import DataFillingFormSave from './save.vue'
import clickoutside from 'element-ui/src/utils/clickoutside.js' 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 { v4 as uuidv4 } from 'uuid'
import { EMAIL_REGEX, PHONE_REGEX } from '@/utils/validate' import { EMAIL_REGEX, PHONE_REGEX } from '@/utils/validate'
import { getTableColumnData, getWithPrivileges } from '@/views/dataFilling/form/dataFilling' import { getTableColumnData, getWithPrivileges } from '@/views/dataFilling/form/dataFilling'
import { getColumnList, listDatasource } from '@/api/dataset/dataset' import { getColumnList, listDatasource } from '@/api/dataset/dataset'
import { getTableList } from '@/api/system/datasource' import { getTableList } from '@/api/system/datasource'
import GridTable from '@/components/gridTable/index.vue'
export default { export default {
name: 'DataFillingFormCreate', name: 'DataFillingFormCreate',
components: { DeContainer, DataFillingFormSave }, components: { GridTable, DeContainer, DataFillingFormSave },
directives: { directives: {
clickoutside clickoutside
}, },
@ -72,6 +73,7 @@ export default {
} }
], ],
showEditBindColumn: false, showEditBindColumn: false,
showCommitUpdateRule: false,
asyncOptions: {}, asyncOptions: {},
componentList: [ componentList: [
{ {
@ -249,12 +251,21 @@ export default {
createIndex: false, createIndex: false,
tableIndexes: [], tableIndexes: [],
folder: undefined, folder: undefined,
level: undefined level: undefined,
commitNewUpdate: false
}, },
selectedItemId: undefined selectedItemId: undefined,
tempForms: []
} }
}, },
computed: { 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() { datasourceList() {
const dsMap = groupBy(this.allDatasourceList, d => d.type) const dsMap = groupBy(this.allDatasourceList, d => d.type)
const _types = [] const _types = []
@ -312,6 +323,7 @@ export default {
const id = this.$route.query.copy const id = this.$route.query.copy
getWithPrivileges(id).then(res => { getWithPrivileges(id).then(res => {
const tempData = res.data const tempData = res.data
this.formSettings.commitNewUpdate = !!tempData.commitNewUpdate
this.formSettings.folder = tempData.pid this.formSettings.folder = tempData.pid
this.formSettings.level = tempData.level this.formSettings.level = tempData.level
this.baseLoading = true this.baseLoading = true
@ -325,6 +337,7 @@ export default {
this.isEdit = true this.isEdit = true
const tempData = cloneDeep(res.data) const tempData = cloneDeep(res.data)
this.formSettings = tempData this.formSettings = tempData
this.formSettings.commitNewUpdate = !!tempData.commitNewUpdate
this.formSettings.table = tempData.tableName this.formSettings.table = tempData.tableName
this.formSettings.folder = tempData.pid this.formSettings.folder = tempData.pid
this.baseLoading = true this.baseLoading = true
@ -362,6 +375,7 @@ export default {
if (f.type === 'dateRange' && f.settings.dateType === undefined) { // if (f.type === 'dateRange' && f.settings.dateType === undefined) { //
f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange' f.settings.dateType = f.settings.enableTime ? 'datetimerange' : 'daterange'
} }
f.settings.updateRuleCheck = !!f.settings.updateRuleCheck
}) })
this.initFormOptionsData(tempForms, () => { this.initFormOptionsData(tempForms, () => {
this.formSettings.forms = tempForms this.formSettings.forms = tempForms
@ -654,6 +668,15 @@ export default {
this.lostFocus() this.lostFocus()
return 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) { if (this.formSettings.forms.length === 0) {
this.$message({ this.$message({
message: this.$t('data_fill.form.form_components_cannot_null'), message: this.$t('data_fill.form.form_components_cannot_null'),
@ -704,6 +727,29 @@ export default {
} }
this.showDrawer = true 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-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-form>
</el-main> </el-main>
</template> </template>
@ -1465,15 +1560,83 @@ export default {
</el-form-item> </el-form-item>
</el-main> </el-main>
</el-form> </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-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> </el-dialog>
</div> </div>
@ -1481,6 +1644,10 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.data-filling-form { .data-filling-form {
.m-divider {
width: 320px;
margin: 24px -20px;
}
::v-deep .el-form-item__error { ::v-deep .el-form-item__error {
position: relative; position: relative;
} }

View File

@ -370,6 +370,7 @@ export default {
forms: JSON.stringify(this.formData.forms), forms: JSON.stringify(this.formData.forms),
createIndex: this.formData.createIndex, createIndex: this.formData.createIndex,
tableIndexes: JSON.stringify(this.formData.tableIndexes), tableIndexes: JSON.stringify(this.formData.tableIndexes),
commitNewUpdate: this.formData.commitNewUpdate,
nodeType: 'form' nodeType: 'form'
} }
updateForm(data).then(res => { updateForm(data).then(res => {
@ -397,6 +398,7 @@ export default {
forms: JSON.stringify(this.formData.forms), forms: JSON.stringify(this.formData.forms),
createIndex: this.formData.createIndex, createIndex: this.formData.createIndex,
tableIndexes: JSON.stringify(this.formData.tableIndexes), tableIndexes: JSON.stringify(this.formData.tableIndexes),
commitNewUpdate: this.formData.commitNewUpdate,
nodeType: 'form' nodeType: 'form'
} }
saveForm(data).then(res => { 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 GridTable from '@/components/gridTable/index.vue'
import { getForm, searchFormMyTasks, searchTable } from '@/views/dataFilling/form/dataFilling' import { getForm, searchFormMyTasks, searchTable } from '@/views/dataFilling/form/dataFilling'
import EditFormData from '@/views/dataFilling/form/EditFormData.vue' 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' import { hasPermission } from '@/directive/Permission'
export default { export default {
@ -23,6 +23,7 @@ export default {
showDrawer: false, showDrawer: false,
selectedDataId: undefined, selectedDataId: undefined,
selectedData: undefined, selectedData: undefined,
selectedKeyName: undefined,
selectedTaskId: undefined, selectedTaskId: undefined,
selectedFormTitle: '', selectedFormTitle: '',
selectedFormId: undefined, selectedFormId: undefined,
@ -206,7 +207,8 @@ export default {
this.selectedTaskId = row.id this.selectedTaskId = row.id
this.selectedDataId = row.valueId this.selectedDataId = row.valueId
this.selectedData = {} this.selectedData = [{}]
this.selectedKeyName = undefined
if (row.valueId) { if (row.valueId) {
getForm(row.formId).then(res => { getForm(row.formId).then(res => {
this.selectedFormTitle = res.data.name this.selectedFormTitle = res.data.name
@ -225,12 +227,11 @@ export default {
}) })
searchTable(row.formId, { searchTable(row.formId, {
primaryKeyValue: row.valueId, primaryKeyValueList: split(row.valueId, ','),
currentPage: 1, currentPage: 1,
pageSize: 10 pageSize: 0
}).then(res => { }).then(res => {
if (res.data) { if (res.data) {
const obj = {}
if (res.data.data.length === 0) { if (res.data.data.length === 0) {
this.$message({ this.$message({
message: this.$t('data_fill.data.id_is') + row.valueId + this.$t('data_fill.data.data_not_found'), 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 return
} }
forIn(res.data.data[0].data, (value, key) => { this.selectedKeyName = res.data.key
if (includes(dateFormatColumns, key)) { const _list = []
if (value) { for (let i = 0; i < res.data.data.length; i++) {
obj[key] = new Date(value) 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 { } 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 this.showDrawer = true
} }
@ -602,7 +609,8 @@ export default {
<edit-form-data <edit-form-data
v-if="showDrawer" v-if="showDrawer"
:id="selectedDataId" :id="selectedDataId"
:data.sync="selectedData" :data-list.sync="selectedData"
:key-name.sync="selectedKeyName"
:user-task-id="selectedTaskId" :user-task-id="selectedTaskId"
:form-title.sync="selectedFormTitle" :form-title.sync="selectedFormTitle"
:form-id="selectedFormId" :form-id="selectedFormId"

View File

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

View File

@ -904,6 +904,66 @@ public class DataFillFormExample {
addCriterion("update_time not between", value1, value2, "updateTime"); addCriterion("update_time not between", value1, value2, "updateTime");
return (Criteria) this; 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 { public static class Criteria extends GeneratedCriteria {

View File

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

View File

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

View File

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

View File

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