From a11fbebe20e1f7094b29ecffa20b6a69fcf8d0eb Mon Sep 17 00:00:00 2001 From: ulleo Date: Fri, 26 Apr 2024 16:43:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(X-Pack):=20=E6=95=B0=E6=8D=AE=E5=A1=AB?= =?UTF-8?q?=E6=8A=A5Excel=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/datafill/DataFillDataService.java | 52 ++++++++++++++----- .../service/datafill/DataFillService.java | 2 +- .../views/dataFilling/form/EditFormData.vue | 11 +++- .../src/views/dataFilling/form/ViewTable.vue | 11 +++- 4 files changed, 58 insertions(+), 18 deletions(-) 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 4146af01ff..f986334ec9 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 @@ -41,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @@ -171,7 +172,15 @@ public class DataFillDataService { List countData = datasourceProvider.getData(datasourceRequest); long count = NumberUtils.toLong(countData.get(0)[0]); - String searchSql = extDDLProvider.searchSql(dataFillForm.getTableName(), searchFields, whereSql, searchRequest.getPageSize(), (searchRequest.getCurrentPage() - 1) * searchRequest.getPageSize()); + long totalPage = new BigDecimal(count).divide(new BigDecimal(searchRequest.getPageSize()), 0, RoundingMode.CEILING).longValue(); + + long currentPage = totalPage < searchRequest.getCurrentPage() ? totalPage - 1 : searchRequest.getCurrentPage(); + + if (currentPage < 1) { + currentPage = 1; + } + + String searchSql = extDDLProvider.searchSql(dataFillForm.getTableName(), searchFields, whereSql, searchRequest.getPageSize(), (currentPage - 1) * searchRequest.getPageSize()); datasourceRequest.setQuery(searchSql); List data2 = datasourceProvider.getData(datasourceRequest); @@ -241,7 +250,7 @@ public class DataFillDataService { .setFields(fields) .setTotal(count) .setPageSize(searchRequest.getPageSize()) - .setCurrentPage(searchRequest.getCurrentPage()); + .setCurrentPage(currentPage); } @@ -378,7 +387,7 @@ public class DataFillDataService { uniqueMap.putIfAbsent(name, new ArrayList<>()); if (uniqueMap.get(name).contains(data.get(name).toString())) { //提前判断录入的数据有没有unique字段重复的 - DataEaseException.throwException(extTableFields.get(name).getSettings().getName() + " 值不能重复"); + DataEaseException.throwException("[" + extTableFields.get(name).getSettings().getName() + "] 值: " + data.get(name) + " 不能重复"); } else { uniqueMap.get(name).add(data.get(name).toString()); } @@ -416,7 +425,7 @@ public class DataFillDataService { long count = NumberUtils.toLong(countData.get(0)[0]); if (count > 0) { - DataEaseException.throwException(extTableFields.get(uniqueField.getFiledName()).getSettings().getName() + " 值不能重复"); + DataEaseException.throwException("[" + extTableFields.get(uniqueField.getFiledName()).getSettings().getName() + "] 值: " + data.get(name) + " 在数据库中已存在, 不能重复"); } } @@ -684,14 +693,10 @@ public class DataFillDataService { if (i < excelDatum.size()) { excelRowData = excelDatum.get(i); } - if (StringUtils.isBlank(excelRowData)) { //处理必填,这里如果是字符串格式的,强制改成空字符串防止报错,其他类型都直接报错 + if (StringUtils.isBlank(excelRowData)) { //处理必填 + excelRowData = null; if (field.getSettings().isRequired()) { - if (field.getSettings().getMapping().getType().equals(ExtTableField.BaseType.nvarchar) || - field.getSettings().getMapping().getType().equals(ExtTableField.BaseType.text)) { - excelRowData = StringUtils.EMPTY; - } else { - DataEaseException.throwException(field.getSettings().getName() + "不能为空"); - } + DataEaseException.throwException("[" + field.getSettings().getName() + "] 不能为空"); } } if (excelRowData == null) { @@ -709,7 +714,11 @@ public class DataFillDataService { break; case datetime: Date date = getDate(field, excelRowData); - rowData.put(field.getSettings().getMapping().getColumnName(), date.getTime()); + Long time = date == null ? null : date.getTime(); + if (time != null && time < 0) { + throw new Exception("时间不能小于1970/01/01"); + } + rowData.put(field.getSettings().getMapping().getColumnName(), time); break; default: if (StringUtils.equalsIgnoreCase(field.getType(), "checkbox") || @@ -723,11 +732,23 @@ public class DataFillDataService { } if (field.getSettings().isRequired()) { if (CollectionUtils.isEmpty(list)) { - DataEaseException.throwException(field.getSettings().getName() + "不能为空"); + DataEaseException.throwException("[" + field.getSettings().getName() + "] 不能为空"); } } rowData.put(field.getSettings().getMapping().getColumnName(), gson.toJson(list)); } else { + //校验手机号,校验邮箱格式 + if (StringUtils.equalsAnyIgnoreCase(field.getSettings().getInputType(), "tel")) { + if (!excelRowData.matches("^1[3|4|5|7|8][0-9]{9}$")) { + throw new Exception(Translator.get("i18n_wrong_tel")); + } + } + if (StringUtils.equalsAnyIgnoreCase(field.getSettings().getInputType(), "email")) { + if (!excelRowData.matches("^[a-zA-Z0-9_._-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")) { + throw new Exception(Translator.get("i18n_wrong_email")); + } + } + rowData.put(field.getSettings().getMapping().getColumnName(), excelRowData); } } @@ -735,7 +756,7 @@ public class DataFillDataService { } catch (DataEaseException e) { DataEaseException.throwException(e.getMessage()); } catch (Exception e) { - DataEaseException.throwException(field.getSettings().getName() + "格式错误"); + DataEaseException.throwException("[" + field.getSettings().getName() + "] 值: " + excelRowData + " 格式解析错误: " + e.getMessage()); } } @@ -755,6 +776,9 @@ public class DataFillDataService { } private static Date getDate(ExtTableField field, String excelRowData) throws ParseException { + if (StringUtils.isBlank(excelRowData)) { + return null; + } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //默认会拿到这种格式的 if (field.getSettings().isEnableTime()) { sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 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 00fc50be02..8bafbfde0e 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 @@ -387,7 +387,7 @@ public class DataFillService { break; case text: case nvarchar: - if (StringUtils.equalsIgnoreCase("select", formField.getType()) || StringUtils.equalsIgnoreCase("checkbox", formField.getType())) { + if (StringUtils.equalsIgnoreCase("select", formField.getType()) && formField.getSettings().isMultiple() || StringUtils.equalsIgnoreCase("checkbox", formField.getType())) { example = "\n(多个值使用分号\";\"分割)"; } else if (StringUtils.equalsIgnoreCase("email", formField.getSettings().getInputType())) { example = "\n(邮箱格式)"; diff --git a/core/frontend/src/views/dataFilling/form/EditFormData.vue b/core/frontend/src/views/dataFilling/form/EditFormData.vue index 85f5f9bc46..e8d93a8c95 100644 --- a/core/frontend/src/views/dataFilling/form/EditFormData.vue +++ b/core/frontend/src/views/dataFilling/form/EditFormData.vue @@ -77,7 +77,12 @@ export default { name: this.$t('data_fill.form.email'), rules: [{ pattern: EMAIL_REGEX, message: this.$t('user.email_format_is_incorrect'), trigger: ['blur', 'change'] }] } - ] + ], + pickerOptions: { + disabledDate: (time) => { + return time.getTime() < new Date(0).getTime() + } + } } }, watch: {}, @@ -343,6 +348,7 @@ export default { :placeholder="item.settings.placeholder" style="width: 100%" size="small" + :picker-options="pickerOptions" /> diff --git a/core/frontend/src/views/dataFilling/form/ViewTable.vue b/core/frontend/src/views/dataFilling/form/ViewTable.vue index eee6d8ebea..aa8fc8fd70 100644 --- a/core/frontend/src/views/dataFilling/form/ViewTable.vue +++ b/core/frontend/src/views/dataFilling/form/ViewTable.vue @@ -136,7 +136,8 @@
{ + this.dataTableShow = true + }) } this.initTable(this.param.id) }, @@ -731,6 +737,7 @@ export default { if (res.data) { this.paginationConfig.key = res.data.key this.paginationConfig.total = res.data.total + this.paginationConfig.currentPage = res.data.currentPage const _data = [] forEach(res.data.data, d => { const obj = {} @@ -911,7 +918,7 @@ export default { const link = document.createElement('a') link.style.display = 'none' link.href = URL.createObjectURL(blob) - link.download = 'test.xlsx' // 下载的文件名 + link.download = this.param.name + '.xlsx' // 下载的文件名 document.body.appendChild(link) link.click() document.body.removeChild(link) From 39aa75f4f820753cd8923ca22e7335b937b69d70 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Fri, 26 Apr 2024 16:45:45 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=83=A8=E5=88=86=E7=BB=84=E4=BB=B6=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=98=8E=E7=BB=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/panel/PanelGroupService.java | 44 ++++++++++--------- .../canvas/customComponent/UserViewDialog.vue | 14 +----- .../src/components/canvas/utils/utils.js | 7 +-- 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/core/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/core/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index 644dec2bef..cfde7c56cb 100644 --- a/core/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/core/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -664,15 +664,17 @@ public class PanelGroupService { CacheUtils.removeAll(AuthConstants.DEPT_PANEL_NAME); } - public DataSetExportRequest composeDatasetExportRequest(PanelViewDetailsRequest request){ + public DataSetExportRequest composeDatasetExportRequest(PanelViewDetailsRequest request) { ChartExtRequest extRequest = request.getComponentFilterInfo(); List filter = new ArrayList(); - if(extRequest != null){ - if(CollectionUtils.isNotEmpty(extRequest.getFilter())){ + if (extRequest != null) { + if (CollectionUtils.isNotEmpty(extRequest.getFilter())) { filter.addAll(extRequest.getFilter()); - }if(CollectionUtils.isNotEmpty(extRequest.getLinkageFilters())){ + } + if (CollectionUtils.isNotEmpty(extRequest.getLinkageFilters())) { filter.addAll(extRequest.getLinkageFilters()); - }if(CollectionUtils.isNotEmpty(extRequest.getOuterParamsFilters())){ + } + if (CollectionUtils.isNotEmpty(extRequest.getOuterParamsFilters())) { filter.addAll(extRequest.getOuterParamsFilters()); } } @@ -681,23 +683,23 @@ public class PanelGroupService { permissionsTreeObjFilter.setLogic("and"); List composePermission = new ArrayList<>(); permissionsTreeObjFilter.setItems(composePermission); - if(CollectionUtils.isNotEmpty(filter)){ - filter.forEach(filterInfo ->{ + if (CollectionUtils.isNotEmpty(filter)) { + filter.forEach(filterInfo -> { DatasetRowPermissionsTreeItem filterPermission = new DatasetRowPermissionsTreeItem(); List values = filterInfo.getValue(); String operator = filterInfo.getOperator(); String dataSetFilterType = "logic"; String term = operator; - if("eq".equals(operator) && values.size()>1){ + if ("eq".equals(operator) && values.size() > 1) { dataSetFilterType = "enum"; } String fieldId = filterInfo.getFieldId(); filterPermission.setFieldId(fieldId); filterPermission.setFilterType(dataSetFilterType); filterPermission.setType("item"); - if(dataSetFilterType.equals("enum")){ + if (dataSetFilterType.equals("enum")) { filterPermission.setEnumValue(values); - }else{ + } else { filterPermission.setTerm(term); filterPermission.setValue(values.get(0)); } @@ -708,17 +710,19 @@ public class PanelGroupService { ChartViewWithBLOBs chartInfo = chartViewMapper.selectByPrimaryKey(request.getViewId()); String customFilter = chartInfo.getCustomFilter(); - DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(chartInfo.getTableId()); + DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(chartInfo.getTableId()); DataSetExportRequest dataSetExportRequest = new DataSetExportRequest(); - BeanUtils.copyBean(dataSetExportRequest,datasetTable); - if(CollectionUtils.isNotEmpty(composePermission)){ - DatasetRowPermissionsTreeObj permissionsTreeObjCustomsFilter = gson.fromJson(customFilter,DatasetRowPermissionsTreeObj.class); - DatasetRowPermissionsTreeItem customFilterPermission = new DatasetRowPermissionsTreeItem(); - customFilterPermission.setType("tree"); - customFilterPermission.setSubTree(permissionsTreeObjCustomsFilter); - composePermission.add(customFilterPermission); + BeanUtils.copyBean(dataSetExportRequest, datasetTable); + DatasetRowPermissionsTreeObj permissionsTreeObjCustomsFilter = gson.fromJson(customFilter, DatasetRowPermissionsTreeObj.class); + if (CollectionUtils.isNotEmpty(composePermission)) { + if (StringUtils.isNotEmpty(permissionsTreeObjCustomsFilter.getLogic())) { + DatasetRowPermissionsTreeItem customFilterPermission = new DatasetRowPermissionsTreeItem(); + customFilterPermission.setType("tree"); + customFilterPermission.setSubTree(permissionsTreeObjCustomsFilter); + composePermission.add(customFilterPermission); + } dataSetExportRequest.setExpressionTree(gson.toJson(permissionsTreeObjFilter)); - }else{ + } else if(StringUtils.isNotEmpty(permissionsTreeObjCustomsFilter.getLogic())){ dataSetExportRequest.setExpressionTree(customFilter); } dataSetExportRequest.setFilename(dataSetExportRequest.getName()); @@ -727,7 +731,7 @@ public class PanelGroupService { } public void exportDatasetDetails(PanelViewDetailsRequest request, HttpServletResponse response) throws Exception { - dataSetTableService.exportDataset(composeDatasetExportRequest(request),response); + dataSetTableService.exportDataset(composeDatasetExportRequest(request), response); } diff --git a/core/frontend/src/components/canvas/customComponent/UserViewDialog.vue b/core/frontend/src/components/canvas/customComponent/UserViewDialog.vue index c3b1399d5f..9ec72f25fb 100644 --- a/core/frontend/src/components/canvas/customComponent/UserViewDialog.vue +++ b/core/frontend/src/components/canvas/customComponent/UserViewDialog.vue @@ -282,19 +282,7 @@ export default { } }, exportExcel(callBack) { - const _this = this - if (this.isOnlyDetails) { - _this.exportExcelDownload(null, null, null, callBack) - } else { - if (this.showChartCanvas) { - html2canvas(document.getElementById('chartCanvas')).then(canvas => { - const snapshot = canvas.toDataURL('image/jpeg', 1) - _this.exportExcelDownload(snapshot, canvas.width, canvas.height, callBack) - }) - } else { - _this.exportExcelDownload(null, null, null, callBack) - } - } + this.exportExcelDownload(null, null, null, callBack) }, exportSourceDetails(callBack) { const loadingWrapper = { val: this.linkLoading } diff --git a/core/frontend/src/components/canvas/utils/utils.js b/core/frontend/src/components/canvas/utils/utils.js index 7c32bdc555..8b4d60d147 100644 --- a/core/frontend/src/components/canvas/utils/utils.js +++ b/core/frontend/src/components/canvas/utils/utils.js @@ -469,10 +469,11 @@ export function getCacheTree(treeName) { } export function exportExcelDownload(chart, snapshot, width, height, loadingWrapper, downloadParams, callBack) { - if (chart.render === 'antv' && !chart.data?.data?.length) { + if ((chart.render === 'echarts' || ['text', 'label'.includes(chart.type)]) && !(chart.data?.series?.length && chart.data?.series[0].data?.length)) { + callBack() return - } - if (chart.type === 'echarts' && !(chart.data?.series?.length && chart.data?.series[0].data?.length)) { + } else if ((chart.render === 'antv' && !['text', 'label'].includes(chart.type)) && !chart.data?.data?.length) { + callBack() return } const fields = JSON.parse(JSON.stringify(chart.data.fields))