diff --git a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java index 55716013f5..b1a438057b 100644 --- a/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java +++ b/core/backend/src/main/java/io/dataease/controller/datafill/DataFillController.java @@ -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 data) throws Exception { + public void userFillData(@PathVariable String taskId, @RequestBody List> data) throws Exception { dataFillService.fillFormData(taskId, data); } @@ -228,9 +228,9 @@ public class DataFillController { } @ApiIgnore - @PostMapping("/form/{optionDatasource}/{optionTable}/{optionColumn}/options/{optionOrder}") - public List listColumnData(@PathVariable String optionDatasource, @PathVariable String optionTable, @PathVariable String optionColumn, @PathVariable String optionOrder) throws Exception { - return dataFillDataService.listColumnData(optionDatasource, optionTable, optionColumn, optionOrder); + @PostMapping("/form/{optionDatasource}/options") + public List listColumnData(@PathVariable String optionDatasource, @RequestBody DatasourceOptionsRequest request) throws Exception { + return dataFillDataService.listColumnData(optionDatasource, request.getOptionTable(), request.getOptionColumn(), request.getOptionOrder()); } } diff --git a/core/backend/src/main/java/io/dataease/controller/request/datafill/DataFillFormTableDataRequest.java b/core/backend/src/main/java/io/dataease/controller/request/datafill/DataFillFormTableDataRequest.java index ac4cf2a85e..ca5c8a8918 100644 --- a/core/backend/src/main/java/io/dataease/controller/request/datafill/DataFillFormTableDataRequest.java +++ b/core/backend/src/main/java/io/dataease/controller/request/datafill/DataFillFormTableDataRequest.java @@ -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 primaryKeyValueList; + } diff --git a/core/backend/src/main/java/io/dataease/controller/request/datafill/DatasourceOptionsRequest.java b/core/backend/src/main/java/io/dataease/controller/request/datafill/DatasourceOptionsRequest.java new file mode 100644 index 0000000000..ff0fd4a157 --- /dev/null +++ b/core/backend/src/main/java/io/dataease/controller/request/datafill/DatasourceOptionsRequest.java @@ -0,0 +1,11 @@ +package io.dataease.controller.request.datafill; + +import lombok.Getter; + +@Getter +public class DatasourceOptionsRequest { + + private String optionTable; + private String optionColumn; + private String optionOrder; +} diff --git a/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.java b/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.java index 92595fc0e7..91f8b343a4 100644 --- a/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.java +++ b/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.java @@ -25,6 +25,6 @@ public interface ExtDataFillFormMapper { List selectActiveDataFillTasks(); List listTodoUserTask(long userId, Date current, String taskName); - List listFinishedUserTask(long userId, String taskName); + List listFinishedUserTask(long userId, Date current, String taskName); List listExpiredUserTask(long userId, Date current, String taskName); } diff --git a/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.xml b/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.xml index ac2bc52f39..6a75b365e9 100644 --- a/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.xml +++ b/core/backend/src/main/java/io/dataease/ext/ExtDataFillFormMapper.xml @@ -231,7 +231,8 @@ 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 >= #{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 diff --git a/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java b/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java index 1867c9d091..2efeba5002 100644 --- a/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/ext/MysqlExtDDLProvider.java @@ -76,7 +76,10 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { @Override public String searchSql(String table, List 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)); @@ -106,7 +109,16 @@ public class MysqlExtDDLProvider extends DefaultExtDDLProvider { StringBuilder builder = new StringBuilder("WHERE 1 = 1 "); for (TableField searchField : searchFields) { //目前只考虑等于 - builder.append("AND $Column_Field$ = ? ".replace("$Column_Field$", searchField.getFieldName())); + if (searchField.getInCount() > 1) { + List pList = new ArrayList<>(); + for (int i = 0; i < searchField.getInCount(); i++) { + pList.add("?"); + } + String str = "AND $Column_Field$ IN (" + String.join(", ", pList) + ")"; + builder.append(str.replace("$Column_Field$", searchField.getFieldName())); + } else { + builder.append("AND $Column_Field$ = ? ".replace("$Column_Field$", searchField.getFieldName())); + } } return builder.toString(); } diff --git a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java index a7a53c26b9..79de4ee9c5 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java @@ -435,9 +435,7 @@ public class OracleQueryProvider extends QueryProvider { xAxis.add(chartViewFieldDTO); List fieldCustomFilter = new ArrayList<>(); -// for (ChartFieldCustomFilterDTO chartFieldCustomFilterDTO : OrgFieldCustomFilter) { -// fieldCustomFilter.add(chartFieldCustomFilterDTO); -// } + ChartFieldCustomFilterDTO chartFieldCustomFilterDTO = new ChartFieldCustomFilterDTO(); DatasetTableField datasetTableField = new DatasetTableField(); datasetTableField.setOriginName("ROWNUM"); @@ -463,7 +461,6 @@ public class OracleQueryProvider extends QueryProvider { } else { if (pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) { - System.out.println("SELECT * FROM (" + sqlFix(originalTableInfo("(" + sqlFix(table) + ")", xAxis, OrgFieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view, fieldCustomFilter)) + ") DE_RESULT_TMP " + " WHERE DE_ROWNUM > " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize()); return "SELECT * FROM (" + sqlFix(originalTableInfo("(" + sqlFix(table) + ")", xAxis, OrgFieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view, fieldCustomFilter)) + ") DE_RESULT_TMP " + " WHERE DE_ROWNUM > " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize(); } else { return "SELECT * FROM (" + sqlFix(originalTableInfo("(" + sqlFix(table) + ")", xAxis, OrgFieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view, fieldCustomFilter)) + ") DE_RESULT_TMP "; @@ -525,10 +522,12 @@ public class OracleQueryProvider extends QueryProvider { List fields = new ArrayList<>(); fields.addAll(xFields); List wheres = new ArrayList<>(); + List pageWheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); if (extWheres != null) wheres.add(extWheres); if (whereTrees != null) wheres.add(whereTrees); - if (oldWhere != null) wheres.add(oldWhere); + if (oldWhere != null) pageWheres.add(oldWhere); List groups = new ArrayList<>(); groups.addAll(xFields); // 外层再次套sql @@ -539,6 +538,7 @@ public class OracleQueryProvider extends QueryProvider { ST st_sql = stg.getInstanceOf("previewSql"); st_sql.add("isGroup", false); if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); if (CollectionUtils.isNotEmpty(orders)) st_sql.add("orders", orders); if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); String sql = st_sql.render(); @@ -571,7 +571,7 @@ public class OracleQueryProvider extends QueryProvider { .tableName(String.format(OracleConstants.BRACKETS, sql)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 2)) .build(); - if (CollectionUtils.isNotEmpty(wheres)) st2.add("filters", wheres); + if (CollectionUtils.isNotEmpty(pageWheres)) st2.add("filters", pageWheres); if (ObjectUtils.isNotEmpty(tableSQL)) st2.add("table", tableSQL2); return st2.render(); diff --git a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 83828f608c..2023a4959c 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -343,6 +343,7 @@ public class ChartViewService { //downloadType = dataset 为下载原始名字 这里做数据转换模拟 table-info类型图表导出 if ("dataset".equals(request.getDownloadType())) { view.setType("table-info"); + view.setIsPlugin(false); List sourceFields = dataSetTableFieldsService.getFieldsByTableId(view.getTableId()); dsHeader = sourceFields.stream() .map(DatasetTableField::getName) diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java index c01139e487..cd3b0f152c 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java @@ -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,23 +225,36 @@ 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())) { datasourceRequest.setTableFieldWithValues(List.of(new DatasourceRequest.TableFieldWithValue() .setValue(searchRequest.getPrimaryKeyValue()) .setFiledName(pk.getFieldName()) .setTypeName(pk.getFieldType()) .setType(pk.getType()))); } + + if (CollectionUtils.isNotEmpty(searchRequest.getPrimaryKeyValueList())) { + pk.setInCount(searchRequest.getPrimaryKeyValueList().size()); + whereSql = extDDLProvider.whereSql(dataFillForm.getTableName(), List.of(pk)); + List ids = new ArrayList<>(); + for (String s : searchRequest.getPrimaryKeyValueList()) { + ids.add(new DatasourceRequest.TableFieldWithValue() + .setValue(s) + .setFiledName(pk.getFieldName()) + .setTypeName(pk.getFieldType()) + .setType(pk.getType())); + } + datasourceRequest.setTableFieldWithValues(ids); + } + + String countSql = extDDLProvider.countSql(dataFillForm.getTableName(), searchFields, whereSql); + datasourceRequest.setQuery(countSql); List 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 +312,28 @@ public class DataFillDataService { List list = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(ids)) { + if (CollectionUtils.isNotEmpty(ids) && withLogs) { list = extDataFillFormMapper.selectLatestLogByFormDataIds(dataFillForm.getId(), ids); } - Map logMap = list.stream().collect(Collectors.toMap(log -> log.getFormId() + "__" + log.getDataId(), log -> log)); + Map logMap = new HashMap<>(); + for (DataFillCommitLogDTO log : list) { + logMap.put(log.getFormId() + "__" + log.getDataId(), log); + } - for (Map object : result) { - Map temp = new HashMap<>(); - temp.put("data", object); - temp.put("logInfo", logMap.get(dataFillForm.getId() + "__" + object.get(key))); + if (withLogs) { + for (Map object : result) { + Map 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 +1002,143 @@ public class DataFillDataService { dataList.add(new RowDataDatum().setData(rowData)); } + List valueList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(dataList)) { - updateOrInsertRowData(formId, dataList); + //表单提交模式为更新时,需要根据条件加上主键id + boolean updateMode = false; + List 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> searchData = new ArrayList<>(); + String key = ""; + + if (res != null && res.getData() != null) { + searchData = (List>) 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 tableFields = datasourceProvider.getTableFields(datasourceRequest); + + for (TableField tableField : tableFields) { + if (tableField.isPrimaryKey()) { + //先把ID放进来 + key = tableField.getFieldName(); + } + } + } + + for (RowDataDatum datum : dataList) { + boolean hasUpdate = false; + for (Map 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 valueList, String key, RowDataDatum datum, Map searchDatum, List fieldsForCheck) { + int count = 0; + for (ExtTableField field : fieldsForCheck) { + if (StringUtils.equalsIgnoreCase(field.getType(), "checkbox") || + StringUtils.equalsIgnoreCase(field.getType(), "select") && field.getSettings().isMultiple()) { + List data1 = gson.fromJson((String) datum.getData().get(field.getSettings().getMapping().getColumnName()), new TypeToken>() { + }.getType()); + List data2 = gson.fromJson((String) searchDatum.get(field.getSettings().getMapping().getColumnName()), new TypeToken>() { + }.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; diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java index d184e510a5..6cf604b7cb 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillService.java @@ -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 data) throws Exception { + public void fillFormData(String userTaskId, List> 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 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 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 updateDatumList = new ArrayList<>(); + List insertDatumList = new ArrayList<>(); - task.setValueId(rowId); + List valueList = new ArrayList<>(); + + for (Map 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 formFields = gson.fromJson(dataFillForm.getForms(), new TypeToken>() { + }.getType()); + + List fields = new ArrayList<>(); + for (ExtTableField field : formFields) { + if (field.isRemoved()) { + continue; + } + if (StringUtils.equalsIgnoreCase(field.getType(), "dateRange")) { + ExtTableField start = gson.fromJson(gson.toJson(field), ExtTableField.class); + start.getSettings().getMapping().setColumnName(start.getSettings().getMapping().getColumnName1()); + 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 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> searchData = new ArrayList<>(); + if (res != null && res.getData() != null) { + searchData = (List>) res.getData(); + } + + for (RowDataDatum datum : insertDatumList) { + boolean hasUpdate = false; + for (Map 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 rowIds = dataFillDataService.updateOrInsertRowData(formId, valueList); + + task.setValueId(String.join(",", rowIds)); task.setFinishTime(new Date()); dataFillUserTaskMapper.updateByPrimaryKeySelective(task); diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillTaskService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillTaskService.java index a6ef77d330..be02626741 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillTaskService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillTaskService.java @@ -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 { diff --git a/core/backend/src/main/resources/db/migration/V68__1.18.23.sql b/core/backend/src/main/resources/db/migration/V68__1.18.23.sql new file mode 100644 index 0000000000..2fbe770e21 --- /dev/null +++ b/core/backend/src/main/resources/db/migration/V68__1.18.23.sql @@ -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'; + diff --git a/core/frontend/package.json b/core/frontend/package.json index 4ea6564500..24cb6f0200 100644 --- a/core/frontend/package.json +++ b/core/frontend/package.json @@ -1,6 +1,6 @@ { "name": "dataease", - "version": "1.18.22", + "version": "1.18.23", "description": "dataease front", "private": true, "scripts": { diff --git a/core/frontend/src/App.vue b/core/frontend/src/App.vue index cd8ee87b6b..592e543cf9 100644 --- a/core/frontend/src/App.vue +++ b/core/frontend/src/App.vue @@ -13,7 +13,7 @@ :title="$t('user.change_password')" :show-close="false" > - + diff --git a/core/frontend/src/components/canvas/components/editor/EditBar.vue b/core/frontend/src/components/canvas/components/editor/EditBar.vue index 478a48b823..6a25393d37 100644 --- a/core/frontend/src/components/canvas/components/editor/EditBar.vue +++ b/core/frontend/src/components/canvas/components/editor/EditBar.vue @@ -495,7 +495,6 @@ export default { { props: { type: 'text', - size: 'mini' }, class: 'btn-text', on: { @@ -525,7 +524,6 @@ export default { { props: { type: 'text', - size: 'mini' }, class: 'btn-text', on: { diff --git a/core/frontend/src/components/canvas/components/editor/Preview.vue b/core/frontend/src/components/canvas/components/editor/Preview.vue index 7538baa085..b012057a1e 100644 --- a/core/frontend/src/components/canvas/components/editor/Preview.vue +++ b/core/frontend/src/components/canvas/components/editor/Preview.vue @@ -191,10 +191,12 @@ :open-type="showChartInfoType" /> + diff --git a/core/frontend/src/views/dataFilling/form/EditFormData.vue b/core/frontend/src/views/dataFilling/form/EditFormData.vue index 4d060b77c6..469e364d22 100644 --- a/core/frontend/src/views/dataFilling/form/EditFormData.vue +++ b/core/frontend/src/views/dataFilling/form/EditFormData.vue @@ -1,5 +1,5 @@